如何在Minecraft函数中仅执行一次命令,为100-199级玩家稳定添加生命提升效果?
我之前做Minecraft数据包时也碰到过这个一模一样的问题!根源在于health_boost效果的特殊机制——每次重新应用它时,游戏会强制把额外的生命值拉满,持续执行命令自然就会不断重置玩家的额外血量。要解决这个问题,我们需要只在玩家进入目标等级区间时一次性授予效果,而不是反复刷新它。
解决方案:基于状态标记的触发式效果管理
我们可以通过记分板跟踪玩家的状态,精准控制效果的授予与移除,具体步骤如下:
1. 创建状态跟踪记分板
首先创建一个记分板,用来记录玩家是否已经获得了生命提升效果,避免重复授予导致的血量重置:
scoreboard objectives add healthBoostStatus dummy
2. 给符合条件的新玩家授予效果
在重复执行的命令链中,仅针对等级在100-199之间且状态为0(未获得效果)的玩家,授予一个近乎永久的生命提升效果,并更新他们的状态标记:
# 授予长时长的生命提升效果(999999 tick约等于694小时,几乎永久) execute as @a[level=100..199,scores={healthBoostStatus=0}] run effect give @s minecraft:health_boost 999999 0 true # 将玩家状态标记为已获得效果 scoreboard players set @a[level=100..199,scores={healthBoostStatus=0}] healthBoostStatus 1
3. 给离开条件的玩家移除效果
同样在命令链中,检测那些状态为1但等级不在100-199区间的玩家,移除效果并重置他们的状态标记:
# 移除生命提升效果 execute as @a[scores={healthBoostStatus=1}] unless entity @s[level=100..199] run effect clear @s minecraft:health_boost # 重置玩家状态标记 execute as @a[scores={healthBoostStatus=1}] unless entity @s[level=100..199] run scoreboard players set @s healthBoostStatus 0
原理说明
- 不再持续刷新
health_boost效果,而是一次性授予长时长效果,游戏不会反复重置额外生命值。 - 记分板标记确保只有当玩家刚进入等级区间时才触发效果授予,避免重复操作。
- 当玩家离开等级区间时,自动移除效果并重置状态,下次进入区间时会重新获得效果。
内容的提问来源于stack exchange,提问作者Alex




