Minecraft 命令 - 递归函数

Minecraft Commands - Recursive Functions

我正在制作一种激光武器,它基本上是一种在 3D 世界中自我重复的功能,每个命令都相对于前一个命令向前执行一个块。但是,我发现它的威力过大,因此决定通过减少武器的有效射程来削弱它。我相信这可以通过在某种程度上停止递归来实现,例如在第 101 次执行递归时停止递归将导致武器的有效射程为 100 格。

部分代码写在raycast.mcfunction

playsound block.iron_trapdoor.open master @a
playsound block.respawn_anchor.deplete master @a
playsound entity.generic.explode master @a
playsound entity.generic.extinguish_fire master @a

particle small_flame ~ ~ ~ 0 0 0 0 100 normal @a
execute if block ~ ~ ~ air unless entity @e[distance=0.1..0.3,type=!armor_stand,type=!item_frame,type=!item,type=!player,type=!area_effect_cloud] positioned ^ ^ ^0.5 run function datapack:raycast

但是,我不太清楚实现这一点的方法,因为 minecraft 中的所有变量(记分板 objectives)似乎只对实体可用。递归函数不是实体,尽管它在 3D 世界中“移动”。

任何能达到我的 objective 限制递归次数的建议和方法都将不胜感激!

要解决该问题,不能使用递归函数,因为它们不被视为实体。我发现通过射击隐形盔甲架可以解决问题。 召唤 armor_stand

execute at @s run summon armor_stand ~ ~ ~ {Invulnerable:1b,Tags:["melta","new_melta"]}

主要功能

execute as @e[tag=new_melta] at @s rotated as @p run teleport @s ~ ~ ~ ~ ~
execute as @e[tag=new_melta] run tag @s remove new_melta
execute as @e[tag=melta] at @s if block ~ ~ ~ air run tp @s ^ ^ ^1
execute as @e[tag=melta] at @s run summon tnt
execute as @e[tag=melta] at @s unless block ~ ~ ~ air run tag @s add crashed
execute as @e[tag=crashed] run kill @s

上面显示的代码可用于在玩家注视的地方射击一个盔甲架,当它移动时,tnt 会在它的身后被召唤。这样我们就可以把激光变成实体了。

唯一的缺点是激光不是以光速行进,而是每秒移动 20 个方块(20 ticks = 1 秒)