userWritable
Игрок волен менять. Лаунчер не проверяет, не перезаписывает и не удаляет такие файлы — правки переживают обновления.
Рядом с профилем install кладёт файл laminara.settings.json — политику сборки, которую задаёт оператор на сервере. Игрок её не видит и не может изменить: она уезжает внутри подписанного манифеста, так что подделать нельзя.
{ "userWritable": ["options.txt", "config/", "saves/", "screenshots/"], "enforced": ["config/anticheat/**"], "serverAddress": "play.example.net"}Файл предзаполняется при подготовке сборки разумными значениями — правьте его под свою сборку и снова публикуйте.
Каждый файл сборки попадает ровно в один класс. Приоритет — сначала enforced, затем userWritable, затем обычный.
userWritable
Игрок волен менять. Лаунчер не проверяет, не перезаписывает и не удаляет такие файлы — правки переживают обновления.
enforced
Всегда возвращаются к опубликованному виду — даже правку того же размера лаунчер откатит. Ваши ассеты, форс-настройки.
обычный
Всё, что не в списках. Проверяется по хешу, восстанавливается при расхождении, удаляется, если ушло из манифеста.
Приоритет enforced над userWritable позволяет открыть игроку целую папку, но запереть внутри неё поддерево: userWritable: ["config/"], enforced: ["config/anticheat/**"].
Пути — от корня сборки, через /. Язык шаблонов намеренно скупой, чтобы список случайно не «расширился»:
| Шаблон | Что совпадает |
|---|---|
options.txt | ровно этот файл |
config/ | вся папка config и всё под ней |
screenshots/*.png | .png прямо в папке (не глубже) |
**/*.log | любой .log на любой глубине |
config/anticheat/** | всё поддерево config/anticheat |
* не пересекает /, ** — это целый сегмент пути. Всё остальное — буквально.
serverAddress (host или host:port, порт по умолчанию 25565) — адрес игрового сервера этой сборки. Лаунчер пингует его по протоколу Minecraft и показывает живой онлайн игроков: по каждой сборке и суммарно по проекту. Поле необязательное; без него счётчик просто не показывается.
Publish не даст добавить в userWritable то, что ломает запуск: mods/, libraries/, versions/, рантайм Java, assets/ и корневые .jar. Незаверяемый и необновляемый мод — это дыра, поэтому такая публикация отклоняется.
В том же файле можно задать jvmArgs, gameArgs, classpath, classpathExclude и mainClass —
это нужно сборкам со сторонними патчами, которые меняют схему запуска. Для lwjgl3ify этого не
требуется: его ставит рецепт compat=lwjgl3ify. Подробности и пример — в
разделе Своя Java и нестандартный запуск.