フライトネットワーク
フライトネットワークは、1 つのワールド内にあるノードの集まりを、双方向のリンクでつないだものです。名前のあるノードが目的地になります。プレイヤーがフライトマスター NPC またはフライトポータルで目的地を選ぶと、乗り物がリンクをたどる最短の経路でそこまで飛ばしてくれます。ネットワークは plugins/EliteMobs/transport_networks/ に置き、移動ルートと同じ乗り物と移動のルールを使います。
フライトは、プレイヤーが要求した時点で組み立てられます。EliteMobs はノード間の直線距離を使ってリンク上で A* 探索を行い、乗り物は結果に含まれるすべてのノードを通る滑らかな曲線をたどります。目的地の組み合わせごとにルートを作る必要はありません。新しいノードやリンクは、それによって短くなるすべてのフライトで使われます。
プレイヤーの飛び方
- プレイヤーがフライトマスター NPC を右クリックするか、フライトポータルに踏み込みます。
- Flight paths メニューに、NPC またはポータルのノードから行けるすべての目的地が、リンクをたどった近い順に最大 54 件表示されます。プレイヤーがまだ解放していない目的地は、ロック時のヒントとともに灰色の染料として表示されます。
- 目的地をクリックするとカウントダウン(デフォルトは 60 ティック、つまり 3 秒)が始まり、終わると乗り物が出発地点でプレイヤーを乗せます。
- 乗り物は経路を飛び、目的地の
arrivalYawの向きにプレイヤーを降ろします。
フライトマスターやポータルは、メニューを開かずに 1 つの目的地へ直接飛ばすこともできます。フライトマスターとフライトポータルを参照してください。
目的地をクリックするときは、プレイヤーが NPC またはポータルから 8 ブロック以内にいる必要があります。離れているとクリックしても何も起こりません。NPC の場合、カウントダウン中に少しでも動くと出発が中止されます。ポータルの場合は、プレイヤーがポータルの範囲(中心から 1.5 × sizeMultiplier + 2 ブロック)を出たときにだけ中止されます。
スニークしても、飛行中に乗り物から降りることはできません。死亡、テレポート、ワールドの変更、ダンジョンインスタンスからの退出、乗り物の削除があると、フライトは途中で終了します。5 秒間進まなくなったフライトは、乗客を目的地に降ろします。ダンジョンインスタンスの外で飛行中に切断した乗客は、次回ログインしたときに目的地へ配置されます。サーバーを停止またはリロードした場合も、搭乗中の乗客は目的地に配置されます。
ゲーム内でネットワークを作る
エディターのコマンドはプレイヤー専用で、elitemobs.transport.admin が必要です。
- ネットワークのワールドに立ち、
/em transport network edit harbor_flightsを実行します。ファイルがないネットワークは、空の下書きとして始まります。 - プレイヤーを乗せたい場所に立ち、
/em transport node add harborを実行します。 - 上に飛び、
/em transport node add harbor_skyを実行します。隣接ノードを指定しない場合、新しいノードは選択中のノードにリンクされ、新しいノードが選択状態になるため、addを続けて実行すると経路が作れます。 - 次の目的地へ進み、同じ方法で追加します。枝分かれをつなぐには
/em transport node link <a> <b>を使います。 - 各目的地に
/em transport node destination harbor &6Harborで名前を付けます。 - 目的地に、プレイヤーを到着させたい向きで立ち、
/em transport node yaw harborを実行します。 /em transport network preview harbor mineで経路を確認し、/em transport network ride harbor mineで実際に飛んでみます。/em transport network saveを実行します。
ノード ID とネットワーク ID は、英小文字、数字、アンダースコア、ハイフンを使った 1~64 文字にします。下書きには、現在のワールドがネットワークのワールドとして記録されます。ダンジョンインスタンスの中では、代わりにダンジョンの原本ワールドが記録されます。既存のネットワークは、そのネットワークのワールドからしか編集できません。
エディターのコマンド
| コマンド | 操作 |
|---|---|
/em transport network edit <network> | 既存ネットワークの下書きを開く、または新しいネットワークを始める |
/em transport network list | 読み込まれたネットワークを一覧表示 |
/em transport network status | 下書きのノード数と選択中のノードを表示 |
/em transport network preview [from] [to] | 2 つのノード間の経路を表示。ノードを指定しない場合はプレビューを消す |
/em transport network ride <from> <to> | 保存せずに、下書きの 2 つのノード間を飛ぶ |
/em transport network generate <first> <second> | 2 つのノード間のリンクを、地形の上を通る生成ノードに置き換える |
/em transport network undo | 直前のノードまたはリンクの編集を取り消す。履歴は最大 32 件 |
/em transport network save | 下書きを保存 |
/em transport network cancel | 下書きを破棄 |
/em transport node add <id> [neighbors...] | 立っている場所にノードを追加し、指定したノード、なければ選択中のノードにリンクする |
/em transport node select [node] | ノードを選択。ノードを指定しない場合は、最も近いものを選択 |
/em transport node link <first> <second> | 2 つのノードを双方向にリンクする |
/em transport node unlink <first> <second> | 2 つのノード間のリンクを削除する |
/em transport node move <node> | ノードを立っている場所へ移動する |
/em transport node remove <node> | ノードとそのリンクを削除する |
/em transport node destination <node> [name] | そのノードを、指定したメニュー名の目的地にする。名前を指定しない場合は、通常の経由地点に戻す |
/em transport node permission <node> <permission> | このノードから、またはこのノードへ飛ぶのに権限を要求する。none で解除 |
/em transport node hint <node> [text] | ノードがロックされている間に表示するメッセージを設定する。テキストなし、または none で解除 |
/em transport node yaw <node> | 到着時の向きを、現在向いている方向に設定する |
タブ補完は、edit にはネットワーク ID を、ノード引数には下書きのノード ID を提案します。edit、list、save、cancel、status 以外のコマンドは、下書きのワールドにいる必要があります。編集できるネットワークは一度に 1 つです。下書きは、保存またはキャンセルするか、切断するか、ワールドがアンロードされるか、EliteMobs がリロードされるまで、メモリ内に残ります。
/em transport network ride は、別の場所にいても最初のノードへ移動させ、そこから出発します。ノードの権限は確認せず、目的地には名前の有無にかかわらず任意のノードを指定できます。
/em transport reload は、ルートファイルと一緒にネットワークファイルも再読み込みします。すでに飛行中のフライトは、元の経路を維持します。
エディターの表示
下書きが見えるのは、編集しているプレイヤーだけです。128 ブロック以内のすべてのノードの上に ID が表示され、2 行目に目的地の名前が表示されます。選択中のノードのラベルは黄色です。リンクは水色の線で描かれます。preview の後は、経路が緑色で描かれます。それ以外のときは、選択中のノードを通ってあなたが立っている場所まで黄色の曲線が描かれ、そこにノードを追加した場合にフライトがどのように曲がるかを示します。
仮のノードを生成する
離れた 2 つのノード間の直線リンクは、丘を突き抜けてしまうことがあります。代わりに /em transport network generate <first> <second> を使うと、地形の上を通るノードの連なりを作ります。
- 2 つのノードを結ぶ線に沿って、4 ブロックごとに、幅 3 列の地面の高さを読み取ります。すでに生成済みのチャンクだけを読み取り、1 ティックに最大 2 つまでしか読み込まないため、新しい地形が作られることはありません。
- 連なりの各点は、前後およそ 32 ブロック以内で最も高い地面より 12 ブロック上を飛び、2 つのノードを結ぶ直線より下には下がりません。また、建築限界より少なくとも 4 ブロック下にとどまります。
- おおよそ 48 ブロックごとにノードを置き、連なりが一方の端より 2 ブロックを超えて高く飛ぶ場合は、その端の真上にもノードを置きます。
- 2 つのノード間の直接のリンクを削除し、代わりにこの連なりを通して 2 つのノードをつなぎます。
ノードは水平方向に少なくとも 16 ブロック離れている必要があります。生成されたノードは <first>_<second>_1、<first>_<second>_2 のように名付けられ、あとで見つけられるよう placeholder: true 付きで保存されます。undo を 1 回実行すると、連なり全体が削除されます。保存する前に、結果を実際に飛んで確認してください。ジェネレーターが見るのは地形だけで、建物や木は見ません。
ネットワークの YAML
harbor_flights.yml の例:
isEnabled: true
world: my_world
transportEntity: transport_cannon_seat.yml
speed: 24.0
acceleration: 16.0
countdownTicks: 60
nodes:
harbor:
location: 120.5,64.0,-340.5
name: '&6Harbor'
arrivalYaw: 90.0
neighbors:
- harbor_sky
harbor_sky:
location: 120.5,96.0,-340.5
neighbors:
- harbor
- ridge_pass
ridge_pass:
location: 310.0,110.0,-180.0
neighbors:
- harbor_sky
- mine_sky
- watchtower_sky
watchtower_sky:
location: 455.5,102.0,-60.5
neighbors:
- ridge_pass
- watchtower
watchtower:
location: 455.5,81.0,-60.5
name: '&6Watchtower'
arrivalYaw: -45.0
permission: elitequest.watchtower_supplies.yml
lockedHint: '&7Finish the quest "Watchtower Supplies" to unlock this flight point.'
neighbors:
- watchtower_sky
mine_sky:
location: 260.0,95.0,20.0
neighbors:
- mine
- ridge_pass
mine:
location: 262.5,70.0,24.5
name: '&6Old Mine'
arrivalYaw: 180.0
neighbors:
- mine_sky
| キー | デフォルト | 説明 |
|---|---|---|
isEnabled | true | ネットワークを読み込む |
world | なし | ノードがあるワールド。必須 |
transportEntity | transport_cannon_seat.yml | 乗り物として使う、custombosses/ 内の有効なファイル。エンティティの種類、モデル、パワーはそこで設定する |
speed | 24 | 最高速度(ブロック/秒)。正の数にする |
acceleration | 16 | 最高速度に達するまで、1 秒ごとに増える速度(ブロック/秒)。正の数にする |
countdownTicks | 60 | 目的地を選んでから乗車するまでのティック数。0 以上 |
nodes | なし | ノード ID からノードのセクションへのマップ |
world がないネットワーク、.yml のファイル名でない transportEntity、無効な速度・加速度・カウントダウンを指定したネットワークは、警告をログに出力し、読み込まれません。
ノードのキー
| キー | 説明 |
|---|---|
location | ネットワークのワールド内の x,y,z。必須 |
name | メニューに表示する名前。名前のあるノードは目的地になり、名前のないノードはフライトが通過する経由地点になる。カラーコードが使える |
arrivalYaw | この目的地に到着したプレイヤーが向く方向。デフォルトは 0 |
permission | このノードから、またはこのノードへ飛ぶのに必要な権限 |
lockedHint | このノードがロックされている間に表示するテキスト。デフォルトは &7You have not unlocked this flight point. |
neighbors | このノードがリンクするノード ID |
placeholder | ジェネレーターが作ったノードでは true。フライトはほかのノードと同じように扱う |
リンクは双方向に働くため、片側に隣接ノードを書くだけで十分です。EliteMobs は、存在しないノードや同じ位置にあるノードへのリンクを警告のうえ破棄し、無効なノードをスキップし、隣接ノードのないノードを警告します。また、目的地が複数あるネットワークでは、ほかのどの目的地にも到達できない目的地についても警告します。
エディターから保存すると、nodes セクションだけが書き換えられ、残っているノード内のコメントと不明なキーは維持されます。新しいファイルには、上記のネットワーク設定もデフォルト値で書き込まれます。エディターは、無効になっている、または読み込みに失敗したネットワークファイルへの上書き保存を拒否します。先にそのファイルを修正または削除してください。
乗り物は曲線を正確にたどります。障害物を避けて操舵することはないため、ノード間の空間は、乗り物と乗客のために空けておいてください。エンティティの種類がニワトリまたはオウムの乗り物は、飛行中に羽根を散らし、羽ばたきます。乗り物をスポーンできない場合に何が起こるかは、ルートの空間確保と中断を参照してください。
フライトマスター
フライトマスターは、interactionType: TRANSPORT とネットワークを設定した NPC です。
interactionType: TRANSPORT
transportNetwork: harbor_flights
transportNode: harbor
これらの項目を、有効な NPC 定義に追加します。transportNode は、その NPC のフライトが出発するノードです。乗り物はそのノードでプレイヤーを乗せるので、NPC のすぐそばに置いてください。transportDestination: mine を追加すると、メニューを開かずにその目的地へ直接飛びます。transportNetwork を設定した場合、NPC は transportRoutes を無視します。
フライトポータル
flight セクションを持つワームホールは、テレポートの代わりにフライトメニューを開きます。
isEnabled: true
location1: my_world,120.5,66,-336.5,90,0
style: ICOSAHEDRON
particleColor: 0xf0c060
sizeMultiplier: 2.0
flight:
network: harbor_flights
node: harbor
flight.node は出発ノードで、乗り物はそこでプレイヤーを乗せるので、そのノードをポータルの位置に置いてください。flight.destination を指定すると、メニューを開かずにその目的地へ直接飛びます。フライトポータルに必要なのは location1 だけです。location2 も設定した場合は、両端が同じメニューを開きます。coinCost の請求や blindPlayer の適用は行われませんが、permission は引き続き適用されます。メニューをもう一度開くには、前回開いてから 5 秒以上経ったあとで、いったんポータルの範囲を出て再び入ります。
フライト中のプレイヤーに対しては、ワームホールは作動しません。ポータルの内側に降ろされたプレイヤーは、ポータルから出たうえで 5 秒経たないと、再びポータルが作動しません。
ロックされたフライトポイント
permission を持つノードは、その権限を持たないプレイヤーに対してロックされます。フライトが確認するのは出発ノードと目的地ノードだけなので、経路はロックされた経由地点を通過できます。クエストで目的地を解放するには、elitequest.watchtower_supplies.yml のような、そのクエストの questLockoutPermission マーカーを、ノードの権限として使います。プレイヤーは、クエストを完了するとそれを受け取ります。
出発ノードがロックされている場合、プレイヤーにはメニューの代わりにその lockedHint が表示されます。ロックされた目的地はメニューに灰色で残り、クリックするとそのヒントが表示されます。
/em quest bypass を有効にしているプレイヤーは、すべてのノードの権限チェックを通過します。
インスタンスダンジョン内のフライト
world にはダンジョンの原本ワールドを設定します。ダンジョンインスタンス内で開始したフライトは、そのプレイヤー専用のワールドのコピーの中を飛びます。フライトポイントには、flight セクションを持つインスタンスワームホールか、インスタンス NPC を使ってください。インスタンス内で飛行中に切断した乗客は、ログイン時に目的地へ配置されません。ダンジョン自体の、戻ってきたプレイヤーに関するルールが適用されます。