命令方块吧 关注:5,360贴子:59,575
  • 48回复贴,共1

命令方块逻辑范例1:判断雪球击中的生物

只看楼主收藏回复

在命令方块系统里,我们经常会遇到不同的问题,比如我们应该在什么时候对什么实体执行什么命令
而这个问题通常都是用计分板以及高频来解决的
而这个范例我会用到:
一个基本的NBT(HurtTime),用以分辨哪只生物受伤(即使它没有扣血也算是受伤)
计分板(snowballNearBy和GetHit,它们都是dummy,就是只能用命令去更改它们的数值)
一些微观延迟


这个不是教程!!!而是一个逻辑的例子。这个例子所用的方法未必是最好的,我的讲解也未必好,所以请大家帮忙纠正
大家如果有任何关于这个系统的问题也可以在下方问我


回复
1楼2015-06-18 23:14
    以下是判断是否被雪球击中的命令(//开头的是解释下面的命令)

    //把所有GetHit分数为/大于1的生物的分数改为0
    scoreboard players set @e[score_GetHit_min=1] GetHit

    //把所有snowballNearBy为/大于3的生物的分数改为0(和延迟有关)
    scoreboard players set@e[score_snowballNearBy_min=3] snowballNearBy 0

    //为所有snowballNearBy 分数大于1的生物的snowballNearBy 分数增加1
    scoreboard players add@e[score_snowballNearBy_min=1] snowballNearBy 1

    //把附近有雪球的生物的snowballNearBy 分数改为1
    execute @e[type=Snowball] ~ ~ ~ execute@e[type=!Snowball,r=4] ~ ~ ~ scoreboardplayers set @e[c=1,r=0] snowballNearBy 1

    //把所有HurtTime:9s的生物的GetHit分数改为1
    (就是被攻击的生物就会改分数)
    scoreboard players set @e GetHit 1{HurtTime:9s}


    以下是判断生物类型的命令(不死类和普通)
    //先假设所有生物都是普通的(如果他们没有那个分数,那个分数就会变为0,如果有分数就不会改变)
    scoreboard players add @e TypeOfMob 0

    //把僵尸、僵尸猪人、骷髅的分数设置为1
    scoreboard players set @e[type=Zombie] TypeOfMob 1
    scoreboard players set @e[type=PigZombie] TypeOfMob1
    scoreboard players set @e[type=Skeleton] TypeOfMob1
    scoreboard players set @e[type=WitherBoss]TypeOfMob 1

    //以下是应用(对被雪球扔中的生物造成伤害)
    effect@e[score_snowballNearBy_min=1,score_GetHit_min=1,score_TypeOfMob_min=0,score_TypeOfMob=0]instant_damage 1 1 true
    effect@e[score_snowballNearBy_min=1,score_GetHit_min=1,score_TypeOfMob_min=1,score_TypeOfMob=1]instant_health 1 1 true


    回复
    2楼2015-06-18 23:14
      额,effect那里的括号被吃了,我现在重新发一次那个应用的命令
      effect @e[score_snowballNearBy_min=1,score_GetHit_min=1,score_TypeOfMob_min=0,score_TypeOfMob=0] instant_damage 1 1 true
      effect @e[score_snowballNearBy_min=1,score_GetHit_min=1,score_TypeOfMob_min=1,score_TypeOfMob=1] instant_health 1 1 true


      回复
      3楼2015-06-18 23:15
        首先,你们需要知道,如果雪球扔中生物,雪球会碎掉,所以生物的GetHit分数和snowballNearBy 分数应该不会同时为1的。因此,我们需要加入一个计分板的计时(当生物被攻击时,他前三游戏刻如果有雪球在附近,就判断为是雪球攻击它的)

        而当生物变成红色时(受到攻击),scoreboard players set @e GetHit 1 {HurtTime:9s}指令就会触发,就把其GetHit分数设置为1

        所以,如果那个生物的GetHit分数是1而且他的snowballNearBy分数是大于1的话,我们就知道它是在雪球经过时受到攻击,而这个有很大可能是被雪球击中,我们就可以把他判定为被雪球击中了

        这个系统的bug:如果生物在雪球附近被攻击的话/他受到攻击前3游戏刻,雪球在他半径4米之内,他就会被判定为受到雪球的攻击
        可行的解决方法之一:必须附近没有雪球他才能判定为受到雪球的攻击(就是把那个snowballNearBy 的最低分数调为2)。这个方法的坏处:如果玩家连发雪球,那么大部分的雪球都不会有效,所以我就不采纳这个方法。有没有更好的解决方法:有的,我就想到两个,然而他们都挺复杂,所以就不在这里说了,当然我欢迎你们在留言那里说出你们的想法了


        而scoreboard players set @e[score_snowballNearBy_min=3] snowballNearBy0
        和scoreboard players add @e[score_snowballNearBy_min=1] snowballNearBy1
        就是为了做到那个延迟
        流程:

        把附近有雪球的生物的snowballNearBy 分数改为1
        一堆运算


        下一个游戏刻:
        把那个生物的snowballNearBy 分数改为2
        一堆运算


        下一个游戏刻:
        把那个生物的snowballNearBy 分数改为3
        一堆运算


        下一个游戏刻
        把分数改为0


        回复
        4楼2015-06-18 23:16
          这一层用来修正错误~~~
          请勿在此层留言


          回复
          5楼2015-06-18 23:18
            赞一个,但是没人?


            回复
            来自Android客户端6楼2015-06-20 07:22
              God。。


              回复
              来自Android客户端7楼2015-06-21 18:17
                大家给点意见啊QAQ
                如果觉得太无聊的话可以给个脑洞23333


                收起回复
                8楼2015-06-23 14:46
                  脑洞: ☯乾坤♂大挪移☯
                  飞剑
                  一堆不同的符
                  炼丹


                  收起回复
                  来自Android客户端9楼2015-06-23 19:11
                    对惹,这个可以用来判断箭的吧,那个判断实体附近有没有雪球的半径是不是可以小点类


                    收起回复
                    来自Android客户端10楼2015-06-28 13:14
                      2018-11-19 12:41 广告
                      这个指令是1.8的吗


                      收起回复
                      11楼2015-08-06 17:06
                        感觉好厉害~大神快带我飞


                        回复
                        12楼2015-08-06 18:20
                          我用1.8连个效果都没有


                          收起回复
                          13楼2015-08-06 18:41
                            楼主可以加一个打中就挂吗


                            收起回复
                            来自Android客户端14楼2015-08-07 18:19
                              我想在5楼回复 @pca006132


                              收起回复
                              来自Android客户端16楼2015-08-08 03:23
                                屁ca why are you so diao?


                                回复
                                17楼2015-08-15 12:21
                                  Sao_N来暖贴= =


                                  回复
                                  18楼2015-08-15 12:31
                                    来暖


                                    回复
                                    来自Android客户端19楼2015-08-15 14:17
                                      那些试过但是没用的注意啦,pca用一些地方没加空格,所以自己把那些漏的空格加上
                                      我是Sao_N~~~~~~


                                      回复
                                      20楼2015-08-15 14:28
                                        我来补一下,使用前请添加判据
                                        /scoreboard objectives add GetHit dummy
                                        /scoreboard objectives add snowballNearBy dummy
                                        /scoreboard objectives add TypeOfMob dummy


                                        回复
                                        21楼2015-08-15 18:36