穿墙

最终效果:

效果演示 效果演示 效果演示

版本:18w03b(1.13快照)

大致原理:
玩家右键萝卜钓竿时,生成盔甲架并让盔甲架继承玩家的朝向,通过局部坐标,将盔甲架向前方tp。如果检测到有墙,就再向前tp,然后停止tp,将玩家传送到盔甲架,最后清除盔甲架。

建立计分板:walltime(dummy)use(minecraft.used:minecraft.carrot_on_a_stick)

rcb:

  1. execute as @a if entity @s[scores={use=1..}] at @s run summon armor_stand ^ ^ ^1 {CustomName:"[\"check\"]",Invisible:1b}

检测使用钓竿并在前方1格生成名为"check"的盔甲架

  1. execute as @a if entity @s[scores={use=1..}] at @s run teleport @e[type=armor_stand,name=check] ~ ~1 ~ ~ ~

将生成的盔甲架tp到自己,同时也继承了玩家的朝向。Y+1是为了防止盔甲架陷入地里。

  1. execute as @a if entity @s[scores={use=1..}] run tag @s add finding

给玩家添加"finding"标签,因为盔甲架要向前tp,穿过墙后要将玩家tp过来,然而这时玩家的use已经重置,所以需要"finding"标签。

  1. execute as @e[type=armor_stand,name=check] run scoreboard players add @s walltime 1
  2. execute as @e[type=armor_stand,name=check,scores={walltime=15..}] run tellraw @a ["\u00a7c目标太遥远"]
  3. execute as @e[type=armor_stand,name=check,scores={walltime=15..}] run kill @s

盔甲架每gt的向前tp一格,同时也每gt增加一分,当分数大于等于15时,也就是走了15格或更远,就判断为目标太远。

  1. execute as @e[type=armor_stand,name=check] at @s run teleport @s ^ ^ ^1

让盔甲架一直向前tp

  1. execute as @e[type=armor_stand,name=check] at @s unless block ~ ~ ~ air if block ~ ~1 ~ air run kill @s

如果盔甲架当前位置不是空气,而上面一格是空气,很有可能是在地里,所以杀死盔甲架。

  1. execute as @e[type=armor_stand,name=check] at @s unless block ~ ~ ~ air unless block ~ ~1 ~ air if block ^ ^ ^1 air if block ^ ^1 ^1 air run tag @s add found

如果盔甲架当前位置和当前位置y+1都不是空气,而前方一格和前方一格y+1是空气,则判定找到,添加"found"标签

  1. execute as @e[tag=found] at @s run teleport @s ^ ^ ^1.5

将盔甲架再向前tp1.5格(大于等于1即可)

  1. execute as @e[tag=found] at @s run teleport @p[tag=finding] ~ ~ ~

将玩家tp到盔甲架

  1. execute as @e[tag=found] at @s run tag @p[tag=finding] remove finding

tp后移除玩家的finding标签

  1. kill @e[tag=found]

清除盔甲架

  1. scoreboard players set @a[scores={use=1..}] use 0

重置分数

  1. scoreboard players set @a[scores={use=1..}] use 0

数据包下载:

使用方法:复制到存档文件夹/datapacks/

  • what_name2018-04-12

                        
    • what_name2018-04-21

      这是一条回复