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

NPC の作成

webapp_banner.jpg

定義ファイルは plugins/EliteMobs/npcs/ に置き、.yml を含む一意のファイル名を付けます。保存後に /em reload を実行してから、新しい NPC を配置してください。elitemobs.place.npc 権限を持つプレイヤーが、配置したい位置と向きで /em place npc <npcfilename.yml> を実行します。1 ファイルに複数の配置を保存できます。

別の NPC ファイルの再利用​

NPC ファイルは extends を使って別の NPC ファイルをベースにし、異なる部分だけを変更できます。

extends: my_base_npc.yml
name: "&aSecond Guard"
spawnLocations:
- my_world,20,64,20,90,0

このファイルはベースのすべての値を継承し、自身で設定したキーだけを上書きします。patrol などのネストされたセクションはキーごとにマージされ、dialog などのリストはベースのリスト全体を置き換えます。ベースはフォルダーパスを付けず、ファイル名だけで指定してください。ベースは npcs(サブフォルダーを含む)内の別のファイルである必要があり、さらに別のベースを継承することもできます。

isEnabled、spawnLocation、spawnLocations は継承されないため、各ファイルは独自の配置を保持します。isEnabled: false に設定したベースはテンプレートとして使えます。それを継承するファイルは通常どおり読み込まれます。EliteMobs は extends を使うファイルにデフォルト値を書き込みません。ベースが見つからない場合、extends にパスが含まれている場合、または extends の参照がループしている場合、そのファイルはコンソールに警告を出して無効化されます。巡回エディターは、複数の配置を持つファイルから 1 つの配置を切り出す際に extends を使います。

設定項目​

isEnabled​

設定読み込み時に NPC 定義を有効にします。変更後は再読み込みが必要です。SCROLL_APPLIER が出現するには、全体設定の useEliteItemScrolls も有効である必要があります。

キー値デフォルト
isEnabled真偽値true
例
isEnabled: true

name​

表示名を設定します。カラーコードに対応し、元のテキストが翻訳 CSV に登録されます。設定した言語の翻訳があれば、それを使用します。

キー値デフォルト
name文字列空文字列
例
name: "&aEnn Peecee"

create_npc_name.jpg


名前と役割の配置​

名前と役割の配置は固定で、NPC ごとの nameplateScale や nameplateLineGap はありません。通常の NPC と変装した NPC では、ラベルが本体や変装の高さに追従します。対応する FreeMinecraftModels モデルはラベルを管理します。ModelEngine は独自の名前を維持し、EliteMobs が役割を表示します。個人用クエストマーカーはその上に配置されます。

ギャンブルが有効な場合、特別な gambling_den_owner.yml は同じラベル群に店側の収益を追加し、約 1 秒ごとに更新します。

scale​

Minecraft のサイズ属性で本体の村人を拡大・縮小します。モデルや変装は独自に表示サイズを管理できるため、見た目も同じ倍率になるとは限りません。

キー値デフォルト
scale倍率1.0

スケーリングする際、1.0 がデフォルトのサイズを表します。エンティティを大きくするには値を増やします(例: 1.2)。エンティティを小さくするには値を減らします(例: 0.8)。

例
scale: 1.2

role​

名前の下に役割ラベルを表示します。見た目だけの設定で、カラーコードに対応し、翻訳 CSV に登録されます。

キー値デフォルト
role文字列空文字列
例
role: "&c<Red Fellow>"

create_npc_role.jpg


profession​

本体の村人の職業を設定します。変装もカスタムモデルも使用しない場合の見た目に反映されます。

キー値デフォルト
profession職業NITWIT
例
profession: NITWIT

create_npc_profession.jpg


greetings​

近接チェックでプレイヤーを初めて activationRadius 内に検出した際に試みる挨拶です。ランダムな 1 項目を、そのプレイヤーだけに約 5 秒間見える吹き出しとして表示します。リストは翻訳 CSV に登録されます。発話には canTalk と共有会話クールダウンの終了が必要です。

挨拶を試みるのは進入を検出したときだけです。共有クールダウンで阻止されても、範囲内に留まるだけでは再試行しません。

キー値デフォルト
greetings文字列リストなし
例
greetings:
- Hi there!
- Good day.

create_npc_greetings.jpg


dialog​

吹き出しの台詞を設定します。リスト順ではなく毎回ランダムに選ばれ、リストは翻訳 CSV に登録されます。

いつ発生するかは interactionType によって異なります。

  • CHAT は操作された際、通常は右クリックで発話を試みます。FreeMinecraftModels はモデルへの左クリックも対話処理に渡します。
  • 他の種類は範囲内に留まるプレイヤーに対し、2 回目以降の近接チェックで台詞を試みます。進入時のチェックでは挨拶を試みます。

文字としての \n は吹き出しを複数行に分けます。YAML の単一引用符で囲むか、二重引用符内では \\n と記述して保持してください。挨拶と別れの台詞にも適用されます。

キー値デフォルト
dialog文字列リストなし
例
dialog:
- I like apples!
- Sure is hot.

create_npc_dialog.jpg


farewell​

ランダムに選んで吹き出しに表示する別れの台詞です。リストは翻訳 CSV に登録されます。

空でないタイトルを持つインベントリ画面を閉じると、近くの NPC が別れの発話を試みます。検索範囲はプレイヤーを中心に各軸 5 ブロックで、開いたメニューの持ち主に限定されません。複数の NPC が話すこともあります。activationRadius の外へ歩くだけでは発生しません。

キー値デフォルト
farewell文字列リストなし
例
farewell: 
- Until next time!
- Bye!

create_npc_farewell.jpg


canTalk​

組み込みの吹き出しを制御します。false は greetings、dialog、farewell を抑制しますが、メニュー、コマンド、Lua、クエスト会話、近接検知、クエストマーカーは無効にしません。

キー値デフォルト
canTalk真偽値true
例
canTalk: true

activationRadius​

NPC がプレイヤーの接近を検知できる範囲(半径)をブロック単位で設定します。

近接チェックは 100 tick、約 5 秒ごとです。3 次元の距離を使い、視線の遮蔽は調べません。静止した NPC はプレイヤーの方を向き、進入時に挨拶し、以後のチェックで会話できます。0 以下は Lua 近接フックを含むこれらの動作を無効にします。QUEST_GIVER と CUSTOM_QUEST_GIVER の個人用マーカーは別の 30 ブロック範囲を使い、activationRadius: 0 でも表示できます。内容は各プレイヤーが受注・報告できるクエストに応じます。

キー値デフォルト
activationRadius小数3.0

巡回の移動中または編集中は近接チェックと吹き出しを抑制します。patrol.pauseNearPlayersRadius と patrol.faceNearbyPlayers でプレイヤー付近での停止と向きを制御できます。巡回 を参照してください。

例
activationRadius: 3.0

scripts​

この NPC に紐付ける Lua スクリプトを設定します。スクリプトファイルは plugins/EliteMobs/npc_scripts/ から読み込まれます。.lua 拡張子は省略可能で、書かなければ自動的に付加されます。

キー値デフォルト
scripts文字列リストなし

共有 MagmaCore Lua エンジンは on_spawn、on_game_tick、on_remove、on_npc_interact、on_npc_proximity_enter、on_npc_proximity_leave、on_zone_enter、on_zone_leave に対応します。NPC の tick フック名は on_game_tick です。各 NPC が独自のスクリプトインスタンスを持ち、小さい優先度から実行します。tick フックだけのスクリプトは、初期化用に空でもよい on_spawn を追加してください。API と例は Lua NPC スクリプト にあります。

読み込まれた定義に対応しない名前は警告付きで無視されますが、NPC は出現します。ファイル名の大文字・小文字を合わせ、変更後は再読み込みしてください。

クエスト会話がクリックを処理すると、on_npc_interact に届かない場合があります。それ以外では設定済みの対話より先にフックを実行し、その対話をキャンセルしません。

例
scripts:
- wave.lua

interactionType​

NPC が行うインタラクションのタイプを設定します。

キー値デフォルト
interactionType特殊 [1]NONE
例
interactionType: TELEPORT_BACK

noPreviousLocationMessage​

TELEPORT_BACK の帰還先が保存されていない場合のメッセージです。帰還先は EliteMobs ワールド外から EliteMobs のテレポートを行った際の出発地点であり、直前の歩行位置や死亡地点ではありません。帰還には通常の EliteMobs テレポート処理と、設定された待機時間・キャンセル規則を使います。カラーコードに対応し、翻訳 CSV に登録されます。

キー値デフォルト
noPreviousLocationMessage文字列空文字列
例
noPreviousLocationMessage: '&8[EliteMobs] &cCouldn''t send you back to your previous location - no previous location found!'

create_npc_noteleportlocation.jpg


timeout​

出現した NPC を除去するまでの分数です。0 以下でタイマーを無効にします。保存済み配置や定義は削除・無効化されないため、再読み込み、再起動、チャンク復元で戻ることがあります。

配置を削除するには /em remove を有効にして NPC を攻撃し、再び /em remove でモードを終了します。elitemobs.remove 権限が必要です。配置リストでは一致する項目を削除し、旧形式の単一配置では定義を無効にします。spawnLocations に移行したら古い spawnLocation を削除してください。残すとリストが空になった際に再び使われる場合があります。

キー値デフォルト
timeout小数0(タイマー無効)
例
timeout: 0

questFileName​

CUSTOM_QUEST_GIVER 用に、plugins/EliteMobs/customquests/ 内のファイル名を .yml 付きで列挙します。キーは単数形ですが値はリストです。メニューは受注条件を満たすクエストを提示し、この NPC のファイル名に割り当てられた報告を受け付けます。報告専用 NPC なら提示リストを空にできます。同じファイルの複数配置はこの識別を共有します。個別のクエスト権限と条件は引き続き適用されます。

キー値デフォルト
questFileName文字列リストなし
例
questFileName:
- my_quest_one.yml
- my_quest_two.yml

disguise​

変装を設定し、LibsDisguises が必要です。カスタムモデルの読み込みに成功した場合はモデルを優先します。

キー値デフォルト
disguiseLibsDisguises 形式なし
例
disguise: SKELETON

create_npc_disguise.jpg


customDisguiseData​

カスタムの LibsDisguises 変装用のデータを設定します。

キー値デフォルト
customDisguiseDataLibsDisguises 形式なし
例
disguise: custom:my_cool_disguise_name
customDisguiseData: player my_cool_disguise_name setskin {"id":"364acb6d-9050-46f7-b5fb-f8c3fd83a6fc","name":"Unknown","properties":[{"name":"textures","value":"ewogICJ0aW1lc3RhbXAiIDogMTYxMTk4ODA4Nzc1NSwKICAicHJvZmlsZUlkIiA6ICJkZGVkNTZlMWVmOGI0MGZlOGFkMTYyOTIwZjdhZWNkYSIsCiAgInByb2ZpbGVOYW1lIiA6ICJEaXNjb3JkQXBwIiwKICAic2lnbmF0dXJlUmVxdWlyZWQiIDogdHJ1ZSwKICAidGV4dHVyZXMiIDogewogICAgIlNLSU4iIDogewogICAgICAidXJsIiA6ICJodHRwOi8vdGV4dHVyZXMubWluZWNyYWZ0Lm5ldC90ZXh0dXJlLzliYmVkODQzNWY4YmYyNzhhZmUyNmU2NGZkOTI2YjhiMzc3MzJkODhlMzM0ODk3ZGJkNTI3ZDU2ZmY5MTk5MGUiCiAgICB9CiAgfQp9","signature":"ujLq1joYVktuQAp1xpFKlxQFUVinSePiDBiVCAxxix/mA5vP86i/eAOfb1mtGjaAZ6sO0l2olbzvycnGXNBtbAxgqprguROXY4tpWiePVTDmy3iD4GdOCxHAkYLoyMV5qTT4SNsldUFFuND8GSEgbNMltKDLmhNKwzm08iCigPfpeuYpwljgJPxu6ka54PKNaQu4doI0ZDZXKqq4hPhR3Bs2Sz9MI0SmdmQWwcCzUz3DFdVno27fmQ6LwqmT+eSoOv0EttVG/XMaTYQ5lhBY61mqf6WlJyYVUSfjJk1AbYsctu7dWM+sbY8jFq5ljvXJGGr5TyKi+fs8vHy06Z2go20QgTYOw+caFxFijAS6fgm3oY57VEO/+/9OLHdD+Z9BrWqQWcIIrVeIfxjue/yt4pyeVv9jX59hjNFjhcPEwotkxJ+vZ96WlTLWDG4BiqauDr2VeGyLlVaygO9ZU0wwsN65iSh91GI3tMIA5wbDR0Hts/9ABvt9eafHbowS+4SZXN0i9mYnKg7op1eiB8nMEAGsPJg3DwsmUrh3ACAapQ6eYHiJpo59RXDqKlRcXwo7wsEFp//5LgQWbPj0NP3nxnywdpozqSAeq6236qlhE9BT9eiyJ41V9sMelYFEWMlUAltR40NdbIrHB0J3nmfuLJz44/sTwWf6P1khOy//XX0="}],"legacy":false}

create_npc_custom_disguise.jpg


customModel​

FreeMinecraftModels または ModelEngine のモデルを設定します。選択されるプロバイダーにモデルを導入してから ID を指定してください。両方ある場合は FreeMinecraftModels を優先し、FMM にモデルがなくても ModelEngine に切り替えません。モデルが読み込めなければ、設定した変装か通常の村人の姿を使います。カスタムモデル を参照してください。

キー値デフォルト
customModel文字列なし
例
customModel: MY_MODEL_ONE

クラストレーナーと移動用 NPC​

interactionType: CLASS_TRAINER と classRoot でクラス分岐を選びます。同梱の class_trainer_*.yml を基にしてください。試練と進行は Advanced Combat System で説明しています。

interactionType: TRANSPORT の transportRoutes は .yml を除いたルート ID のリストです。クリックすると目的地選択を開きます。移動ルート を参照してください。

arena​

NPC がメニューを開く対象のアリーナのファイル名を設定します(ARENA_MASTER の interactionType が必要です)。

キー値デフォルト
arenaファイル名なし
例
arena: my_arena.yml

command​

COMMAND 用のコマンドです。クリックしたプレイヤーとして次の tick に実行し、そのプレイヤーの通常の権限を必要とします。先頭の / は省きます。プレイヤーのプレースホルダーを自動展開せず、EliteMobs のコンソールコマンド形式も使用しません。

キー値デフォルト
command文字列なし
例
command: say Look at me running a command, how cool!

create_npc_command.jpg


spawnLocation​

NPC の単一のスポーン地点を設定します。これは旧来の単一位置キーであり、spawnLocations が存在しないか空の場合にのみ読み取られます。ゲーム内で新しく配置した位置は代わりに spawnLocations に書き込まれるため、そちらのキーを優先してください。

推奨形式は world,x,y,z,yaw,pitch です。指定するワールドは読み込み済みである必要があり、この設定自体はワールドを読み込みません。

キー値デフォルト
spawnLocation文字列なし
例
spawnLocation: my_world,10,50,10,0,0

spawnLocations​

同じ定義の複数配置です。/em place npc <npcfilename.yml> は現在位置と向きを小数点以下 2 桁に丸めて追加し、isEnabled: true にします。保存形式が完全に同じ位置は重複追加しません。NPC はチャンクがエンティティを tick 処理できる状態になると復元されます。

各エントリの形式は world,x,y,z,yaw,pitch です。

キー値デフォルト
spawnLocations文字列リストなし
例
spawnLocations: 
- my_world,10,50,10,0,0
- my_world,-10,50,-10,0,0

instanced​

NPC をインスタンス化するかどうかを設定します(インスタンスダンジョンでの使用向け)。true に設定すると、NPC はブループリントワールドにはスポーンされず、代わりにテンプレートとして登録され、各ダンジョンインスタンス用にクローンされます。各クローンは対応するインスタンスワールド内に存在します。

キー値デフォルト
instanced真偽値false
例
instanced: false

syncMovement​

NPC のカスタムモデルの移動を、背後のエンティティと同期させるかどうかを設定します。これは customModel が設定されていてモデルが読み込まれている場合にのみ効果があり、素の NPC や LibsDisguises の NPC では無視されます。

有効な patrol が設定されていれば、巡回が一時停止中でも、この値が false でも同期を有効にします。巡回しないモデルではこの設定が使われます。

キー値デフォルト
syncMovement真偽値true
例
syncMovement: true

patrol​

NPC にネイティブの自動経路探索ルートを追加します。ノードはこの NPC に設定したスポーン地点からのオフセットですが、patrol.relative: false を指定するとそのワールド内の絶対座標になります。長い区間は自動分割され、チャンクを強制ロードしません。patrol.startNodeWaitSeconds を設定すると NPC は 1 周ごとに 1 回最初のノードで休止し、NPC 専用の patrol.pauseNearPlayersRadius はプレイヤーの近くで巡回を一時停止させ、patrol.faceNearbyPlayers は一時停止中にそのプレイヤーの方を向かせます。スキーマ、ゲーム内エディター、長距離動作、Lua 制御については NPC・ボスの巡回 を参照してください。


NPC 設定の例
isEnabled: true
name: "&cRed Rubin"
role: "&a<Generic NPC>"
profession: NITWIT
greetings:
- Hiya!
- Hello!
dialog:
- Great conversation!
- Pleasure talking with you!
farewell:
- Goodbye!
- Laters!
canTalk: true
activationRadius: 4
interactionType: CHAT
timeout: 0
spawnLocations:
- my_world,584,55,127,90,10

create_npc_npc.jpg


特殊 [1]​

次は、有効な NPC インタラクションタイプの一覧です。

タイプ説明
GUILD_GREETER武器スキルボーナスを開く。必要権限: elitemobs.skill.npc。
CLASS_TRAINERclassRoot の分岐を開く。必要権限: elitemobs.command。
TRANSPORTtransportRoutes の目的地を開く。
CHAT操作時にランダムな dialog の発話を試みる。
CUSTOM_SHOPカスタムショップを開く。必要権限: elitemobs.shop.custom.npc。
PROCEDURALLY_GENERATED_SHOP自動生成ショップを開く。必要権限: elitemobs.shop.dynamic.npc。
BAR未実装。プレイヤーに機能が近日公開予定であることを伝える。
ARENA何もしない。代わりに ARENA_MASTER を使用すること。
QUEST_GIVER自動生成クエストを開く。必要権限: elitemobs.quest.npc。
CUSTOM_QUEST_GIVERquestFileName の受注可能なクエストと、割り当てられた報告を扱う。
NONE組み込み動作なし。スクリプト、近接処理、クエスト会話は動作可能。
SELL売却を開く。必要権限: elitemobs.shop.sell.npc。
TELEPORT_BACK保存済み EliteMobs 帰還先を使う。必要権限: elitemobs.back.npc。
SCRAPPERスクラップを開く。必要権限: elitemobs.scrap.npc。
REPAIRMAN修理を開く。必要権限: elitemobs.repair.npc。
ENCHANTERエンチャントを開く。必要権限: elitemobs.enchant.npc。
REFINER置き換え済み - プレイヤーに機能が置き換えられたことを伝える。管理者には NPC を削除するよう伝える
SMELTER置き換え済み - プレイヤーに機能が置き換えられたことを伝える。管理者には NPC を削除するよう伝える
ENHANCER置き換え済み - プレイヤーに機能が置き換えられたことを伝える。管理者には NPC を削除するよう伝える
UNBINDERバインド解除を開く。必要権限: elitemobs.unbind.npc。
ARENA_MASTERarena で設定したアリーナのアリーナメニューを開く
COMMANDcommand で設定したコマンドを実行する
SCROLL_APPLIERエリートアイテムスクロールを開く。必要権限: elitemobs.scroll.npc。useEliteItemScrolls が無効なら出現しない。
ARROW_SHOP矢ショップを開く。必要権限: elitemobs.shop.arrow.npc。
GAMBLING_BLACKJACKブラックジャックを開く。必要権限: elitemobs.gambling.npc。
GAMBLING_COINFLIPコイン投げを開く。必要権限: elitemobs.gambling.npc。
GAMBLING_SLOTSスロットを開く。必要権限: elitemobs.gambling.npc。
GAMBLING_HIGHERLOWERハイ&ローを開く。必要権限: elitemobs.gambling.npc。

SCRAPPER や同様のインタラクションタイプが何をするのかについての詳細は こちら をクリックしてください。

NPC の動作に関する注記​

組み込み動作には次のものもあります。

  • 移動: 通常は静止して近くのプレイヤーを向きます。巡回やスクリプトで移動でき、巡回は通常の村人の行動に代わってルートを制御します。
  • 操作順序: クエスト会話が Lua や組み込み動作より先にクリックを処理することがあります。それ以外では Lua、設定済み動作とその権限確認の順です。1 tick の制限で、同じプレイヤーによる複数 NPC への連続操作を防ぎます。巡回の編集中は操作を阻止しますが、通常の移動中は阻止しません。
  • 保護: 本体は通常の衝突を行いません。EliteMobs はダメージ、村人の変身、通常の取引画面の表示をキャンセルします。
  • ラベル: 名前と役割は上記の固定配置です。通常および変装した NPC は現在の本体の高さを使うため、サイズ変更でラベル位置も変わり得ます。対応する FMM モデルは名前と役割をまとめて管理します。
  • Bedrock: 表示は有効なモデル・表示連携によって決まります。残されている bedrockNPCRoleYOffset は現在の NPC ラベル描画には使われません。
  • 会話クールダウン: 各 NPC は全プレイヤー間で 3 秒の待機時間を共有します。あるプレイヤーへの挨拶が他のプレイヤーへの挨拶を阻止する場合があります。個人用吹き出しは約 5 秒後に消えます。
  • 不可視化: 透明化のポーション効果を受けている NPC はチャットバブルを表示しません。
  • チャンク: アンロード時に消え、エンティティを tick 処理できる状態になると復元されます。NPC のエンティティはワールドに保存せず、設定ファイルの配置を使います。
  • 改名: メインハンドに名札を持って本体の村人を通常の右クリックで操作すると、メッセージを表示してキャンセルします。モデル側は独自のコールバックを使い、FreeMinecraftModels は左右どちらのクリックも NPC の対話処理に渡します。