命令方块吧 关注:6,106贴子:68,762
  • 5回复贴,共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
          回复
            大家给点意见啊QAQ
            如果觉得太无聊的话可以给个脑洞23333


            8楼2015-06-23 14:46
            收起回复