本帖最后由 lirui11 于 2019-7-12 11:59 编辑

自由爬行指的是玩家能随时控制角色进入游泳姿势,即使在陆地上,看起来像在爬行一样。以前只能用鞘翅卡bug达到这种效果


效果
爬过窗口

操作方法:紧贴窗口,视角朝下,按住前进键(W),再按下跳跃键+潜行键

探索洞窟

即使在爬行状态下也可以跳跃,虽然这会让你退出爬行状态,但由于头上一格有方块封顶,仍然会保持游泳的姿势,从而爬出洞窟

注:有一定几率失败,这是因为按下跳跃键的时候未能及时清理掉潜影贝导致“顶头”而不能正常跳起,gif演示中也失败了一次才跳出

这种事情是没办法的,每秒20次的频率也不能保证及时


更多高难度操作等你来发现…


1.5格深的水


自由地在各种不平整的地形切换


最窄可通过的地方




数据包在这里 creep.zip (2.95 KB, 下载次数: 58) 直接拖进地图文件夹datapacks内

进入爬行状态的方法是视角朝下85-90度(这个角度可更改为你习惯的角度),同时按下潜行键(默认为shift)。起身的方法是跳跃。

在深水中无法爬行!但是在浅水中(指小于等于1.5格深的水)可以。(在深水中本来就能进入游泳的状态)
熔岩中也是可以爬行的。
美中不足是潜影贝不改材质无法彻底隐身,而且我也改不来…不过有个小贝壳跟着也挺好看的




感谢ruhuasiyu的提醒,已使用模板并向@贰逼的方法学习

http://www.mcbbs.net/thread-874588-1-1.html比较之后我认为有以下几点不同

对于2b的放置方块的方法呢,改进了楼主之前未能解决的窒息伤害问题,但是
  • 以爬行状态下坡(从一格高的地方下到地面)时仍然会有窒息伤害
  • 玩家快速地趴下起身也会有窒息伤害
  • 未能很好地处理上图中地形不平整的地方(测试时窒息卡住上不去)
  • 不是所有地形都能爬行,如高草丛
  • 不能进行以下操作:爬出窗口(若将OnGround:1b去掉就可以),爬出洞窟
除了第一项,剩下四项都是小问题,一般的地形都是比较平整的,但下坡还是比较常见的
优点:
  • 材质完全隐形,不易暴露
另外对于2b所使用的#prostrate:in方块标签来单独处理碰撞箱不完整的方块,可以通过将放置方块的坐标设为~ ~1.5 ~而避免 就不需要分类成:
#如果玩家不在不完整的方块里面,则在脚上方1格处放置屏障
#若果玩家在不完整的方块里面,则在脚上方2格处放置屏障                                                                                       ——摘自http://www.mcbbs.net/thread-874588-1-1.html

对于本文的方法,仅仅只是在原理上取得了优势:实体的坐标不必是整数格,可以处于方块中,少量实体不会带来窒息。这才解决了上述问题,运行更稳定,目前未找到bug。缺点也是显而易见的:
  • 潜影贝隐身不彻底




起因 讲的是发现这个的过程,与正文关系不大,可略过

原理
这里只介绍我暂且能想到的运行最稳定的一种方案,我之前的其他方案因为不稳定且功能不完全被舍弃了
有兴趣的朋友可以打开看看弊端在哪里

当玩家首次进入爬行状态时给予编号,并生成对应编号的骑在Marker盔甲架上的潜影贝,不断把自己编号的潜影贝tp至~ ~1.1 ~处
  1. #load.mcfunction
  2. scoreboard objectives add jump minecraft.custom:minecraft.jump
  3. scoreboard objectives add uid dummy \\编号计分板
复制代码
  1. #tick.mcfunction
  2. execute as @a[tag=!creeping,x_rotation=85..90] at @s unless block ~ ~1.5 ~ water positioned ~ ~1.7 ~ unless entity @s[dy=0.01] at @s run function creep:prepare
  3. execute as @a[tag=creeping] at @s run function creep:creeping
  4. \\这里检测潜行时用了一种新方法,有好处(见下文)
复制代码
  1. #creep:prepare.mcfunction \\加creeping标签 首次编号 生成骑着盔甲架的潜影贝
  2. tag @s add creeping
  3. execute unless score @s uid matches 1.. store result score @s uid run scoreboard players add #uid uid 1
  4. summon minecraft:armor_stand ~ ~2 ~ {Marker:1b,Invisible:1b,Tags:["creep"],Passengers:[{id:shulker,NoAI:1b,Silent:1b,Invulnerable:1b,Tags:["creep"],DeathLootTable:"",ActiveEffects:[{Id:14b,Amplifier:0b,Duration:2147483647,ShowParticles:0b}]}]}
  5. scoreboard players operation @e[tag=creep,tag=!creep_done] uid = @s uid
  6. tag @e[tag=creep] add creep_done    \\方便给潜影贝和盔甲架编号
复制代码
  1. #creep:creeping
  2. tag @s[scores={jump=1..}] remove creeping
  3. execute if block ~ ~ ~ water if block ~ ~-1 ~ water run tag @s remove creeping  \\入深水去标签
  4. tag @s add selecting            \\方便选中与自己编号一致的潜影贝
  5. execute as @e[tag=creep] if score @s uid = @a[tag=selecting,limit=1] uid run tp @s ~ ~1.1 ~ ~ ~
  6. execute as @e[tag=creep] if score @s uid = @a[tag=selecting,limit=1] uid unless entity @a[tag=selecting,tag=creeping] run tp @s ~ -65 ~
  7. execute as @e[tag=creep] if score @s uid = @a[tag=selecting,limit=1] uid unless entity @a[tag=selecting,tag=creeping] run kill @s    \\避免让玩家看见死亡粒子效果,将潜影贝传送走。又由于客户端与服务端不同步导致“实际上已经传送走了但客户端这里仍在原地让我站不起身来”,所以传送走了还要kill掉 可惜的是有时候仍然看得见死亡粒子效果
  8. tag @s remove selecting
  9. scoreboard players reset @s jump

  10. 关于检测潜行的新方法,估计大家在看到这篇文章之前也想到过吧,就是检测玩家碰撞箱变小。
  11. 但是导致碰撞箱变小的不只是潜行,还有鞘翅,游泳,以及这1.14的新特性,不过对于这个系统来说没关系。
  12. 好处就是不用重置潜行计分板的分了,以及在碰撞箱变小时自动进入爬行模式。
复制代码

在深水中无法爬行是有重要原因的!游戏机制限制了它。
骑乘关系的生物进入水中就会脱离骑乘关系,骑马入水会强制从水中下马,潜影贝和盔甲架也是如此。骑乘关系解除后,潜影贝的坐标只能是整数格,这会让你在水中无法浮起来。
所以为什么在熔岩里就不会脱离骑乘关系呢