[MD]
### 动作语法迁移
- **动作写法整体换新, 但你不需要自己动手改。** 首次启动时 CoreLib 会自动把 `plugins/` 下所有 Emaki 插件的配置文件改写成新写法, 只做一次, 之后不再重复。每个被改过的文件旁边都会留一份 `.legacy-backup` 后缀的原文件备份。万一某一行转换不成功, 插件不会拿这行去覆盖你的配置, 而是单独写到一个 `.v2-failed` 文件里、原配置保持不动, 控制台也会列出是哪个文件的哪一行, 方便你自己看一眼。
- **只有营养相关的七个动作要你手工改一下名字**, 自动改写不包括它们。名字规则是加下划线分词 (`emakicooking*` → `cooking_*`):
- `emakicookingaddnutrition` → `cooking_add_nutrition`
- `emakicookingremovenutrition` → `cooking_remove_nutrition`
- `emakicookingsetnutrition` → `cooking_set_nutrition`
- `emakicookingclearnutrition` → `cooking_clear_nutrition`
- `emakicookingresetnutrition` → `cooking_reset_nutrition`
- `emakicookingrechecknutritionthreshold` → `cooking_recheck_nutrition_threshold`
- `emakicookingrunrecipereward` → `cooking_run_recipe_reward`
- 旧名字不再保留, 升级后还写旧名字的话, 控制台会提示找不到这个动作。
- **原先用 JS 脚本发奖励的配方需要重写。** JS 脚本功能整体取消了, 也没有自动转换的办法, 请改用配置文件里的动作来实现同样的奖励。随包的示例脚本 `scripts/examples/cooking_reward.js` 一并删除。
- 如果你用过营养循环 (在 CoreLib 里配 `action.loop.templates` 那种), 这部分也要手工改: `loopsync`/`cancelloop` 换成 `start_task`/`stop_task`, `%player_name%` 换成 `%caster.uuid%`, `mode=replace` 换成 `on_conflict=replace`, `stop_if_offline` 换成 `stop_when_offline`。config.yml 里营养阈值那段的注释已经写成新格式了, 照着改就行。另外 `start_task` 的重复次数受 CoreLib 的 `action.pipeline.max_repeat_times` 限制 (默认 `100` 次), 想让循环持续更久就把这个值调大。
### 工位修复
- **修复工位用一段时间后彻底失灵**, 影响砧板、炒锅、研磨机、榨汁机。表现为: 炒锅炒好了却盛不出来、放进去的食材凭空消失或被后放的覆盖、砧板既切不动也取不下东西、研磨机进度条卡住不动。这些其实是同一个毛病, 插件在读取工位内容时会不断给它的存档记录累加编号, 一旦某次没保存成功, 这个工位在插件眼里就等于空的, 之后不管怎么操作都找不回来。现在已经不会再出现这种累加, 保存失败也会退回原样。
- **修复流水线自动流转卡住**, 只影响 Folia 服务端。原先一道菜从上一个工位流转到下一个工位时, 中途出错会让这个工位彻底停摆, 后面所有菜都推不动, 只能重启服务器。现在出错也会自动恢复, 不再卡死。
- **修复配方条件没通过却照样扣东西**, 影响炒锅和榨汁机。原先配方里写了 `condition` 条件时, 插件会先把碗或容器从玩家背包里扣掉, 再去判断条件, 条件不通过也已经扣完了, 还会提示制作成功。现在改成先判断再动手: 条件不通过就不扣任何物品, 不提示成功, 只执行 `on_fail` 里配置的动作。
- **修复取材料时可能在莫名其妙的时候扣物品**。需要从玩家背包取材料的配方, 原先取不到就一直反复重试, 可能等玩家走远了、换了物品之后才突然扣走。现在最多尝试 5 次, 都失败就放开工位, 不扣物品。
- **修复榨汁机方块挖不掉**。榨汁机里有液体时, 查看操作占用了左键, 结果生存和创造模式都没法正常破坏这个方块。现在查看操作默认改成右键。同时修复了手上没拿容器时反复弹错误提示刷屏的问题, 现在只有手持容器才会尝试盛取。
- **修复工位拆掉后地上还留着悬浮文字**。七种工位在被破坏时, 如果插件读不到它的内容, 会直接跳过清理, 把悬浮文字和展示物品留在原地。现在无论能不能读到内容, 都会先清干净再拆。
### 配置清理
- 榨汁机的查看操作默认从左键改成了右键。新的 config.yml 已经是右键, 如果你沿用旧配置文件, 建议把 `stations.juicer` 下的 `inspect` 改成 `right_click`, 否则挖不掉榨汁机方块。
- 删掉了两个一直没有实际作用的配置项: `stations.juicer.drop_completed_result_on_break` 和 `stations.fermentation_barrel.require_sealed`。它们以前就写在配置文件里, 但插件从来没读过, 不管填什么都没效果, 现在直接删了, 你的配置里有也可以放心删掉。
### 开发者相关
- `EmakiCookingApiProvider` 已移除, 直接使用 `EmakiCookingApi` 的静态方法。
- `EmakiCookingApi.available()`、`apiVersion()`、`pluginName()`、`isReady()` 全部移除, 由 `EmakiCookingApi.status()` 统一替代 (返回 `ApiStatus`, 提供 `usable()`、`ready()`、版本与插件名字段)。
- 新增三层公开 API: `EmakiCookingApi.nutrition()` (营养值读写)、`EmakiCookingApi.catalog()` (配方与工位只读查询, 含 `recentStation(UUID)`)、`EmakiCookingApi.operations()` (状态变更操作)。这三层在插件未加载时返回空实现, 不再抛异常。
- `EmakiCookingApi.Bridge` 改为 `@ApiStatus.NonExtendable`, 第三方插件不得实现。
- 事件类补齐线程语义说明: 各事件均为同步事件, 仅在运行时持有对应区域/实体所有权时触发, 监听器需遵守相同的 Paper/Folia 线程约束。
### 升级说明
- 需要先把 EmakiCoreLib 升到 `4.7.0`。
- **升级前请备份 `plugins/EmakiCooking/` 整个目录。**
- 大部分动作写法由插件自动改写, 但下面三处要你自己动手:
- 营养相关的七个动作要改名 (对照上面的清单)。
- 用 JS 脚本发奖励的配方要改成用动作实现。
- 营养循环的配置要换成 `start_task`/`stop_task` 写法。
- 沿用旧配置文件的话, 记得把榨汁机的 `inspect` 改成 `right_click`。
- 玩家的营养数据和世界里已经摆好的工位都不受影响, 不需要迁移。配方文件里的动作写法会被自动改写, 配方本身的结构没变。
[/MD]