Java * Туториал Всем привет! Эта статья была написана из-за отсутствия адекватных русскоязычных руководств по моддингу, особенно для новых версий Minecraft. То, что я опишу ниже, будет применимо для таких загрузчиков модов, как Fabric и Forge, а также для реализации различных функций. Для начала — немного теории. Когда вы пишете любую программу на Java и компилируете её, вы получаете файл с расширением .jar. Если открыть этот файл как архив, то внутри, среди прочего, вы найдёте файлы с расширением .class. Это и есть ваш код, но уже в виде Java байт-кода. Далее эти файлы загружаются в виртуальную машину Java (JVM) и выполняются. Любой загрузчик модов построен на том, что он модифицирует процесс загрузки классов, изменяя байт-код этих самых классов в соответствии с указаниями из модов. (Да, технически я очень упростил). Однако не всё так просто. Зачастую код коммерческих приложений, включая Minecraft, проходит через обфускацию — процесс, при котором оригинальные названия классов, полей и методов заменяются на бессмысленные символы (например, a, b, aa). Это затрудняет обратную разработку. С Minecraft такая ситуация была долгое время, хотя в последних версиях официальные маппинги стали значительно лучше(а недавно и вовсе обфускацию отменили).Разумеется, также понадобится среда разработки, такая как IntelliJ IDEA. Я выберу загрузчик Fabric, а в качестве инструмента для модификации байт-кода — Mixin. Всё это уже собрано в удобный шаблон проекта. Итак, переходим в официальный репозиторий Fabric Example Mod . В ветке выбираем нужную версию игры (я выбираю 1.20.x). После того, как скачаем, нам нужно понять какие требования к версии JDK у сборщика gradle, переходим в build.gradle и ищем: java { // Loom will automatically attach sourcesJar to a RemapSourcesJar task and to the "build" task // if it is present. // If you remove this line, sources will not be generated. withSourcesJar() sourceCompatibility = JavaVersion.VERSION_21 targetCompatibility = JavaVersion.VERSION_21 } Видно что требует jdk 21, качаем и ставим. Так как данный репозиторий позволяет сразу запустить модуль(клиент или сервер) и протестировать что мы написали, то по умолчанию к коду не будут применяться карты обфускации, поэтому вручную их укажем. Я уже указал: loom { splitEnvironmentSourceSets() mixin { defaultRefmapName = "your-mod-id-refmap.json" useLegacyMixinAp = true } mods { "modid" { sourceSet sourceSets.client } } } тут я предлагаю вам стереть упоминания модуля main, в modid ибо не ясно зачем он. Видимо это что-то из API, но API мы не используем.Так вот, вам надо вставить: mixin { defaultRefmapName = "your-mod-id-refmap.json" useLegacyMixinAp = true } Что бы вышло так. К слову defaultRefmapName это название файла, в которым будут данные, которые сопоставляют что мы изменили в деобфусцированном коде, и где это находится в оригинальном, укажите какое угодно название. Теперь надо скачать IDEA (у меня версия 2022.3.3 когда ещё не добавили ИИ). Открываем IDEA и импортируем проект, скорей всего получите такое(иногда вообще ничего не будет, вручную перезагрузите gradle проект): Ошибка из-за того, что IDEA не использует JAVA установленную в систему. Собственно это происходит потому, что IDEA почему-то даже не пытается искать в системных переменных и выбирает последнюю версию. Поэтому переходим по File — Settings — Build, Execution, Deployment — Gradle — В Пункте Gradle JVM выбираем наш JDK , затем Apply и OK. Затем Project Structure — Project — SDK — выбираем наш JDK, так же Apply и OK, снова перезагружаем gradle проект. После этого подтянуться зависимости, будет это около 10 минут. Теперь генерируем исходный код. Запускаем CMD переходим в корень проекта и выполняем gradlew genSources. Теперь исходный код находится в .gradle/loom-cache/minecraftMaven/net/Minecraft и тут две папки клиент и сервер. Да мы при создании мода укажем что меняем, и от этого будем отталкиваться, переходим в клиент и там переходим в архив который перед форматом не содержит source , а там в net.minecraft и всё, код игры. Теперь не много о структуре проекта. Собственно как и всегда код проекта в src, и у вас будет два модуля это main и client, но ещё можно добавить server, в зависимости от модуля, вам будут доступны соответствующие классы, но почему в main не доступно почти ничего, поэтому я просто советую его удалить(буквально нажать и delete). В папке src -> client есть java, там не посредственно код а в resources конфиги, собственно для нас будет два главных: fabric.mod.json — конфиг загрузчика, там на самом деле не много и он на почти не нужен, так как апи мы не будем использовать, а будем использовать перехватчик ClassLoader , то есть миксины. fabric.mod.json синтаксис "schemaVersion": 1 Назначение: Версия схемы Fabric mod metadata Значения: Всегда 1Всегда обязателен "id": "yourmod" Назначение: Уникальный идентификатор мода Формат: [a-z][a-z0-9_]Всегда обязателен "version": "1.0.0" Назначение: Версия мода Формат: Semantic Versioning (major.minor.patch)Всегда обязателен "name": "Your Awesome Mod" Назначение: Человекочитаемое название мода Формат: Любая строка Обязательный пункт description Назначение: Описание мода Формат: Текст "authors": [ "YourName", "AnotherDeveloper" ] Альтернатива: Можно использовать "contributors" "contributors": { "Developer1": "Главный разработчик", "Artist1": "Художник текстур" } "contact": { "homepage": " https://yourmod.site", "sources": " https://github.com/yourname/yourmod", "issues": " https://github.com/yourname/yourmod/issues", "discord": " https://discord.gg/yourmod", "email": " support@yourmod.site " } "license": "MIT" "icon": "assets/yourmod/icon.png" Формат: PNG, размер 64×64 или 128×128 пикселей Путь: Относительно папки src/main/resources/ "environment": "" назначение: ГДЕ РАБОТАЕТ МОД Значения: "" — везде (клиент + сервер) "client" — только клиент "server" — только сервер "dedicated_server" — только выделенный сервер "entrypoints": { "main": [ "com.yourname.yourmod.YourMod" ], "client": [ "com.yourname.yourmod.client.YourModClient" ], "server": [ "com.yourname.yourmod.server.YourModServer" ] } назначение: точки входа. Если не используем API , можно не указывать значения. "mixins": [ "yourmod.mixins.json", "yourmod.client.mixins.json" ] Назначение: конфиги с информацией о инъекцией кода(это мы и будем использовать) Расширенный вариант: "mixins": [ { "config": "yourmod.mixins.json", "environment": "*" }, { "config": "yourmod.client.mixins.json", "environment": "client" }, { "config": "yourmod.server.mixins.json", "environment": "server" } ] "depends": { "fabricloader": ">=0.15.0", "minecraft": "~1.20.1", "java": ">=17", "fabric-api": "*" } Назначение: Зависимости мода Синтаксис: "*" — любая версия "1.0.0" — точная версия ">=1.0.0" — версия или выше "<=1.5.0" — версия или ниже "1.0.0 — 2.0.0" — диапазон версий "~1.0.0" — совместимая версия (1.0.x) Пример с зависимостью от других модов: "depends": { "fabricloader": ">=0.15.0", "minecraft": "~1.20.1", "java": ">=17", "fabric-api": "*", "cloth-config": ">=11.0.0", "rei": ">=12.0.0" } "suggests": { "modmenu": ">=7.0.0", "jei": ">=15.0.0", "worldedit": "*" } Назначение: рекомендация модов Source: https://habr.com/ru/articles/971448/