命令方块吧 关注:4,712贴子:56,010
  • 47回复贴,共1

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

只看楼主收藏回复

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


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


为企业提供完美网络存储服务器解决方案,提供上门安装-技术调试 synology群晖昌讯电脑官方授权总代
广告
以下是判断是否被雪球击中的命令(//开头的是解释下面的命令)

//把所有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
                脑洞: ☯乾坤♂大挪移☯
                飞剑
                一堆不同的符
                炼丹


                对惹,这个可以用来判断箭的吧,那个判断实体附近有没有雪球的半径是不是可以小点类


                大皇帝页游新区入口,策略游戏选大皇帝,点击领取礼包,新服送首冲高返利! 酷玩吧为您推荐!!!
                广告
                这个指令是1.8的吗


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


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


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


                      我想在5楼回复 @pca006132


                      屁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