Mod Menu - это мод для Майнкрафт, который добавляет в игру полноценное меню со списком всех установленных модов. Вместо того чтобы копаться в папках или гадать, что за мод у тебя стоит, ты просто открываешь меню и видишь всё как на ладони. Если мод поддерживает конфигурацию, то прямо оттуда можно зайти в его настройки - удобно и быстро.
Но Mod Menu - это не просто список. Он умеет больше: поддерживает переводы названий и описаний модов, может отфильтровывать библиотеки от обычных модов (чтобы не засорять список), проверяет обновления для модов с Modrinth или собственных источников. В общем, штука полезная, особенно если у тебя сборка из 50+ модов.
Mod Menu работает на Fabric или Quilt для Minecraft: Java Edition 1.14 и новее.
У Mod Menu есть несколько API, чтобы разработчики могли улучшить отображение своих модов. Всё через языковые ключи, JSON-метаданные и Java API.
Можно перевести название, краткое описание и полное описание мода без единой строчки Java-кода. Просто добавь ключи перевода в нужном формате.
Вот пример перевода Mod Menu на пиратский английский. Чтобы сделать свой, замени modmenu в конце (НЕ в начале) ключа на ID своего мода, например modmenu.descriptionTranslation.traverse.
en_pt.json
"modmenu.nameTranslation.modmenu": "Menu o' mods!",
"modmenu.descriptionTranslation.modmenu": "Menu o' mods ye installed matey!",
"modmenu.summaryTranslation.modmenu": "Menu o' mods ye installed matey!"
Перевод summary тут избыточен, но он показывает, что можно переводить краткое описание отдельно от полного.
Многое можно добавить прямо в fabric.mod.json через блок custom.
Вот пример использования разных фич:
fabric.mod.json
{
...
"custom": {
"modmenu": {
"links": {
"modmenu.discord": "https://discord.gg/jEGF5fb"
},
"badges": [ "library", "deprecated" ],
"parent": {
"id": "example-api",
"name": "Example API",
"description": "Modular example library",
"icon": "assets/example-api-module-v1/parent_icon.png",
"badges": [ "library" ]
},
"update_checker": true
}
}
}
"badges": [ ])Значок Client ставится автоматически для клиентских модов (если указано "environment": "client"). А вот Library и Deprecated нужно прописывать вручную.
Допустимые значения:
library - для модов-зависимостей, которые не нужно показывать пользователю по умолчаниюdeprecated - для устаревших модов (например, старые модули API)Остальные значки игнорируются. Свои добавить нельзя, но можно предложить новую фичу через issue.
"links": { })Объект links позволяет добавить гиперссылки в конец описания мода. Если указан контакт sources в стандартных метаданных fabric.mod.json, он тоже попадёт в раздел ссылок.
Ключи из links используются как ключи перевода. Например:
fabric.mod.json
"custom": {
"modmenu": {
"links": {
"modmenu.discord": "https://discord.gg/jEGF5fb"
}
}
}
Будет показана ссылка с текстом "Discord", потому что это английский перевод ключа modmenu.discord.
У Mod Menu есть несколько стандартных переводов для ссылок. Все ключи имеют формат modmenu.<тип>.
Можно добавлять и свои ссылки, но используй СВОЁ пространство имён (не modmenu) для кастомных ключей.
"parent": "mod_id" или { })Родители нужны, чтобы показать мод как дочерний для другого. Это удобно для модов, разбитых на модули. Например:
fabric.mod.json
"custom": {
"modmenu": {
"parent": "flamingo"
}
}
Если родитель - не настоящий мод, а виртуальный, можно задать его метаданные прямо тут:
fabric.mod.json
"custom": {
"modmenu": {
"parent": {
"id": "this-mod-isnt-real",
"name": "Fake Mod",
"description": "Do cool stuff with this fake mod",
"icon": "assets/real-mod/fake-mod-icon.png",
"badges": [ "library" ]
}
}
}
Виртуальный родитель поддерживает только:
id (строка)name (строка)description (строка)icon (строка)badges (массив строк)"update_checker": false)По умолчанию Mod Menu проверяет обновления через хеш jar-файла на Modrinth. Если найдёт совпадение, то сравнивает версию и сообщает о наличии апдейта.
Отключить можно так:
fabric.mod.json
"custom": {
"modmenu": {
"update_checker": false
}
}
Для Quilt всё то же самое, но формат немного другой. Вместо блока "modmenu" внутри "custom", он кладётся прямо в корень объекта:
quilt.mod.json
{
...
"modmenu": {
// Тут ссылки, значки и прочее
}
}
Чтобы использовать Java API, добавь Mod Menu как зависимость времени компиляции в Gradle. Это не сделает твой мод зависимым от Mod Menu, но даст возможность тестировать.
build.gradle
// Добавь maven репозиторий Terraformers в блок repositories
repositories {
maven {
name = "Terraformers"
url = "https://maven.terraformersmc.com/"
}
}
// Добавь Mod Menu как зависимость в окружении
dependencies {
// До Minecraft 26.x используй "modImplementation" вместо этого
implementation("com.terraformersmc:modmenu:${project.modmenu_version}")
}
Потом пропиши версию Mod Menu в gradle.properties. Актуальную версию можно взять тут, но если у тебя не последняя версия Майнкрафт, может понадобиться другая - смотри список версий.
gradle.properties
modmenu_version=НОМЕР_ВЕРСИИ_ТУТА
Если не хочешь тащить Mod Menu в окружение для тестов, но нужно компилировать под Java API - используй
modCompileOnlyвместоmodImplementation. Это сработает даже если Mod Menu не обновлён под твою версию Minecraft.
Реализуй интерфейс ModMenuApi на классе и добавь его как точку входа типа "modmenu" в fabric.mod.json:
fabric.mod.json
"entrypoints": {
"modmenu": [ "com.example.mod.ExampleModMenuApiImpl" ]
}
Моды могут предоставить фабрику экранов для кастомной конфигурации через кнопку настроек. Реализуй метод getModConfigScreenFactory.
ID мода определяется автоматически по контейнеру, из которого пришла точка входа.
Моды могут предоставлять фабрики экранов для других модов через метод getProvidedConfigScreenFactories. Это нужно, например, для Cloth Config, который может показывать настройки для модов, использующих его API.
Моды могут назначать другим модам значок Modpack, реализовав метод attachModpackBadges. Например:
@Override
public void attachModpackBadges(Consumer<String> consumer) {
consumer.accept("modmenu"); // Указывает, что 'modmenu' часть модпака
}
Внутренние моды (сам Minecraft и загрузчик) получить этот значок не могут - они не распространяются в составе типичного модпака.
У ModMenuApi есть несколько методов для работы с меню модов.
Screen createModsScreen(Screen previous)
Text createModsButtonText()