自定义模型
EliteMobs 通过 Model Engine 和 FreeMineCraftModels 支持自定义模型。
前言
从 EliteMobs 的角度来看,自定义模型系统非常简单,管理员只需在 NPC 或自定义 Boss 配置文件中添加一行,指明使用哪个自定义模型即可。然而,为了让该系统完全可用,需要在 Model Engine 与 Minecraft 端采取正确的步骤,而这些步骤并不那么容易上手。
本指南将详细介绍与 Model Engine 和 Minecraft 对接的部分。它不会告诉你如何使用 Blockbench 创建自定义 Boss,也不会详细讲解 Model Engine 的工作方式。关于这些已经有大量他处的指南可参考,如果你想了解更多相关系统,直接查看它们的文档会更有帮助。
FreeMineCraft Models
如果你想了解如何使用 FMM 让你的模型生效,可以查看这个 Wiki 页面以了解更多。
当前 FreeMinecraftModels 优先使用作者设置的 tag_ 骨骼(例如 tag_head),没有锚点时则把名牌放在模型碰撞箱上方。锚点可让作者选择位置,但不再是显示名称的必要条件。FMM 负责整个名牌,包括 EliteMobs NPC 的名称和角色行。较旧的 FMM 版本可能仍然需要锚点。
基岩版(Geyser)支持
通过 Geyser/Floodgate 连接的基岩版玩家能否看到自定义模型,完全取决于你的模型插件(ModelEngine 或 FreeMinecraftModels)以及你的资源包配置,而不取决于 EliteMobs。EliteMobs 确实会检测基岩版客户端,但它将这一信息用于菜单渲染、名牌定位等方面——它不会生成或提供单独的基岩版兼容模型。关于基岩版/Geyser 的模型支持,请参阅你所用模型插件的文档。
LibsDisguises 集成
EliteMobs 也支持 LibsDisguises 作为自定义模型的替代方案。已配置且可用的模型优先于伪装;没有选择可用模型时,可以使用配置的伪装。此集成会同步名称的可见性。
要使用 LibsDisguises,请配置 Boss/NPC 的伪装,不指定 customModel 字段。
物品模型和魔法武器(FMM)
使用 fmmItemModel 设置 FMM 物品外观;对于作者定义的魔法武器,再设置 weaponType: WANDS 或 weaponType: STAVES。EliteMobs 保留名称、描述、附魔和等级。FMM 提供模型,并为魔法武器提供攻击定义。
旧的 scriptedItem 桥接仍用于作者定义物品的身份和显示,但不再运行装备物品的 Lua 脚本。FMM 会拒绝包含非空 scripts 列表的物品定义。不要将它与作者定义的魔法武器组合使用。
# Example EliteMobs custom item config
material: IRON_SWORD
name: "&cFlame Blade"
enchantments:
- "FIRE_ASPECT,2"
scalability: scalable
fmmItemModel: flame_blade
引用的 FMM 物品或模型必须存在。缺少外观模型时,可能保留原版材质并输出警告;如果显式设置的 weaponType 与可用的作者定义武器不匹配,则会拒绝构建物品。请参阅 FMM 魔法武器和自定义物品配置。
最低要求
需要 EliteMobs、兼容的 FreeMinecraftModels 版本或 ModelEngine 集成*、Blockbench** 和 Minecraft 资源包。ModelEngine 集成针对 R3 API:只有当 ModelEngine 已启用且其版本中包含 R3 时,EliteMobs 才会选用它。更新的主版本不代表自动兼容。
* 该插件可能有进一步的依赖。请查阅其官方文档。
** 创建与编辑自定义模型所必需。如果你只是想安装内容而不修改它们,则不需要它。
如果同时安装了 ModelEngine 和 FreeMinecraftModels,EliteMobs 将默认使用 FreeMinecraftModels。同时只会启用一个自定义模型插件。
手动设置自定义模型
注意:本指南假设你已经拥有一个有效的自定义模型。它们以 Blockbench 文件格式提供(.bbmodel)。
EliteMobs 能够为 NPC 与自定义 Boss 使用自定义模型。两者的操作流程相同,如下:
第 1 步. 设置 EliteMobs 配置
前往你想修改的自定义 Boss 或 NPC 的配置文件,并添加以下一行:
customModel: modelname
将 modelname 替换为你的模型名称。该名称即你所使用的自定义模型文件的名称。例如,测试 Boss 的自定义模型文件为 showcase_boss.bbmodel。因此,配置选项应为
customModel: showcase_boss
EliteMobs 端就到此为止!接下来会更复杂一些。
第 2 步. 生成 Model Engine 数据
以下路径来自已归档的 ModelEngine 导入指南。请使用适合已安装 ModelEngine 版本的说明。
- 将你的自定义模型 Blockbench 文件(
.bbmodel)放入目录(yourServer)/plugins/ModelEngine/blueprints中。 - 运行适合当前 ModelEngine 版本的模型重载命令;归档指南使用
/meg reload models。确认模型出现在已加载注册表中,并检查控制台错误。
第 3 步. 分发资源包
如果你希望让服务器管理资源包下载,这可能是最棘手的部分。在着手自动分发之前,请先检查在你客户端拥有该资源包时系统是否能正常工作!
- 前往目录
(yourServer)/plugins/ModelEngine/resource pack,使用其中数据创建一个资源包,或将其中的assets文件夹加入你的资源包的assets中 - 将资源包分发给你的玩家。只有拥有该资源包的玩家才能看到自定义模型,对其他人来说看起来会非常诡异且破损。如果你打算大量使用这些模型,可能需要强制玩家使用资源包。
- (可选)若要允许玩家在登录时下载资源包,你需要将文件托管在网上某处,并将 server.properties 中的
resource-pack=字段指向该地址。* - 自动下载时,将最终 ZIP 的 SHA-1 填入
resource-pack-sha1=。可在本地用 PowerShell 的(Get-FileHash -LiteralPath "pack.zip" -Algorithm SHA1).Hash.ToLowerInvariant()或 Linux 的sha1sum pack.zip计算。只复制 40 字符的哈希值,并在 ZIP 每次变更后更新。 - (可选)要强制玩家使用资源包,请在 server.properties 中使用选项
require-resource-pack=true。*
- (可选)若要允许玩家在登录时下载资源包,你需要将文件托管在网上某处,并将 server.properties 中的
如果你修改了 server.properties,你需要重启!
* 注:网上有许多指南可以帮你完成此操作,如果上述说明对你帮助不大,可以去搜索一下。
合并资源包
可以手动合并资源包,或使用 ResourcePackManager 管理 Nightbreak 资源包流程。merge.elmakers 等外部工具可以合并 ZIP,但仍需解决模型 ID 冲突,并在目标客户端验证合并后的资源包。
第 4 步. 验证模型
模型注册表加载完成、客户端应用对应资源包后,在实际 Boss 或 NPC 上验证模型。以下命令要求由玩家执行,并具有相应权限:
- 自定义 Boss:
/em spawn boss filename.yml—elitemobs.place.admin,在视线指向的位置生成。 - NPC:
/em place npc filename.yml—elitemobs.place.npc,在脚下保存持久放置。
/em remove 切换移除模式。攻击目标将其移除,然后再次运行命令退出此模式。这样移除已放置的 NPC 也会删除保存的放置记录。
为 EliteMobs 创建与适配自定义模型
请使用所选提供者支持且已成功加载的模型。提供者的兼容性及支持的模型功能仍有限制。
不过,对于动画,需要使用特定名称才能保证 Boss 可以使用动画。
这些动画名称即你在 Blockbench 的动画标签页中设置的名称。你随时可以重命名它们,这意味着你可以将任何现有模型改造为与 EliteMobs 兼容。
动画
EliteMobs 的自动钩子使用以下动画名称。
idle
idle 是常规待机动画名称。EliteMobs 将 ModelEngine 模型启动为其默认待机状态;后续待机和移动动画由模型提供者选择。
walk
walk 是常规移动动画名称。EliteMobs 不会在附加模型时显式启动 walk 动画;移动动画由 ModelEngine/FMM 选择。
attack
有三种攻击动画:
attack
attack 是 Boss 进行攻击时正确的通用动画名称。
attack_melee
attack_melee 在自定义 Boss 作为 Bukkit 实体伤害事件的直接伤害者时替代 attack。动画在事件处理期间请求播放,不是会延迟命中的前摇。已取消事件被忽略,但后续监听器仍可能取消伤害。请使用较短动画,不要依赖它调度伤害发生时间。
attack_ranged
attack_ranged 在弹射物生成事件将自定义 Boss 识别为生物射手时替代 attack。它响应弹射物生成,不会让发射等到动画结束。没有这种射手关联的弹射物不会触发自动钩子。
动画回退系统
EliteMobs 对攻击动画采用回退系统:
- 如果未定义
attack_melee,则回退到attack - 如果未定义
attack_ranged,则回退到attack - FMM 在播放前检查
attack是否存在;ModelEngine 适配器将该回退名称传给其动画处理器
这允许你创建一个适用于所有攻击类型的单一攻击动画,或针对近战与远程攻击分别创建专门动画。
damaged
EliteMobs 没有注册自动 damaged 动画钩子。提供者的受伤变色或其他命中反馈与播放这个命名动画是两回事。
death
在 EliteMobDeathEvent 中,如果自定义 Boss 模型存在 death 动画,EliteMobs 就会请求播放。移除和阶段切换不等于死亡事件。动画播放和模型清理仍取决于提供者的生命周期。
powers
技能名称与模型动画名称之间没有自动匹配。
虽然没有自动名称匹配,但两个脚本系统都能显式按名称播放动画:
- **EliteScript:**使用
PLAY_ANIMATION动作,以动画名称为值。它将各目标解析为自定义 Boss,并在其模型上播放动画。 - Lua:
context.boss:play_model_animation("animation_name")。
两者都会在模型没有该名称的动画,或 Boss 没有自定义模型时静默跳过。
从副本导入自定义模型
第 1 步. 正常导入
导入包含自定义模型的副本打包 ZIP 文件夹时,模型会移入已安装的模型插件:
- 已安装 FreeMinecraftModels — 模型进入
(yourServer)/plugins/FreeMinecraftModels/models,若旧版Models文件夹已存在则使用它;过程中将.bbmodel转换为.fmmodel。随后 EliteMobs 触发模型安装事件,让 FMM 重建模型注册表。 - 只安装 ModelEngine — 模型进入
(yourServer)/plugins/ModelEngine/blueprints。当前共享导入器不会自动重载 ModelEngine;请用适合其版本的命令重建模型和资源包。
导入启动 FMM 模型重建后,EliteMobs 会等待 FMM 达到初始化完成状态,最多 300 秒(五分钟)。FMM 失败或被禁用、等待超时或被中断,都会在加载不完整模型和物品之前停止 EliteMobs 初始化。检查两个插件的控制台错误,解决重建问题后再重启;这不是一次只跳过部分模型实体的成功启动。
第 2 步. 资源包
EliteMobs 启动时将内置包导出到 (yourServer)/plugins/EliteMobs/resource_pack/em_rsp_defaults,并在父文件夹记录 .rsp_checksum。内置与保存的校验和一致且 em_rsp_defaults 存在时,会跳过复制。更改插件版本本身不会强制导出;校验和一致也不会逐个检查导出文件是否被本地修改或删除。替换使用预先准备的目录交换;请将自己的资源包改动保存在此生成文件夹之外。
你需要将这些资源包文件与任何 Model Engine 资源包文件合并,并将合并后的资源包分发给你的玩家。只有拥有该资源包的玩家才能看到自定义模型。
故障排查
常见问题:
-
模型不可见:
- 确认所选提供者的注册表包含模型,使用适合该提供者及版本的重载命令
- 检查客户端是否已安装资源包
- 确保
customModel与注册的模型 ID 匹配,通常是没有扩展名的文件名
-
动画不播放:
- 验证 Blockbench 中的动画名称与文档完全匹配
- 检查动画在应只播放一次时是否被设为循环
- 使用所选提供者的命令单独测试动画
-
两个插件都已安装:
- 如果两者都存在,EliteMobs 将使用 FreeMinecraftModels
- 没有按模型选择提供者的设置。若要改用 ModelEngine,请禁用 FreeMinecraftModels 并运行 R3 版本的 ModelEngine
-
Boss 或 NPC 没有可见名称(FMM):
- 先检查
name、Boss 的alwaysShowName和模型加载情况。 - 当前 FMM 在没有
tag_锚点时将名牌放在碰撞箱顶部上方。位置不对时,检查碰撞箱高度或添加作者指定的锚点。 - FMM 发出重载完成事件时会重新附加 NPC 模型。若重载后模型消失,请检查控制台警告。
- 先检查