Skip to content

物品来源系统 (Item Source)

Minecraft 服务器上经常同时跑着好几个物品插件——CraftEngine、ItemsAdder、NeigeItems 等等。物品来源系统就是为了解决"怎么用一种写法引用所有这些插件的物品"这个问题。

不管物品来自原版还是第三方插件,你都用同一套 类型-物品ID 的格式来引用。CoreLib 在运行时自动检测服务器上装了哪些插件,帮你把引用解析成实际的 ItemStack。

ItemSourceType 枚举

类型枚举别名对应插件说明
VANILLAvanilla, minecraft, mcMinecraft 原版原版物品,使用 Material 名称
CRAFTENGINEcraftengine, ceCraftEngineCraftEngine 自定义物品
ITEMSADDERitemsadder, iaItemsAdderItemsAdder 自定义物品
NEIGEITEMSneigeitems, niNeigeItemsNeigeItems 自定义物品
MMOITEMSmmoitems, miMMOItemsMMOItems 自定义物品
NEXOnexoNexoNexo 自定义物品

每种类型都有简短的别名,写配置时可以少打几个字。

简写格式

物品来源的格式是 类型-物品ID,用连字符 - 分隔:

<sourceType>-<itemId>

各类型示例

类型简写示例说明
VANILLAvanilla-diamond_sword原版钻石剑
VANILLAminecraft-golden_apple原版金苹果(用别名)
VANILLAmc-netherite_ingot原版下界合金锭(用别名)
CRAFTENGINEcraftengine-custom_pickaxeCraftEngine 自定义镐
CRAFTENGINEce-magic_wandCraftEngine 魔杖(用别名)
ITEMSADDERitemsadder-emaki:fire_swordItemsAdder 物品(命名空间:ID)
ITEMSADDERia-emaki:ice_shieldItemsAdder 物品(用别名)
NEIGEITEMSneigeitems-legendary_bowNeigeItems 物品
NEIGEITEMSni-epic_armorNeigeItems 物品(用别名)
MMOITEMSmmoitems-SWORD.fire_bladeMMOItems 物品(类型.ID)
MMOITEMSmi-BOW.thunder_bowMMOItems 物品(用别名)
NEXOnexo-crystal_staffNexo 物品

重要

分隔符是连字符 -,不是冒号 :。这是最常见的写错的地方。

yaml
# ✅ 正确
source: "vanilla-diamond_sword"
source: "minecraft-diamond_sword"

# ❌ 错误
source: "minecraft:diamond_sword"
source: "vanilla:diamond_sword"

冒号 : 只会出现在第三方插件物品 ID 的内部(比如 ItemsAdder 的 namespace:id),而不是用来分隔来源类型和物品 ID。

使用场景

物品来源格式在 CoreLib 的多个子系统中都会用到:

GUI 物品字段

GUI 模板里的 item.source 字段:

yaml
slots:
  reward_display:
    slots: "13"
    type: DISPLAY
    item:
      source: "vanilla-diamond"
      name: "<aqua>钻石奖励"
      amount: 5

装配系统 baseSource

装配系统里指定基础物品:

yaml
assembly:
  baseSource: "craftengine-iron_longsword"
  namespace: "forge"

动作 createitem / senditem

动作系统里通过 source 参数引用物品:

yaml
actions:
  - "createitem source=vanilla-diamond amount=10"
  - "senditem source=itemsadder-emaki:rare_gem amount=1"
  - "clearitem source=vanilla-dirt"

集成机制

CoreLib 不会硬依赖任何第三方物品插件。启动时它会检测服务器上装了哪些插件,装了的就注册对应的提供者,没装的就跳过。CraftEngine 解析器直接调用 CraftEngine API 并监听其重载事件自动刷新物品表,其他插件的解析器在插件启用/禁用时动态注册或注销:

服务器启动
  ├─ 检测 CraftEngine  → 已安装 → 注册 CRAFTENGINE 提供者
  ├─ 检测 ItemsAdder   → 已安装 → 注册 ITEMSADDER 提供者
  ├─ 检测 NeigeItems   → 未安装 → 跳过
  ├─ 检测 MMOItems     → 未安装 → 跳过
  └─ 检测 Nexo         → 未安装 → 跳过

这样做的好处是,即使某个插件没装,CoreLib 也能正常启动,只是对应的物品来源类型不可用。当你尝试使用未安装插件的物品来源时,系统会返回 ITEM_SOURCE_NOT_FOUND 错误。

编程接口

java
ItemSourceService itemSourceService = EmakiServiceRegistry.get(ItemSourceService.class);

// 解析物品来源,拿到 ItemStack
Optional<ItemStack> item = itemSourceService.resolve("vanilla-diamond_sword", 1);

// 检查某个来源类型是否可用(对应插件是否已安装)
boolean available = itemSourceService.isAvailable(ItemSourceType.ITEMSADDER);

// 获取所有已注册的来源类型
Set<ItemSourceType> registered = itemSourceService.getRegisteredTypes();

注意

resolve 返回 Optional<ItemStack>。物品来源不可用或物品 ID 无效时会返回空值,调用方要记得处理这种情况。

Released under the GPL-3.0 License