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

NPC・ボスの巡回

EliteMobs では、設定済みの NPC とカスタムボスを、Minecraft のネイティブナビゲーションで作成者指定のルートに沿って移動させられます。同じ仕組みから Lua の walk_to、hold、teleport も利用できます。

簡単な作成手順​

  1. 対象の NPC またはカスタムボスをスポーン・配置します。
  2. 12 ブロック以内から対象を直接見て /em patrol edit を実行します。
  3. 各目的地に立って /em patrol add を実行します。新しいルートは、設定上のスポーン地点をノード 0 として始まります。
  4. 最後のノードから最初へ戻すには /em patrol mode LOOP、リストを逆順に戻るには /em patrol mode REVERSE を使います。
  5. /em patrol save でルートを保存し、対象を更新します。

エディターにはノード間の接続と計算済み歩行経路のプレビューが表示されます。/em patrol remove は最後のノードを削除し、/em patrol undo は前の編集状態に戻し、/em patrol status は編集用ドライバーの状態を表示します。/em patrol cancel はルート変更を保存せずに終了します。編集コマンドはすべてプレイヤー専用で、elitemobs.patrol.admin が必要です。目的地は元のワールド内に置く必要があり、WorldGuard の elitemob-spawning が deny のリージョンでは追加が拒否されます。

新しいルートは相対座標を使います。既存のルートを編集する場合、エディターはその patrol.relative の設定を維持し、追加した目的地をその形式で保存します。形式は YAML 設定で指定してください。

NPC またはリージョナルボスのファイルに複数の spawnLocations がある場合、対象のルートを保存すると、その地点専用の子ファイルが作成され、元のファイルからその地点が取り除かれます。これにより、相対ルートでも絶対ルートでも、編集はその対象だけに適用されます。子ファイルは extends で元の設定を継承します。ボスの子ファイルは、extends では継承されない元の leashRadius、powers、eliteScript もコピーします。

設定​

巡回ノードは x,y,z 座標です。デフォルトの relative: true では、設定上のスポーン地点からのオフセットになります。relative: false では、対象のワールド(進行中のダンジョンインスタンスのワールドを含む)内の正確な座標になります。絶対座標のノードにはワールド名を含めません。

patrol:
enabled: true
relative: true
mode: LOOP
speed: 1.0
virtualSpeed: 0.2
nodes:
- 0,0,0
- 1000,0,0
- 1000,0,250
キー値デフォルト説明
patrol.enabledtrue / falseノードがあれば trueルートを有効にします。
patrol.relativetrue / falsetruetrue では設定上のスポーン地点からのオフセット、false では対象のワールド内の正確な座標を使います。ルート内のすべてのノードに適用されます。
patrol.modeLOOP / REVERSELOOPLOOP は最後のノードをノード 0 へ接続し、REVERSE はリストを逆方向に戻ります。
patrol.speed正の有限数1.0ネイティブナビゲーションの速度倍率です。
patrol.virtualSpeed正の有限数移動速度属性 × 巡回速度永続的な対象の実体がない間、キャッシュされた計算済み経路を 1 tick あたり何ブロック進むかを指定します。通常は省略してください。
patrol.startNodeWaitSeconds0 以上の有限数0対象がノード 0 に戻るたびにそこで休止する秒数です。LOOP では 1 周ごとに 1 回、REVERSE では 1 往復ごとに 1 回休止します。ノード 0 でスポーンした対象は、最初の周回の前にも休止します。休止中はスポーン時の向きを向きます。
patrol.nodes2 個以上の座標なし順序付きの目的地で、patrol.relative に従って解釈されます。x,y,z 文字列と x、y、z のマップを使用できます。座標は有限値で、連続するノードは異なる位置である必要があります。

たとえば、次のルートは 3 つの正確な位置を巡回してから最初の位置に戻ります。

patrol:
enabled: true
relative: false
mode: LOOP
nodes:
- 299,91,215
- 286,91,213
- 279,91,230

patrol.relative のない既存のルートは、引き続きオフセットを使います。このフラグを変更するとすべてのノードの解釈が変わりますが、保存されている数値は変換されません。既存のルートの形式を変更する場合は、ノードも変換してください。

公開されている区間距離の上限はありません。1,000 ブロックの区間も有効です。旧実験用キー patrol.maxLegDistance は廃止されており、効果はありません。

エディターは保存時に、ルートのナビゲーション速度、明示的な virtualSpeed、開始ノードでの休止を保持します。3 個以上のノードがあるルートで、末尾が最初のノードの繰り返しになっている場合、読み込み時にその末尾ノードが自動的に取り除かれます。

プレイヤーへの接近による NPC の一時停止​

NPC は patrol.pauseNearPlayersRadius(デフォルト 0、無効)と patrol.faceNearbyPlayers(デフォルト false)にも対応します。正の有限半径を指定すると、生存中かつスペクテイターではないプレイヤーの近くで停止します。向きのオプションを有効にすると、停止中の NPC は最も近い対象プレイヤーを見ます。接近判定は 20 tick ごとです。無効な値や負の半径では、この停止機能が無効になります。

これらは会話や Lua による手動停止とは独立しています。NPC 用の設定であり、ボス巡回の追加フィールドではありません。

開始ノードでの休止​

patrol.startNodeWaitSeconds を設定すると、対象は次の周回を始める前にノード 0 で停止します。休止のカウントダウンは、対象がアンロードされている間も進みます。接近や戦闘による一時停止中は、それが終わるまでカウントダウンが止まります。walk_to、hold、teleport、patrol_resume() は休止をすぐに終了させます。ギルドの戦闘教官は 60 秒の休止を使っているため、プレイヤーは周回の合間に椅子にいる彼を見つけられます。

長距離経路探索​

長い区間は自動的に解決されます。EliteMobs は MagmaCore にロード済み地形上のローリングルートを要求し、ネイティブナビゲーション用の短い目的地に分割し、対象の進行に合わせて再計算します。

地形へのアクセスと経路探索は分離されています。

  • ロード済みチャンクのスナップショットは、MagmaCore の tick 予算付き共有ワークロードシステムによりサーバースレッドで取得されます。
  • 上限付き A* 探索は、その不変スナップショット上で非同期実行されます。
  • 最終的な短い区間は Minecraft のネイティブ経路探索で検証・移動されます。
  • 経路計画はチャンクを強制ロードしません。地形が不足している場合は待機して再試行します。実体のない永続的な対象は、キャッシュされた計算済み経路だけを進み、その経路が尽きると停止します。実体が戻れるのはエンティティが tick する区域だけです。

これにより、1 tick で都市全体を走査したり、未ロードの建物を直線で通過したりせずに長距離を移動できます。飛行・水生 Mob は体積探索を使い、地上 Mob は足場と空間を確認して一般的な危険物を避けます。

対象の動作​

  • NPC の巡回は実体の AI とカスタムモデルの移動同期を自動的に有効化します。syncMovement は巡回しないモデルには有効ですが、巡回用の別スイッチではありません。
  • カスタムボスには ai: true、正の移動速度、乗り物の同乗者でないことが必要です。
  • ボスは戦闘中に巡回を一時停止し、戦闘後に再開します。
  • 非インスタンスの NPC と非インスタンスの永続ボスは、チャンク切り離しやリロードをまたいで安全なルート上の位置を patrol-state.yml に保存します。ルートのノードや relative フラグが変更されると保存位置は破棄され、対象はノード 0 からやり直します。
  • 対象はエンティティが tick する区域でのみ再実体化します。実体がなくても保存位置は以前に計算した経路を進めますが、未知の地形で新しい経路を探索することはありません。
  • 同乗者は巡回を所有できません。代わりに乗り物側へ設定してください。

Lua からの制御​

次のメソッドは context.npc と context.boss に公開されており、巡回操作には設定済みのコントローラーが必要です。Lua の座標は patrol.relative にかかわらず元のスポーン地点からのオフセットのままで、戻り値は要求が受理されたかを示します。walk_to、hold、teleport には生きた実体も必要です。歩行要求の受理は到着の証明ではなく、戦闘、接近による停止、無効な AI、経路探索の失敗などで中断される場合があります。

メソッド動作
patrol_pause()設定を失わずに現在のルートを停止します。
patrol_resume()スクリプトによる待機・一時移動を解除して巡回を再開します。
walk_to(x, y, z)オフセットまで歩き、その後巡回を再開します。
hold(x, y, z)オフセットまで歩き、patrol_resume() が呼ばれるまで待機します。
teleport(x, y, z)同じワールド内のオフセットへ、目的地でエンティティが tick し、Bukkit が許可した場合に生きた実体をテレポートします。既存のスクリプト停止や一時的な目的地は解除しません。ルートへ戻すには patrol_resume() を使用してください。
return {
api_version = 1,
on_npc_interact = function(context)
context.npc:walk_to(40, 0, -12)
end
}

walk_to は同じ長距離ソルバーを使うため、手動で中継点へ分割する必要はありません。

診断​

編集セッション外で対象を見て /em patrol status を実行します。状態、現在・目標ノード、進捗、論理位置、仮想速度、実体の有無、停止理由が表示されます。start_node_wait は開始ノードでの休止を示します。terrain_unavailable は実体のない移動に使える計算済み経路が残っていないことを示します。ロード済みの対象が計画を待っている場合は yielded と表示されることがあります。論理位置はルート上の進捗を表し、実体の復元に使う保存済みの安全な位置とは異なる場合があります。

通常の経路失敗では、巡回コントローラーは一度再試行してから次のノードへ進みます。一時的な歩行や待機移動の失敗も一度再試行されますが、目的地への到着を保証しません。途中の地点を飛ばす、または停止したままになる場合は、地形とネイティブナビゲーションを確認してください。