mcbbs原帖链接:https://www.mcbbs.net/thread-1089131-1-1.html
一直以来,有几个问题困扰着一些CBer
那就是:
怎么检测按钮是被谁按下的?怎么检测是谁激活的命令方块?
在1.16之后,就可以借助进度触发器minecraft:item_used_on_block
来检测按钮究竟是谁按下的了。
至于命令方块是谁激活的。。。既然能检测到按钮是谁按下去的,那检测命令方块是谁激活的好像就不难了吧。。。虽然好像用了这个方法后就不需要用命令方块了。。。
效果图
原理
进度触发器minecraft:item_used_on_block的触发条件为:
玩家对方块使用物品时触发 ——Minecraft Wiki
但实际上,只要玩家手持物品与方块交互即可满足此触发器,并非必须要使用。
甚至,当该触发器的条件item
被空出时,空手(可以理解为手持air? 有待求证)与方块互动也会成功触发此触发器。(Mojang出来挨打)
因此,依据我曾在这个帖给出的一些解释,在进度触发器里填写按钮坐标信息并匹配按钮的状态,即可做到检测玩家与按钮的互动,并奖励函数。由于进度奖励函数的执行者为完成进度的玩家,因此可以在奖励函数里使用@s
选择器来代指按下按钮的玩家。
数据包文件及解析
首先总结一下检测所需的一些关键参数:
● 玩家手持任意物品或空手
● 玩家与指定坐标的按钮产生了互动
● 互动后按钮呈现被按下的状态
手持任意物品或空手。。。不写item
参数即可。
指定坐标:这里需要注意一下,需要填写的坐标并非整数坐标,而是整数坐标加上0.5后的值。。。好像解释的不太好,比如一个按钮的坐标是x=10,y=20,z=-30
,那么进度中需要填写的坐标就是"x": 10.5, "y": 20.5, "z": -29.5
。嗯,应该就这样
按钮为被按下的状态:"powered": true
应该无需过多解释
据此,完整的进度json如下(此处按钮坐标为343 77 -616):
{
"criteria": {
"test": {
"trigger": "minecraft:item_used_on_block",
"conditions": {
"location": {
"block": {
"tag": "minecraft:buttons",
"state": {
"powered": true
}
},
"position": {
"x": 343.5,
"y": 77.5,
"z": -615.5
}
}
}
}
},
"rewards": {
"function": "test:test"
}
}
在奖励函数中执行所需命令,并剥夺原进度。可在此函数中使用@s
来代指按下按钮的玩家
advancement revoke @s only test:test
tellraw @a [{"text": "按按钮的是"},{"selector": "@s"}]
这样即可对按下按钮的玩家执行命令了。
应用与不足
在无法判断按钮是谁按下的时候,为考虑多人兼容性,以及现在很多人已经很少或不再使用命令方块,按钮往往被打入冷宫,取而代之的是多人友好、功能一目了然的告示牌。而有了能够检测按下按钮的玩家的方法,至少按钮不再会因为多人兼容不好而被抛弃。而且,此处使用按钮也没有使用到命令方块,可以很好地调试。按钮终于站起来了!
不过其相对于告示牌的不足也确实存在。一个告示牌执行命令往往只需要绑定一个函数即可,而按照此方法,一个按钮想要执行命令则需要绑定一个进度和一个函数,而且需要手动输入按钮的坐标,还是较为麻烦。而且,按钮可能不如告示牌直观。
最后,个人有个想法,不知能不能把按钮和1.16物品展示框的全新特性结合起来,做出比告示牌更加直观震撼的效果呢?