Tutorial2 ― OP・運営ガイド¶
Tutorial2 の導入手順、データファイル(userdata.yml)、管理コマンド、権限(OP判定)、トラブルシューティングをまとめます。
基本情報¶
| 項目 | 値 |
|---|---|
| プラグイン名 | Tutorial2 |
| バージョン | 1.0 |
| api-version | 26.1.2 |
| main | com.example.tutorial2.Tutorial2 |
| メインコマンド | /tutorial <subcommand> |
| 依存プラグイン | なし(/gs give のステップは GlobalStorage 系プラグインの存在を前提) |
| データファイル | plugins/Tutorial2/userdata.yml |
| config.yml | 生成・参照されません(プラグイン側に設定項目はありません) |
| 権限 | tutorial.admin(既定 op)― /tutorial paper / /tutorial skip に必要 |
起動時の動作
onEnable で TutorialManager が初期化され、userdata.yml を読み込みます。/tutorial コマンドの登録と、進行判定用のイベントリスナー(参加・右クリック・ワールド変更・コマンド実行・破壊・拾得・かまど抽出・クラフト)が登録されます。停止時 (onDisable) には userdata.yml を保存します。
導入手順¶
- ビルドした
Tutorial2-1.0.jarをサーバーのplugins/フォルダに配置する。 - サーバーを起動すると
plugins/Tutorial2/フォルダとuserdata.yml(プレイヤーが進行を始めた時点で)が生成される。 - ステップ3(資源ワールド到達判定)が動作するためには、ワールド名が
S1の資源ワールド が存在する必要があります。Multiverse 等で資源ワールドを作る場合は、ワールド名をS1にしてください。 - ステップ4(共有倉庫入手)が動作するためには、
/gs giveコマンドが実行可能なプラグイン(GlobalStorage 系)が導入されている必要があります。
ワールド名・依存コマンドはハードコード
判定対象のワールド名 S1、共有倉庫の入手コマンド /gs give、リスポーン用コマンド /spawn は ソースコード内に固定値として記述 されています。サーバー側のワールド名/コマンドが異なる場合、該当ステップで進行が止まります。変更にはプラグインの再ビルドが必要です。
パスワードはコード内に直書き
最終ステップで要求されるパスワードは TutorialCommand クラス内に PASSWORD = "20240526" として ソースコードに直書き されています。変更したい場合はソースを書き換えて再ビルドしてください。config.yml では変更できません。
userdata.yml の構造¶
プレイヤーごとの現在ステップを保存します。プラグインが自動で読み書きするため、原則として手動編集は不要です。
| キー | 説明 |
|---|---|
<UUID> |
プレイヤーのUUID(文字列)。値はそのプレイヤーの現在ステップ番号(整数) |
ステップ番号の対応は以下の通りです。
| 番号 | 定数 | 目標 |
|---|---|---|
| 0 | STEP_NONE |
未開始 |
| 1 | STEP_1_USE_PAPER |
紙の使用待ち |
| 2 | STEP_2_READ_BOOK |
ルールブックの確認待ち |
| 3 | STEP_3_ENTER_S1 |
S1への移動待ち |
| 4 | STEP_4_GS_GIVE |
/gs give 実行待ち |
| 5 | STEP_5_SPAWN |
/spawn 実行待ち |
| 6 | STEP_6_GET_LOG |
原木入手待ち |
| 7 | STEP_7_CRAFT_WORKBENCH |
作業台クラフト(達成時にパン64個ボーナス) |
| 8 | STEP_8_CRAFT_STICK |
棒クラフト |
| 9 | STEP_9_CRAFT_WOOD_PICKAXE |
木のツルハシ |
| 10 | STEP_10_GET_COBBLESTONE |
丸石入手 |
| 11 | STEP_11_CRAFT_STONE_PICKAXE |
石のツルハシ |
| 12 | STEP_12_CRAFT_STONE_SWORD |
石の剣 |
| 13 | STEP_13_CRAFT_FURNACE |
かまど |
| 14 | STEP_14_GET_IRON_ORE |
鉄鉱石入手 |
| 15 | STEP_15_GET_IRON_INGOT |
鉄インゴット入手(かまど抽出) |
| 16 | STEP_16_CRAFT_IRON_PICKAXE |
鉄のツルハシ |
| 17 | STEP_17_HELMET |
鉄ヘルメット |
| 18 | STEP_17_CHESTPLATE |
鉄チェストプレート |
| 19 | STEP_17_LEGGINGS |
鉄レギンス |
| 20 | STEP_17_BOOTS |
鉄ブーツ(ここで「鉄装備一式完了」) |
| 21 | STEP_18_CRAFT_SHIELD |
盾 |
| 22 | STEP_19_GET_DIAMOND |
ダイヤモンド入手 |
| 23 | STEP_20_CRAFT_DIAMOND_PICKAXE |
ダイヤのツルハシ |
| 24 | STEP_21_PASSWORD |
パスワード入力待ち |
| 999 | STEP_COMPLETED |
完了 |
ステップ番号と内部定数のズレ
内部定数名 STEP_17_*(4種)や STEP_18_*〜STEP_21_* の名前は 元設計時の論理ステップ番号 をそのまま残しているため、実際の整数値(17〜24)とはズレています。userdata.yml の値は 上表の整数値 で判定されます。
データのバックアップ
userdata.yml はプレイヤーごとの進行状況のみを保持します。誤って削除すると、進行中のプレイヤーは「未開始」状態となります(初回参加判定 hasPlayedBefore() は Minecraft 側の参加履歴を見るため、再度自動開始はしません)。バックアップを推奨します。
管理コマンド¶
| コマンド | 権限 | 説明 |
|---|---|---|
/tutorial open |
全員 | 配布された紙の代わりに使用。最初のステップならルールブックを配布、それ以外は現在の目標を再表示 |
/tutorial paper |
tutorial.admin(op) |
「チュートリアル開始」の紙を再発行(OP の再配布用) |
/tutorial password <pass> |
全員 | 最終ステップでパスワードを照合(正解で完了、エメラルド10付与) |
/tutorial skip [プレイヤー名] |
tutorial.admin(op) |
対象プレイヤーのステップを 1段階だけ 進める(報酬なし)。プレイヤー名省略時は自分が対象 |
/tutorial skip の挙動
skipStep は現在ステップから内部マップで定義された 次のステップへ 1 段階のみ進めます(一気に完了させる機能はありません)。報酬・ボーナス(エメラルド/パン64個)は付与されず、対象プレイヤーには [スキップ] 管理コマンドによりステップをスキップしました。 のメッセージと、新しい目標が表示されます。鉄装備一式のように内部ステップが連続している区間では、複数回実行が必要です。
TAB補完
/tutorial のサブコマンド補完は、第1引数で open / paper / password を返し、OPの場合のみ skip が補完候補に追加 されます。skip の第2引数(プレイヤー名)はオンラインプレイヤー名のデフォルト補完が動作します。
権限ノード¶
| 権限 | 既定 | 用途 |
|---|---|---|
tutorial.admin |
op | /tutorial paper(紙の再配布)と /tutorial skip [プレイヤー名](ステップ強制進行)に必要 |
| サブコマンド | 必要権限 |
|---|---|
/tutorial open |
不要(全プレイヤー) |
/tutorial password <pass> |
不要(全プレイヤー) |
/tutorial paper |
tutorial.admin(既定 op) |
/tutorial skip [プレイヤー名] |
tutorial.admin(既定 op) |
LuckPerms 等で個別付与可能
tutorial.admin は plugin.yml で正規に宣言されているため、LuckPerms 等の権限プラグインで OP 以外にも個別付与できます。open / password はプレイヤー向けの正規操作として権限不要で開放されています。
トラブルシューティング¶
初回ログインしてもチュートリアルが始まらない
自動開始は !player.hasPlayedBefore()(過去ログイン履歴なし)かつ現在ステップが STEP_NONE(0) の両方を満たすときのみ実行されます。何らかの理由で hasPlayedBefore() が true になっている(過去にテスト接続した等)プレイヤーは自動開始しません。手動で開始させたい場合は /tutorial paper で紙を渡し、プレイヤーに右クリックしてもらってください(紙の右クリックは /tutorial open を内部実行します)。
ステップ3(S1到達)で進行が止まる
判定対象のワールド名は ハードコードで S1 です。Multiverse 等で作成した資源ワールドの ワールド名(フォルダ名)が S1 以外 だと、入っても進みません。ワールド名を S1 に揃えるか、ソースを書き換えて再ビルドしてください。
ステップ4(/gs give)で進行が止まる
判定は /gs give で始まるコマンドが実行された ことのみを見ます。/gs give を提供するプラグイン(GlobalStorage 系)が導入されていない場合、コマンド自体が失敗します。プラグインの導入状況を確認してください。
ステップ17(鉄装備一式)が途中で止まる
鉄装備は ヘルメット → チェストプレート → レギンス → ブーツ の順序で判定されます。順序を入れ替えても判定されません。/tutorial skip で手動進行させるか、対象プレイヤーに順番通りに作り直してもらってください。
原木/丸石/鉄/ダイヤを取っても進まない
破壊判定は BlockBreakEvent、拾得判定は EntityPickupItemEvent の両方を見ています。
- 原木:
Material.name().endsWith("_LOG")でマッチ(全種の原木が対象)。 - 丸石:破壊は
STONE(石)、拾得はCOBBLESTONE(丸石)。 - 鉄鉱石:破壊は
IRON_ORE/DEEPSLATE_IRON_ORE、拾得はRAW_IRON/IRON_ORE。 - ダイヤ:破壊は
DIAMOND_ORE/DEEPSLATE_DIAMOND_ORE、拾得はDIAMOND。
シルクタッチ等で別アイテム化していると判定されない場合があります。
鉄インゴットを取り出しても進まない
判定は FurnaceExtractEvent(かまどから取り出し)かつ Material.IRON_INGOT です。ホッパー等で自動回収した場合は FurnaceExtractEvent が発火しないため、進行しません。プレイヤー自身にかまどから手動で取り出してもらってください。
パスワードを変更したい
パスワードは TutorialCommand クラス内の private final String PASSWORD = \"20240526\"; で固定されています。config による変更はできません。変更したい場合はソースを書き換えて再ビルドしてください。
OP プレイヤーに /tutorial skip の補完が出ない
TAB 補完は sender.hasPermission("tutorial.admin") で判定しているため、tutorial.admin 権限を持っていない場合 skip 候補は出ません。OP 権限または LuckPerms 等で tutorial.admin を付与してください。
ステップ完了の報酬(エメラルド)が出ない
報酬はインベントリに余裕がある場合のみ通常通り渡されます。満杯の場合は 足元にドロップ され、対象プレイヤーには「インベントリがいっぱいのため、アイテムを足元に落としました。」と表示されます。チャット履歴を確認してください。