メインコンテンツまでスキップ

ボスフェーズの作成

ボスフェーズを使うと、戦闘中にカスタムボスの設定を変更できます。

ボスフェーズはどのように機能しますか?​

ボスフェーズは、次の設定形式を使って EliteMobs の任意のカスタムボスに追加できます。

phases:
- phase_2_boss.yml:0.X
- phase_3_boss.yml:0.Y

注: 最初にスポーンさせるボス(他のすべてのフェーズを列挙する phases: エントリを含むもの)がフェーズ 1 のボスです。フェーズ 1 のボスファイルは、自身の phases: エントリで自分自身を列挙すべきではありません。

各エントリは filename:healthFraction の形式です。割合は 0.60 や 0.30 のように 0 以上 1 未満である必要があり、参照先のボスファイルは読み込まれ、有効化されている必要があります。EliteMobs はボスを作成するたびにこのリストをチェックします。無効なエントリがあるとそのボスはスポーンせず、コンソールメッセージにそのエントリが表示されます。

各フェーズは別のボスファイルを参照するため、パワー、ダメージ倍率、体力倍率、エンティティタイプ、変装、装備を変更できます。戦闘の状態と後述するリージョナル設定は共有されます。

EliteMobs は戦闘の状態を保持しながら、ボスの本体を次のフェーズに置き換えます。ダメージイベントが次のフェーズのしきい値に達する場合、そのイベントはキャンセルされ、次のフェーズは設定された体力割合で始まります。余ったダメージは引き継がれません。その後、ボスには 20 tick の戦闘猶予期間が与えられます。

移行先のチャンクがまだエンティティを処理できない状態の場合、EliteMobs はそのチャンクを読み込み、本体を置き換える前に最大 100 tick(5 秒)待機します。待機中、ボスへのダメージはキャンセルされます。移行先のワールドが読み込まれていない場合や、時間内にチャンクの準備が整わない場合は移行が拒否されます。ボスは現在のフェーズのままとなり、コンソールに警告が記録されます。

例​

次のフェーズボスの例を見てみましょう。

ファイル: phase_1_boss.yml

isEnabled: true
level: 50
healthMultiplier: 10
entityType: STRAY
powers:
- attack_gravity.lua
phases:
- phase_2_boss.yml:0.60
- phase_3_boss.yml:0.30

ファイル: phase_2_boss.yml

isEnabled: true
level: 50
healthMultiplier: 10
entityType: SKELETON
powers:
- attack_gravity.lua
- arrow_fireworks.lua

ファイル: phase_3_boss.yml

isEnabled: true
level: 50
healthMultiplier: 10
entityType: WITHER_SKELETON
powers:
- arrow_rain.lua

これは有効なフェーズボスを構成します。phase_1_boss.yml をスポーンさせると、上記の属性を持つ Stray がスポーンします。体力の 60% までダメージを受けると、設定ファイルに - phase_2_boss.yml:0.60 と記載されているため、同じ場所で phase_2_boss.yml で形成されたカスタムボスに即座に置き換わります(phase_2_boss.yml はそのカスタムボスのファイル名、0.60 は体力 60% です)。フェーズ 2 のボスは体力 60% でスポーンする点に注意してください。そのフェーズに変化するのがその時点だからです。 ボスは phase_2_boss.yml ファイルに列挙されたパワーを持ちます。フェーズ 2 のボスが体力の 30% までダメージを受けると、フェーズ 3 用に設定されたボスをスポーンさせます。フェーズ 3 のパワーは以前のものとは無関係である点に注意してください。他のほぼすべての属性と同じく、フェーズ間でパワーを完全に変更できます。

高度な内容​

継承されるメカニクス​

次は、フェーズごとに変化しないものの一覧です。

  • チェーン内の最初のフェーズボスが、ボスがどのフェーズを経るかを決定します。つまり、フェーズ内の他のボスには phases エントリを置くべきではありません。

  • 脅威テーブル/ダメージテーブルは同じままです。つまり、戦利品の分配や高度なアグロシステムはフェーズ変更の影響を受けません。

  • フェーズ変更では、次のフェーズに設定された体力割合を使用します。フェーズ 2 が 50% で始まる場合、きっかけとなった攻撃で前のフェーズがそのしきい値を下回るはずだったとしても、新しいフェーズ自身の最大体力の 50% を受け取ります。各フェーズの最大体力は異なっていても構いません。

体力上限に達したフェーズは最大体力が同じになります

ボスの体力はサーバーの settings.attribute.maxHealth.max(デフォルトは 2048)でクランプされます。複数のフェーズが、その上限に達するほど高い level と healthMultiplier で設定されている場合、それらはすべてちょうど 2048 HP になり、意図したフェーズごとの体力差が消えてしまいます。このページの例(level: 50、healthMultiplier: 10)はまさにその領域にあります — 各倍率が何レベルで上限に達するかについては healthMultiplier を参照してください。

  • 条件を満たす非インスタンスのフェーズボスは、戦闘外回復システムが fullHeal() を呼ぶとフェーズ 1 に戻ります。これには regenerateCustomBossHealthOnCombatEnd が必要で、このイベント経路はファントムを除外します。インスタンスボスは fullHeal() を実行しません。通常の回復で最大体力に達しただけでは、フェーズはリセットされません。

  • リージョナルのフェーズボスはフェーズ 1 のリーシュ半径とリスポーンクールダウンを保持し、そのクールダウン後にフェーズ 1 として復活します。フェーズ変更はサイレントスポーンを使い、新たな逃走タイマーを開始しません。戦闘全体の timeout はフェーズ 1 に設定してください。

  • normalizedCombat もフェーズ 1 が全体を決定します。level: -1 のフェーズは、インスタンスの選択レベルなど、すでに決定した戦闘レベルを保持します。新しいフェーズに明示的なレベルを指定すると置き換えられます。

フェーズ固有のスポーン地点​

デフォルトでは、ボスはフェーズ間を移行する際に現在の場所に留まります。しかし、phaseSpawnLocation 設定を使って、フェーズに入る際にボスを特定の場所にテレポートさせることができます。

ファイル: phase_2_boss.yml

isEnabled: true
level: 50
healthMultiplier: 10
entityType: SKELETON
powers:
- attack_gravity.lua
- arrow_fireworks.lua
phaseSpawnLocation: world_name,100,64,100,0,0

ボスを同じワールド内に留めたままテレポートさせることもできます。

phaseSpawnLocation: same_as_boss,100,64,100,0,0

これは、ボスが別のアリーナや場所にテレポートする劇的なフェーズ移行を作るのに便利です。

警告​

次は、最初は直感に反するかもしれない動作をするメカニクスの一覧です。

  • EliteMobs の通常ダメージでは、有効な次のフェーズを一撃で飛ばせません。しきい値に達する攻撃はキャンセルされ、1 フェーズ進みます。戦利品は実際に死亡した時点の設定から生成されるため、最終フェーズの報酬を設定してください。移行が拒否された場合(たとえば phaseSpawnLocation が読み込まれていないワールドを指定している場合)も、しきい値に達する攻撃はキャンセルされます。そのため、問題を修正するまで、通常ダメージではボスの体力をそのしきい値より下げられません。

  • 各フェーズは、該当する onSpawnCommands を含むスポーン処理を実行します。フェーズ移行と全回復によるリセットはサイレントスポーンを使い、通常の出現告知を抑制します。クールダウン後のリージョナルリスポーンでは再び告知できます。フェーズ変更は死亡ではなく、死亡時コマンドは実行しません。

  • リージョナルのフェーズボスは、移行前に現在のフェーズの ON_REMOVE 遷移ブロックを適用し、その後、新しいフェーズのスポーンブロックを適用します。実際の死亡や kill コマンドでは最終フェーズの除去ブロックが適用されます。通常のチャンクアンロードや全回復リセットは、この処理での撃破には該当しません。

  • フェーズ変更では前のフェーズが管理するマウントを除去し、新しいフェーズの設定でマウントを作成します。全回復リセットでも現在のマウントを除去し、フェーズ 1 のマウント設定を使用します。

  • 各フェーズでパワーを読み直すため、custom_summon パワーの増援 ONCE 状態もフェーズ変更やフェーズ 1 へのリセットで初期化されます。戦闘全体で 1 回だけという制限ではありません。

ヒントとテクニック​

  • 装備やエンティティタイプが戦闘中に変更できるという事実を利用して、戦闘を通じてボスがどんどん危険に(あるいはどんどん安全に)見えるようにできます。

  • 可能ではありますが、特定のデザイン上の目標がない限り、フェーズボスの持つパワーはフェーズ間であまり大きく変えないのがおそらく最善です。プレイヤーは、戦闘を通じて自然に感じられる進行をより楽しむ傾向があるからです。

  • onSpawn コマンドを使って、フェーズ間でコマンドを実行できます。

  • 音楽を変更するフェーズには song を指定してください。異なる値なら曲を置き換え、同じ値なら続けます。後のフェーズで song を省略しても、前の曲は停止しません。

  • フェーズを使って、ボスを近接モードから遠隔モードへ、またその逆へ切り替えることができます。

  • フェーズボスは、多くの HP を持つ手強いボスとして作られました。通常は、ダンジョンの最終ボス遭遇や、大規模なワールドボスとして使うのが最も適しています。

  • 増援はフェーズ間で生き残ることがあります。前のフェーズの cullReinforcements が除去を制御し、フェーズ 1 へのリセットでも増援の除去が要求されます。

  • ボスは好きなだけフェーズを持てますが、フェーズが多いほど、各フェーズを意味のあるものにするためにより多くの体力が必要になります。

API 連携​

プラグイン開発者向け: EliteMobs は、ボスがフェーズ間を移行する際に ElitePhaseSwitchEvent を発火します。このイベントは、フェーズ移行中にカスタムの動作やエフェクトを作成するために使用できます。

このイベントはフェーズ 1 へのリセット時にも発火します。新しいフェーズの本体がスポーンし、その体力割合と 20 tick の戦闘猶予期間が適用された後に一度だけ発火します。移行先のチャンクを待機する移行では、本体が現れた時点で初めてイベントが発火します。

@EventHandler
public void onPhaseSwitch(ElitePhaseSwitchEvent event) {
CustomBossEntity boss = event.getCustomBossEntity();
PhaseBossEntity phaseBoss = event.getPhaseBossEntity();
// Your custom logic here
}