0.27.17 风弹喂食冲突修复
阻止喂旋风人时同时发射风弹,保护副手回退,正常投掷不受影响。
版本:0.27.17-SNAPSHOT,日期:2026-09-05。
问题与修改
给旋风人右键喂风弹时,旧版只取消“右键实体”事件。紧随其后的“使用手中物品”事件仍能执行原版发射,与异步喂食扣除叠加,导致多消耗一颗风弹。
本版增加独立的 PetFoodUseListener:喂食入口识别到该宠物配置中启用的食物后,在提交异步结算前保存双手物品快照。后续物品使用若匹配同一玩家、选中槽位及物品组件,就拒绝原版物品使用,不再发射、喝掉或放置这份食物。匹配不比较数量,因此喂食回调先扣除一份时仍能正确阻止后续使用。
每只手最多拦截一次,保护有效期为该玩家当前及随后 2 tick;新主手实体交互、左键、切槽、交换双手或退出会清理旧记录。只读取玩家本身的状态,不遍历附近实体,也不在物品使用事件中读取跨区宠物。这个短窗口用于关联 Bukkit 未提供共同交互 ID 的两类事件;异常网络延迟跨越窗口的情况仍需目标服验收。
PlayerInteractEvent 的方块使用与手持物品使用是独立结果,空气事件也可能初始为取消状态。因此监听器仍处理这类事件,并明确设置 useItemInHand=DENY,不改写其他插件设置的方块交互结果。参见 Bukkit 官方事件说明。
保持不变的行为
- 旋风人仍吃其配置中的
WIND_CHARGE,无需改成其他物品。 - 成功喂食只扣一份;失败不扣除,创造模式不扣除。
- 合法食物因非主人、等级受限或无效果而喂食失败时,也不会将本次点击改为发射。
- 普通朝空处投掷、未被该宠物配置接受的物品不登记保护;技能书和信号棒继续由原来的监听器处理。
- 现有食物、经验、模型、商城等配置完全保留,本版没有新配置或数据库迁移。
升级步骤
- 备份服务器现有 LiPet Jar 与数据目录,正常停止 Minecraft 服务端。
- 用
LiPet-0.27.17-SNAPSHOT.jar替换旧版,插件目录内只保留一份 LiPet Jar。 - 完整启动服务端。
/lipet reload只能重载配置,不能加载新 Java 代码。 - 生存模式准备 8 个风弹,右键自己的旋风人,确认喂食一次后剩 7 个且无风弹实体;随后朝空处发射,确认正常消耗并生成风弹。
验证
默认兼容 API 与 Paper 26.2 Build 111 API 均执行了清理后的完整编译,各 343 项测试通过。新增 10 项回归覆盖主手、双手回退、异步扣除后的数量变化、正常投掷、其他玩家、过期/切槽/换手/退出、同底材不同自定义物品和事件结果保留。
真人客户端视觉预测、Folia/Shiroha 目标服及异常延迟网络尚未实测。
Paper 26.2 Build 111 隔离服使用真实 Breeze 与原生 CraftPlayer,经服务端实体交互、使用物品包处理器完成对照(无真人客户端):
| 场景 | 结果 |
|---|---|
| 旧版 0.27.16,8 颗风弹喂一次 | 当场生成 1 个风弹,异步结算后剩 6 颗,获得 4 经验,复现重复消耗 |
| 新版 0.27.17,同样操作 | 无风弹实体,结算后剩 7 颗,获得 4 经验 |
| 主手 8 颗、副手 4 颗,模拟双手回退 | 无风弹实体,主手剩 7 颗、副手仍为 4 颗 |
| 其他玩家喂该旋风人 | 无风弹实体,8 颗全部保留 |
| 未配置成该宠物食物的雪球 | 正常投掷,8 个变 7 个 |
| 普通朝空处使用风弹 | 正常生成风弹并只消耗 1 颗 |
| 创造模式喂食 | 无风弹实体,不扣数量,正常增加经验 |
最终成品为 target/LiPet-0.27.17-SNAPSHOT.jar,897,266 字节;SHA-256:
690B5204063009D35E3DC2FCAE3035D7DB2EE7C2A49FCD59731869DEB4C3930E
隔离服已正常停止;未对电脑执行关机操作。Windows 性能计数器存在与插件无关的启动告警,LiPet 和最终探针没有异常。