跳到主要内容

物品源系统

Malkuth 通过物品源(ItemSource)系统支持 36 个固定物品源 + 1 个条件物品源(mod,仅 Mod 服务器生效),可从第三方插件或内置来源加载物品。你也可以注册自定义物品源。

MalkuthItem 对象

MalkuthItem 是物品源管理的核心对象,位于 kim.hhhhhy.malkuth.common.api.item 包下。

方法一览

方法返回值说明
getLoadedSources()List<ItemSource>获取所有已加载的物品源实例
get(source: String)ItemSource?根据名称精确获取物品源实例
findSource(source: String)ItemSource?忽略大小写按名称或别名查找物品源,未找到返回 null
normalizeSource(source: String)String返回已加载物品源的规范名称;未找到时返回去除首尾空白并转为小写的输入值
readSourceTrace(item: ItemStack)ItemSourceTrace?读取物品上的 Malkuth 来源追踪信息,未记录或读取失败时返回 null
getItemSourceId(item: ItemStack, sourceName: String? = null)String反向识别 source:itemId;指定来源时仅使用该来源,无法识别时返回空字符串
getSource(source: String)ItemSource根据名称或别名获取物品源,未找到时回退到 minecraft
register(instance: ItemSource)Unit注册自定义物品源
parse2ItemStack(id: String, player: Player?)BuildSourceItem解析物品 ID 为 BuildSourceItem

物品 ID 格式

Malkuth 使用 source:itemId 格式标识物品:

minecraft:diamond_sword     → 原版钻石剑
mythicmobs:SkeletonKingSword → MythicMobs 物品
itemsadder:custom_gem → ItemsAdder 物品

解析物品

import kim.hhhhhy.malkuth.common.api.item.MalkuthItem

// 解析物品 ID 为 BuildSourceItem
val result = MalkuthItem.parse2ItemStack("mythicmobs:SkeletonKingSword", player)
player.inventory.addItem(result.itemStack)

// 获取所有已加载的物品源
val sources = MalkuthItem.getLoadedSources()
sources.forEach { println("已加载物品源: ${it.name}") }

ItemSource 接口

自定义物品源需要实现 ItemSource 接口:

import kim.hhhhhy.malkuth.common.api.item.ItemSource

interface ItemSource {

/** 物品源名称(唯一标识) */
val name: String

/** 物品源别名列表(可选的替代名称) */
val alias: List<String>

/** 所属插件名称 */
val pluginName: String

/** 该物品源对应的插件是否已加载 */
val isLoaded: Boolean

/**
* 根据物品 ID 构建 ItemStack
* @param id 物品 ID(不含 source: 前缀)
* @param player 目标玩家(部分物品源需要玩家上下文)
* @return 构建出的 ItemStack
*/
fun build(id: String, player: Player? = null): ItemStack

/** 反向识别物品 ID,不匹配当前来源时返回空字符串 */
fun getId(itemStack: ItemStack): String {
val trace = MalkuthItem.readSourceTrace(itemStack) ?: return ""
if (!trace.source.equals(name, ignoreCase = true)) {
return ""
}
return formatId(trace.itemId)
}

/** 格式化为 name:itemId,空 ID 返回空字符串 */
fun formatId(itemId: String): String {
val normalized = itemId.trim()
if (normalized.isEmpty()) {
return ""
}
return "$name:$normalized"
}

/** 输出物品源错误消息并返回基岩占位物品 */
fun warnItemNotFound(value: String): ItemStack {
return buildItem(XMaterial.BEDROCK).also {
console().sendLang("item-source-error", pluginName, value)
}
}
}

ItemSourceTrace

MalkuthItem.readSourceTrace 返回的来源追踪结构:

字段类型说明
sourceString物品源名称
itemIdString物品源内部 ID

BuildSourceItem

字段类型说明
playerPlayer?目标玩家
idString物品 ID
itemStackItemStack构建出的物品
sourceString物品源插件名称

注册自定义物品源

import kim.hhhhhy.malkuth.common.api.item.ItemSource
import kim.hhhhhy.malkuth.common.api.item.MalkuthItem

class MyItemSource : ItemSource {

override val name = "myplugin"
override val alias = listOf("mp", "my")
override val pluginName = "MyPlugin"
override val isLoaded: Boolean
get() = Bukkit.getPluginManager().isPluginEnabled("MyPlugin")

override fun build(id: String, player: Player?): ItemStack {
return MyPlugin.getItem(id) ?: warnItemNotFound(id)
}
}

// 注册物品源
MalkuthItem.register(MyItemSource())

注册后即可在商店配置中使用:

goods:
- id: "my_item"
source: "myplugin:custom_item"

内置物品源

Malkuth 内置了 36 个固定物品源 + 1 个条件物品源,自动检测对应插件是否加载:

物品源名称对应插件说明
minecraft原版物品
mythicmobsMythicMobs神话物品
itemsadderItemsAdderIA 自定义物品
neigeitemsNeigeItemsNI 物品
mmoitemsMMOItemsMMO 物品
oraxenOraxenOraxen 自定义物品
zaphkielZaphkielZaphkiel 物品
craftengineCraftEngineCE 物品
baikirutoBaikirutoBaikiruto 物品
emakiitemEmakiItemEmakiItem 物品,别名 emaki / emaki-item / emaki_item
qinhitemsQinhItemsQinhItems 物品,别名 qinh / qi / qinh-items / qinh_items
overtureOvertureOverture 物品,别名 ovt / over
sxitemSX-ItemSX 物品
slimefunSlimefun粘液科技物品
headdatabaseHeadDatabase头颅数据库
executableitemsExecutableItemsEI 物品
azureflowAzureFlowAzureFlow 物品
magicgemMagicGem魔法宝石
pxrpgPxRPGPxRPG 物品
ratzielRatzielRatziel 物品
customfishingCustomFishing自定义钓鱼物品
nexoNexoNexo 物品
novaNovaNova 物品
hmccosmeticsHMCCosmeticsHMC 装饰物品
sertralineSertralineSertraline 物品
dragonarmourersDragonArmourers龙铠甲物品
repositoryMalkuth 物品仓库
ecoarmorEcoArmorEco 护甲
ecocratesEcoCratesEco 宝箱
ecoitemsEcoItemsEco 物品
ecomobsEcoMobsEco 怪物掉落
ecopetsEcoPetsEco 宠物物品
ecoscrollsEcoScrollsEco 卷轴
reforgesReforgesEco 重铸物品
stattrackersStatTrackersEco 统计追踪器
talismansTalismansEco 护符
modMod 物品(模组服支持),ID 使用 modid:item_id
备注

物品源的 isLoaded 属性会在运行时动态检测对应插件是否启用。未安装对应插件的物品源不会影响 Malkuth 正常运行。

mod 是条件来源,只在 ModUtil.isModServer() 判定为 Mod 服务端时注册。Arclight、Mohist、Banner 等混合端上的模组注册表物品应使用 mod:modid:item_id,不要交给 minecraft 来源解析。