Skip to content

API 与集成

EmakiLevel 对外公开的是静态门面 EmakiLevelApi。第三方插件应依赖 emaki-level-api,由服务器上安装的 EmakiLevel 插件在启用时安装 bridge、停用时卸载 bridge。

依赖方式

Maven:

xml
<dependency>
  <groupId>emaki.jiuwu.craft</groupId>
  <artifactId>emaki-level-api</artifactId>
  <version>1.4.0</version>
  <scope>provided</scope>
</dependency>

Gradle:

kotlin
dependencies {
    compileOnly("emaki.jiuwu.craft:emaki-level-api:1.4.0")
}

服务器端只需要安装:

text
EmakiCoreLib-*.jar
EmakiLevel-1.4.0.jar

不要把 emaki-level-api-*.jar 放进 plugins/。运行时插件 jar 已经包含自己的 API。

获取 API

直接调用静态门面:

java
if (EmakiLevelApi.available()) {
    int level = EmakiLevelApi.getLevel(player.getUniqueId(), "main");
    double exp = EmakiLevelApi.getExp(player.getUniqueId(), "main");
}

如果你更喜欢先做可用性检查,可以配合 provider 辅助类:

java
if (!EmakiLevelApiProvider.available()) {
    return;
}

EmakiLevelApiProvider.requireAvailable();
LevelOperationResult result = EmakiLevelApi.addExp(player.getUniqueId(), "main", 50.0, "quest_reward");

推荐在 paper-plugin.yml 中声明可选依赖:

yaml
dependencies:
  server:
    EmakiLevel:
      load: BEFORE
      required: false
      join-classpath: true

如果你的插件没有 EmakiLevel 就无法运行,可以把 required 改为 true

EmakiLevelApi 方法

方法说明
available()判断 API 是否已安装。
type(String typeId)查询一个等级类型定义。
types()获取所有已加载等级类型。
getPlayerData(UUID uuid)获取玩家等级数据视图。
getLevel(UUID uuid, String typeId)获取玩家指定类型等级。
getExp(UUID uuid, String typeId)获取当前等级内经验。
getTotalExp(UUID uuid, String typeId)获取总经验。
getRequiredExp(UUID uuid, String typeId, int targetLevel)获取升到目标等级所需经验。
addExp(UUID uuid, String typeId, double amount, String reason)增加经验,按类型配置触发自动升级。
removeExp(UUID uuid, String typeId, double amount, String reason)扣除当前等级内经验,不降级。
setExp(UUID uuid, String typeId, double amount, String reason)设置当前等级内经验。
addLevel(UUID uuid, String typeId, int amount, String reason)直接增加等级,并清空当前等级内经验。
removeLevel(UUID uuid, String typeId, int amount, String reason)直接扣除等级,并清空当前等级内经验。
setLevel(UUID uuid, String typeId, int level, String reason)直接设置等级,并清空当前等级内经验。
levelUp(UUID uuid, String typeId, LevelUpCause cause)按升级需求、消耗和奖励尝试升一级。

reason 建议使用稳定的英文 ID,例如 quest_rewarddungeon_cleardaily_task。它会进入升级动作变量 %reason%

数据视图

LevelTypeView

LevelTypeView 用来读取等级类型的展示信息、上下限、升级模式和属性配置,是只读视图。

PlayerLevelView

PlayerLevelView 用来查看某个玩家的所有等级类型数据。

PlayerLevelEntryView

PlayerLevelEntryView 表示某个等级类型的单项数据,包括 levelexptotalExprequiredExpprogress

LevelOperationResult

操作返回值包含:

  • 是否成功。
  • 失败原因 ID。
  • 操作类型。
  • 类型 ID。
  • 操作前后等级和经验。
  • 额外数据字段。

建议始终检查 success()

java
LevelOperationResult result = EmakiLevelApi.addExp(player.getUniqueId(), "combat", 25.0, "arena_win");
if (!result.success()) {
    plugin.getLogger().warning("Failed to add level exp: " + result.reason());
    return;
}

常见失败原因包括:player_not_foundtype_not_foundtype_disabledinvalid_amountupgrade_disabledmanual_upgrade_disabledmax_levelnot_enough_expnot_enough_moneynot_enough_materialinvalid_requirement

CoreLib Action

EmakiLevel 注册了 CoreLib Action,其他模块、脚本或第三方接入层可以通过动作修改等级数据。当前 Action ID 只使用规范名,不再注册旧别名;完整动作页见 CoreLib 动作

动作 ID

操作Action ID
增加经验emakileveladdexp
设置经验emakilevelsetexp
扣除经验emakilevelremoveexp
增加等级emakileveladdlevel
设置等级emakilevelsetlevel
扣除等级emakilevelremovelevel
重置等级类型emakilevelreset
手动升级emakilevellevelup

参数

参数必填默认说明
typeprimary_type等级类型 ID。
amount0经验或等级数量。等级操作会四舍五入为整数。
target动作上下文玩家在线玩家名或 UUID。未填写时使用 ActionContext.player()
reasonaction操作原因。
auto_upgradetrue仅增加经验时有意义;是否允许本次经验触发自动升级。
silentfalse静默标记,传入等级服务。

示例

yaml
actions:
  - 'emakileveladdexp type="cooking" amount="25" reason="recipe_success"'
yaml
actions:
  - 'emakileveladdexp target="Steve" type="main" amount="100" reason="admin_reward"'
yaml
actions:
  - 'emakileveladdexp type="mining" amount="500" auto_upgrade="false" reason="event_reward"'
yaml
actions:
  - 'emakilevelsetlevel target="Steve" type="combat" amount="30" reason="migration"'

动作执行成功时,ActionResult 数据包含 typeold_levelnew_levelold_expnew_expamount。失败时会返回 CoreLib Action 失败结果,并带上 EmakiLevel 的失败原因 ID。

MythicMobs Drop 接入

MythicMobs 非实物 Drop 属于运行时集成,不需要开发者 API:

yaml
Drops:
  - emakilevel_exp{type=main;amount=120}
  - elv_exp{type=combat;amount=80;reason=mythic_drop}

详细参数见 MythicMobs 集成

不要依赖实现类

第三方插件不应引用这些实现类或包:DefaultEmakiLevelApiPlayerLevelServicePlayerLevelDataStoreLevelTypeLoaderRequirementLoaderSourceRuleLoaderLevelOperationAction,以及任何 emaki.jiuwu.craft.level.service / loader / listener / bridge 包下的类。对外稳定入口只保留 emaki.jiuwu.craft.level.api.*