# エンダーマイン
*Spigot & Paper のクロスサーバーインベントリ / エンダーチェスト / Vault マネー同期ツール*
---
## 1. 何をするのですか?
エンダーマインは各プレイヤーの…を保存します。
* メインインベントリ(全36スロット)
* 鎧の内容
* エンダーチェスト(任意のサイズ)
* 金庫残高(エコノミー)
…MongoDBに**リアルタイム**で保存し、プレイヤーが
* サーバーに参加する
* 世界を変える
* サーバー変更 (Bungee / Velocity)
* または定期的な自動保存タイマーが作動したとき。
これにより、ネットワークのすべてのサーバーで単一の共有状態が維持されます。これは、異なるマイナー ビルド (例: *main* = 1.12.4、*resource* = 1.12.6) または完全に異なる jar フレーバー (Spigot、Paper、Purpur など) を実行している場合でも同じです。
このプラグインは NMS ではなく純粋な Bukkit API を使用するため、1.8 から 1.21 以降で動作します。
---
## 2. 主な特徴
| 特集 | 詳細 |
|---------|----------|
| インベントリ同期 | *インベントリ* + *アーマー* を別々に保存します。 |
| エンダーチェスト同期 | サイズセーフ: 別のプラグインがチェストの容量を増やすと、ロード時に配列がトリミング/拡張されます。 |
| Vault のお金の同期 | Vault 経由で読み取り/書き込みます。Vault がない場合、この機能は自動的に無効になります。 |
| 自動保存 | 設定の `autosave-ticks` (デフォルト **600 t = 30 秒**)。 |
| データ損失ゼロ | 初回実行時にはドキュメントが存在しません → プラグインはバニラ プレイヤーデータをそのまま残します → 最初の保存時に現在の状態を Mongo にコピーします。 |
| Mongo スキーマ | `{ _id : <uuid>, inv : "<b64>", armor : "<b64>", ender : "<b64>", money : 123.45 }` |
| 後方 / 前方 | `spigot-api:1.12.2-R0.1-SNAPSHOT` に対して構築されています。API 呼び出しのみが使用されるため、新しいサーバーまたは古いサーバーで動作します。 |
---
## 3. 要件
* Java 17+ (最新の Paper と同じ)
* MongoDB 3.4+ (ローカルまたはリモート)
* Vault **および** あらゆる経済プラグイン (EssentialsX、CMI、…) – お金の同期が必要な場合のみ
* スピゴット、ペーパー、パープル…1.8~1.21以上
---
## 4. インストール
1. **Vault.jar** (必要な場合) とエコノミー プラグインを `/plugins/` にドロップします。
2. **Endermine-xxx-shaded.jar** を `/plugins/` にドロップします。
3. サーバーを一度起動すると、`plugins/Endermine/config.yml` が作成されます。
4. 必要に応じて Mongo セクションを編集し、再起動/リロードします。
---
## 5. 設定 (`config.yml`)
```yaml
モンゴ:
URI: "mongodb://localhost:27017"
データベース:「Minecraft」
コレクション:「在庫」
autosave-ticks: 600 # 600 tick = 30秒
「」
`autosave-ticks` を 1 以上の任意の値に設定します。
`0` は定期的なタスクを無効にします (参加/終了/ワールド変更の保存のみが実行されます)。
---
## 6. ソースからビルドする
「」
git クローン
https://github.com/YourRepo/Endermine.git
cd エンダーマイン
mvnクリーンパッケージ
# → target/Endermine-<バージョン>-shaded.jar
「」
`maven-shade-plugin` は MongoDB ドライバーをバンドルし、競合を避けるために再配置するので、必要なのは **1 つの jar** だけです。
---
## 7. どのように機能しますか?
1. **シリアル化**
Bukkit の `BukkitObjectOutputStream` は、すべての `ItemStack` 配列を、MongoDB に保存される前に Base64 でエンコードされたバイト ストリームに変換します。
2. **互換性**
サーバーが同じ *メジャー* バージョン (例: 1.12.x) を実行している限り、Bukkit はデータを逆シリアル化できます。マテリアルの名前変更 (1.13 以上) は、必要に応じて API によって自動的にマップされます。
3. **アトミック アップサート**
`replaceOne(filter, document, new ReplaceOptions().upsert(true))` は、ドキュメントが挿入または置換され、重複されないことを保証します。
4. **お金の同期**
参加時に、プラグインは Mongo から `money` を読み取り、それをライブ Vault 残高と比較します。保存された値と一致するように差分が預け入れられたり、引き出されたりするのです。
---
## 8. 安全に関する注意事項
* インストール後の最初の参加では何も上書きされません。Mongo は空なので、変更は行われません。
* 最初のセーブはプレイヤーがすでに持っているものをコピーします。
* それでも、大規模なロールアウトを行う前に、必ず `world/playerdata/` と MongoDB データベースのバックアップを保存してください。
---
## 9. コマンドと権限
コマンドも権限もありません。
プラグインは完全に自動化されています。
---
## 10. サポート
GitHub リポジトリでの問題とプル リクエストを歓迎します。
テスト対象:
* 論文-1.12.2、1.20.6、1.21.7
* スピゴット 1.8.8
* プルプル-1.19
* グロウストーン-1.12.2
---
Minecraft ネットワーク全体でシームレスで損失のないインベントリ体験をお楽しみください。