[反作弊] 防止飞行

Ganxiaozhe
2019/08/22

未经作者授权,禁止转载

引子

由于之前 《风清弊绝》原版防熊模组 中飞行反作弊实在是误判感人,毫无作用,所以如今别人提到做一个反作弊系统,我便重新捣鼓了一下,本文是反作弊系列中的——反飞行。

本文测试采用的是老牌知名作弊端——Wurst v6.25。



首先我们还是先测试之前的stat.flyOneCm是否可以检测带作弊端飞行的距离。使用/scoreboard objectives add infly stat.flyOneCm创建计分项。

开启后飞行,可以看见旁边的分数变动,说明有效。个屁!后来发现被统计是因为我在开启飞行的时候正在掉落,所以被算入了飞行距离,而平地开启后空格升空飞行完全没有被统计到!

然后我又试了用玩家的{abilities:{mayfly:1b,flying:1b}}属性来精准地检测。测试后发现是对作弊端飞行无效的,只能检测到创造模式和旁观模式下飞行。

这样一来,就又只有在通过其他方法实现飞行检测。就用execute+detect自己做一个吧:检测玩家脚下四周是否为空气,是则为该玩家gxz-g-flyt计分项增加1分,若玩家该分数达到60,也就是循环型命令方块运行下的3秒处于空气上,则判定为作弊。

gxz-g-flyt计分项创建代码为:/scoreboard objectives add gxz-g-flyt dummy,循环命令如下:

  1. execute @a ~ ~ ~ detect ~ ~-0.5 ~ air -1 execute @s ~ ~ ~ detect ~ ~-1.5 ~ air -1 execute @s ~ ~ ~ detect ~ ~-2.5 ~ air -1 execute @s ~ ~ ~ detect ~1 ~-0.5 ~ air -1 execute @s ~ ~ ~ detect ~-1 ~-0.5 ~ air -1 execute @s ~ ~ ~ detect ~ ~-0.5 ~1 air -1 execute @s ~ ~ ~ detect ~ ~-0.5 ~-1 air -1 scoreboard players add @s gxz-g-flyt 1 {abilities:{mayfly:0b,flying:0b}}

误判处理

为了解决玩家在高跳跃提升和漂浮两种药水效果以及鞘翅飞行出现的误判,这里分别用{ActiveEffects:[{Id:8b}]}{ActiveEffects:[{Id:25b}]}{FallFlying:1b}检测玩家是否处于上诉三个状态,如果是,则重置其gxz-g-flyt分数。代码如下:

  1. scoreboard players tag @a[tag=gxz-g-fly-re] remove gxz-g-fly-re
  2. scoreboard players tag @a add gxz-g-fly-re {ActiveEffects:[{Id:8b}]}
  3. scoreboard players tag @a add gxz-g-fly-re {ActiveEffects:[{Id:25b}]}
  4. scoreboard players tag @a add gxz-g-fly-re {FallFlying:1b}
  5. scoreboard players reset @a[tag=gxz-g-fly-re] gxz-g-flyt

为了解决误检测生存玩家在正常掉落、跳跃、奔跑出现的飞行距离,想到可以判定玩家是否下坠来实现。这里直接通过属性FallDistance来解决。

切换版本到1.14,get看了下自己的nbt标签,发现玩家在坠落时其FallDistance会增长为相应速度,非具体值。而未坠落的情况下则是0,所以我们直接通过检测玩家未坠落来反举玩家坠落即可。

检测下坠代码Demo
  1. scoreboard players tag @a[tag=t_] remove t_
  2. scoreboard players tag @a add t_ {FallDistance:0f}
  3. title @a[tag=!t_] title ["正在下坠"]

最终效果

整合一下,也就是利用execute+detect检测飞行,当玩家存在误判操作时reset其飞行距离统计。若玩家飞行时长超3秒,则代表其在飞行。而非op如果以创造模式下飞行直接用{abilities:{mayfly:1b,flying:1b}}检测即可,不对旁观模式进行操作,代码如下:

初始化

  1. scoreboard objectives add gxz-g-flyt dummy

为自己添加管理权限

  1. scoreboard players tag @s add gxz-g-op

循环组

  1. execute @a ~ ~ ~ detect ~ ~-0.5 ~ air -1 execute @s ~ ~ ~ detect ~ ~-1.5 ~ air -1 execute @s ~ ~ ~ detect ~ ~-2.5 ~ air -1 execute @s ~ ~ ~ detect ~1 ~-0.5 ~ air -1 execute @s ~ ~ ~ detect ~-1 ~-0.5 ~ air -1 execute @s ~ ~ ~ detect ~ ~-0.5 ~1 air -1 execute @s ~ ~ ~ detect ~ ~-0.5 ~-1 air -1 scoreboard players add @s gxz-g-flyt 1 {abilities:{mayfly:0b,flying:0b}}
  2. scoreboard players tag @a[tag=!gxz-g-op,m=1] add gxz-g-ban {abilities:{mayfly:1b,flying:1b}}
  3. scoreboard players tag @a[tag=gxz-g-fly-re] remove gxz-g-fly-re
  4. scoreboard players tag @a add gxz-g-fly-re {ActiveEffects:[{Id:8b}]}
  5. scoreboard players tag @a add gxz-g-fly-re {ActiveEffects:[{Id:25b}]}
  6. scoreboard players tag @a add gxz-g-fly-re {FallFlying:1b}
  7. scoreboard players tag @a add gxz-g-fall
  8. scoreboard players tag @a remove gxz-g-fall {FallDistance:0f}
  9. scoreboard players tag @a[tag=gxz-g-fall] add gxz-g-fly-re
  10. scoreboard players reset @a[tag=gxz-g-fly-re] gxz-g-flyt
  11. scoreboard players tag @a[score_gxz-g-flyt_min=60,tag=!gxz-g-op] add gxz-g-ban
  12. execute @a[tag=gxz-g-ban] ~ ~ ~ tp @s @s
  13. effect @a[tag=gxz-g-ban] blindness 5 255 true
  14. title @a[tag=gxz-g-ban] times 0 10 20
  15. title @a[tag=gxz-g-ban] title ["\u00a7e[警告] \u00a7c你因飞行已被禁锢!"]
  16. title @a[tag=gxz-g-ban] subtitle ["\u00a7a[ 反作弊系统来自Ganxiaozhe.com ]"]

请在使用时尽量保留系统出处title,算是对我成果的支持,谢谢!

未经作者授权,禁止转载





LOADING | 此框架正在加载中
QQ群:771363745