Skip to content

API 接入

EmakiCooking 对外公开的是静态门面 EmakiCookingApi,用于提供版本、插件名和就绪状态探针。工位交互、配方结算、营养施加等完整玩法流程仍以方块交互、配方、命令和动作为主要入口;需要介入烹饪或营养时优先监听 事件 API 或注册 JavaScript 烹饪规则。

推荐接入方式

  1. 公开 API 探针:通过 EmakiCookingApi 或 CoreLib JavaScript 的 emaki.module("cooking") 判断模块是否可用。
  2. 事件:监听 CookingRecipeCompleteEventPlayerNutritionConsumeEventNutritionThresholdChangeEvent 拦截或记录烹饪与营养流程,详见 事件 API
  3. JavaScript 规则:通过脚本注册烹饪产物规则和完成钩子,详见 JavaScript 脚本
  4. PlaceholderAPI:通过占位符读取营养状态,详见 占位符
  5. 配置驱动:通过 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: true

JavaScript 调用

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.ymlnutrition 配置。
  • 玩家手动烹饪:使用方块交互。
  • 任务或成就监听:使用事件。
  • 修改产物或追加奖励:使用 JavaScript 规则和完成钩子。