hasItem 和 hasStockItem 条件方法¶
hasItem - 普通物品判断¶
判断玩家背包中是否有指定材质、数量(可选包含描述和模型)的物品。
格式¶
参数说明¶
| 参数 | 说明 | 必需 |
|---|---|---|
mats |
Minecraft 材质名称(支持多种格式) | ✅ |
amount |
需要的数量 | ✅ |
lore |
物品描述中需要包含的文本(忽略大小写) | ❌ |
model |
物品的 item_model(格式:namespace:key) | ❌ |
判断规则¶
- 物品材质必须匹配
- 所有匹配物品的数量总和必须大于等于指定数量
- 如果指定了
lore,物品描述中必须包含该字符串(忽略大小写) - 如果指定了
model,物品的 item_model 必须匹配(格式为namespace:key)
物品材质名格式支持¶
KaMenu 支持多种材质名称格式,系统会自动规范化并匹配对应的 Material 枚举:
- 标准格式:
DIAMOND_SWORD - 小写:
diamond_sword - 混合大小写:
DiAMond swORd - 短杠:
Diamond-Sword - 空格:
diamond sword
示例:
# 以下格式均可匹配到 DIAMOND_SWORD
- condition: "hasItem.[mats=DIAMOND_SWORD;amount=1]"
- condition: "hasItem.[mats=diamond_sword;amount=1]"
- condition: "hasItem.[mats=Diamond-Sword;amount=1]"
- condition: "hasItem.[mats=diamond sword;amount=1]"
信息
系统会自动忽略大小写、将短杠和空格替换为下划线,并合并多余的下划线,因此所有上述格式都会正确匹配。
示例¶
判断玩家是否有 10 个钻石:
- condition: "hasItem.[mats=DIAMOND;amount=10]"
allow:
- 'tell: &a你有足够的钻石!'
deny:
- 'tell: &c你需要 10 个钻石!'
判断玩家是否有 1 个描述中包含"锻造材料"的钻石:
- condition: 'hasItem.[mats=DIAMOND;amount=1;lore=锻造材料]'
allow:
- 'tell: &a你有锻造材料钻石!'
deny:
- 'tell: &c你缺少锻造材料钻石!'
判断玩家是否有 16 个自定义模型的物品(如 Oraxen 的物品):
- condition: 'hasItem.[mats=PAPER;amount=16;model=oraxen:mana_crystal]'
allow:
- 'tell: &a你有足够的魔法水晶!'
deny:
- 'tell: &c你需要 16 个魔法水晶!'
结合 item 动作使用:
actions:
- condition: "hasItem.[mats=DIAMOND;amount=16]"
allow:
- 'item: type=take;mats=DIAMOND;amount=16'
- 'tell: &a购买成功!已扣除 16 个钻石'
deny:
- 'tell: &c物品不足!需要 16 个钻石'
反向判断(没有物品时满足条件):
actions:
- condition: "!hasItem.[mats=DIAMOND;amount=64]"
allow:
- 'tell: &a你可以继续采集钻石!'
deny:
- 'tell: &c你的背包已经满了!'
注意事项¶
- 材质名称不区分大小写,支持多种格式(见上方说明)
lore判断是包含关系,只要描述中包含指定字符串即可model格式为namespace:key,如:minecraft:book(原版物品模型)oraxen:mana_crystal(Oraxen 自定义物品)itemsadder:test_item(ItemsAdder 自定义物品)- 支持反向判断,如
!hasItem.[...]表示没有该物品时条件满足 - 遍历所有背包槽位(主背包、盔甲槽、副手槽、主手槽)
hasStockItem - 保存物品判断¶
判断玩家背包中是否有指定名称和数量的保存物品。
格式¶
参数说明¶
| 参数 | 说明 | 必需 |
|---|---|---|
| 物品名称 | 已保存物品的名称 | ✅ |
| 数量 | 需要的数量 | ✅ |
判断规则¶
- 物品必须通过
/km item save指令保存 - 物品比较使用
ItemStack.isSimilar()方法,忽略物品数量差异 - 所有匹配物品的数量总和必须大于等于指定数量
示例¶
判断玩家是否有 16 个神秘果:
判断玩家是否有 1 个神圣之剑:
结合 stock-item 动作使用:
actions:
- condition: "hasStockItem.神秘果;16"
allow:
- 'stock-item: type=take;name=神秘果;amount=16'
- 'tell: &a购买成功!'
deny:
- 'tell: &c物品不足!需要 16 个神秘果'
反向判断(没有物品时满足条件):
actions:
- condition: "!hasStockItem.神圣之剑;1"
allow:
- 'tell: &a你还没有这个武器,可以购买!'
deny:
- 'tell: &c你已经拥有神圣之剑,不能再购买了!'
使用变量:
actions:
# 从数据中读取物品名称和数量
- condition: "hasStockItem.{data:purchase_item};{data:required_amount}"
allow:
- 'stock-item: type=take;name={data:purchase_item};amount={data:required_amount}'
- 'tell: &a购买成功!'
deny:
- 'tell: &c物品不足!'
注意事项¶
- 物品必须先通过
/km item save保存才能使用 - 支持反向判断,如
!hasStockItem.物品名称;数量 - 物品比较会忽略 NBT 标签以外的差异
- 遍历所有背包槽位(主背包、盔甲槽、副手槽、主手槽)
完整示例:购物菜单¶
购买普通物品¶
将演示如何编写一个使用100金币/个的价格购买钻石的菜单。
Title: '§6§l钻石商店'
Settings:
need_placeholder:
- 'math'
Body:
diamond:
type: 'item'
text: '&a&l钻石'
material: DIAMOND
lore:
- '&7价格: 100 金币 / 个'
description: '请在下方拖动条选择购买数量。'
Inputs:
amount:
type: 'slider'
text: '&a购买数量'
min: 1
max: 64
default: 1
format: '%s: %s个'
Bottom:
type: 'confirmation'
confirm:
text: '&a[ 确认购买 ]'
actions:
# 购买钻石(使用 hasMoney 判断是否有足够的货币)
- condition: "isIntNum.$(amount)"
deny:
- 'tell: &c请输入一个有效的数值。'
- 'return'
- condition: "hasMoney.%math_0_100*$(amount)%"
allow:
- 'money: type=take;num=%math_0_100*$(amount)%'
- 'item: type=give;mats=DIAMOND;amount=$(amount)'
- 'tell: &a购买成功!消耗了金币 x%math_0_100*$(amount)%,获得 钻石 x$(amount)'
deny:
- 'tell: &c货币不足!需要 金币 x%math_0_100*$(amount)% '
- 'sound: block.note_block.bass'
deny:
text: '&c[ 取消购买 ]'
actions:
- 'actionbar: &c取消购买'
- 'sound: block.note_block.bass'
- 'close'
购买存储库的物品¶
前提: 若要使用该示例菜单,应该先使用指令/km item save 神奇钻石剑存储一个名为神奇钻石剑的物品。
Title: '§6§l神奇钻石剑商店'
Settings:
need_placeholder:
- 'math'
Body:
diamond_sword:
type: 'item'
text: '&a&l神奇钻石剑'
material: DIAMOND_SWORD
lore:
- '&7价格: 10 个钻石'
description: '请在下方拖动条选择兑换数量。'
Inputs:
amount:
type: 'slider'
text: '&a购买数量'
min: 1
max: 64
default: 1
format: '%s: %s个'
Bottom:
type: 'confirmation'
confirm:
text: '&a[ 确认购买 ]'
actions:
# 购买钻石剑(使用 hasItem 判断普通物品)
- condition: "hasItem.[mats=DIAMOND;amount=%math_0_10*$(amount)%]"
allow:
- 'item: type=take;mats=DIAMOND;amount=%math_0_10*$(amount)%'
- 'stock-item: type=give;name=神奇钻石剑;amount={data:purchase_amount}'
- 'tell: &a购买成功!消耗了钻石 x%math_0_10*$(amount)%,获得 神奇钻石剑 x$(amount)'
deny:
- 'tell: &c物品不足!需要 钻石 x%math_0_10*$(amount)% '
- 'sound: block.note_block.bass'
deny:
text: '&c[ 取消购买 ]'
actions:
- 'actionbar: &c取消购买'
- 'sound: block.note_block.bass'
- 'close'
两者的区别¶
| 特性 | hasItem | hasStockItem |
|---|---|---|
| 适用范围 | 普通物品 | 已保存的物品 |
| 参数格式 | hasItem.[mats=...;amount=...] |
hasStockItem.物品名称;数量 |
| 材质判断 | 使用 Minecraft 原生材质 ID | 使用保存物品的完整 ItemStack |
| 物品匹配 | 仅匹配材质、可选 lore 和 model | 使用 isSimilar() 完整匹配 |
| 预先保存 | 不需要保存 | 需要通过 /km item save 保存 |
| 适用场景 | 判断基础物品(如钻石、铁矿) | 判断自定义物品(如附魔装备、特殊道具) |