命令方块吧 关注:6,129贴子:69,038
  • 8回复贴,共1

[1.16+][没啥用]按钮终于知道自己是被谁按下的了

只看楼主收藏回复

在bbs发完后在这儿再发一遍真刺激(并不
一直以来,有几个问题困扰着一些CBer
那就是:
“怎么检测按钮是被谁按下的?怎么检测是谁激活的命令方块?”
在1.16之后,就可以借助进度触发器 minecraft:item_used_on_block 来检测按钮究竟是谁按下的了。
至于命令方块是谁激活的。。。既然能检测到按钮是谁按下去的,那检测命令方块是谁激活的好像就不难了吧。。。虽然好像用了这个方法后就不需要用命令方块了。。。
效果图:

原理:
Wiki上对进度触发器 minecraft:item_used_on_block 的触发条件解释为:
“玩家对方块使用物品时触发”
但实际上,只要玩家手持物品与方块交互即可满足此触发器,并非必须要使用。
甚至,当该触发器的条件 item 被空出时,空手(可以理解为手持air? 有待求证)与方块互动也会成功触发此触发器。
因此,依据我曾在bbs的某个帖子里给出的一些解释,在进度触发器里填写按钮坐标信息并匹配按钮的状态,即可做到检测玩家与按钮的互动,并奖励函数。由于进度奖励函数的执行者为完成进度的玩家,因此可以在奖励函数里使用 @s选择器来代指按下按钮的玩家。


IP属地:湖北1楼2020-07-29 23:40回复
    数据包文件及解析
    首先总结一下检测所需的一些关键参数:
    ●玩家手持任意物品或空手
    ●玩家与指定坐标的按钮产生了互动
    ●互动后按钮呈现被按下的状态
    手持任意物品或空手。。。不写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(防at) only test:test
    tellraw @a(防at) [{"text": "按按钮的是"},{"selector": "@s"}]
    这样即可对按下按钮的玩家执行命令了。


    IP属地:湖北2楼2020-07-29 23:43
    收起回复
      应用与不足
      在无法判断按钮是谁按下的时候,为考虑多人兼容性,以及现在很多人已经很少或不再使用命令方块,按钮往往被打入冷宫,取而代之的是多人友好、功能一目了然的告示牌。而有了能够检测按下按钮的玩家的方法,至少按钮不再会因为多人兼容不好而被抛弃。而且,此处使用按钮也没有使用到命令方块,可以很好地调试。按钮终于站起来了!
      不过其相对于告示牌的不足也确实存在。一个告示牌执行命令往往只需要绑定一个函数即可,而按照此方法,一个按钮想要执行命令则需要绑定一个进度和一个函数,而且需要手动输入按钮的坐标,还是较为麻烦。而且,按钮可能不如告示牌直观。


      IP属地:湖北3楼2020-07-29 23:43
      回复
        最后,二楼可能被吞,如果被吞了麻烦和我说一声


        IP属地:湖北4楼2020-07-29 23:44
        回复
          有意思


          IP属地:上海来自Android客户端6楼2020-08-05 14:06
          回复