クエストの作成
クエスト例
同梱の test_quest.yml の形式に沿った簡単な例です。
サーバーフォルダ内の plugins/EliteMobs/customquests/ に、重複しない名前の .yml ファイルを作成します。/em reload でクエストと参照先のコンテンツを読み込み、以下の説明に従って NPC に割り当てます。
test_quest.yml
isEnabled: true
customObjectives:
Objective1:
amount: '1'
filename: test_boss.yml
objectiveType: KILL_CUSTOM
customRewards:
- filename=magmaguys_toothpick.yml:amount=1:chance=1
name: "&aKill the Test Boss"
questLore:
- "&cEnd the test boss' reign of terror!"

画像は従来の本型画面です。/em alt はメニューの表示設定を切り替えます。Java でその設定を選ぶと、Minecraft 1.21.6 より前は本、それ以降は Minecraft のダイアログになります。Bedrock とインベントリメニューを選んだプレイヤーにはインベントリ画面が表示されます。
このクエスト例では、プレイヤーに test_boss.yml を 1 体倒すという課題が与えられます。(クエストトラッカーに表示されるボスの実際の名前は、test_boss.yml に設定された name: になります。)そしてクエスト達成の報酬として、Magmaguy's Toothpick が 1 つ与えられます。
各目標は受注時に同時に有効になります。Objective1、Objective2 などのキーは順序を指定しません。報酬にはすべての目標の達成が必要です。既定ではその後 NPC に報告します。Quests.yml の requireQuestTurnIn: false を設定すると、目標達成時に収集品の確認と消費を含めて即座に完了を試みます。受注数の上限 maximumActiveQuests は既定で 10 です。
カスタムクエストの作成
isEnabled
クエストが有効かどうかを設定します。
| キー | 値 | 既定値 |
|---|---|---|
isEnabled | 真偽値 | true |
例
isEnabled: true
customObjectives
クエストの目標を設定します。
| キー | 値 | 既定値 |
|---|---|---|
customObjectives | 特殊 [1] | なし |
複数フェーズのボスには最初のフェーズのファイル名を指定します。進捗はフェーズ切り替えではなく、ボスの死亡時に加算されます。KILL_CUSTOM はファイル名を照合し、questLevel を討伐対象の最低レベルとしては使用しません。
例
KILL_CUSTOM:
customObjectives:
Objective1:
amount: '1'
filename: my_cool_boss.yml
objectiveType: KILL_CUSTOM
DIALOG:
customObjectives:
Objective1:
dialog:
- "&a[Dialog NPC] &fCome here often?"
- "&7&oI should eat more apples."
filename: dialog_npc.yml
npcName: Dialog NPC
location: at dialog location.
objectiveType: DIALOG
FETCH_ITEM:
収集目標はインベントリ内の EliteMobs カスタムアイテムタグを数えます。報告時には、アイテムの消費や報酬の付与より先に、同じインベントリの写しを使ってすべての収集目標を確認します。二つの目標が同じアイテムを要求する場合は合計数が必要で、一つのスタックを二重に使用できません。アイテムを捨てると達成済みの目標が未達成に戻ることがあります。
customObjectives:
Objective1:
amount: '99'
itemName: Red Apples
filename: my_quest_item_red_apples.yml
objectiveType: FETCH_ITEM
ARENA:
customObjectives:
Objective1:
objectiveType: ARENA
filename: my_arena.yml
name: "Complete the Arena"

特殊 [1]
テーブルを展開
カスタム目標は以下の値を使って構成します:
| キー | 説明 |
|---|---|
objectiveType | 目標の種類。KILL_CUSTOM はカスタムボスの討伐、FETCH_ITEM はカスタムアイテムの収集、DIALOG は NPC との会話、ARENA はアリーナの攻略、CLASS_UNLOCK はクラス解放の確認です。 |
filename | ボス、アイテム、会話 NPC、アリーナ、クラストレーナーの必須 .yml ファイル名。表示名ではなく、読み込まれた定義を指定します。filename のない目標、または objectiveType が欠落・不明な目標があると、コンソールに警告が出てクエスト全体が無効になります。不正な CLASS_UNLOCK はクエストに残りますが、達成できません。提供前にすべての警告を修正してください。 |
amount | 討伐数または収集数を正の整数で指定します。既定は 1。1 未満の値はクエストを無効にします。DIALOG、ARENA、CLASS_UNLOCK の必要数は一つで、このフィールドは無視されます。 |
dialog | DIALOG 専用 — プレイヤーが会話したときに NPC が言うセリフです。 |
location | DIALOG 専用 — NPC がどこにいるかの自由記述のヒントで、クエストメニューの要約行に $location として表示されます。 |
name / npcName / itemName | FETCH_ITEM、DIALOG、ARENA、CLASS_UNLOCK の表示ラベル用の任意の別名。一つだけ設定してください。すべて翻訳可能で、独自の説明や情報の秘匿に使えます。省略時は FETCH_ITEM が翻訳済みアイテム名、DIALOG が翻訳済み NPC 名を使います。KILL_CUSTOM はボスの設定名を使います。 |
class | CLASS_UNLOCK 専用: adventurer など、確認するクラス形態の ID。 |
空でない customObjectives マップに、目標ごとの一意なキー(Objective1、Objective2 など)を指定します。フィールド名は大文字と小文字を区別し、種類には上記の大文字の値を使います。KILL_CUSTOM:filename=X.yml:amount=Y のような旧形式の文字列は、初回読み込み時に新形式へ変換され保存されます。
目標ラベルには、クエストのファイル名と customObjectives.Objective1.itemName などのフィールドパスで識別される独自の翻訳エントリがあります。元のアイテムが翻訳済みでも、この CSV エントリを翻訳してください。未翻訳の場合は元のラベルを表示し、隠したアイテム名を明かしません。原文は YAML に残り、既存の翻訳編集も保持されます。
FETCH_ITEM の挙動
FETCH_ITEM は素材、表示名、説明文ではなく、アイテムのファイル名タグで判定します。受注前に入手した物や、防具・オフハンドのスロットにある物も数えます。受注、該当アイテムの拾得・投棄、クエスト報酬では次の tick に再集計します。その他のインベントリ変更は表示に即座に反映されない場合がありますが、報告時には必ず再確認します。成功時に必要数を消費し、合計数が不足していれば一部だけ消費せずに報告を中止します。
DIALOG は対応する NPC との対話操作時に、通常メニューを開くより先に進みます。会話を読み終える必要はありません。location は文字によるヒントで、コンパス座標ではありません。ARENA はクエスト進行中に指定アリーナを攻略すると進み、過去の攻略は数えません。
クラス解放の目標
CLASS_UNLOCK は高度な戦闘システムで解放されたクラスを確認します。クラス自体は付与しません。例:
customObjectives:
Objective1:
objectiveType: CLASS_UNLOCK
class: adventurer
filename: class_trainer_adventurer.yml
class には存在するクラス形態を指定します。filename はトレーナー NPC への追跡に使い、name で表示を変更できます。必要数は一つで、受注前に解放済みのクラスも、現在装備していなくても認識します。クラス進行機能が利用可能である必要があり、完了時に解放状態を再確認します。不正なクラスや欠落したトレーナーファイル名は、無視されず達成不能な目標として残ります。
追跡と放棄
一人が追跡できるクエストは一つです。Quests.yml の autoTrackNextQuestOnCompletion: true により、追跡中のクエスト完了後、次の tick に別の進行中で追跡可能なクエストを選びます。questAutoTrackNextMessage は $questName に対応します。autoTrackQuestsOnAccept も既定で true ですが、現在は追跡のオン・オフを切り替えるため、すでに追跡中に別のクエストを受注すると、切り替えではなく停止する場合があります。必要ならメニューから追跡を選び直してください。
コンパスはカスタムボス、会話 NPC、トレーナー、要求アイテムを戦利品テーブルに含むボスや宝箱を探します。すべての入手経路を探せるわけではなく、アリーナや動的討伐目標には専用の目的地検索がありません。別ワールドの場合は適切な直通ワームホールを示すか、ワールド名を表示しますが、通行可能な道順を保証しません。目的地がなくても目標は進行できます。
通常の放棄操作には再確認が必要です。文面とホバー説明は questAbandonConfirmationText と questAbandonConfirmationHover で設定します。放棄は進行中のクエストと追跡を削除しますが、questLockoutMinutes の完了後制限を開始せず、完了マーカーも付与しません。通常の条件を満たせば再受注できます。
NPC のクエスト表示はプレイヤーごとに異なり、30 ブロック以内に表示されます。コンパスには上下方向の案内があります。ボスバー会話中は表示領域を専有し、他の管理対象バーを隠します。旧設定 hideKeyedBossBarsDuringQuestDialogue は削除されます。hideQuestScoreboardDuringQuestDialogue はスコアボードを別に制御します。
Java のボスバー会話では、スニークで現在のページを全文表示し、その後に次へ進みます。最大 30 秒の移動速度低下 III を付けますが、完全には固定しません。キャンセルされていない正のダメージを受けると、クエスト画面と会話を閉じます。Bedrock はこの会話をチャットで受け取ります。会話の画像には対応するリソースパック素材が必要です。
customRewards
クエストの報酬を設定します。
| キー | 値 | 既定値 |
|---|---|---|
customRewards | EliteMobs 共通の戦利品形式 | なし |
例
customRewards:
- currencyAmount=50:amount=1:chance=0.05
- material=COOKED_COD:amount=3:chance=1.0
- filename=magmaguys_toothpick.yml:amount=1:chance=1.0

カスタムクエストでは報酬エントリは自動生成されません。customRewards が空なら、このテーブルからアイテムや通貨は出ませんが、別途設定した完了コマンドは実行されます。自動の報酬エントリはダイナミッククエストに適用されます。
レベル可変のアイテム報酬は、選択中の動的ダンジョンレベルまたは現在の戦闘レベルを使用し、10 % の確率で 1 加算します。固定・制限付きアイテムは通常のスケーリング規則に従います。questLevel は実際の報酬アイテムレベルを決めません。
クエスト報酬は直接配られます。アイテムはプレイヤーのインベントリへ直接入り(入りきらないものは足元にドロップされます)、通貨は残高に加算されます。達成時にコマンドを実行したい場合は、command= のルートエントリではなく questCompleteCommands を使ってください。
プレビューと実際の配布は別々に抽選します。表示されたランダム報酬やレベル加算が確保されるわけではありません。
questAcceptPermission
受注前に必要な EliteMobs のクエスト完了マーカーを一つ指定します。同名の通常パーミッションを付与しても条件は満たせません。
| キー | 値 | 既定値 |
|---|---|---|
questAcceptPermission | 文字列 | なし |
例
questAcceptPermission: elitequest.my_permission
questAcceptPermissions
列挙した EliteMobs 完了マーカーのすべてを要求します。questAcceptPermission も設定した場合は、そのマーカーも必要です。
| キー | 値 | 既定値 |
|---|---|---|
questAcceptPermissions | 文字列リスト | なし |
例
questAcceptPermissions:
- elitequest.my_previous_quest_one.yml
- elitequest.my_previous_quest_two.yml
questLockoutPermission
正常完了後に付与するマーカーを設定します。後続クエストを解放でき、questLockoutMinutes が 0 以下の場合はこのクエストの繰り返しを防ぎます。省略しても正の時間制限は無効になりません。
| キー | 値 | 既定値 |
|---|---|---|
questLockoutPermission | 文字列 | なし |
例
questLockoutPermission: elitequest.my_quest.yml
questLockoutMinutes
プレイヤーが再びそのクエストを実行できるようになるまで待たなければならない時間を分単位で設定します。
ロックアウトのシステムは 2 つあり、このキーがどちらを使うかを決めます。
0より大きい値の場合は、時間指定のロックアウトトラッカーが使われます。プレイヤーは納品後その分数だけこのクエストからロックアウトされ、再度受けようとすると残り時間が伝えられます。可用性のチェックではquestLockoutPermissionは無視されます。0以下の場合は、レガシーなquestLockoutPermissionのマーカーにフォールバックし、達成時に恒久的に付与されます。questLockoutPermissionも設定されていない場合、そのクエストは繰り返し可能なままです。
| キー | 値 | 既定値 |
|---|---|---|
questLockoutMinutes | 整数 | -1(マーカーの規則を使用) |
両方のフィールドを設定し、時間が正の場合もマーカーは付与されますが、その時間後に失効します。そのマーカーを条件にする後続クエストは失効前に受注する必要があります。時間制限はクエストのファイル名に対して保存され、前提条件用のマーカーとは別です。
例
questLockoutMinutes: 60
name
クエストの名前を設定します。カラーコード を受け付けます。
| キー | 値 | 既定値 |
|---|---|---|
name | 文字列 | 空 |
例
name: "&aMy Great Quest Name"
questLore
ゲーム内のクエストメニューに表示されるクエストのロア(説明文)を設定します。
| キー | 値 | 既定値 |
|---|---|---|
questLore | 文字列リスト | なし |
例
questLore:
- "Interesting lore sentence."
- "Yet another interesting lore sentence."

temporaryPermissions
受注時に実際の Bukkit パーミッションを付与し、ログイン後に進行中クエストを復元する際にも再適用します。クエストを完了または放棄すると削除され、ログアウトすると次のログインまで解除されます。各クエストはノードを個別に付与するため、進行中の 2 つのクエストが同じノードを共有できます。片方が終了しても、もう片方が付与したノードは残ります。
通常のアイテム生成には、アイテム側でも同じパーミッションを設定します。この確認はすべての配布経路を対象にしません。
| キー | 値 | 既定値 |
|---|---|---|
temporaryPermissions | 文字列リスト | なし |
例
temporaryPermissions:
- elitequest.item_that_should_drop_only_during_quest.yml
questAcceptDialog
クエスト受注時にチャットに表示されるダイアログを設定します。
ボスバー会話が有効なら、このリストは受注前に依頼主が話す内容にも使われます。空の場合は questLore が代わりになります。
| キー | 値 | 既定値 |
|---|---|---|
questAcceptDialog | 文字列リスト | なし |
例
questAcceptDialog:
- "My hero! You are so helpful!"
- "I wish you the best of luck!"

questCompleteMessage
報告時の会話を設定します。Quests.yml の useQuestDialogueBossBars が有効なら、報告メニューを開く前に表示される場合があります。それ以外は正常完了時に表示します。直前に表示済みの報告会話は完了時に繰り返しません。Bedrock はチャットで受け取ります。この会話を見ただけでは報酬を受け取った証拠にはなりません。
| キー | 値 | 既定値 |
|---|---|---|
questCompleteMessage | 文字列リスト | なし |
例
questCompleteMessage:
- "My hero! You have completed my difficult quest!"
- "As a reward you can have this loaf of bread!"

questCompleteCommands
クエスト達成時に実行されるコマンドを設定します。コマンドはコンソールからディスパッチされるため、先頭のスラッシュは含めず、プレイヤーがその権限を持っていることを前提にしないでください。
サポートされるプレースホルダー: プレイヤー名には $player、プレイヤーのいるワールド名には $getWorld、位置座標には $getX、$getY、$getZ。
| キー | 値 | 既定値 |
|---|---|---|
questCompleteCommands | 文字列リスト | なし |
例
questCompleteCommands:
- say $player has finished a quest at $getX, $getY, $getZ!
- give $player diamond 1
![]()
turnInNPC
報告先 NPC のファイル名を設定します。依頼主と別でも構いません。省略時は元の依頼主を使います。別の報告先は interactionType: CUSTOM_QUEST_GIVER を使用し、提供クエストのリストは空でも構いません。
| キー | 値 | 既定値 |
|---|---|---|
turnInNPC | ファイル名 | なし |
例
turnInNPC: my_cool_quest_npc.yml
クエスト付与者
クエストをプレイヤーに渡す NPC に割り当てるには、クエストファイルではなく NPC ファイルを設定する必要があります。
NPC の設定ファイル(plugins/EliteMobs/npcs/)に以下を追加します:
interactionType: CUSTOM_QUEST_GIVER
questFileName:
- my_quest.yml
複数のクエストを付与する NPC の場合:
interactionType: CUSTOM_QUEST_GIVER
questFileName:
- quest_one.yml
- quest_two.yml
一件でも YAML リストを使ってください。単一値の questFileName: my_quest.yml は提供リストとして読み込まれません。開くには interactionType: CUSTOM_QUEST_GIVER が必要です。
NPC の設定に関する詳細は、NPC 作成のドキュメントを参照してください。
trackable
コンパスによる手動・自動追跡を許可します。false にしても目標の進行、報酬、一時的な進捗スコアボードは止まりません。
| キー | 値 | 既定値 |
|---|---|---|
trackable | 真偽値 | true |
例
trackable: true
questLevel
クエストのレベルを設定します。これはプレイヤーがクエストの難易度を把握できるようにするための視覚的な目安にすぎません。ボス、アイテム、その他のレベルを変更することは一切ありません。
| キー | 値 | 既定値 |
|---|---|---|
questLevel | 整数 | 0 |
例
questLevel: 10

questAcceptSound
受注時のサウンドを設定します。Minecraft とリソースパックのサウンドを使えます。省略時は SoundsConfig の共通受注サウンドを使用します。
| キー | 値 | 既定値 |
|---|---|---|
questAcceptSound | 文字列 | なし |
例
questAcceptSound: entity.experience_orb.pickup

questCompleteSound
完了時のサウンドを設定します。Minecraft とリソースパックのサウンドを使えます。省略時は SoundsConfig の共通完了サウンドを使用します。
| キー | 値 | 既定値 |
|---|---|---|
questCompleteSound | 文字列 | なし |
例
questCompleteSound: entity.player.levelup

翻訳
以下のフィールドは、多言語サーバー向けのローカリゼーションをサポートしています:
namequestLorequestAcceptDialogquestCompleteMessagecustomObjectivesの各項目内のdialog、name、npcName、itemName、location
これにより、サーバー上のさまざまな言語向けに翻訳を提供できます。
パーミッション
上記の表で述べたように、パーミッションは通常 String または String List です。しかしここでは、クエストをロック・アンロックするためにこれらをどのように使用するか、もう少し詳しく説明します。
重要: questAcceptPermission と questAcceptPermissions は通常の権限ではなく EliteMobs 内部の完了マーカーを確認します。対応する questLockoutPermission を持つクエストの完了でマーカーが作られます。LuckPerms で同名の権限を与えても解放されません。一方、temporaryPermissions はクエストの進行中に実際の権限ノードを付与します。
たとえば、あなたが計画した一連のクエストの中で quest_3 を作成しているとし、プレイヤーが quest_2 を終える前に quest_3 を受注できないようにしたいとします。その場合、クエストファイルを次のように設定します:
questAcceptPermission: elitequest.quest_2.yml
questLockoutPermission: elitequest.quest_3.yml
quest_2 は自身の questLockoutPermission で elitequest.quest_2.yml を付与する必要があります。quest_3 は questAcceptPermission でそのマーカーを要求します。既定の 0 以下の時間設定では、quest_3 の完了で永続マーカーが付与され、繰り返しを防ぎます。別の NPC が同じ進行中クエストを提供しても、独立した二件目にはなりません。
プレイヤーが一連のクエストを完了した後にのみ利用可能になるクエストを作成したい場合は、クエストファイルを次のように設定します:
questAcceptPermissions:
- elitequest.quest_2.yml
- elitequest.quest_3.yml
- elitequest.quest_4.yml
受注によって通常のアイテム生成を許可するには、temporaryPermissions にノードを加え、アイテムの permission に同じノードを指定します。
たとえば、クエストファイルを開いて以下を追加します:
temporaryPermissions:
- elitequest.my_cool_item.yml
次にアイテムファイル、この場合は my_cool_item.yml を開いて以下を追加します:
permission: elitequest.my_cool_item.yml
これでクエストは進行中、通常のアイテム生成が確認するノードを付与し、完了または放棄時にそれを削除します。
パーティーと共有討伐クレジット
クエストは個人所有です。パーティーに入っても他人のクエストの受注、報告、報酬受領は行われません。一人が討伐クレジットを得ると、同じワールドで sharedProgressRange(Party.yml の既定は 128 ブロック)以内にいるオンラインメンバーにも、自分の一致する進行中討伐目標の進捗が加算されます。特定のカスタムボスも対象です。
収集アイテム、NPC 会話、アリーナ目標は共有しません。受け手には自分の該当クエストと読み込み済みデータが必要です。参加中の試合が待機・開始段階を過ぎていれば、その試合の開始時参加者である必要があります。受け手のインスタンスを討伐元のインスタンスと別途比較はしませんが、同じワールド内の距離条件は必要です。
ダイナミッククエスト
ダイナミッククエストは、EliteMobs によって自動的に作成・更新される、手続き的に生成されるクエストです。設定ファイルで定義されるカスタムクエストとは異なり、ダイナミッククエストは手動でのセットアップを必要とせず、各プレイヤーの進行状況に適応します。
仕組み
- 依頼主:
interactionType: QUEST_GIVERの NPC を使用します。提供内容はquestFileNameではなく動的な候補群から選ばれます。 - ティア: 戦闘レベルを 1~100 に制限し、整数除算で 5 で割り、ティアを 1~20 に制限します。レベル 45 はティア 9 です。ティアはテンプレートと討伐数を決め、対象の最低レベルは制限後の戦闘レベルを使います。
- 各ティアに三つのテンプレート:
Quests.ymlのquestEntityTypesから種類を選びます。不明なエンティティタイプや EliteMobs のモブプロパティを持たないタイプは警告とともにスキップされ、使用可能なエントリーが 1 つもないリストではダイナミッククエストの提供が無効になります。各テンプレートはtier + 1からtier * 10までの両端を含む討伐数を選びます。該当種類の Elite Mob は最低レベル以上が必要で、通常の Minecraft Mob は数えません。 - 更新: テンプレートは 1200 tick ごと、20 TPS なら約 60 秒ごとに更新されます。既存クエストと進捗は保持されます。メニューは既存分と現在のティアの三つのテンプレートを、同じテンプレート ID を重複させずにまとめるため、必ず三件とは限りません。
- 動的ダンジョンへの適応: 入場時に既存の動的クエストの最低 Mob レベル、表示レベル、名前を選択レベル(1~100)に合わせます。必要数と進捗は保持し、通貨報酬は再計算しません。
- 報酬: 通貨は提供内容の作成時に
floor(questLevel / 2 * targetKillCount)で固定します。アイテムは報告時に通常の戦利品システムで生成し、選択中の動的ダンジョンレベルまたは現在の戦闘レベルに 10 % の確率で 1 を加え、最後に 1~100 に制限します。アイテムの利用可否とスケーリング規則が適用され、プレビューは別抽選です。
