搜索

2.3.1 模型骑乘修复

模型主驾驶选择、下马取消与旧挂载冲突保护,升级方法及实际验证范围。

本次修复模型宠物骑乘中已经确认的两个问题:同一实体挂载多个模型时可能选到没有移动控制权的副座位,以及旧模型座位拒绝下马后仍继续换乘,造成多个座位同时保留骑手。保留 LiPet 2.3.0 的全部功能。

修复内容

  • 按 ModelEngine 主驾驶关系上马。 LiPet 使用 ModelEngine 为载体指定的主驾驶管理器,不再按模型集合遍历顺序选第一个驾驶骨。主座位被占用、拒绝挂载或主驾驶关系缺失时,结束本次上马,避免误入副模型座位。
  • 确认旧座位释放后再换乘。 ModelEngine 下马事件可被其他插件取消。现在 LiPet 会检查旧挂载关系是否确实解除;未解除时保留原座位并拒绝换乘,避免两个座位同时向客户端绑定同一个玩家。检查也覆盖非生物载体的模型座位。
  • 保护 MM 直接上马入口。 MythicMobs mountmodel 等直接触发 ModelEngine 上马时,同样检查玩家是否仍有旧模型挂载关系,避免覆盖旧关系后遗留另一把座位。
  • 确认旧载体的 Folia 区域归属。 下马前检查骑手与旧模型载体是否由当前区域处理;旧载体无法取得或已经跨区时拒绝继续换乘,避免跨区域触发旧座位修改与下马事件。
  • 保留没有驾驶骨的模型与原版骑乘。 模型完全没有驾驶骨时,继续使用原版载体骑乘;存在驾驶骨但主驾驶关系不完整时不会猜选副座位。主人、等级、区域与事件取消限制继续生效。

本次没有改写第三方 ModelEngine Jar,也没有调整模型座位坐标、动画或客户端资源包。

模型骑乘的判断方式

ModelEngine 使用客户端虚拟座位,玩家骑在模型上时,Bukkit 的 Player#getVehicle() 可以为空。这是模型座位的正常实现方式,不能据此认定玩家已下马,也不能只靠原版乘客列表判断换乘是否成功。

LiPet 以 ModelEngine 的实际挂载关系确认模型骑乘。具备驾驶骨的模型只由 ModelEngine 的主驾驶控制移动;原有按键同步继续保留。

升级方式

  1. 正常停服,备份 plugins/LiPet、数据库与恢复台账,以及现有相关 ME/MM 配置。
  2. 将旧 LiPet Jar 移出 plugins 扫描目录,只保留一个 LiPet-2.3.1.jar。不要覆盖仍在运行的 Jar,也不要使用 PlugMan 或 /reload 替代正常重启。
  3. 保留原有配置、独立宠物文件、模型与资源包。从 2.3.0 升级不新增配置项或数据库字段;从更早版本升级时,由既有迁移补齐历史缺失项,不整份覆盖自定义配置。
  4. 正常启动,确认日志显示 Enabling LiPet v2.3.1。使用实际宠物检查上马、转向、前进、下马和连续换乘,并由另一位玩家观察模型与骑手位置。

112 项技能、MythicMobs 双向接口、GUI 标题变量、每宠自动攻击、捕捉品质提示与 CE 物品功能继续保留。CE 物品贴图包仍为独立的 1.0.0,本次升级不要求重新安装资源包。

验证结果

隔离 Paper 服务端使用 LiPet 2.3.0 与真实 ModelEngine 复现了三处旧行为:取消模型下马后 LiPet 仍继续换乘、MM 直接上马覆盖旧挂载关系、同一载体的多个模型可能选到非主驾驶座位。单模型的四向移动与转向基线正常,因此不能把这三处缺口认定为录像中所有不同步表现的唯一原因。

最终 LiPet 2.3.1 Jar 已通过 848 项单元测试,失败、错误、跳过均为 0。同一最终 Jar 完成 130 项隔离服务端检查:

环境 2.3.1 检查结果 覆盖范围
Paper 26.2 build 111 + ModelEngine R4.1.0 65 项通过 LiPet 创建模型、MM 生成模型、原版骑乘;四向移动与转向、下马清理、多模型主驾驶选择、取消下马后的 LiPet/MM 换乘保护、骑手与观察者的生成包链。
Folia 26.2 build 5 + ModelEngine R4.1.0 65 项通过 与 Paper 相同的三种骑乘入口及回归场景,使用同一最终 Jar。

另以旧版 LiPet 2.3.0 完成 Paper 基线 62 项基础检查,并记录三处旧缺陷复现,不计入新版本的 130 项。模型由真实 ModelEngine 加载并驱动,MM 环境为 5.13.0-SNAPSHOT-2b0b757a。

生成包与视觉验证边界

探针使用代理玩家,ModelEngine 的自动渲染循环生成真实 AddEntity 和 SetPassengers,分别确认骑手与观察者应得到的“枢轴→座位→骑手”绑定。ModelEngine 会拒绝向测试 EmbeddedChannel 直接发送数据,因此探针仅在其输出 Consumer 捕获并展开真实生成的 ProtectedPacket/Bundle;没有手工构造座位包或主动调用渲染发送方法。该结果证明生成包包含座位关系,不证明真实客户端已经收包或显示正确。

rawSeatDistance 只记录服务端骑手脚部与动画座位锚点之间的采样距离,其中包含约 0.6 格的座位附着偏移和 ME 异步更新时差。本轮没有以这些采样值断言客户端插值精度或视觉同步阈值,不能作为“零偏移”的验收。

本轮没有重启或替换生产服务器插件,也未连接、修改客户数据库。Windows OSHI 性能计数器、ME 测试通道与 MineSkin 配置、MM 示例技能及已弃用占位符接口存在环境或既有告警;本轮骑乘回归没有业务失败,不宣称全部服务端日志零告警。

本次没有修改活动模型宠物的停服清理流程;2.3.0 已披露的 Folia 停服区域清理告警不在本次修复范围。

本轮视频没有提供可确认的录像服版本、宠物 ID 与完整模型配置,因此目前不能把主驾驶和换乘修复等同于录像中模型与骑手脱离现象已彻底解决。ModelEngine parser 生成的网络包检查与服务端实体、挂载关系检查,不等于真实网络客户端收包或视觉验收;同一客户端与模型包仍需复测。历史版本的测试结果不计为 2.3.1 重跑。

最终已验证 Jar SHA-256:

CEAC579FFBF027E96B67AC4BF2FBE4BADA8EF20E1D8DBC38B6124C1C2F8A19F1