Упаковка пользовательского контента EternalTD
EternalTD загружает пользовательский контент из папок ниже. ZIP-архивы обрабатывает общий импортёр MagmaCore; метаданные пакета управляют его отображением в /etd setup.
Корневая папка импорта
Ручной импорт по-прежнему проходит через:
plugins/EternalTD/imports/
После ручного импорта контента выполните:
/etd reload
Канонические папки контента
Текущий плагин сканирует эти папки в нижнем регистре:
plugins/EternalTD/levels/
plugins/EternalTD/waves/
plugins/EternalTD/npcs/
plugins/EternalTD/worlds/
Примечание об устаревших версиях:
Levels/иNPCs/— это устаревшие имена папок.- EternalTD теперь мигрирует их в
levels/иnpcs/при запуске и перезагрузке.
Правила упаковки миров
EternalTD рассматривает миры в:
plugins/EternalTD/worlds/
как шаблоны миров.
Когда игрок начинает уровень, EternalTD клонирует соответствующий шаблонный мир в контейнер миров сервера и запускает сессию в этой клонированной копии.
Корень шаблона проверяется до копирования, вложенные файлы и папки — во время него. При ошибке частичная копия откатывается. Копирование отклоняется при любом из условий:
- в корне шаблона нет
level.dat - папка шаблона является символической ссылкой или содержит символическую ссылку где-либо внутри
- шаблон содержит файл с именем
.eternaltd-instance
Последнее имя зарезервировано: EternalTD записывает его в рабочие копии как маркер владения и проверяет идентичность экземпляра и владение перед очисткой. Не включайте такой файл в распространяемый шаблон.
Практическое значение:
- упаковывайте шаблонные миры в
plugins/EternalTD/worlds/ - не рассматривайте клонированные во время выполнения миры как источник истины для упакованного контента
- шаблоны должны быть прямыми подпапками
worlds/; имена с любым символом.исключаются из обнаружения - имена также не должны содержать разделители пути,
:и управляющие символы и должны точно совпадать сworldNameуровня
Официальный мир хаба является особым случаем и отслеживается непосредственно в контейнере миров сервера как:
etd_spawn
Условия включения и отключения пакета
Переключение пакетов в /etd setup работает только для пакетов, которые предоставляют отслеживаемые файлы конфигурации.
Текущие поля отслеживаемых ресурсов:
levelFileswaveFilesnpcFilesworldFoldersworldContainerFoldersmarkerFileName
На практике:
- пакеты уровней, волн и NPC могут быть включены или отключены путём записи
isEnabledв эти YAML-файлы - имена отслеживаемых файлов сопоставляются рекурсивно, поэтому подпапки
levels/,waves/иnpcs/допустимы — совпадать должно только имя файла - общий контент контейнера миров и ресурсные пакеты только с маркером не переключаются таким же образом
Поля метаданных пакета
Текущая модель полей конфигурации пакетов поддерживает:
isEnablednamedescriptiondownloadLinkversionnightbreakSluglevelFileswaveFilesnpcFilesworldFoldersworldContainerFoldersmarkerFileNamecategorytoggleable
Чтобы показать пользовательский контент в меню настройки, поместите YAML метаданных прямо в plugins/EternalTD/content_packages/ или включите его в папку content_packages/ внутри ZIP (см. Структура ZIP). Укажите фактические имена файлов и миров и хотя бы один отслеживаемый ресурс. Пустой список ресурсов никогда не считается загруженным. Один лишь флаг isEnabled пакета не отключает его уровни: переключатель меню записывает флаг в каждый отслеживаемый файл уровня, волн и NPC, сохраняет флаг пакета и перезапускает EternalTD.
Дополнительное поле markerFallbackFolders перечисляет папки внутри plugins/, непустое содержимое которых также считается признаком установленного пакета. Оно нужно для контента, попавшего на сервер без записи маркера при загрузке. Поле задано только в коде; запись в YAML пакета не действует.
Примечания по упаковке моделей
Текущий пакет EternalTD Custom Models отслеживается с помощью файла-маркера, а не обычных файлов конфигурации EternalTD.
Это означает:
- EternalTD может отслеживать, был ли загружен общий пакет моделей
- фактические ресурсы моделей находятся на стороне FreeMinecraftModels при установке FMM
- очистка выполняется вручную с последующим выполнением
/etd reload
Структура ZIP
Размещайте распознаваемые папки прямо в корне архива, без внешней обёртки. Пример минимальной структуры:
pack.meta
levels/my_level.yml
waves/my_waves.yml
npcs/my_npc.yml
worlds/my_world/level.dat
worlds/my_world/region/...
Обычный текст в pack.meta — eternaltd. ZIP без этого файла использует платформу импортирующего плагина. Распакованная папка обрабатывается только при наличии pack.meta. Поместите файлы .zip в папку импорта, затем выполните перезагрузку.
| Элемент в корне архива | Назначение |
|---|---|
levels, waves, npcs, worlds | Соответствующие папки внутри plugins/EternalTD/ |
content_packages | plugins/EternalTD/content_packages/; метаданные пакета, которые добавляют набор в /etd setup |
content_markers | plugins/EternalTD/content_markers/; маркеры установки с именами <markerFileName>.marker |
worldcontainer | Контейнер миров сервера для общих миров, например etd_spawn |
models, modelengine | Папка моделей FMM, если он включён; иначе blueprints ModelEngine, если он включён; иначе папка моделей FMM для последующего использования |
scripts | plugins/FreeMinecraftModels/scripts/ |
freeminecraftmodels, elitemobs, betterstructures | Папка данных соответствующего плагина (plugins/FreeMinecraftModels/, plugins/EliteMobs/, plugins/BetterStructures/); располагайте содержимое так же, как в этой папке |
Для моделей FMM используется существующая старая папка Models, иначе models; папка freeminecraftmodels/models из архива объединяется с той же папкой. Любой импорт в папки FMM запускает перезагрузку импортированного контента FMM, если FMM включён. Контент, помещённый в папку BetterStructures, запускает перезагрузку контента BetterStructures после того, как BetterStructures завершит запуск.
Импортёр запускается до того, как EternalTD загружает content_packages/, поэтому YAML пакета из ZIP появляется в /etd setup после перезагрузки, которая его импортирует. Маркер из content_markers/ засчитывается как маркерный ресурс пакета, так что этот ресурс считается присутствующим без загрузки через меню настройки. Чтобы пакет считался загруженным, ему всё равно нужны остальные отслеживаемые файлы.
Неизвестный элемент в корне приводит к отклонению архива до установки. Импортёр сохраняет неудачные ZIP для повторной попытки и пытается восстановить целевые папки, изменённые этим архивом. Перед повтором проверьте ошибки отката в журнале. При замене общего мира старый мир сначала выгружается: находящиеся в нём игроки перемещаются на точку появления другого загруженного мира. Если игрока не удаётся переместить или мир не выгружается, архив сохраняется для повторной попытки. При успешном импорте ZIP удаляется; это ещё не подтверждает, что уровень пригоден для игры.