Сделал свой первый мод для Майнкрафта, чтобы вам не пришлось
Привет, DTF. На днях я выпустил свой первый мод для майнкрафта, и сегодня решил поделиться своими впечатлениями о пути который прошёл, и который пройти ещё предстоит.
Вступление
Начну издалека. Говорят, что у каждого человека раз в год наступает такой момент, когда он резко заваливается в майнкрафт на пару недель, а потом не заходит до следующего такого порыва. Так вот, у меня такого нет. Я активно играл в майнкрафт в версии с 1.1 по 1.2.5 (ещё будучи в школе). Дальше я вкатывался раз в пару лет, офигевал от новых штук и понимал что игра становится слишком большой и разбираться в ней мне каждый раз всё тяжелее.
С возрастом я начинал смотреть на подобные забеги с иного угла. Я начинал задумываться о моддинге, когда уже учился на программиста, но как-то не складывалось. И я понял, что каждый раз когда я обращаю внимание на игру, я начинаю ловить себя на мысли что хочу сделать свой мод. Но мне всегда было не до этого, да и как-то всё сложно было. Чтобы избегать соблазна я вовсе начал избегать игру. Пару раз я сдавался, но это ни к чему не приводило. Даже чуть-чуть играл на сервере DTF.
Но недавно я сдался и меня затащили друзья на один сервер, после игры на котором я понял что пора.
Подготовка. Битва загрузчиков. Сага. Затмение
Пару месяцев назад я начал изучать материал. Я знал что есть Forge, что есть материалы и начал гуглить первые уроки для моддинга на версию 1.20, так как она самая актуальная. Я нашёл классный канал на ютубе, видео которого я изучал и буду изучать и дальше. Пока я искал гайды, я узнал что есть какой-то Fabric, и что для него тоже делают моды. Также я что-то услышал о проекте NeoForge, но я решил не вдаваться в подробности, так как посчитал что это подражатели Форджа. Фабрик расхваливали за то, что он проще для разработки, что он быстрее обновляется, но у него меньше возможностей. Меня подобное не сильно устроило, так как первый проект который я задумал, как всегда был настолько амбициозен, что вполне вероятно он никогда не выйдет.
Я не буду рассказывать детали мода, которого я тогда придумал, так как не хочу раскрывать карты до каких-либо демонстраций. Отмечу лишь что в этой статье речь идёт о моде, который родился в процессе создания этого мода...
Первые уроки шли туго, так как я вливался в новую для себя экосистему. Тут наверное пора уже отметить тот факт, что я программист, раньше специализировался на C++, но последние год-два пересел на скриптовые языки. Java не вызывает у меня вообще никаких проблем, однако я сильно путался в том как работает Майнкрафт и Фордж. Со временем я начал привыкать и у меня начали получаться простейшие вещи: кастомный предмет, рецепт для крафта, блок.
Но в какой-то момент меня что-то дёрнуло всё же разобраться что за NeoForge такой мне попадался и почему он вообще существует. Оказывается, что в мире моддинга для майнкрафта происходят весьма серьёзные драмы. Один из (вроде как) ведущих разработчиков Форжа оказался токсиком, которого другие разрабы устали тепреть и ушли. И по сути NeoForge это почти те же люди, но без пары других. Более подробнее о ситуации можно почитать на официальном сайте NeoForge.
Я понял, что раз так, то вероятно пора переходить на NeoForge так как скорее всего обычный Фордж, по всей видимости со временем начнёт терять популярность. И тут началось веселье. На тот момент я сидел на версии майнкрафта 1.20.4. Видео с гайдами выходили для 1.20.1, а начиная с версии 1.20.2 НеоФордж постепенно начинал терять совместимость с Форджом, и случилось так что к версии 1.20.4, много разных моментов из гайдов уже были не актуальны.
Документация НеоФорджа не такая наглядная, как мне бы хотелось, а гайдов конкретно под этот загрузчик модов, вроде как, не было. Моим спасением стало несколько вещей:
- Дискорд НеоФорджа, в котором можно было погуглить ошибки
- Смекалка и личный опыт
- Моды с открытым исходным кодом
Боже, храни опенсоурс.
Большое количество модов не обновлялись с 1.20.1, но те которые переходили на более новые патчи - спасали меня. У меня сейчас больше десятка репозиториев склонировано локально, которые я изучал вдоль и поперёк. К счастью у меня есть друг, который весьма хорошо знает то, какие моды уже есть. Я спрашивал у него примерный функционал, который меня интересовал, друг мне подсказывал мод, и я смотрел на реализацию.
Как уже было отмечено выше, изначально я делал один мод. В определённый момент я дошёл до создания своих ковров, и я подумал, а почему бы мне не сделать так чтобы ковры можно было ставить вертикально. Ну то есть, повесить ковёр на стену. Ставь лайк если висит такой дома.
Поиск информации привёл к тому, что скорее всего такого мода ещё нет, либо есть но он плохо ищется. К тому времени уже вышла версия 1.20.6, и там меня ждал новый прикол. Оказывается, это нормальная практика выкатывать минорный патч, который ломает совместимость с предыдущим. К счастью существует человек, который собирает более подробную информацию о том как переходить с одной версии на другую в одном документе. Я решил отвлечься от своего большого мода на более мелкий.
Начало разработки
Идея была проста. В Майнкрафте есть блоки, которые могут быть повёрнуты в разные стороны. Всего таких сторон 6:
- Верх
- Низ
- Север
- Восток
- Юг
- Запад
Для того, чтобы блок можно было повернуть, нужно добавить ему параметр направления и немного логики, которая будет его поворачивать. Я подсмотрел как это делается у блока брёвен, горизонтальную модельку сделал вертикальной и за один или два дня сделал рабочий прототип.
Концепт заработал, чему я был очень рад. Я сделал такую же логику для блоков со стандартной текстурой ковров и выложил скриншот с демонстрацией в дискорд-канал НеоФорджа, где люди публикуют свои наработки. Скриншот довольно быстро затерялся и я получил 0 фидбека. Тогда я решил выложить демонстрацию в подобный канал, но у же в дискорде... Фабрика. Да, к тому моменту я уже узнал что есть моды которые сразу разрабатываются под несколько загрузчиков и решил попробовать также.
В дискорде Фабрика демонстрацию встретили довольно тепло. Однако, как видно на гифке, между блоком который размещён на земле и блоком который размещён на стене - имеется пустое пространство. Несмотря на то, что блок ковра занимает всего 1 воксель в высоту, он считается полноценным блоком, и следующий блок будет поставлен над ним. В дискорде Фабрика мне дали наводку, что есть блок лиан, который может вмещать в себя несколько моделек лиан. Идея также была проста, но несколько отличалась.
Если раньше направление блока было одним параметром, то у лианы было 5 параметров. Каждый из них обозначал: смотрит ли блок в эту сторону или не смотрит. Их было пять, а не шесть, потому что лиану нельзя разместить в нижнюю часть. Вот тут и началось всё самое весёлое.
Концепт был набросан быстро, однако допиливал я его неделю.
Во-первых, ковры очень легко потерять. Если ты поставишь на ковёр другой блок - ковёр исчезнет и больше ты его не получишь. В какой-то степени это логично. Однако если у тебя в блоке стоит 2 или больше ковра, то ты безвозвратно теряешь ресурсы. Тут довольно просто всё было. Я сделал проверку, что если у ковра всего 1 сторона размещена, то его можно заменить на другой блок, как на гифке выше. Иначе блок поставится сверху.
Во-вторых, я не хотел делать отдельную вкладку в креативе где будет отдельный ковёр, который можно разместить вертикально или на потолок. В моём понимании игрок должен взять ванильный предмет ковра, прожать ПКМ на стену и там появится вертикальный ковёр. Похожая реализация есть у факела. В Майнкрафте есть обычный факел и настенный факел, у которого иная моделька. Один предмет, который может ставить два разных блока. Здесь мне пришлось лесть туда, куда лесть мне не хотелось.
Для того чтобы сделать подобную механику для предмета мне нужно было иначе определять этот предмет в коде. Но проблема в том, что он был определён разработчиками игры, и просто так это исправить нельзя никак. Однако... Существует такое понятие, как миксины (mixin). Это механизм, который позволяет инжектить свой код в код который был написан разработчиками игры. Я сделал так, что когда игрок пытается разместить блок ковра - ставился не дефолтный ковёр, а мой кастомный, который может быть в разных позициях. Да, довольно грязно, но это работает.
Тут же появилась проблема, что когда игрок находит на земле дефолтный ковёр на земле, и клацает по нему , чтобы поставить вертикальную часть - дефолтный ковёр пропадал. На словах всё просто, но я довольно долго настраивал поведение размещение кастомного ковра. В итоге сделал так, что дефолтный ковёр исчезает, а ставится кастомный, но с учётом того что у него уже есть нижняя часть.
В-третьих, надо было настроить генерацию данных. Большой пласт данных игры хранится в формате json. Там находится локализация, рецепты крафтов, информация о генерации, возможные состояния блоков, таблицы с лутом и ещё многое другое. В игре есть 16 ковров и каждому ковру нужно прописать что у него может быть вертикальная стенка, которая смотрит в одну сторону, а может быть вертикальная стенка в другую сторону. Чтобы не прописывать все эти данные вручную - их можно сгенерировать. Для этого нужно просто написать пару методов на Java.
Проблемой тут оказалось, что я не мог найти подходящий шаблон кода для блоков у которых есть несколько состояний, и каждое должно учитываться и иметь свои параметры. Я долго пытался воспроизвести код разработчиков игры, но в итоге нашёл похожую реализацию в другом моде и адаптировал под себя.
Но это ещё не всё. Другая проблема была в уничтожении блока. Ты можешь потратить пять ковров для того, чтобы расставить их на разные стенки, и ещё разместить на полу. Но если ты сломаешь блок, то выпадет... 1 ковёр. Чтобы мод был более честным, логично было сделать что при уничтожении падает ровно столько ковров, сколько было поставлено. Казалось бы, просто посчитать сколько сторон у блока, столько ковров при уничтожении выдавать. Но нет.
Система лута, которая зависит от состояния блока работает таким образом, что тебе нужно прописать лут на каждое возможное состояние каждого параметра. А я напомню, параметров 6. И каждый из них может иметь одно из двух состояний. То есть в данном случае нужно просчитать каждое возможное значение с каждым состоянием. В тот момент я обратил внимание на блок снега. Когда ты его размещаешь на земле он имеет 1 слой и высоту в 1 воксель. При уничтожении он даёт несколько снежков. Когда ты размещаешь на нём ещё один блок снега, он увеличивается и даёт больше дропа.
Я долго ходил вокруг да около, но в итоге добавил ковру ещё один параметр - количество граней. И тут уже всё стало просто. Если 1 грань, то выпадает 1 ковёр, если 2 грани, то 2 ковра и так далее...
На самом деле я упустил ещё много нюансов, но о них я уже успел забыть. Моим следующим шагом стали
Бэкпортинг и публикация
Версия для 1.20.6 была готова. Однако это далеко не самый популярный патч у Майнкрафта 1.20. Поигравшись с настройками, и изменив немного кода, я смог собрать версию для 1.20.4. С 1.20.1 всё было веселее. Мне нужно было переписать код НеоФорджа под Фордж, так как у них была полная совместимость на тот момент. Просто поиграться с настройками у меня не вышло, мне пришлось создать новый проект для Форджа, и переносить туда код.
Дальше я отправился на CurseForge и создал там страницу мода. Процесс был для меня уже знакомым, ранее я публиковал там уже аддоны для World of Warcraft. Я залил три файла версии 1.0.0, и пока они проверялись, начал заливать их же на другой сайт с модами - Modrinth. Взволнованный и удовлетворённый я пошёл спать.
Проверка на курсфордже была где-то 16 часов. Точно уже не вспомню. Модринт всё ещё проверял файлы. В этот же день произошёл и релиз Майнкрафта 1.21, а вскоре и НеоФорджа для этой версии. Быстро подсуетившись я смог перенести мод на новую версию, попутно поправив один баг. Версия мода 1.0.1 для версий 1.20.1, 1.20.4, 1.20.6, 1.21 вышла тем же вечером. Модринт продолжал проверять файлы.
На курсфордже начали идти первые загрузки. Версии я обновлял не одновременно, а с небольшим интервалом, что позволило мне немного дольше повисеть в категории Latest Updates. На следующий день я начал изучать как люди делают моды сразу на несколько загрузчиков. Я обнаружил 3 способа.
Первый способ - отдельно создавать проект под каждый загрузчик. Самый ужасный способ. Логика поведения у моего блока должна быть везде одинаковая. Но в НеоФордже и Фабрике одни и те же методы имеют разные названия, и могут иметь похожую, но не такую же реализацию. Я просидел минут 40 пытаясь перенести код, но в итоге плюнул на этот вариант.
Второй способ - использование Architectury API. У этого проекта есть сайт, на котором ты можешь сгенерировать шаблон для своего мода. В нём будут папки под каждый загрузчик, который ты выберешь. Основной код будет размещён в папке common. Если есть код который работает специфично для НеоФорджа, то он пишется уже в папке НеоФорджа. Также и с Фабриком. Я пока до конца не разобрался с этим способом (опять документации почти что 0 и приходится разбираться на примере других модов), но я просто перенёс весь код в папку Common, сделав несколько изменений, и смог собрать версию мода под Фабрик.
Третий способ - использовать шаблон мультизагрузки. По сути принцип похож на второй способ, но без дополнительных зависимостей в виде Architectury API.
Между вторым и третьим способом наверняка больше различий, но я пока не так далеко зашёл. В итоге за ещё один день я смог портировать мод на все те же версии Майнкрафта, но уже для Фабрика. И примерно в это же время Модринт закончил проверку файлов. Я сразу же удалил старые файлы, и залил туда все версии своего мода и пошёл спать.
Заключение
Довольно простенький мод весьма потрепал меня. Ушла где-то неделя разработки и не один литр чая. На текущий момент я вижу что любители Фабрика предпочитают качать мод для версии 1.21, в то же время следующим по популярности идёт мод для Форжа на версию 1.20.1, а на текущий момент я уже начал делать следующий мелкий мод на добавление шапочки из фольги. Этот мод тоже будет для НеоФорджа и Фабрика скорее всего, но вот более крупные моды я не решусь делать сразу под разные загрузчики. Фордж, ожидаемо, начал терять популярность. Многие моды начали переходить на Нео, а на данный момент на КурсФордже для версии 1.21 Фордж имеет самое низкое количество модов.
Для себя я сделал вывод, что НеоФордж мне удобнее Фабрика даже при том что он обновляется быстрее, и сообщество там более активное (по крайней мере в дискорде). А ведь помимо них есть ещё и другой загрузчик модов - Quilt, который вроде как является ответвлением от Фабрика и вроде как топит за... Современные ценности.
Если кому интересен мод, то его можно найти на CurseForge или Modrinth.
• Автор рассказывает о своем опыте создания мода для Minecraft.
• Мод добавляет блок лиан с несколькими параметрами для размещения в игре.
• Автор столкнулся с проблемами при создании мода, такими как потеря ковров и настройка генерации данных.
• Автор использовал миксины для инжектирования своего кода в код игры.
• Были проблемы с уничтожением блока и определением количества граней для ковра.
• Автор создал версию мода для разных версий Minecraft и опубликовал его на различных сайтах с модами.
• Автор столкнулся с трудностями при переносе кода на несколько загрузчиков модов.
• Автор сделал вывод, что НеоФордж ему удобнее Фабрика, даже при том что он обновляется быстрее.
Спасибо, а то устал читать
Поскольку я приверженец ваниллы (для моих периодических "двухнедельных майнкрафт-фаз" её вполне достаточно), за моды и их установку не шарю от слова совсем. Для меня даже шейдеры установить проблема, с которой я третий день не хочу разбираться. Тем не менее, я смотрю много контента по майну и про фордж и фабрик краем уха слышал. И как же было интересно прочитать подобный пост о разработке мода, казалось бы, такой простой визуально вещи как вертикальный ковёр. Нужно учесть кучу логики, перелопатить исходный код чтобы найти в нём референсы, постоянно крутить мозгами для достижения нужного результата и после этого ещё и озаботиться процессом портирования и апдейта своего мода. А ведь это "всего лишь" вертикальный ковёр! Я теперь даже боюсь представить как реализовывается (и реализовывается ли вообще) возможность установки различных объектов поверх ковра, чтобы они не ставились на целый блок выше самого ковра, а именно чтобы осуществлялась некая синергия между ними.
Короче, пост крутой, в меру подробный и понятный для человека, который последний раз программированием занимался в школьном паскальАБС и майнкрафт-моддинг наблюдает только в рофляных роликах по типу "заспавнил ебаку в пещере теперь ору и убегаю". Надеюсь когда я проснусь завтра на работу он будет в топе. Удачи тебе!
Я сам прошёл через этот этап принятия модов. Мне друг помогал, и я даже в процессе купил лицензию, теперь с друзьями играем на разных сборках и проходим моды
возможность установки различных объектов поверх ковраНе, тут синергии никакой нет. Предмет просто поставится сверху над блоком. Если это возможно, то я пока не придумал как
Надеюсь когда я проснусь завтра на работу он будет в топе. Удачи тебе!Спасибо!
Какой ужас, мне страшно это читать
«Говорят, что у каждого человека раз в год наступает такой момент, когда он резко заваливается в майнкрафт на пару недель, а потом не заходит до следующего такого порыва.» вот это жизная жиза, у самого так же, обычно в соляново захожу в такие порывы, но иногда и с друзьями, но перед нг традиция у нас, закупаемся едой и заходим в майнкрафт строить огромную новогоднюю ёлку под рождественские песни.
Я так же захожу, не смотря на новые версии сижу на 1.7.10 ftb IE. Лучше сборки для меня пока не существует