0.27.8 召唤无响应修复
实体任务退休后正确结束、玩家队列与查询占位释放、召唤回滚,以及可关闭的等待提示。
更新日期:2026-09-01;对应插件版本:0.27.8-SNAPSHOT。
本版修复偶发的“召唤没有任何反应,执行重载仍无效”。已有宠物、名字、属性、模型与管理员自定义配置继续保留;0.27.7 的骑乘名牌全员隐藏和持续视角控制不变。
为什么旧版会一直没有提示
召唤要先完成数据库保存,再回到玩家或宠物所属实体区域创建、登记实体。旧版仅处理任务提交时立即被拒绝的情况:如果调度器先受理任务,玩家退出或实体移除又使任务在执行前退休,业务回调不会执行,对应 Future 也可能一直不结束。
同一玩家的宠物状态操作必须串行,后续召唤、收回等请求会等候前一项结束。前一项永久未完成时,后面的请求无法开始;命令和仓库又只在召唤结果完成后发送提示,因此玩家看到的是完全无反应。旧版 /lipet reload 重载配置与活动宠物运行参数,不重建玩家操作队列,不能清除已经卡住的前序任务。
本次修复
- 实体任务执行、立即拒绝、受理后退休及同步异常均产生明确完成结果,同一个任务只结束一次,迟到回调不能重复执行业务。
- 退休回调只完成任务交接,不在 Folia 的退休临界区直接访问实体;后续实体读写仍调度到所属区域。
- 召唤失败依据本次最后一次成功保存的 revision 回滚状态和释放租约,覆盖首次外观已经保存后才遇到实体失效的情况,避免拿旧版本号回滚。首个 ACTIVE 写入冲突或同步/异步失败时只释放租约,不使用猜测的 revision 回滚其他操作已经保存的记录。
- 玩家操作队列先发布等待占位,再在 Map 原子操作外执行实际业务;同步依赖错误也交给 Future 处理,不让后续同玩家请求永久等待。
- 查询成功、失败或同步抛错时都会释放对应查询占位,后续请求可以重新尝试。
- 取消公开返回值不会提前解除仍在执行的状态写入;本次没有用强制超时解锁来掩盖问题,避免迟到保存与新操作同时修改宠物。
- 命令与仓库共用反馈服务。业务失败、空结果、名称解析错误、反馈调度拒绝或退休都有明确处理及日志;提示错误不会被当作已经生成的宠物召唤失败。
等待提示与消息配置
普通快速召唤只发送原有最终结果。操作仍未完成超过 100 tick(正常 TPS 下约 5 秒)时,才额外发送一次等待提示;该提示不会取消召唤、释放锁、重复执行请求或生成第二只宠物。
配置位于服务器 plugins/LiPet/messages.yml。以下都是根节点,请合并到已有文件,不覆盖整份消息配置:
# 超过 100 tick 仍未完成时仅提示一次;支持 MiniMessage,设为 "" 可关闭。
# 不会中断召唤或提前释放玩家的状态操作锁。
pet-call-pending: "<yellow>正在召唤宠物,请稍候,无需重复操作。</yellow>"
# 召唤业务失败时的原有消息,旧服自定义文本保持不变。
pet-call-failed: "<red>宠物召唤失败,请稍后重试。"
# 只表示结果文本或发送流程异常,宠物可能已经生成;先核对实际状态。
pet-call-feedback-failed: "<yellow>召唤结果提示异常,请先检查宠物状态,并联系管理员查看后台日志。</yellow>"
升级只补缺失的消息节点和中文注释,管理员自定义文本、空值与其他配置保留。完成首次换 Jar 并重启后,后续修改上述文本可执行 /lipet reload。
升级与排查
- 停服,备份
plugins/LiPet/与 SQLite/MySQL 数据。 - 替换为
LiPet-0.27.8-SNAPSHOT.jar,确保plugins/只保留一个 LiPet Jar,然后重启。 - 执行
/lipet status核对实际加载版本;保留原宠物数据,不需要删除宠物、清库或重建配置。 - 分别使用
/lipet call <宠物名称>与仓库左键召唤,核对成功或失败提示。等待提示出现后无需反复点击。 - 若仍持续等待,收集服务端版本、宠物类型、玩家 UUID、操作时间及相邻日志。反馈异常日志中的
ownerId与请求信息用于定位;实体生成或回滚日志还会给出相关宠物和失败阶段。
pet-call-pending 仅说明尚未得到最终结果,不代表操作已经失败;pet-call-feedback-failed 仅说明结果提示异常,应先检查宠物是否已经出现。重载不能替代换 Jar 后重启,也不会被用来强制清除正在保存的数据操作。
验证结果
已在 Paper 26.2 Build 111 与真实 SQLite 上连续两次复现旧 0.27.7:首次外观保存成功到 revision 3,异步实体任务排入后在同一 tick 移除实体;8 tick 后召唤与收回 Future 仍未完成,数据库为 ACTIVE 而活动实体索引为空。执行真实 /lipet reload 成功后,两项操作仍然等待。
默认兼容构建(Paper 1.21.11 API、Java 21 字节码)与 Paper 26.2 Profile 各 306 项测试通过,失败、错误和跳过均为 0。覆盖实体任务退休与拒绝、同步异常、同玩家队列顺序、取消返回值不提前放行、查询占位释放,以及两种召唤入口共用的等待和异常反馈。新增写入边界测试确认首个 ACTIVE 写入未获成功确认时不会回滚其他记录。
最终成品:LiPet-0.27.8-SNAPSHOT.jar;大小:847689 字节;SHA-256:7077A6987925F08E542746F427EBB420AF83B53A287026E809390E664FF8B7F0。
同一 SHA-256 的最终 Jar 在 Paper 26.1.2 Build 70、Paper 26.2 Build 111 与真实 SQLite 均通过以下故障注入流程:
- 首次外观保存返回 UPDATED,数据库已到 revision 3。
- 实体任务由 0 增至 1、确认受理后,在同一 tick 移除实体。
- 首次召唤明确返回 FAILED,已排队的收回返回 NOT_ACTIVE,数据库恢复为 STORED revision 4。
- 不执行重载,再次召唤返回 CALLED;实际仅有一个宠物实体和一个活动会话。
- 正常收回清理实体与会话,两台隔离服务器均安全关闭。
同一成品另外通过 Paper 26.2 狼骑乘回归:骑手、现有及后来出现的旁观者都隐藏名牌;原地 yaw/pitch 跟随、持续前进转头、下马原 AI/感知恢复、真实重载切换隐藏开关、多层座位,以及取消下马后继续控制均正常。
这些是服务器内原生玩家对象、实际实体和真实数据库探针;反馈服务另有自动回归测试。未做真人网络客户端画面、真实 ModelEngine/MEG 模型或 Folia 实服运行验证,不能把 Paper 探针结果扩大为这些场景已经验证。