API 接入
EmakiCooking 对外公开的是静态门面 EmakiCookingApi,用于提供版本、插件名和就绪状态探针。工位交互、配方结算、营养施加等完整玩法流程仍以方块交互、配方、命令和动作为主要入口;需要介入烹饪或营养时优先监听 事件 API 或注册 JavaScript 烹饪规则。
推荐接入方式
- 公开 API 探针:通过
EmakiCookingApi或 CoreLib JavaScript 的emaki.module("cooking")判断模块是否可用。 - 事件:监听
CookingRecipeCompleteEvent、PlayerNutritionConsumeEvent、NutritionThresholdChangeEvent拦截或记录烹饪与营养流程,详见 事件 API。 - JavaScript 规则:通过脚本注册烹饪产物规则和完成钩子,详见 JavaScript 脚本。
- PlaceholderAPI:通过占位符读取营养状态,详见 占位符。
- 配置驱动:通过
recipes/、nutrition/、config.yml配置完成绝大多数需求。
EmakiCookingApi
| 方法 | 返回值 | 说明 |
|---|---|---|
available() | boolean | 判断 API 是否已安装。 |
apiVersion() | String | 返回 API 版本,不可用时为空字符串。 |
pluginName() | String | 返回插件名,不可用时为空字符串。 |
isReady() | boolean | 判断插件是否已完成初始化。 |
java
if (EmakiCookingApi.available() && EmakiCookingApi.isReady()) {
logger.info("Cooking API version: " + EmakiCookingApi.apiVersion());
}如果你更喜欢迁移辅助类,也可以先做可用性检查:
java
if (!EmakiCookingApiProvider.available()) {
return;
}
EmakiCookingApiProvider.requireAvailable();接入前提
- 服务器已安装并启用 Cooking 模块。
- 调用方插件在
paper-plugin.yml中声明可选依赖。 - 不要在异步线程直接修改 Bukkit 物品或玩家背包。
yaml
dependencies:
server:
EmakiCooking:
load: BEFORE
required: false
join-classpath: trueJavaScript 调用
CoreLib JavaScript 脚本中可通过 emaki.module("cooking") 查询 Cooking 模块是否可用。当前公开 API 只暴露身份与就绪探针;配方执行和工位状态变更仍通过方块交互与动作流程完成。注册烹饪产物规则和完成钩子的脚本方法见 JavaScript 脚本。
| 方法 | 说明 |
|---|---|
available() | 判断 Cooking API 是否已注册。 |
apiVersion() | 返回 API 版本。 |
pluginName() | 返回插件名。 |
ready() | 判断插件是否完成初始化。 |
js
function main(ctx) {
if (emaki.module("cooking").available() && emaki.module("cooking").ready()) {
emaki.logger.info("Cooking module=" + emaki.module("cooking").pluginName());
}
return true;
}线程安全
- 读取静态配置可以异步缓存,但最终修改 ItemStack 或工位状态必须回到主线程。
- 不要在异步任务里直接操作玩家背包、世界掉落或事件对象。
- 烹饪与营养事件均在主线程触发,异步路径会跳过事件。
什么时候不用 API
- 固定工位配方:使用
recipes/下对应工位目录。 - 营养类型和阈值:使用
nutrition/和config.yml的nutrition配置。 - 玩家手动烹饪:使用方块交互。
- 任务或成就监听:使用事件。
- 修改产物或追加奖励:使用 JavaScript 规则和完成钩子。