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 包可以通过在这些 YAML 文件中写入
isEnabled来启用或禁用 - 跟踪的文件名是递归匹配的,因此
levels/、waves/和npcs/的子文件夹没有问题 —— 只需要文件名匹配 - 共享世界容器内容和仅标记的资源包不能以相同方式切换
包元数据字段
当前的包配置字段模型支持:
isEnablednamedescriptiondownloadLinkversionnightbreakSluglevelFileswaveFilesnpcFilesworldFoldersworldContainerFoldersmarkerFileNamecategorytoggleable
要在设置界面显示自定义内容,请将元数据 YAML 直接放入 plugins/EternalTD/content_packages/,或将其放在 ZIP 的 content_packages/ 文件夹中(参见 ZIP 结构)。填写实际文件名和世界名,并至少跟踪一个资产。空资产列表永远不会计为已下载。包自身的 isEnabled 标志不会单独禁用其关卡:菜单开关会把标志写入每个跟踪的关卡、波次和 NPC 文件,保存包标志,然后重启 EternalTD。
还有一个跟踪字段 markerFallbackFolders,它列出 plugins/ 下的一些文件夹,只要这些文件夹非空,也会被计为该包已安装。它的存在是为了应对那些无需下载流程写入标记就能到达服务器的内容。该字段仅在代码中定义 —— 把它写进包的 YAML 不会有任何效果。
模型打包说明
当前的 EternalTD Custom Models 包使用标记文件而不是普通的 EternalTD 配置文件进行跟踪。
这意味着:
- EternalTD 可以跟踪共享模型包是否已下载
- 当 FMM 安装时,实际的模型资产位于 FreeMinecraftModels 侧的设置中
- 清理是手动的,之后需要运行
/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 启用时使用其模型文件夹;否则若 ModelEngine 启用,使用其 blueprints;两者均未启用时,使用 FMM 模型文件夹供以后使用 |
scripts | plugins/FreeMinecraftModels/scripts/ |
freeminecraftmodels, elitemobs, betterstructures | 对应插件的数据文件夹(plugins/FreeMinecraftModels/、plugins/EliteMobs/、plugins/BetterStructures/);内容的布局方式与该文件夹相同 |
FMM 模型目标优先使用已存在的旧版 Models 文件夹,否则使用 models;压缩包中的 freeminecraftmodels/models 文件夹会合并到同一个文件夹中。FMM 启用时,任何导入到 FMM 文件夹的内容都会触发 FMM 的导入内容重载。放入 BetterStructures 文件夹的内容会在 BetterStructures 完成启动后触发其内容重载。
导入器会在 EternalTD 加载 content_packages/ 之前运行,因此 ZIP 中附带的包 YAML 会在导入它的那次重载之后出现在 /etd setup 中。放在 content_markers/ 中的标记会算作该包的标记资产,所以这项资产无需经过设置菜单的下载流程就显示为已存在。该包仍需要其他被跟踪的文件齐全,才会算作已下载。
无法识别的顶层条目会使整个压缩包在安装前被拒绝。导入器会保留失败的 ZIP 供重试,并尝试还原该压缩包修改过的目标位置;重试前请检查回滚错误日志。替换共享世界时会先卸载原世界:其中的玩家会被移到另一个已加载世界的出生点。如果有玩家无法移出,或该世界拒绝卸载,压缩包会被保留以供重试。成功导入后 ZIP 会被删除,但这不代表关卡可以正常游玩。