今天小编为大家解析一下如何在用命令方块在原版MC中制作背包合成系统,想知道的玩家一定要看下面的内容!
原作者:jim~命令傀儡师
首先,我们要理清思路
首先需要做到检测到相应的物品栏有相应的物品
展示里面是两根木棍合成了一根长棍
在正常情况下我们需要
testfor @a {Inventory:[{Slot:16b,id:"minecraft:stick",Count:1b,Damage:0s}]} 然后命令方块连接比较器输出
为了应和函数以及加快运行,我们可以用积分板tag做到
1.检测到相应物品栏的相应物品加上tag "a"和"b"
scoreboard players tag @a add a {Inventory:[{Slot:16b,id:"minecraft:stick",Count:1b,Damage:0s}]}
scoreboard players tag @a add b {Inventory:[{Slot:25b,id:"minecraft:stick",Count:1b,Damage:0s}]}
如何输出结果是下一个关键,这里,我们得同时探测拥有tag "a" "b"的玩家,这时很容易有个误区
直接在选择器那里输入[tag=a,tag=b],但是这样是不行的会导致只有a或只有b的玩家一起被选择
所以得这么做execute @a[tag=a] ~ ~ ~ execute @s[tag=b] ~ ~ ~
在选择了tag=a的玩家后再检测自身tag=b
2.输出
execute @a[tag=a] ~ ~ ~ execute @s[tag=b] ~ ~ ~ scoreboard players tag @s add c
诶?你说我没给物品啊.这是下一个步骤,如果直接输出物品会导致tag"a""b"没有删除而继续给予结果
所以我们加上tag "c"来判定合成,于是又到下一个关键----删除合成物品以及tag还有给予物品
这件事如果在同一tick中做会导致物品还没被给予合成物品就被删除了
所以这件事得分几个tick来做
3.生成积分板,合成物品分开做
scoreboard objectives add d dummy
首先,有了tag"c"就得开始记分
scoreboard players add @e[tag=c] d 1
然后删除合成物品
execute @e[tag=c,score_d_min=1,score_d=1] ~ ~ ~ /replaceitem entity @s slot.inventory.16 minecraft:air 1 0
execute @e[tag=c,score_d_min=2,score_d=2] ~ ~ ~ /replaceitem entity @s slot.inventory.7 minecraft:air 1 0
再然后给予成品
execute @e[tag=c,score_d_min=4,score_d=4] ~ ~ ~ /give @s stick 1 0 {display:{Name:"长棍",Lore:["通过多根木棍的连接组成的长棍"]},AttributeModifiers:[{Operation:0,UUIDLeast:1413204334,UUIDMost:1413204334,Amount:2,AttributeName:generic.attackDamage,Name:Attack,Slot:mainhand}]}
删除tag "a" "b"
execute @e[tag=c,score_d_min=4,score_d=4] ~ ~ ~ scoreboard players tag @s remove a
execute @e[tag=c,score_d_min=4,score_d=4] ~ ~ ~ scoreboard players tag @s remove b
当c被删除时,d将不再加分所以tagc是最后一个被删除的
execute @e[tag=c,score_d_min=5,score_d=5] ~ ~ ~ scoreboard players tag @s remove c
最后d归0
execute @e[score_d_min=5,score_d=5] ~ ~ ~ scoreboard players set @s d 0
诶?是不是看起来很完整,是不是以为完成了可以用了?
错了,现在你可以用以上指令执行一下,会发现....
是的,一根木棍就合成了,但是一共需要两根
那么,问题在哪呢?
在于
scoreboard players tag @a add a {Inventory:[{Slot:16b,id:"minecraft:stick",Count:1b,Damage:0s}]}
scoreboard players tag @a add b {Inventory:[{Slot:25b,id:"minecraft:stick",Count:1b,Damage:0s}]}
它们只要探测到了就加上"a"或"b"
即使物品已经挪走了,tag也还在那
所以我们为了防止这种事发生
比较好的做法是在一定时间后把tag"a""b"删掉
4.防止出错
生成积分板
scoreboard objectives add e dummy
加分
scoreboard players add @a e 1
清除tag
execute @e[score_a_min=1] ~ ~ ~ scoreboard players tag @s remove a
execute @e[score_b_min=1] ~ ~ ~ scoreboard players tag @s remove b
现在使用后效果就和之前所展示的成品一样了
这就是全部,完全由我自己研发,可能有些不足,目前看来,是适合多人使用的,但是尚未测试,
所以出错也是有可能发生的
19游戏网整理报道