跳到主要内容

兼容 ModelEngine 插件(MCPets)

有些插件写死只支持 ModelEngine——例如宠物插件 MCPets,没装 ModelEngine 就无法启动。 云模型提供 ModelEngine 兼容层(1.2.0 起):它的插件名称就叫 ModelEngine,这些插件调用的 ModelEngine 接口全部交给云模型处理。 不用改那些插件,也不用重做模型。

安装​

  1. 在资源中心的云模型页面下载 CloudModel-MEG兼容层 的 jar(与云模型放在一起,需要云模型 1.2.0 以上)。
  2. 把它和云模型一起放进 plugins,重启服务器。
  3. 后台出现下面这行就完成了:
[ModelEngine] 已连接 CloudModel:只支持 ModelEngine 的插件(例如 MCPets)现在会使用 CloudModel 的模型
不要和真正的 ModelEngine 同时安装

兼容层的插件名称就是 ModelEngine,两个同时放会冲突。已经装了 ModelEngine 的服务器不需要兼容层,云模型照常用 cmodel{} 等技能共存(见 与 ModelEngine 共存)。

装了兼容层以后,MythicMobs 的 model{}、state{}、mountmodel{} 等技能照常由云模型接手(就像没装 ModelEngine 一样)。

已测试的插件​

插件测试版本支持的功能
MCPets4.1.6(1.21+)召唤宠物、宠物名称、骑乘(walking / flying / force_walking / force_flying)、下坐骑、DespawnOnDismount、MountPermission、只有主人能骑

其他只支持 ModelEngine 的插件,只要用到的是下面列出的接口也能用;用到没做的接口会在后台报错,欢迎回报给我们补上。

MCPets 设置​

宠物的 MythicMobs 怪物照常写 model{},MCPets 的宠物配置不用改:

# MythicMobs/mobs/pets.yml
Dragon_Pet:
Type: ZOMBIE
Options:
MovementSpeed: 0.3 # 骑乘时的速度也看这个
Invincible: true
Skills:
- model{mid=dragon_pet} @self ~onSpawn
# MCPets/Pets/dragon.yml
Id: dragon
MythicMob: Dragon_Pet
Mountable: true
MountType: flying # walking / force_walking / flying / force_flying
DespawnOnDismount: false

模型的骨骼​

骨骼作用
mount驾驶座:玩家骑上宠物时坐在这里,跟着动画移动。没有 mount 骨骼时直接骑在宠物身上(原版的骑乘位置)
p_ 开头乘客座位
tag_name宠物名称显示的位置(MCPets 设置的名称,例如 Pet of 玩家)。没有这根骨骼时照原版规则显示在宠物头上

骑乘操控​

与 ModelEngine 的规则相同,速度是怪物的移动速度属性(MythicMobs 的 MovementSpeed):

MountType移动跳跃键潜行键
walking(默认)前后左右照玩家面向走在地上或水里跳起来下坐骑
force_walking同上同上不会下来
flying不受重力,前后左右照玩家面向飞往上飞空中往下飞;落地后再按才下坐骑
force_flying同上往上飞只会往下飞,不会下来
  • 骑乘中宠物不会自己乱跑(AI 暂停),下来后恢复。
  • 主人以外的玩家不能骑(MCPets 的规则),MountPermission 照常生效。
  • 新版(1.21.2 起)与旧版客户端的按键封包都支持。

骑乘的运作方式​

1.2.0 起云模型的座位(mountmodel{} 与兼容层的骑乘)改成与 ModelEngine 相同的做法:

  • 服务器上:乘客直接骑在模型的实体身上。不会每 tick 传送玩家,潜行下坐骑、死亡、离线等都照原版处理,其他插件看到的就是「玩家骑着这只怪」。
  • 玩家看到的:座位跟着 mount / p_ 骨骼走,动画怎么动乘客就怎么动。

以前座位是一个看不见的实体,每 tick 连乘客一起传送,会让「玩家传送时把人放下来」的插件(MCPets 就是)把玩家踢下来;现在不会了。

给开发者:支持的 ModelEngine 接口​

兼容层实现了下面这些 ModelEngine R4 接口(包名、方法名与 ModelEngine 相同):

类方法
ModelEngineAPIgetModeledEntity(UUID / Entity)、isModeledEntity、removeModeledEntity、getMountControllerTypeRegistry、getMountPairManager
ModeledEntitygetBase、getModels、getModel、hasModel、removeModel、destroy、getMountData
ActiveModelgetModeledEntity、getBlueprintId、getBone、getBones、getMountManager、destroy
ModelBonegetBoneId、getBoneBehavior(NAMETAG、MOUNT、HEAD、GHOST…)、hasBoneBehavior
NameTagsetString、getString、setVisible、isVisible
MountData / MountManagergetMainMountManager、getDriver、hasRiders、hasPassengers、mountDriver、mountPassenger、dismountDriver、dismountRider、dismountAll
MountPairManagergetController、getMountedPair、tryDismount
MountControllerTypeRegistryget("walking" / "force_walking" / "flying" / "force_flying")
事件ModelMountEvent(骑上之前,可取消)、ModelDismountEvent(下来之后)

写新插件建议直接用云模型自己的 开发者 API。