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





creep.zip
(2.95 KB, 下载次数: 58)
在深水中无法爬行!但是在浅水中(指小于等于1.5格深的水)可以。(在深水中本来就能进入游泳的状态)
熔岩中也是可以爬行的。
美中不足是潜影贝不改材质无法彻底隐身,而且我也改不来…不过有个小贝壳跟着也挺好看的
- 以爬行状态下坡(从一格高的地方下到地面)时仍然会有窒息伤害
- 玩家快速地趴下起身也会有窒息伤害
- 未能很好地处理上图中地形不平整的地方(测试时窒息卡住上不去)
- 不是所有地形都能爬行,如高草丛
- 不能进行以下操作:爬出窗口(若将OnGround:1b去掉就可以),爬出洞窟
优点:
- 材质完全隐形,不易暴露
#如果玩家不在不完整的方块里面,则在脚上方1格处放置屏障
#若果玩家在不完整的方块里面,则在脚上方2格处放置屏障 ——摘自http://www.mcbbs.net/thread-874588-1-1.html
对于本文的方法,仅仅只是在原理上取得了优势:实体的坐标不必是整数格,可以处于方块中,少量实体不会带来窒息。这才解决了上述问题,运行更稳定,目前未找到bug。缺点也是显而易见的:
- 潜影贝隐身不彻底
起因 讲的是发现这个的过程,与正文关系不大,可略过
原理
这里只介绍我暂且能想到的运行最稳定的一种方案,我之前的其他方案因为不稳定且功能不完全被舍弃了
有兴趣的朋友可以打开看看弊端在哪里
当玩家首次进入爬行状态时给予编号,并生成对应编号的骑在Marker盔甲架上的潜影贝,不断把自己编号的潜影贝tp至~ ~1.1 ~处
- #load.mcfunction
- scoreboard objectives add jump minecraft.custom:minecraft.jump
- scoreboard objectives add uid dummy \\编号计分板
- #tick.mcfunction
- 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
- execute as @a[tag=creeping] at @s run function creep:creeping
- \\这里检测潜行时用了一种新方法,有好处(见下文)
- #creep:prepare.mcfunction \\加creeping标签 首次编号 生成骑着盔甲架的潜影贝
- tag @s add creeping
- execute unless score @s uid matches 1.. store result score @s uid run scoreboard players add #uid uid 1
- 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}]}]}
- scoreboard players operation @e[tag=creep,tag=!creep_done] uid = @s uid
- tag @e[tag=creep] add creep_done \\方便给潜影贝和盔甲架编号
- #creep:creeping
- tag @s[scores={jump=1..}] remove creeping
- execute if block ~ ~ ~ water if block ~ ~-1 ~ water run tag @s remove creeping \\入深水去标签
- tag @s add selecting \\方便选中与自己编号一致的潜影贝
- execute as @e[tag=creep] if score @s uid = @a[tag=selecting,limit=1] uid run tp @s ~ ~1.1 ~ ~ ~
- 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 ~
- 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掉 可惜的是有时候仍然看得见死亡粒子效果
- tag @s remove selecting
- scoreboard players reset @s jump
- 关于检测潜行的新方法,估计大家在看到这篇文章之前也想到过吧,就是检测玩家碰撞箱变小。
- 但是导致碰撞箱变小的不只是潜行,还有鞘翅,游泳,以及这1.14的新特性,不过对于这个系统来说没关系。
- 好处就是不用重置潜行计分板的分了,以及在碰撞箱变小时自动进入爬行模式。
在深水中无法爬行是有重要原因的!游戏机制限制了它。
骑乘关系的生物进入水中就会脱离骑乘关系,骑马入水会强制从水中下马,潜影贝和盔甲架也是如此。骑乘关系解除后,潜影贝的坐标只能是整数格,这会让你在水中无法浮起来。


