跳至主要內容

Elite Script 冷卻時間

冷卻時間控制事件何時可以再次啟動同一腳本,以及參與此機制的其他技能何時可以開始。繞過冷卻的腳本與沒有冷卻檢查的 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、重複或持續時間結束。腳本層級條件失敗時不會開始冷卻,但個別動作未通過自己的條件時,腳本冷卻仍可能已套用。

每個冷卻都會儲存其結束的刻數。再次套用冷卻時,會保留較晚的結束刻數,因此其他技能較短的全域冷卻永遠不會提早結束較長的冷卻。其他腳本直接呼叫同一腳本時,本地冷卻也以相同方式運作。

隨機化​

local 與 global 冷卻時間都支援使用範圍語法進行隨機化。這讓冷卻時間的長度能夠變化,為首領的行為增添不可預測性。

範例:

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 或落地回呼呼叫的腳本會檢查條件,但不會在執行前進行相同的冷卻檢查。它們仍會在執行後套用設定的冷卻。