本帖最后由 sylqiuyifeng 于 2015-8-1 12:51 编辑

声明:本系统并非本人发明,一切原理来自于外国友人SQRTdude的视频Sonar Hearing in Minecraft 15w31! [Last of Us]


一切的起源都在这个视频,SQRTdude发表了一个视频,展示了一个复刻The Last of Us(美国末日)中的聆听系统的视频
(图片截自原视频)只要潜行就能高亮显示附近的僵尸
系统使用了1.9快照中的glowing效果,这并没有什么出乎意料的
然而在视频之后的系统讲解中,出现了潜行侦测系统的讲解


众所周知(好吧可能不是),MC的Scoreboard系统中有很多的判据,其中stat.crouchOneCm就是玩家潜行距离的判据
你可能会说,这不就简单了么,Scoreboard监测这个判据就好,潜行系统不就这么简单了?
然而这个判据最大的问题是,如果玩家潜行了然而没有移动,这个判据不会上升,这是这个判据的缺陷
然而SQRTdude提出了一个解决方案,能探测到原地潜行的玩家




(图片截自原视频)视频中指出,当生物堆积在同一个位置的时候,他们的hitbox(碰撞箱)会令他们不断推挤其他生物,造成移动
于是潜行探测系统就出现了
其核心思想是,不停传送生物到玩家的位置“推挤”玩家,虽然玩家感受不到运动,但是系统会被欺骗,认为你移动了("no idea why but it work"-作者原话)
于是判据就会上升
经过对SQRTdude的聆听模式系统的研究之后,我单独制造了一个潜行探测系统的原型



整个系统就这样,我开启了系统,右边的stest是一个stat.crouchOneCm(潜行距离)的判据计分版


当我原地按下潜行键(你可以比对一下两张图片,位置一样但这张视角稍微下降了),判据开始上升
可见系统被欺骗,认为我有移动

我再加了一个stat.walkOneCm(行走距离)的判据,就算我原地不动,判据分数还是在上升,可见系统确实被欺骗了

(系统结构在下一页)
(再次鸣谢外国友人SQRTdude的发明)




整个系统的结构如图
  1. /fill ~ ~-1 ~ ~3 ~-1 ~ minecraft:redstone_block
  2. /fill ~ ~1 ~ ~3 ~1 ~ minecraft:stone
复制代码
这只是一个简单的fill clock,没什么好奇怪的
  1. /tp @e[name=sneak] ~ ~-300 ~
  2. /kill @e[name=sneak]
复制代码
最先执行的这两个CB是“灭杀”系统,把名为sneak的村民(欺骗系统用的那个实体)传送到虚空再杀掉
这样可以避免生物死亡时候的粒子影响玩家体验
  1. /summon Villager ~ ~ ~ {NoAI:true,Silent:true,Invulnerable:true,ActiveEffects:[{Id:14,Duration:111110,ShowParticles:false}],Age:-1000000,CustomName:sneak}
复制代码
这里就是召唤村民的命令,召唤一个名为sneak,不会移动(NoAI),不会发出声音(Silent),无敌(Invulnerable),并且隐身(ActiveEffects)的小村民(Age:-1000000)
  1. /execute SYL_qiuyifeng ~ ~ ~ /tp @e[name=sneak] SYL_qiuyifeng
复制代码
然后在我身上execute,把村民传送过来(我偷懒了233,目标写了自己的名字,实际应用请按需要更改)
整个系统大致完成了
然而就这样停下的话面临了一个bug:第一次启动系统的时候如果玩家并没有做任何移动,探测系统失效
虽然这个bug发生的可能性微乎其微,但是为了修复他
我们在最后加入
  1. /tp @e[name=sneak] ~0.01 ~ ~
复制代码
让村民做一个轻微位移,解决了这个bug
系统到此完结


[groupid=546]Command Block Logic[/groupid]