Перейти к основному содержимому

Упаковка пользовательского контента 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 работает только для пакетов, которые предоставляют отслеживаемые файлы конфигурации.

Текущие поля отслеживаемых ресурсов:

  • levelFiles
  • waveFiles
  • npcFiles
  • worldFolders
  • worldContainerFolders
  • markerFileName

На практике:

  • пакеты уровней, волн и NPC могут быть включены или отключены путём записи isEnabled в эти YAML-файлы
  • имена отслеживаемых файлов сопоставляются рекурсивно, поэтому подпапки levels/, waves/ и npcs/ допустимы — совпадать должно только имя файла
  • общий контент контейнера миров и ресурсные пакеты только с маркером не переключаются таким же образом

Поля метаданных пакета​

Текущая модель полей конфигурации пакетов поддерживает:

  • isEnabled
  • name
  • description
  • downloadLink
  • version
  • nightbreakSlug
  • levelFiles
  • waveFiles
  • npcFiles
  • worldFolders
  • worldContainerFolders
  • markerFileName
  • category
  • toggleable

Чтобы показать пользовательский контент в меню настройки, поместите 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_packagesplugins/EternalTD/content_packages/; метаданные пакета, которые добавляют набор в /etd setup
content_markersplugins/EternalTD/content_markers/; маркеры установки с именами <markerFileName>.marker
worldcontainerКонтейнер миров сервера для общих миров, например etd_spawn
models, modelengineПапка моделей FMM, если он включён; иначе blueprints ModelEngine, если он включён; иначе папка моделей FMM для последующего использования
scriptsplugins/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 удаляется; это ещё не подтверждает, что уровень пригоден для игры.