0.27.25 生命周期逐项排查
意外回血、死亡保存重试、末影人验证和剩余问题清单。
本轮优先闭环宠物生命值和死亡持久化。并未完成全部宠物、全部联动组合的验收;已确认的剩余风险在下面逐项列出。
已复现并修复
1. 受伤后重新载入、配置重载或成长刷新意外回血
旧版 0.27.24 在 Folia 26.2 隔离服召唤真实末影人,设置血量为 5,再调用实际的重新载入入口后,血量变成 20。原因是 PetEntityService.applyAttributes 在每次刷新时重新使用存档血量,覆盖实体刚受到的伤害。
0.27.25 区分首次召唤与运行中刷新:召唤仍恢复保存的血量,死亡冷却结束后的召唤仍恢复满血;配置重载、区块恢复、升级及加点只保留实时血量,并在生命上限下降时钳制。迟到的刷新或治疗不会把死亡实体复活。
喂食保存成功后只追加本次治疗和原有升级治疗,不回写保存前的血量快照。若期间又产生经验更新,使用最新活动档案刷新属性,本次治疗不会仅因 revision 已变化而被跳过。本轮实际调用治疗入口;未做真人客户端连续喂食验收。
2. 死亡保存失败后可能被收回成活宠
旧流程在死亡事件中忘记实体,数据库保存失败后仍保留 ACTIVE 档案;之后收回读取不到实体,会回退到缓存血量并保存为 STORED,可能绕过死亡冷却和扣级。
新版在忘记实体前保留待保存死亡事件、首次死亡时间、当时的扣级配置。待保存期间拒绝成长;召唤、收回、改名和删除先重试死亡保存。死亡与已经开始的收回写入竞争时,根据仍存在的死亡凭据把 STORED 纠正为 DEAD。普通死亡保存入口仍不能随意覆盖 STORED。
数据库确认后才清除待保存事件。周期维护、收回、召唤及关闭保存会重试;重复回调不延长最初冷却。删除已确认落盘时清理删除期间到达的死亡凭据。
限制:待保存事件目前在内存中,不是磁盘恢复台账。数据库持续故障且进程被强杀、崩溃或插件被热卸载时,尚未落盘的死亡仍可能丢失。此项没有解决崩溃后的恰好一次扣级。
3. 玩家退出保存失败没有统一日志
退出入口不再丢弃异常或 SAVE_FAILED 结果,会记录 ownerId 和失败原因,方便追查退出后宠物状态异常。普通收回失败的完整自动恢复策略仍需单独完善。
末影人“打死又出现一只”的结论
新版隔离服实际触发末影人死亡,注入一次死亡数据库保存失败,再通过收回重试:最终档案为 DEAD、等级从 2 降到 1,冷却使用首次死亡时间。观察死亡后 100 tick,监听到的 LiPet 末影人生成事件为 1 次、死亡事件为 1 次,未出现自动生成第二只。
这证明该原版末影人受控场景通过,不能据此认定用户服的重复实体已完全解决。还需对照原服日志、实体 UUID / LiPet pet_id、实际服务端构建和 MM 死亡技能,区分原版传送的同一实体、模型载体、第三方技能召唤和真正重复生成。
PlugManX 官方说明其 reload 会卸载并重新加载插件,见 官方命令说明。这与 /lipet reload 更新配置是不同操作。LiPet 当前存在异步存档与实体调度关闭边界,本轮没有进行 PlugManX 实机验收,不声明热卸载安全。插件更新应在维护窗口完整重启 Minecraft 服务器;本轮未操作正式服或关闭电脑。
逐项检查清单
| 顺序 | 问题 | 本轮结果与下一项验收 |
|---|---|---|
| 1 | 受伤后重载/重新载入回血 | 旧版实际复现,新版实机通过;升级保持实时血量 |
| 2 | 死亡保存失败被收回成活宠 | 注入一次数据库失败,新版收回重试保持 DEAD 和扣级;补磁盘恢复台账仍待做 |
| 3 | 末影人真实死亡后重复生成 | 原版受控场景未复现;原服 Shiroha、MM、MEG 与 PlugManX 组合未验收 |
| 4 | 宠物背包多人编辑/快速重新打开 | P1:源码确认每次打开读取独立副本,关闭直接覆盖存储,缺少 petId 独占编辑会话;需要双编辑者、保存延迟、断线和跨服测试。建议处理顺序最高,暂勿让多人同时编辑同一宠物背包 |
| 5 | GUI 物品被拿走 | 原有取消点击、拖拽和延迟操作保护仍在;与可存物品的宠物背包并发问题不同。数字键、双击、丢弃、创造模式需真人客户端验收 |
| 6 | 改配置不生效/重载混合状态 | P2:普通配置分步更新,后续文件校验失败可能留下部分新配置;需要整体校验和原子发布。不要把本轮血量重载修复理解为全部重载问题解决 |
| 7 | 退出重进不认主/收回偶发失败 | 本轮补统一失败日志;Folia 真实网络断线、重进及保存失败恢复仍需专项验证 |
| 8 | 捕捉幼体、风弹喂食、捕捉无响应 | 历史修复未在本轮全部重新实测;捕捉保存与原实体清理仍缺持久化事务凭据,需卸载/重启/崩溃测试 |
| 9 | 经验批量结算、技能书、属性加点 | 本轮全量自动化回归及末影人升级通过;多人真实战斗、快速连点、跨区目标仍需持续负载验收 |
| 10 | 敏捷速度、飞禽加速、乐魂移动、骑乘朝向和名牌 | 历史代码保留,未用真人客户端及 ModelEngine 骑乘重新验收,不能标记全部通过 |
| 11 | 专属食物、喂食冷却、喂食经验与打怪收益 | 配置和历史回归保留;原服定制值不覆盖,需使用实际宠物配置比较收益并逐种验证 |
| 12 | 领地晴天但烈焰人受雨伤 | 未搭建原服 Residence 与 Shiroha 组合,不把历史代码修复当成本轮联动验收 |
验证证据与边界
- 默认 Paper 1.21.11 API + Java 21 字节码:383 项测试通过,失败/错误/跳过均为 0。
- Paper 26.2 API:383 项测试通过,失败/错误/跳过均为 0。
- 新增 6 项回归覆盖实时血量保持、延迟治疗、死亡不复活、首次召唤恢复、重复待保存事件、数据库失败与收回竞争纠正。
- 实机 Folia 26.2 Build 7 + Java 25;真实末影人、合成服务端玩家;未使用真人网络客户端。
- 旧版日志
.tools/audit25-folia-baseline.log:断言记录RESTORE_MUST_KEEP_DAMAGE actual=20.0。 - 最终 Jar 日志
.tools/audit25-folia-final.log在 17:39:56—17:40:03 验证真实重载、升级、死亡、注入保存失败、收回重试及没有自动重复生成。完整重启后.tools/audit25-folia-restart.log在 17:41:01 确认该档案仍为 DEAD、等级 1,没有自动召唤。探针与注入故障不打入交付 Jar。 - 首次修复版探针以纳秒精度比较数据库毫秒时间而报错;改为毫秒比较后通过,未修改插件时间规则来迁就测试。
- 日志中的
PROBE_INJECTED_DATABASE_FAILURE是主动注入的预期告警;Windows OSHI/JNA 性能计数器告警不属于 LiPet 的实体线程异常。 - 未完成 Shiroha、真实 MythicMobs/ModelEngine、MySQL 跨服、PlugManX 热卸载及持续高并发验收。
更新
成品:LiPet-0.27.25-SNAPSHOT.jar。本轮不新增配置,不覆盖自定义属性、食物、价格、GUI 或消息。
维护窗口先备份 plugins/LiPet/,正常停止 Minecraft 服务器,替换 Jar 后完整启动。/lipet reload 不会替换已经加载的 Java 代码。此处停止的是 Minecraft 服务器,不是关闭电脑。
产物校验:933100 字节,428 个业务 class,全部位于 cn/lipet/,Java 21 字节码,不包含探针或公共依赖。
SHA-256:F0C4864087916FC09BC1FBAF91E9DD588C017A322B0D7D7C44BDA142988B5B28。