minecraft吧 关注:2,547,851贴子:31,856,863
  • 8回复贴,共1

[教程]两个命令方块实现服务器可用的防盗门

取消只看楼主收藏回复

私人财产神圣不可侵犯,在游戏中同样如此。为了让玩家有自己一片栖身之地,有的服务器会通过坐标限制非区域主人不能进入某个区域。但这样有点不符合少干预、少禁止和多样性原则。所以我根据自己的需求设计了这个防盗门。具体教程如下:


1楼2019-07-08 12:13回复
    功能需求:当主人靠近门时打开,离开门时关闭。
    实现思路:
    1:用 @贴吧用户_00000e8🐾 判断栅栏所在的<坐标A>是否有实体,//这里用了栅栏而不是铁门,后续会说明原因
    2:若以上 成立,判断主人是否在<坐标A> ,
    3: 若以上 成立,用setblock 命令将<坐标A> 的实体换为空气方块。


    2楼2019-07-08 12:23
    收起回复
      第一个命令方块的命令:
      例如<坐标A>为 (14,13,16)
      /execute as @e[x=14,y=13,z=16,dx=0,dy=0,dz=0] as @s[name=<玩家姓名>] run setblock 14 13 16 空气方块 replace
      重点讲解:
      1 . as @e[x=14,y=13,z=16,dx=0,dy=0,dz=0] : 选中在坐标 (14,13,16) 中的所有实体,用于后面的 @s 的二次筛选。
      2. as @s[name=<玩家姓名>] : 在上步中的 @e范围内再次选择名字为 <玩家姓名> 的玩家。也就是判断某玩家是否在指定坐标内。
      简而言之,上面两步实现了 判断 某玩家 是否在 指定坐标内,即与主人的栅栏重合,如果重合,将栅栏替换为指定方块:
      3. setblock 14 13 16 空气方块 replace
      重点讲解:
      将坐标 (14,13,16) 中的方块替换为指定方块,这里为空气方块。


      3楼2019-07-08 12:41
      收起回复
        这时你会发现:当玩家通过后栅栏不会回来了。为了让栅栏回来,我们:
        再写个命令,当玩家离开 <指定坐标> 后将 <指定坐标> 的空气方块替换为栅栏。
        如果你和我想的一样,那么你想对了。问题是,这里有 一个重难点,如何判断玩家不再某个 <指定坐标> 呢?
        这里就用到 unless 命令了:
        /execute unless entity @a[x=14,y=13,z=16,dx=0,dy=0,dz=0,name=MengKE] run setblock 14 13 16 minecraft:birch_fence replace
        重点讲解:
        1. unless entity @a[x=14,y=13,z=16,dx=0,dy=0,dz=0,name=玩家姓名]
        unless 的作用是 如果找不到目标则执行,在这里是:如果在指定坐标 (14,13,16) 找不到名为 玩家姓名 的玩家,则。。。
        2, run setblock 14 13 16 minecraft:birch_fence replace
        看三楼


        4楼2019-07-08 12:56
        回复
          终于下课了,继续


          7楼2019-07-08 16:18
          回复
            我来说说制作过程中遇到的问题:
            1:为什么要用栅栏?用铁活板门或铁门行不行?
            答:可以是可以,思路为:有玩家靠近打开门或活板门,没有则关闭。
            但是,但是,但是:这样你会发现你进去以后没法出去了,因为你会被栅栏或门永远挡在里面。因为打开的门的碰撞体积在方块一个面的最边缘,你无法从这个方向与方块重合。
            而栅栏的体积是小于一个方块的体积的,so


            8楼2019-07-08 16:27
            收起回复
              接下来的讲解我画个图解释。
              2:如果你有了一个房子,但是有恶意玩家卡你的体积重叠插队进门怎么办?
              答:这时就需要双保险了。
              1)弄两个栅栏,如下:
              不过这会产生一个新的问题,见下楼,嘻嘻


              9楼2019-07-08 16:40
              回复
                因为光杆栅栏和两个连着的栅栏是不一样的,呃,有点糊涂
                这么说,假设 两个连着的栅栏 为 A
                单个光杆栅栏为 B
                并不能想当然的认为: A = B + B。因为中间还多了两个横杆,所以 A = (B + c) + (B + c),
                B 与 (B + c) 是两个不同的模型。
                如果你在一个 B 旁边生成另一个 B,系统会自动替换为 (B+ c)(两个 B 全部替换),而命令方块会又生成一个 B
                系统继续替换,命令方块继续生成。如此,如此,会造成死循环。不过照样能用,只要你不觉得命令提示消息烦就行。


                10楼2019-07-08 16:57
                收起回复
                  光杆栅栏 B
                  两个连在一起的栏杆 (A) ,注意中间的两个横杆 (B + c)


                  11楼2019-07-08 17:00
                  回复