Опциональные моды
Оператор может дать игроку выбор опциональных модов в лаунчере — на стороне каждой
сборки. Всё описывается в laminara.settings.json профиля, рядом с политиками файлов,
и штампуется в подписанный манифест при publish.
Как это работает
Манифест несёт ВСЕ файлы (базовые и опциональные), каждый подписан и лежит в CAS.
Файл считается опциональным, если он указан в files какой-либо опции; иначе он
базовый и ставится всегда. Игрок выбирает опции в лаунчере — клиент ставит базу
плюс выбранное и удаляет снятое. Подделать выбор нельзя: можно выбрать лишь
подмножество уже подписанных файлов.
Авторинг
Положите все моды (базовые и опциональные) в mods/ профиля и опишите блок features:
{ "loader": "neoforge", "userWritable": ["config/", "options.txt"], "features": { "groups": [ { "id": "graphics", "title": "Графика", "selection": "single", "options": [ { "id": "sodium", "title": "Sodium", "defaultEnabled": true, "files": ["mods/sodium.jar"], "meta": { "badge": "Рекомендуется" }, "groups": [ { "id": "extras", "title": "Дополнения Sodium", "selection": "multi", "options": [ { "id": "extra", "title": "Sodium Extra", "files": ["mods/sodium-extra.jar"] } ] } ] }, { "id": "embeddium", "title": "Embeddium", "files": ["mods/embeddium.jar", "mods/oculus.jar"] } ] }, { "id": "utility", "title": "Утилиты", "selection": "multi", "options": [ { "id": "jei", "title": "JEI", "defaultEnabled": true, "files": ["mods/jei.jar"] } ] } ] }}selection:single— ровно один выбор (радио);multi— любое число (чекбоксы).required: trueв single-группе — выбор нельзя обнулить (всегда активна одна опция).defaultEnabled— опция включена по умолчанию (в single-группе не больше одной).files— массив путей относительно профиля; можно несколько на опцию.groupsвнутри опции — вложенный подвыбор, видимый только пока опция активна.meta.badge/meta.icon— украшения строки в лаунчере; размер опции считается сам.
Правила
Публикация отклонит сборку, если: id не уникальны среди соседей; selection не задан;
файл опции отсутствует на диске; в single-группе больше одного дефолта; опциональный
файл попадает под userWritable (снятый user-writable нельзя было бы удалить —
опциональные моды должны быть неизменяемыми). Общие зависимости базовых модов НЕ
указывайте ни в одной опции — иначе они станут условными; оставьте их вне features,
и они будут базовыми.