исходный код лаунчера майнкрафт
Делаем свой minecraft на JavaScript
Добро пожаловать в самую запутанную архитектуру проекта. Да я умею писать вступление.
Попробуем сделать небольшую демку minecraft в браузере. Пригодятся знания JS и three.js.
Немного условностей. Я не претендую на звание лучшее приложение столетия. Это всего лишь моя реализация для данной задачи. Также есть видео версия для тех кому лень читать(там тот же смысл, но другими словами).
В конце статьи есть все нужные ссылки. Постараюсь как можно меньше воды в тексте. Объяснять работу каждой строки не буду. Вот теперь можно начать.
Для начала чтобы понимать какой будет итог, то вот демка игры.
Разделим статью на несколько частей:
Структура проекта
Вот так выглядит структура проекта.
index.html — Расположение канваса, немного интерфейса и подключение стилей, скриптов.
style.css — Стили только для внешнего вида. Самое важное это кастомный курсор для игры который располагается в центре экрана.
texture — Здесь лежат текстуры для курсора и блока земли для игры.
core.js — Основной скрипт где происходит инициализация проекта.
perlin.js — Это библиотека для шума Перлина.
PointerLockControls.js — Камера от three.js.
controls.js — Управление камерой и игроком.
generationMap.js — Генерация мира.
three.module.js — Сам three.js в виде модуля.
settings.js — Настройки проекта.
Игровой цикл
В core.js нужно провести инициализацию three.js, настроить его и добавить все нужные модули от игры + обработчики событий… ну и игровой цикл запустить. В учет того, что все настройки стандартные, то объяснять их нет смысла. Поговорить можно про map (он принимает сцену игры для добавления блоков) и contorls т.к. он принимает несколько параметров. Первый это камера от three.js, сцену для добавления блоков и карту чтобы можно было взаимодействовать с ней. update отвечает за обновление камеры, GameLoop — игровой цикл, render- стандарт от three.js для обновления кадра, событие resize также стандарт для работы с канвасом (это реализация адаптива).
Настройки
В настройки можно было вынести и другие параметры, например, настройки three.js, но я сделал без них и сейчас здесь лишь пара параметров отвечающие за размер блоков.
Генерация карты
В классе Map у нас есть несколько свойство которые отвечают за кеш материалов и параметры для шума Перлина. В методе generation мы загружаем текстуры, создаем геометрию и меш. noise.seed отвечает за стартовое зерно для генерации карты. Можно рандом заменить на статичное значение чтобы карты всегда была одинаковая. В цикле по X и Z координатам начинаем расставлять кубы. Y координата генерируется за счет библиотеки pretlin.js. В конечном итоге мы добавляем куб с нужными координатами на сцену через scene.add( cube );
Камера и управление
Я уже говорил, что controls принимает параметры в виде камеры, сцены и карты. Также в конструкторе мы добавляем массив keys для клавиш и movingSpeed для скорости. Для мыши у нас есть 3 метода. onClick определяет какая кнопка нажата, а onRightClick и onLeftClick уже отвечают за действия. Правый клик(удаление блока) происходит через raycast и поиска пересеченных элементов. Если их нет, то прекращаем работу, если есть, то удаляем первый элеент. Левый клик работает по схожей системе. Для начала создаем блок. Запускаем рейкаст и если есть блок который пересек луч, то получаем координаты этого блока. Далее определяем с какой стороны произошел клик. Меняем координаты для созданного куба в соответствии со стороной к которой мы добавляем блок. градация в 5 единиц т.к. это размер блока(да здесь можно было использовать свойство из settings).
Как работает управление камерой?! У нас есть три метода inputKeydown, inputKeyup и update. В inputKeydown мы добавляем кнопку в массив keys. inputKeyup отвечает за очистку кнопок из массива которые отжали. В update идет проверка keys и вызывается moveForward у камеры, параметры которые принимает метод это скорость.
Ссылки
Как и обещал. Весь материал который пригодится.
Если есть желание, то на можете добавить свой функционал к проекту на гитхаб.
Исходный код Майнкрафт: как его достать и что с ним можно сделать?
Майнкрафт — это одна из самых знаменитых игр нашего времени. Над ее созданием и поддержкой трудится команда шведских разработчиков Mojang Java Studios. Исходный код в Майнкрафт в целом держится в секрете, не считая тех наработок, что есть в darknet’е. Однако буквально недавно команда разработчиков опубликовала несколько легальных частей кода под свободной лицензией. Чуть позже остановимся на этом подробнее.
Почему считают, что Майнкрафт — для детей?
Нрави тся Майнкрафт детям по нескольким простым причинам:
Код Майнкрафта — это Java?
Сделано это для того, чтобы была возможность объединять все версии с разных платформ:
К сожалению, Java не могла обеспечить работу игры на iOS, поэтому было принято такое решение.
Вот и получается, что код Майнкрафта доступен в двух версиях:
Где найти исходный код Майнкрафта?
Но вот, буквально недавно, были легально опубликованы несколько пакетов кода Java Edition. Найти их можно на GitHub. Они распространяются открыто и со свободной лицензией MIT корпорации Microsoft. В своем составе они представляют две библиотеки Java:
Эти библиотеки открыли возможность разбивки, отправки, обработки пользовательских команд и данных от новых версий игры.
На этом все не остановится. Как говорят разработчики, в дальнейшем они планируют еще о публиковать в открытом доступе другие библиотеки и куски исходного кода Майнкрафт. Это будет делаться для того, чтобы облегчит ь разработку других подобных игр и труд разработчиков модификаций.
Библиотека Brigadier
Данной библиотекой пользоваться довольно просто — нужны минимальные знания.
Библиотека DataFixerUpper
Данная библиотека представляет собой набор инструментов, чтобы можно было собрать, склеить и оптимизировать преобразованные данные, которые нужны будут для добавления их в новые версии игры Майнкрафт.
Полностью Java код Майнкрафта пока открыва ть не будет, хотя у разработчиков были мысли и об этом. Он говорят, что пока исходный код Minecraft будет открываться частями и по запланированному графику.
Мы будем очень благодарны
если под понравившемся материалом Вы нажмёте одну из кнопок социальных сетей и поделитесь с друзьями.
Создание Minecraft за одну неделю на C++ и Vulkan
Я поставил перед собой задачу воссоздания с нуля Minecraft за одну неделю с помощью собственного движка на C++ и Vulkan. Меня вдохновил на это Hopson, который сделал то же самое при помощи C++ и OpenGL. В свою очередь, его вдохновил Шейн Бек, которого вдохновила Minecraft, источником вдохновения для которой была Infiniminer, при создании которой, предположительно, вдохновлялись реальными горными промыслами.
Репозиторий GitHub этого проекта находится здесь. У каждого дня есть своя git-метка.
Разумеется, я не планировал в буквальном смысле воссоздавать Minecraft. Этот проект должен был стать обучающим. Я хотел изучить использование Vulkan в чём-то более сложном, чем vulkan-tutorial.com или демо Саши Виллема. Поэтому основной упор сделан на проектирование Vulkan-движка, а не на дизайн игры.
Задачи
Разработка на Vulkan намного медленнее, чем на OpenGL, поэтому я не смог включить в игру многие функции настоящей Minecraft. Нет ни мобов, ни крафта, ни красного камня, ни физики блоков, и т.п. С самого начала цели проекта были следующими:
Библиотеки
Разумеется, я не собирался писать Vulkan-приложение с нуля. Для ускорения процесса разработки я по возможности буду использовать готовые библиотеки. А именно:
День 1
В первый день я подготовил бойлерплейт Vulkan и скелет движка. Большая часть кода была бойлерплейтом и я смог просто скопипастить его с vulkan-tutorial.com. В него вошёл и трюк с хранением данных вершин как части вершинного шейдера. Это означало, что мне даже не придётся настраивать распределение памяти. Всего лишь простой конвейер, который способен делать только одно: отрисовывать треугольник.
Движок достаточно прост, чтобы поддерживать рендерер треугольников. Он имеет одно окно и игровой цикл, к которому можно подключать системы. GUI ограничен частотой кадров, выводимой в заголовок окна.
День 2
Я интегрировал библиотеку Vulkan Memory Allocator. Эта библиотека берёт на себя большую часть бойлерплейта, связанного с распределением памяти Vulkan: типы памяти, кучи памяти устройств и вторичное распределение.
Теперь, когда у меня было распределение памяти, я создал классы для мешей и буферов вершин. Я изменил рендерер треугольников так, чтобы он использовал класс мешей, а не встроенные в шейдер массивы. На данный момент передача данных мешей в GPU выполняется рендерером треугольников вручную.
День 3
Я добавил систему графов рендеринга. Для создания этого класса взят за основу данный пост, но класс очень сильно упрощён. Мой граф рендеринга содержит только самое необходимое для обработки синхронизации с Vulkan.
Граф рендеринга позволяет мне задавать узлы и рёбра. Узлы представляют собой выполняемую GPU работу. Рёбра — это зависимости данных между узлами. Каждый узел получает собственный буфер команд, в который выполняет запись. Граф занимается двойной буферизацией буферов команд и синхронизацией их с предыдущими кадрами. Рёбра используются для автоматической вставки барьеров конвейера перед и после того, как узел выполняет запись в каждый буфер команд. Барьеры конвейера синхронизируют использование всех ресурсов и переносят принадлежность между очередями. Кроме того, рёбра вставляют семафоры между узлами.
Узлы и рёбра образуют ориентированный ациклический граф. Затем граф рендеринга выполняет топологическую сортировку узлов, что приводит к созданию плоского списка узлов, отсортированных таким образом, что каждый узел идёт после всех узлов, от которых он зависит.
Движок имеет три типа узлов. AcquireNode получает образ из цепочки буферов (swapchain), TransferNode передаёт данные от CPU к GPU, а PresentNode предоставляет изображение цепочки буферов, которое нужно отобразить.
Клянусь, внутри движок поменялся
День 4
Я создал камеру и систему 3D-рендеринга. Пока камера получает собственный постоянный буфер и пул дескрипторов.
Если мы переворачиваем ось Y, то нужно перевернуть и данные вершин, потому что до этого отрицательное направление оси Y указывало вверх.
День 5
Я добавил ввод пользователя и возможность перемещения камеры при помощи мыши. Система ввода слишком переусложнена, но она устраняет странности ввода GLFW. В частности, у меня возникала проблема изменения позиции мыши при её блокировании.
Просто для сравнения — примерно то же самое Hopson сделал в день 1 своего проекта.
День 6
Я начал добавлять код для генерации и рендеринга блоков вокселей. Писать код мешинга было просто, потому что я делал это раньше и знал абстракции, позволяющие совершать меньше ошибок.
У меня есть несколько статических массивов, задающих смещения, которые обычно используются в игре. Например, Neighbors6 задаёт 6 соседей, с которыми куб имеет общие грани.
Neighbors26 — это все соседи, с которыми у куба общая грань, ребро или вершина. То есть это сетка 3x3x3 без центрального куба. Также есть подобные массивы для других наборов соседей и для 2D-наборов соседей.
Благодаря этому код создания мешей очень прост. Он просто обходит данные блоков и добавляет грань, когда блок сплошной, а его сосед — нет. Код просто проверяет каждую грань каждого куба в блоке. Это аналогично «наивному» методу, описанному здесь.
Затем я изменил движок так, чтобы он мог правильно обрабатывать события изменения окна. В OpenGL это делается просто, но довольно запутанно в Vulkan. Так как цепочка буферов должна создаваться явным образом и иметь постоянный размер, при изменении размера окна её нужно создавать заново. Необходимо создавать заново все ресурсы, зависящие от цепочки буферов.
Все команды, зависящие от цепочки буферов (а сейчас это все команды отрисовки), должны завершить выполнение перед уничтожением старой цепочки буферов. Это означает, что весь GPU будет простаивать.
Нужно изменить графический конвейер, чтобы обеспечить динамическое окно обзора и изменение размеров.
Цепочку буферов невозможно создать, если размер окна равен 0 по оси X или Y. В том числе, когда окно свёрнуто. То есть когда такое происходит, вся игра ставится на паузу и продолжается, только когда окно разворачивается.
Сейчас меш является простой трёхмерной шахматной доской. Цвета RGB меша устанавливаются в соответствии с его позицией по XYZ, умноженной на 16.
День 7
Я отрефакторил меш, чтобы его данные можно было обновлять после его создания. Это позволит мне обновлять меш блока в будущем, когда я добавлю возможность добавления и удаления кубов.
При добавлении или удалении куба количество вершин в меше потенциально может увеличиваться или уменьшаться. Ранее выделенный буфер вершин можно использовать, только если новый меш того же размера или меньше. Но если меш больше, то необходимо создать новые буферы вершин.
Теперь меш блока регенерируется в каждом кадре.
Исходники Minecraft#
Мы разрабатываем моды для Minecraft, а значит находимся в очень тесной связи и с ним.
Иногда возникают вопросы вида: * Как сделать портал? * Как отловить правый клик по блоку? * Как добавить описание под названием предмета?
Ответы на подобного вида вопросы ВСЕГДА нужно искать в исходном коде Minecraft. 99% того, что вы хотите создать в своем моде уже было реализовано в Minecraft. Можно просто посмотреть, как (правильно) сделано в игре, и, на основе готового примера, сделать что-то свое.
Для этого нам нужно уметь обращаться к исходным кодам и ассетам (звукам, текстурам, моделям) Minecraft.
В Intellij Idea исходники можно найти, открыв в проводнике слева вкладку External Libraries и найдя файл «forgeSrc-версия Minecraft—версия Forge.jar».
Откройте его и увидите достаточно много папок:
Eclipse#
Пояснение#
В пакете assets/minecraft находятся все ресурсы Minecraft: текстуры, JSON описания моделей, файлы локализации и так далее.
В пакете net.minecraft находится исходный код игры. Файлов там очень много и именно там находятся ответы на 90% всех ваших вопросов.
Пример#
Там есть следующий кусок кода:
Вот мы и нашли метод, который надо записать в файле нашего блока. Он будет выполняться, когда по нашему блоку кликнут.
Внутри него видим следующий метод:
Строчка this.world.createExplosion(this, this.posX, this.posY + (double)(this.height / 16.0F), this.posZ, 4.0F, true); как раз то, что нам нужно!
В нашем блоке BlockTest.java осталось записать:
Почти наверняка то, что вы хотите добавить в своем моде уже реализовано в игре в том или ином смысле. Старайтесь найти примеры в исходном коде и используйте их для реализации своих идей.
К тому же, ориентируясь на исходники игры, вы будете лучше понимать их внутреннюю структуру, что сильно облегчает создание модов.
Безопасность, как один из принципов работы TLauncher
Безопасность в интернете очень острый вопрос, так как каждое программное обеспечение, запускаемое на вашем компьютере, изменяет и добавляет файлы. Поэтому доверие, на котором строится взаимодействие с программой является основой работы с компьютером. Но не всяким файлам и программам стоит доверять, а также информации о программе, распространяемой в интернете.
Проверка антивирусными средствами
Некоторые пользователи очень сильно доверяют своему антивирусы, хоть он и может заблокировать большинство известных вирусов, он не защищает на 100%. Поэтому, скачивая с ещё не известного вам сайта файл, воспользуйтесь, к примеру, VirusTotal. Данный сайт проверяет файл по многим антивирусам сразу, что-то около 60, это действительно более внушает, чем ваш один.
Можете проверить наш лаунчер на этом же сервисе, скачав по ссылкам с главной. Вот результаты версии TLauncher 2.66: Установщик для Windows; Файл для Windows, Файл для Linux/OS X;
Активность на сайте и в социальных сетях
У любого серьёзного программного обеспечения достаточно много страниц на сайте (а не только главная, где только скачать). Обычно у программ есть файл справки, своя регистрация и авторизация, много дополнительного контента для своего продукта, а возможно и не один продукт!
Лично у нас не только несколько продуктов (к примеру TLauncher PE), но и так же справка (с ответами на вопросы, не только связанных с лаунчером), плюс множество дополнительного контента к игре.
Не малое значение имеет активность в социальных сетях, у нормального ПО есть страница практически во всех. Как у нашего: VK.com, Twitter, Facebook, OK.ru (кстати не забудьте подписаться).
У крупных издателей, есть множество партнеров, прямых или же скрытых. К прямым можно отнести тех, кого сами разработчики и рекомендуют. К скрытым можно отнести тех, кому разработчики помогают без публичных демонстраций этого. Поэтому, если у программы есть множество партнеров, это может говорить о доверии к данным разработчикам (не путать с банальной рекламой за деньги).
Чем крупнее продукт, тем больше конкурентов пытается устроить им антипиар, тратя на это большие деньги. Поэтому, нельзя верить на слова и якобы доказательствам, которые ВЫ НЕ МОЖЕТЕ ПРОВЕРИТЬ САМИ. Типичные черты антипиара:
1) Негатив в отношении отдельно взятого ПО, за короткий промежуток времени, особенно у источников, которые продают рекламу.
2) На фоне антипира к определённой программе, идет реклама совершенно идентичного продукта (это сразу говорит о купленном источнике).
И не имеет значение про какой идёт речь, про аккаунт Mojang с лицензией или TLauncher аккаунт, нужно всегда использовать следующие рекомендации, они полностью исключают кражу вашего пароля:
1) Надёжный пароль. Самое главное и простое, использовать минимум 13 символов, среди которых есть буквы (разного регистра), цифры и специальные знаки. Если вы покупаете донат на серверах, вы становитесь уязвимой мишенью! Поэтому, нужно обязательно использовать сложный пароль.
По данным исследования аналитической компании Deloitte Canada, на сегодняшний день среднее время, которое пользователи компьютеров тратят на то, чтобы придумать пароль, значительно меньше того, которое требуется для его подбора: более 90% паролей можно взломать за считанные секунды.
2) Для почты нужно использовать двухфакторную аутификацию. Все популярные сервисы бесплатной почты (Yandex, GMail и другие) позволяют буквально за пару минут настроить дополнительную защиту: авторизацию по СМС или коду из приложения. Этот способ защитит вашу почту, даже если пароль смогли подобрать! TLauncher рекомендует!
3) На каждом сервере Minecraft использовать разные сложные пароли. Используя везде один пароль, вы даже не сможете узнать, источник вашего взлома! Никогда нельзя использовать один и тот же пароль!
Если вы не используете, не одну из этих рекомендаций, ваш аккаунт в опасности, возможно, прямо сейчас, кто-то пытается подобрать пароль к нему!
Открытый исходный код
Не мало важным является момент, открыт ли исходный код у программы. Если он полностью закрыт и предпринимаются серьёзные попытки к его сокрытию, нужно дважды подумать о добросовестности разработчиков при условии отсутствия цифровой подписи (и других маркеров безопасности).
Мы не публикуем свои исходные коды, но они достаточно открыты, что любой Java разработчик может проверить основные моменты исполнения TLauncher. Нам нечего скрывать в нём, поэтому это является одной из наших гарантий добросовестности.
Ответы на популярные вопросы
По нашему мнению, именно такие вопросы могут возникнуть у наших пользователей, по обеспечению своей сетевой безопасности:
Вопрос: Возьмем любой пароль из головы, например, «2456253462», сложно ли его взломать?
Рекомендуем, используйте сервис генерации пароля, чтобы подобрать по настоящему стойкий пароль.
Ответ: Покупая аккаунт, вы должны понимать, что он уже кому-то принадлежит. Вам бы понравилось, если бы кто-то играл под вашим аккаунтом? Скорее нет, поэтому, как только владелец это заметит, он сменит пароль, и вы потеряете доступ. Самый безопасный вариант: создавать свой аккаунт на Mojang, покупать лицензию и использовать рекомендации по паролю и защите почты (тогда его никто не сможет украсть).
Вопрос: Обязательно ли нужно включать двухфакторную авторизацию к почте?
Ответ: Да. Почта является одним из способов восстановления пароля на многих сайтах, поэтому нужно позаботиться о безопасности вашего почтового ящика. А именно этот способ защиты, является серьёзным гарантом не потерять почту. Чтобы включить эту защиту, напишите в поиске к примеру Яндекс следующее: «как включить двухфакторую авторизацию почта Яндекс» (Вместо Яндекс, ваш почтовый сервис).
Вопрос: Какие меры вы предпринимаете по защите аккаунта TLauncher и по отношению к аккаунтам Mojang?
Ответ: Все зарегистрированные аккаунты TLauncher хранятся в надёжном защищенном месте (для пользователей из СНГ, в Российском дата центре в Москве. Для пользователей ЕС и других стран, на территории европейского ДЦ), в связи с ограничением прав сотрудников на использование определенных данных компании (особенно аккаунтов TLauncher), утечки не имеет места быть.
Мы не записываем и не храним никакие данные по Mojang аккаунтам, все запросы на авторизацию идут на сервера Mojang. Программа на вашем компьютере не хранит пароль в открытом виде.
Пароли, которые вы вводите на серверах, также никак не фиксируются. Для этого нет технических возможностей у программы, любой может разобрать программу и проверить это.
Вопрос: Я увидел откровенную ложь про программу, которую уже давно использую, что делать?
Ответ: В зависимости от расположения источника, можно предпринять следующие шаги: если это публичная площадка (к примеру YouTube), то можно отправить жалобу на видео, плюс оставить комментарий о обмане другим пользователям.