搜索

开发者 API

只读祭坛查询 API、Bukkit 合成事件与扩展接入示例。

BlockCraft 1.0.13 提供只读祭坛查询 API 和三个 Bukkit 合成事件。

添加依赖

把 BlockCraft Jar 作为 provided/compileOnly 依赖,不要打进你的插件 Jar。

Maven 坐标:

<dependency>
    <groupId>cn.blockcraft</groupId>
    <artifactId>blockcraft</artifactId>
    <version>1.0.13</version>
    <scope>provided</scope>
</dependency>

如果未发布到 Maven 仓库,可先把 Jar 安装到本地仓库或由你的构建仓库托管。

在消费插件的 plugin.yml 中声明:

depend:
  - BlockCraft

查询 API

import cn.blockcraft.api.BlockCraftApi;
import cn.blockcraft.api.BlockCraftApiProvider;
import org.bukkit.Location;

BlockCraftApi api = BlockCraftApiProvider.get();
Location core = /* 祭坛核心位置 */;

api.stateAt(core).ifPresent(state ->
        getLogger().info("祭坛状态:" + state)
);

api.altarItem(core).ifPresent(item ->
        getLogger().info("中心物品数量:" + item.getAmount())
);

api.resultItem(core).ifPresent(item ->
        getLogger().info("待领取产物:" + item.getType())
);

api.pedestalItems(core).forEach((slot, item) ->
        getLogger().info("基座 " + slot + ":" + item.getType() + " x" + item.getAmount())
);

api.surroundingItems(core).forEach((slot, item) ->
        getLogger().info("环绕槽 " + slot + ":" + item.getType() + " x" + item.getAmount())
);

接口方法:

方法 返回值
stateAt(Location) Optional<AltarState>,状态为 IDLE 或 CRAFTING
pedestalItems(Location) 基座槽位编号到 ItemStack 的只读副本
surroundingItems(Location) 高级配方环绕槽位编号到 ItemStack 的只读副本
altarItem(Location) 中心前置物副本
resultItem(Location) 待领取产物副本

BlockCraftApiProvider.get() 只能在 BlockCraft 启用后调用。BlockCraft 关闭后 API 实例会注销。

合成开始事件

AltarCraftStartEvent 在配方和权限验证完成、扣款前触发,可以取消:

@EventHandler
public void onCraftStart(AltarCraftStartEvent event) {
    if (event.getPlayer().getWorld().getName().equals("disabled_world")) {
        event.setCancelled(true);
    }
}

可读取:

  • getPlayer();
  • getCoreLocation();
  • getRecipe();
  • isCancelled() / setCancelled(boolean)。

取消开始事件时不会扣费、不会消耗材料,也不会进入计时。

合成完成事件

AltarCraftCompleteEvent 在材料已经安全扣除、结果已经保存到祭坛后触发:

@EventHandler
public void onCraftComplete(AltarCraftCompleteEvent event) {
    getLogger().info(event.getPlayer().getName()
            + " 合成了 " + event.getRecipe().id());
    ItemStack resultCopy = event.getResult();
}

getResult() 返回结果副本。修改它不会替换祭坛中已经保存的产物。

概率失败事件

AltarCraftFailEvent 在成功率判定失败并按配方规则完成材料消耗后触发:

@EventHandler
public void onCraftFail(AltarCraftFailEvent event) {
    getLogger().info(event.getPlayer().getName()
            + " 合成失败:" + event.getRecipe().id());
}

普通取消、结构损坏或产物生成失败不会触发 AltarCraftFailEvent;该事件只代表一次完成的概率失败结算。

RecipeDefinition

事件中的 getRecipe() 提供:

  • ID、显示名称和结构 ID;
  • 权限与优先级;
  • 持续时间和额外材料规则;
  • 费用、成功率和失败规则;
  • 附魔继承与匹配规则;
  • 配方形式 mode;
  • 中心物品、基座材料、环绕材料和结果定义。

结构定义中的 supportGroups() 返回全部纯结构支持方块组。每组 StructureSupportDefinition 包含组 ID、原版/CraftEngine 方块身份和相对坐标;这些方块只参与结构校验,不会出现在 pedestalItems() 中。

监听器应执行快速操作。需要访问 Bukkit 世界、实体或背包时,应遵循服务器主线程规则。