跳到主要内容

精英脚本冷却时间

冷却时间控制事件何时可以再次启动同一脚本,以及参与此机制的其他技能何时可以开始。绕过冷却的脚本和没有冷却检查的 Lua 回调不受影响。

配置位置​

冷却时间在精英脚本的 Cooldowns 部分中配置:

eliteScript:
ScriptName:
Events:
- [event configuration]
Actions:
- [action configuration]
Cooldowns:
local: [value or range]
global: [value or range]

部分名称必须严格写成 Cooldowns,包括大小写。内部的键不区分大小写(local、Local、LOCAL 都有效)。使用整数 tick 数或整数范围,不要使用小数。小数、颠倒的范围(例如 80~40)或不是数字的文本,都会使 EliteMobs 跳过整个脚本并记录 Skipped script <name> in <file>。

关于单位的说明:所有冷却时间值以刻(tick)为单位。在 Minecraft 中,每秒有 20 刻,因此:

  • 20 刻 = 1 秒
  • 60 刻 = 3 秒
  • 100 刻 = 5 秒
  • 99999 刻 ≈ 83 分钟

默认值​

如果省略 Cooldowns 部分,local 和 global 默认为 0,这意味着脚本完全绕过冷却时间系统。

冷却时间绕过​

当 local 或 global 大于 0 时,脚本就受冷却限制。受限制的脚本在自身本地冷却生效期间,或 Boss 处于全局冷却期间,都不会运行。如果两个值都缺失、为零或负数,脚本会绕过冷却检查;事件、条件和技能抑制检查仍然适用。配置中请使用非负值。

任意一个值都会启用冷却检查

只设置 local: 200 会把脚本的执行频率限制为每 200 刻一次。它还会让脚本在任何其他技能占用 Boss 全局冷却时等待。

只设置 global: 20 会在脚本运行后让其他参与冷却机制的技能等待 20 刻。脚本自身也要等待同一个全局冷却,因此它在这 20 刻内同样无法再次运行。

这种绕过是有意设计的,用于不应受 Boss 冷却状态影响的事件行为。

示例:

eliteScript:
AlwaysTeleportOnCombatEnter:
Events:
- EliteMobEnterCombatEvent
Actions:
- action: TELEPORT
Target:
targetType: SELF
FinalTarget:
targetType: SELF_SPAWN
# No Cooldowns section - script always executes when event fires

冷却时间有两个值:

local​

local 设置同一脚本再次执行前的时间(以刻为单位)。示例:

示例

local: 60

只要 Boss 不处于全局冷却且其他检查通过,该技能可在 3 秒后再次运行。

global​

global 设置任何其他脚本或技能再次执行前的时间(以刻为单位)[1]。示例:

示例

global: 20

阻止其他参与冷却机制的技能在 1 秒内启动。

[1] global 设置 Boss 共用的冷却标记。其他技能只有在自身检查参与该机制时才会遵守它。EliteMobs 技能使用 EliteScript 或 Lua 能力 编写;Lua 能力调用 context.cooldowns:set_global(ticks),并在启动前检查 context.cooldowns:global_ready(),即可共享该时段。频繁触发的脚本可能让较慢的参与技能持续等待。

本地冷却长于全局冷却,可以给其他符合要求的技能留出运行时间,但不保证交替。每个技能仍需要自己的事件、条件和冷却检查通过。

此外,如果你的技能有一个特定的激活持续时间,你应该使用此系统来防止其他技能同时运行并可能破坏你的技能。

冷却从脚本分发动作时开始,而不是等到动作的 wait、重复或持续时间结束。脚本级条件失败时不会开始冷却,但个别动作未通过自己的条件时,脚本冷却仍可能已经应用。

每个冷却都会记录其结束的 tick。再次应用冷却时,会保留较晚的结束 tick,因此其他技能施加的较短全局冷却永远不会提前结束较长的冷却。其他脚本直接调用同一脚本时,本地冷却也遵循同样的规则。

随机化​

local 和 global 冷却时间都支持使用区间语法进行随机化。这允许冷却时长发生变化,为 Boss 行为增加不可预测性。

示例:

Cooldowns:
local: 40~80
global: 10~30

将本地冷却时间随机设置为 40 到 80 刻(2-4 秒),全局冷却时间随机设置为 10 到 30 刻(0.5-1.5 秒)。

当前实现会在构建脚本运行实例时从每个范围中选择一次数值,并保存在该技能实例中。每次应用冷却时不会重新抽取。

使用冷却时间让脚本只运行一次​

为确保脚本在使用可能在战斗中多次发生的事件时只触发一次,请将本地冷却时间设置为较大的数字,例如 99999。此示例演示了该概念:

示例
eliteScript:
SetMeOnFireOnlyOnce:
Events:
- EliteMobDamagedByPlayerEvent
Actions:
- action: SET_ON_FIRE
duration: 60
Target:
targetType: DIRECT_TARGET
Cooldowns:
local: 99999

在此场景中,EliteMobDamagedByPlayerEvent 触发 SET_ON_FIRE 动作。如果没有冷却时间,每次玩家攻击怪物时都会激活该动作。

设置 local: 99999 后,动作最多每 99999 tick(约 83 分钟)触发一次。这通常可以防止同一场战斗中的第二次执行,但它不是“每场遭遇一次”的标记:在同一技能实例中,脱战再进入战斗不会重置该计时器。

单独的 local 就能启用冷却检查,因此该脚本不需要 global 值。省略 global 还意味着它永远不会拖延 Boss 的其他技能。

故障排除​

无效的冷却时间键

如果你在 Cooldowns 部分使用了无法识别的键,服务器日志中将出现警告:

Failed to parse cooldown entry for script name [ScriptName] in config file [FileName]

有效的键为:local、global(不区分大小写)

上述冷却检查适用于普通事件分发。通过 RUN_SCRIPT 或落地回调调用的脚本会检查条件,但不会在执行前进行同样的冷却检查。它们仍会在执行后应用配置的冷却。