Corpse
概要
プレイヤーが死亡すると、Corpse がドロップ品を引き受けます。インベントリ全体(ホットバー、防具、オフハンド)と経験値が、倒れた場所に立つ死体に移されます。バニラのドロップは消去されます。死体は、誰かが回収するか有効期限が切れるまで残り、サーバーを再起動しても保持されます。
死体はパケットエンティティで、近くにいるプレイヤーごとに個別に描画されます。死亡ポーズで倒れた、被害者のスキンと防具を身につけたプレイヤーモデルにすることも、対応するバックエンドの任意のモデルにすることもできます。すべては 2 つの manifest エントリで制御します。サーバー全体のルールを定める Corpse Global Settings と、死体の見た目を定める Corpse Model Definition です。
機能
- 完全なルート回収 — インベントリ、防具、オフハンド、経験値が死体に入り、バニラのドロップと経験値は消去されます。
- 3 つのルートモード — ページ付きのルートメニュー、回収者のインベントリへの直接転送、またはすべてを地面にドロップ。
- ルート保護 — オーナーのみが回収できる設定、または保護期間が過ぎれば誰でも回収できる設定。
- 有効期限 — 死体は、設定した時間が経過すると消えます。消えない設定も可能です。
- 永続化 — 死体は再起動後も残ります。MySQL が使える場合は MySQL に、そうでなければローカルファイルに保存されます。
- 複数の見た目 — 定義はワールドと優先度で選ばれます。EntityExtension、ModelEngine、BetterModel、BTC Mob NPC、MythicMobs NPC のモデルを使えます。
- プレイヤー表示へのフォールバック — モデル未設定の場合は、スキン、防具、グロー、ポーズ(横たわる、倒れる、瀕死、立ち姿)で表示します。
- クエスト連携 — スポーン、回収、期限切れ時のイベント、ファクト、回収目標、戻る道を示すウェイポイント。
- ワールドフィルター —
allowedWorldsとexcludedWorldsで、特定のワールド(例: ダンジョン)にだけ死体を残せます。 - すべてのテキストを設定可能 — メッセージ、メニューのラベルとマテリアル、ウェイポイントの書式と矢印、コマンドの応答はすべてフィールドです。
- スタッフ用コマンド — サーバー全体の死体の一覧表示と削除。
- Folia 対応 — ワールドの変更は、死体を所有するリージョンで実行されます。
インストール
- TypeWriter の拡張機能 Basic、Quest、Entity を、Web パネルの Extensions タブからインストールします(TypeWriter ドキュメントを参照)。
- GUI 拡張機能をインストールします。ルートメニューはこれを基盤にしています。
- 任意: 死体の見た目に使いたいモデルバックエンドをインストールします(ModelEngine、BetterModel、MythicMobs NPC、BTC Mob NPC)。
- 任意: 死体をデータベースに保存するには、MySQL 拡張機能をインストールします。ない場合、死体は
plugins/Typewriter/corpse/corpses.jsonに保存されます。 - Corpse の JAR を
plugins/Typewriter/extensions/に置き、サーバーを再起動します。
起動時に、コンソールに検出されたモデルバックエンドがログ出力されます。1 つも見つからなくても、死体はルートを保持し、通常のプレイヤーとして描画されます。
はじめに
5 分間残り、1 分間はオーナーだけが保護され、戻る道を示す死体を設定する手順です。
- TypeWriter の Web パネルで manifest ページを開き、Corpse Global Settings エントリを追加します。これがない場合は、組み込みのデフォルト(300 秒、ルートメニュー、誰でも回収可能)が適用されます。
durationを300、onlyOwnerCanLootをオフ、ownerProtectionSecondsを60に設定します。lootModeを選びます。GUIは右クリックでルートメニューを開き、DIRECTはすべてを回収者のインベントリに移し、DROPは地面にドロップします。スニークしながらクリックすると別のモードになります(sneakSwapsLootMode)。- Corpse Model Definition を追加します。通常のプレイヤーモデルにするには
definitionRefを空のままにし、モデルを使う場合はエンティティ定義を選びます。必要に応じてpose、rotationMode、interaction*のヒットボックスを設定します。 - Corpse Waypoint オーディエンスエントリを追加すると、アクションバーに死体までの距離と矢印が表示されます。死体がなくなると消えます。
- 回収をクエストのステップにするには、クエストにリンクした Corpse Recovery Objective を追加します。
- パブリッシュし、テスト用ワールドで一度死亡して、死体を右クリックします。
Corpse が取得するのは、その死亡で本来ドロップされるものだけです。keepInventory ゲームルールがオンの場合、プレイヤーはアイテムを保持し、死体は作られません(通常のバニラの死亡になります)。他のプラグインがプレイヤーのために保持するアイテム(消滅の呪い、ソウルバウンドアイテム)は、死体に複製されません。
特定のワールドに限定する
デフォルトでは、すべてのワールドで死体が残ります。Corpse Global Settings の 2 つのリストで場所を選びます。
allowedWorlds: 死亡時に死体を残すワールド。空の場合はすべてのワールドです。excludedWorlds: 死亡時に死体を決して残さないワールド。常にallowedWorldsより優先されます。
ダンジョンにだけ死体を残し、他では残さない場合:
allowedWorlds:
- dungeon_*
両方のリストに共通するルール:
- 1 ワールドにつき 1 エントリです。
*は任意の文字列、?はちょうど 1 文字に一致します。dungeon_*はダンジョンが各ランのために生成するすべてのワールドに一致し、dgbuildは特定の名前のワールド 1 つを指します。 - 各エントリは、大文字小文字を区別せず、ワールド名(フォルダー名)とそのディメンションキー(例:
minecraft:the_nether)の両方と比較されます。 - 許可されたワールドの外(または除外されたワールド)では、死亡は通常のバニラの動作になります。ドロップと経験値は通常どおりで、死体は残りません。
- これは死体が存在するかどうかだけを決めます。死体の見た目は、同じエントリを受け付ける Corpse Model Definition の
worldsリストで選ばれます。
拒否されたワールドでプレイヤーに見えるもの。 filteredWorldDeath で選びます。両方のリストが空の場合は効果がありません。
VANILLA_DEATH_SCREEN(デフォルト): 通常の Minecraft の死亡です。地面に横たわる体と死亡画面は Corpse ではなく Minecraft クライアントが描画するため、Corpse では取り除けません。INSTANT_RESPAWN: プレイヤーは次のティックにリスポーンし、死亡画面は表示されません。どちらの場合も、アイテムと経験値はバニラと同様に地面に落ちます。
ダンジョンにだけ死体を残し、それ以外では即時リスポーンさせる場合:
allowedWorlds:
- dungeon_*
filteredWorldDeath: INSTANT_RESPAWN
次の場合、死体は残らず、死亡はバニラのままです。
- ワールドが許可されていない、または除外されている。
keepInventoryがオンである。- 他のプラグインが死亡をキャンセルした(トーテムや蘇生プラグイン)。プレイヤーは死んでいません。
- 取得するものがない(アイテムも経験値もない)。
仕組み
どの定義を使うかは死亡時に決まります。worlds リストに死亡したワールドが含まれる Corpse Model Definition エントリ(リストが空なら全ワールド対象)のうち、priority が最も高いものが採用されます。定義が 1 つもない場合は、デフォルトの定義が使われます。寿命は、overrideDuration が 0 より大きければその値、そうでなければグローバルの duration から決まります。オーナー保護のルールは、死体の作成時に確定します。
死体を回収できるのは、死体への右クリックだけです。回収すると死体は空になり、死体は削除されます。誰にも回収されなかった死体は期限切れになり、中のアイテムは失われます。
メニュー
GUI ルートモードでは、死体を右クリックすると、GUI 拡張機能で作られた 54 スロットのメニューが開きます。
- 最初の 5 行(45 スロット)に、死体のアイテムが入っています。アイテムをクリックすると、自分のインベントリに取り込めます(入りきらないアイテムは足元にドロップされます)。死体はアイテムを取るたびに保存されます。最後のアイテムを取ると死体は空になり、経験値が付与されて
on_corpse_lootが発火します。 - 最下段にはボタンが並びます。前のページ(左)、次のページ、すべてを取るボタン、閉じる(右)です。ページ送りのボタンは、複数ページある場合にのみ表示されます。
- すべてを取るチェストのロアには、死体が保持する経験値(と現在のページ)が表示され、経験値を含むすべてを回収者に渡します。
- タイトルとすべてのラベルは、Corpse Global Settings で変更できます(
guiTitle、guiLootAllLabel、guiCloseLabel、guiPreviousPageLabel、guiNextPageLabel、guiExperienceLabel、guiPageLabel)。
DIRECT モードで回収者のインベントリがいっぱいの場合、あふれた分は死体の位置にドロップされ、inventoryFullMessage が表示されます。ドロップされたアイテムは、回収者のために確保しておくこともできます(reserveDroppedItems、reserveDroppedItemsSeconds)。
設定
死体は Web パネルの外に保存されます。
| ストレージ | 使われる場合 | 場所 |
|---|---|---|
| MySQL | MySQL 拡張機能がデータソースを提供している | テーブル corpse_corpses(自動的に作成されます) |
| ローカルファイル | データソースがない、または MySQL の初期化に失敗した | plugins/Typewriter/corpse/corpses.json |
サーバー停止中に有効期限が過ぎた死体は、起動時に on_corpse_expire を発火させずに削除されます。再起動後、死体は固定値の名前と設定で表示されます。プレースホルダーで決まる名前やオプションは、デフォルトに戻ります。 復元された死体はポーズ、発光、名前、アニメーションを保持しますが、オーナーのスキンと防具は保持されず、シンプルなモデルで表示されます。読み取れないストレージファイルは、上書きされずに別の場所へ退避されます(.unreadable-<time>)。
コマンド
コマンドは、Web パネルで作成する Corpse Admin Command エントリです。名前と権限はエントリのフィールドで、デフォルト値は以下のとおりです。
| コマンド | 説明 |
|---|---|
/corpses list | ワールドを問わず、サーバー内のすべての死体を、オーナー、位置、ワールド、アイテム数、経験値とともに一覧表示します。 |
/corpses clear | 自分のワールドだけでなく、サーバー内のすべての死体を削除します。on_corpse_expire は発火しません。 |
どちらのコマンドもワールドごとではなく、サーバー全体に作用します。応答とリストの見出しは、エントリの編集可能なフィールドです。
権限
| 権限 | 許可される内容 |
|---|---|
typewriter.corpse.admin | /corpses list と /corpses clear(エントリの permission フィールドのデフォルト値)。 |
エントリ
11 件のエントリー(拡張機能のソースから生成)。
イベント3
- On Corpse ExpireWhen a corpse expires unlooted
- On Corpse LootWhen a corpse is looted
- On Corpse SpawnWhen a corpse spawns
目標1
- Corpse Recovery ObjectiveRecover your corpse
ファクト2
- Corpse CountHow many corpses the player has
- Has CorpseWhether the player has a corpse waiting
オーディエンス2
- Corpse Owner AudiencePlayers who have a corpse waiting
- Corpse WaypointPoints players back to their corpse
コマンド1
- Corpse Admin CommandAdmin command for corpses
マニフェスト2
- Corpse DefinitionCorpse Model Definition
- Corpse SettingsCorpse Global Settings
トラブルシューティング
死体を右クリックしても何も起きない。 死体は、interactionWidth × interactionHeight ブロックの透明なヒットボックスを通じてクリックできます。デフォルトは 1.0 です。大きなモデルの場合は大きくしてください。Corpse Global Settings で debugInteractions をオンにすると、すべてのクリックがコンソールにログ出力されます。確認が済んだらオフに戻してください。また、onlyOwnerCanLoot と ownerProtectionSeconds も確認してください。他のプレイヤーには cannotLootMessage が表示されます。
死体がモデルではなく、通常のプレイヤーになる。 definitionRef が空か、解決できませんでした(コンソールに Failed to resolve entity definition と表示されます)。バックエンドの拡張機能がインストールされていることを確認してください。起動時のログに、検出されたバックエンドが一覧表示されます。
ルートメニューが開かない。 メニューには GUI 拡張機能が必要です。また、lootMode と、スニークしていないことも確認してください。sneakSwapsLootMode がオンの場合、スニーク中はもう一方のモードが使われます。
死亡後に死体がない。 次の順に確認してください。ワールドが allowedWorlds で許可され、excludedWorlds に含まれていない(フォルダー名とディメンションキーで比較)。そのワールドで keepInventory ゲームルールがオフである。他のプラグインが死亡をキャンセルしていない。プレイヤーが少なくとも 1 つのアイテムまたは経験値を持っていた。
遠くからクリックしても何も起きない。 クリックが有効なのは、死体から interactionReach ブロック以内の場合だけです(デフォルトは 6、0 = 制限なし)。interactionCooldownMillis 内の連続クリックは 1 回の操作として無視されます。
再起動後に死体が消える。 コンソールで Restored n corpse(s) from storage を確認してください。サーバー停止中に死体の有効期限が切れた場合、その死体は削除されます。MySQL の初期化に失敗した場合、Corpse はログに警告を出してローカルファイルにフォールバックします。
名前のプレースホルダーが動作しない。 displayName ではオーナー名に {player} を使います。respawnMessage では <x>、<y>、<z>、<world> を、guiTitle では <player> を使います。 他のテキストのプレースホルダーは MiniMessage の前に埋め込まれ、プレイヤーの名前はエスケープされるため、クリック可能なタグになることはありません。
関連する拡張機能
- GUI — ルートメニューを提供します。
- BetterModel と MythicMobs NPC — 死体用のモデルバックエンド。
- MySQL — 死体のデータベース保存。