北伐666
execute if entity @a[nbt=]
nbt=后需要添加什么才能用来检测玩家副手上的物品

wiki上我查不到这个nbt,是我的查法不对?



Peanutz_OwO
本帖最后由 Peanutz_OwO 于 2020-7-31 13:00 编辑

哦对忘了玩家没有 HandItems,应该是 Inventory:[{Slot:-106b,id:"<待检测物品id>"}]




⊙u⊙
data get entity @s

之后选择你需要检测的填写回去

一水合氨
本帖最后由 tonylo 于 2020-7-31 13:01 编辑
  1. /execute as @a if entity @s[nbt={Inventory: [{Slot: -106b, id: "minecraft:要检测的物品"}]}] run say 1
复制代码
玩家在副手拿起特定物品时说1
比如:
  1. /execute as @a if entity @s[nbt={Inventory: [{Slot: -106b, id: "minecraft:cobblestone"}]}] run say 1
复制代码
玩家在副手拿起圆石时说1

版本1.16.1,不确定之前的版本可不可以

renyunzhong
副手对应物品栏位置-106b
检测可以用execute as @a[nbt={Inventory:[{Slot:-106b,id:"minecraft:stone"}]}]
需要检测nbt可以用execute as @a[nbt={Inventory:[{Slot:-106b,id:"minecraft:stone",tag:{YourNBT:1b}}]}]
当然也可以使用execute if data entity @s  Inventory[{Slot:-106b,id:"minecraft:stone"}]
或者execute if entity @s[nbt={Inventory:[{Slot:-106b,id:"minecraft:stone"}]}]

北伐666
renyunzhong 发表于 2020-7-31 13:22
副手对应物品栏位置-106b
检测可以用execute as @a[nbt={Inventory:[{Slot:-106b,id:"minecraft:stone"}]}] ...

那么我怎样指定减少副手的物品呢,比如说副手上放了64个石头,但是我只想减少1个石头该用什么指令

北伐666
tonylo 发表于 2020-7-31 12:57
玩家在副手拿起特定物品时说1
比如:
玩家在副手拿起圆石时说1

那么我怎样指定减少副手的物品呢,比如说副手上放了64个石头,但是我只想减少1个石头该用什么指令

一水合氨
北伐666 发表于 2020-7-31 13:49
那么我怎样指定减少副手的物品呢,比如说副手上放了64个石头,但是我只想减少1个石头该用什么指令 ...

直接用/clear?
  1. /clear @a minecraft:cobblestone 1
复制代码
好处是简单但有可能没清副手反而清背包
指定清副手的研究中

北伐666
tonylo 发表于 2020-7-31 13:54
直接用/clear?
好处是简单但有可能没清副手反而清背包
指定清副手的研究中

clear会优先清理背包中的物品,应该有什么nbt能让clear指定清理副手的物品。但是我对wiki的熟练度太差搜不到

renyunzhong
北伐666 发表于 2020-7-31 13:42
那么我怎样指定减少副手的物品呢,比如说副手上放了64个石头,但是我只想减少1个石头该用什么指令 ...

我能想到的有三种,一个是clear,但是clear会先开始清除背包里的东西,最后才轮到副手

再者就是nbt穷举法,检测副手物品Count,替换成Count-1的一组石头,但这个会把例如铁砧命名之类的吞掉,而且穷举写命令方块不现实,至少得写函数文件

还有一个是比较黑科技的,可以修改玩家背包所有物品的特定nbt而保留剩下的,但也比较麻烦,需要用到战利品表,将其放在数据包的data\minecraft\loot_tables\blocks\下面

yellow_shulker_box.json (什么颜色都可以,对盒子正常使用不影响)

装上之后就可以execute到一个黄色盒子的位置,使用指令
loot replace entity @s weapon.offhand 1 mine ~ ~ ~ air{drop_contents:1b}
将手中的物品替换成盒子中的第一个物品

所以就可以用/data modify block ~ ~ ~ Items append from entity @s Inventory[{Slot:-106b}]
建个用于储存物品数量的记分板/scoreboard objectives add count dummy
然后获取nbt中的Count:/execute store result score count count run data get block ~ ~ ~ Items[0].Count
然后将记分板数值赋回去:/execute store result block ~ ~ ~ Item[0].Count byte 1 run scoreboard players remove count count 1
最后将修改好的物品replace回玩家手中即可

你也可以参考这个视频,如果能上去的话: https://www.youtube.com/watch?v=2z1uEhFVzFA&

一水合氨
北伐666 发表于 2020-7-31 13:55
clear会优先清理背包中的物品,应该有什么nbt能让clear指定清理副手的物品。但是我对wiki的熟练度太差搜 ...

是有关于数量的nbt
  1. Inventory: [{Slot: -106b, id: "minecraft:cobblestone", Count: 物品数量b}]
复制代码
但是无法直接修改玩家物品栏nbt
是有间接修改物品栏nbt的方法但要创建数据包,战利品表,比较麻烦,我还在研究

爱心魔王FHC
北伐666 发表于 2020-7-31 13:55
clear会优先清理背包中的物品,应该有什么nbt能让clear指定清理副手的物品。但是我对wiki的熟练度太差搜 ...

这里建议不用clear
直接用replaceitem指令把玩家副手的物品替换成空气(就是清空)
https://wiki.biligame.com/mc/%E5%91%BD%E4%BB%A4/replaceitem

第一页 上一页 下一页 最后一页