[MD]
# KaFurnace v1.0.3 更新日志
---
### 跨服同步:玩家数据租约
- 跨服模式新增基于 MySQL `GET_LOCK`/`RELEASE_LOCK` 的玩家数据租约:同一玩家同一时刻只被一个子服读写,不新增数据表结构。
- 玩家登录/转入改为异步获取租约(250ms 起指数退避至 2 秒)后再加载熔炉数据,等待与读库均不占用服务器主线程。
- 租约被其他子服持有时,`/kf` 主菜单和快捷开炉入口会提示“正在同步你的熔炉数据”,暂不开放界面,避免读到旧数据。
- 玩家退出/转出改为先异步写回并等数据库确认,确认成功后才释放租约;写回失败会保留内存状态与租约,防止其他子服用旧快照覆盖。
- 同一玩家的登录加载与退出写回按先后顺序排队执行,快速重连不会越过尚未完成的退出写回。
- 启动校验:`cross-server.enabled: true` 但 `database.type` 不是 `mysql` 时直接拒绝启用并给出原因,SQLite 不支持跨进程租约。
- 管理员关闭离线玩家的代管界面后,改为异步结算写回并释放该玩家租约,避免离线玩家长期占用锁。
- 关服时先等待未完成的玩家写回(最长 30 秒),再刷新最终快照并关闭租约连接。
### 第三方配方兼容(修复)
- 修复第三方插件(如 CraftEngine)注册的熔炉/高炉/烟熏配方不生效的问题。
- 原因:旧版只在插件启用时用 `Bukkit.recipeIterator()` 快照一次配方表,CraftEngine 等插件在其 delayedLoad 阶段才注册配方,通常晚于 KaFurnace,导致这些配方从未进入索引。
- 配方索引现支持运行期重建:
- `recipe-refresh-seconds`(默认 `30`)周期性检查配方集合变化,仅在变化时重建;
- `recipe-refresh-initial-ticks`(默认 `100`)控制首次刷新延迟,用于覆盖 delayedLoad 阶段注册的配方;
- 查找未命中时按 5 秒节流自动重建一次索引,放入新物品即可立即识别新配方;
- 索引改为按输入材质建立候选表并保留注册顺序,命中时只匹配相关配方,重建与查找成本更低。
- 索引发生变化时控制台输出 `已刷新配方索引,当前共 N 个烹饪配方`。
### 配置与语言
- 新增 `recipe-refresh-seconds`(默认 `30`)与 `recipe-refresh-initial-ticks`(默认 `100`)。
- `config-version` 仍为 `4`:已部署服务器不会自动补入上述两个键,缺失时按默认值 `30`/`100` 生效,如需调整请手动添加到 `config.yml` 顶层。
- 新增语言键 `command.data-loading`(数据同步中提示)与 `plugin.recipes-refreshed`(配方索引刷新日志),现有语言文件会自动补键。
[/MD]