エリートスクリプトクールダウン
クールダウンは、イベントが同じスクリプトを再起動できる時点と、この仕組みに参加する他のパワーが開始できる時点を制御します。クールダウンを無視するスクリプトや、確認処理のない 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> をログに出力します。
単位に関する注意:すべてのクールダウン値はティック単位で指定されます。Minecraftでは1秒あたり20ティックなので:
- 20ティック = 1秒
- 60ティック = 3秒
- 100ティック = 5秒
- 99999ティック ≈ 83分
デフォルト値
Cooldownsセクションが省略された場合、localとglobalの両方がデフォルトで0になり、スクリプトはクールダウンシステムを完全にバイパスします。
クールダウンバイパス
local または global が 0 より大きい場合、スクリプトはクールダウンで制限されます。制限されたスクリプトは、自身のローカルクールダウン中や、ボスがグローバルクールダウン中の間は実行されません。両方が省略、ゼロ、負数ならクールダウン判定を飛ばしますが、イベント、条件、パワー抑制の確認は残ります。設定には非負の値を使用してください。
local: 200 だけを設定すると、スクリプトの実行は 200 tick に 1 回に制限されます。また、他のパワーがボスのグローバルクールダウンを保持している間も、スクリプトは待機します。
global: 20 だけを設定すると、スクリプトの実行後 20 tick の間、参加している他のパワーを待たせます。スクリプト自身も同じグローバルクールダウンを待つため、20 tick の間は再実行できません。
これは意図的な回避機能で、ボスのクールダウン状態にかかわらず実行したいイベント処理に使えます。
例:
eliteScript:
AlwaysTeleportOnCombatEnter:
Events:
- EliteMobEnterCombatEvent
Actions:
- action: TELEPORT
Target:
targetType: SELF
FinalTarget:
targetType: SELF_SPAWN
# No Cooldowns section - script always executes when event fires
クールダウンには2つの値があります:
local
localは、同じスクリプトが再度実行できるようになるまでの時間をティック単位で設定します。例:
例
local: 60
ボスがグローバルクールダウン中でなく、他の確認も通過する場合、3 秒後に再実行できます。
global
globalは、他のスクリプトやパワーが再度実行できるようになるまでの時間をティック単位で設定します[1]。例:
例
global: 20
この仕組みに参加する他のパワーの開始を 1 秒間防ぎます。
[1] global はボス全体のクールダウンフラグを設定します。他のパワーが従うのは、その確認処理に参加する場合だけです。EliteMobs のパワーは EliteScript または Lua パワー です。Lua パワーは context.cooldowns:set_global(ticks) を呼び、開始前に context.cooldowns:global_ready() を確認することで同じ期間を共有します。頻繁に起動するスクリプトは、参加する遅いパワーを待たせることがあります。
ローカルをグローバルより長くすると、他の有効なパワーが動く時間を確保できます。ただし交互実行は保証されません。各パワーには自身のイベント発生、条件成立、クールダウン確認が必要です。
さらに、パワーがアクティブな特定の期間がある場合、このシステムを使用して、他のパワーが同時に実行されてパワーが台無しになるのを防ぐべきです。
クールダウンはアクションの開始処理時に適用され、wait、繰り返し、効果時間の終了を待ちません。スクリプト全体の条件が失敗すると開始しませんが、個々のアクションの条件が失敗してもスクリプトのクールダウンは適用される場合があります。
各クールダウンは、終了する tick を保存します。クールダウンを再度適用すると、より遅い終了 tick が保持されるため、他のパワーによる短いグローバルクールダウンが長いクールダウンを途中で打ち切ることはありません。別スクリプトから同じスクリプトを直接呼んだ場合のローカルクールダウンも同様に動作します。
ランダム化
localとglobalの両方のクールダウンは、範囲構文を使用したランダム化をサポートしています。これにより、クールダウンの持続時間が変化し、ボスの行動に予測不能性が加わります。
例:
Cooldowns:
local: 40~80
global: 10~30
ローカルクールダウンをランダムに40〜80ティック(2〜4秒)、グローバルクールダウンをランダムに10〜30ティック(0.5〜1.5秒)に設定します。
現在の実装はスクリプトの実行インスタンスを構築するときに範囲から値を選び、そのパワーのインスタンスに保存します。クールダウンの適用ごとに抽選し直すことはありません。
クールダウンでスクリプトを1回だけ実行する
戦闘中に複数回発生する可能性があるイベントを使用しながら、スクリプトが1回だけトリガーされるようにするには、ローカルクールダウンを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 分)に 1 回です。通常は同じ戦闘中の再実行を防げますが、「遭遇ごとに 1 回」のフラグではありません。同じパワーのインスタンスでは、戦闘を離脱して再開してもタイマーはリセットされません。
local だけで判定が有効になるため、このスクリプトには global の値は不要です。global を省略すれば、ボスの他のパワーを待たせることもありません。
トラブルシューティング
無効なクールダウンキー
Cooldownsセクションで認識されないキーを使用すると、サーバーログに警告が表示されます:
Failed to parse cooldown entry for script name [ScriptName] in config file [FileName]
有効なキーは:local、global(大文字小文字を区別しない)
上記の判定は通常のイベント経由の実行に適用されます。RUN_SCRIPT や着地コールバックで呼び出すスクリプトは条件を確認しますが、実行前に同じクールダウン判定は行いません。それでも実行後には設定されたクールダウンを適用します。