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. Незаверяемый и необновляемый мод — это дыра, поэтому такая публикация отклоняется.