
CoreProtect — Minecraft Java Edition 1.16 - 1.21.11+
依存関係: · ローダー:Bukkit, Spigot, Paper, Purpur, Folia · Minecraft バージョン:1.16 - 1.21.11+ · Mod バージョン:23.2 マルチプレイヤーの Minecraft…
依存関係: · ローダー:Bukkit, Spigot, Paper, Purpur, Folia · Minecraft バージョン:1.16 - 1.21.11+ · Mod バージョン:23.2 マルチプレイヤーの Minecraft サーバーでは、マップへの無断変更やゲーム内の貴重品の盗難を防ぐために、プレイヤーの行動を詳細に監査する必要があります。サーバーのバニラのコアは、地形編集の履歴やコンテナ内のアイテムの移動を記録しな
依存関係:
· ローダー:Bukkit, Spigot, Paper, Purpur, Folia
· Minecraft バージョン:1.16 - 1.21.11+
· Mod バージョン:23.2
マルチプレイヤーの Minecraft サーバーでは、マップへの無断変更やゲーム内の貴重品の盗難を防ぐために、プレイヤーの行動を詳細に監査する必要があります。サーバーのバニラのコアは、地形編集の履歴やコンテナ内のアイテムの移動を記録しないため、管理者は違反者を特定したり、バックアップからマップファイルを完全に復元することなく破壊を取り消したりすることができません。サーバープラグインの CoreProtect は、ワールドを変更するすべてのイベントを記録し、ユーザー行動の詳細なインデックスを作成し、複雑なパラメトリッククエリに基づいて空間のピンポイントなロールバック(rollbacks)を実行します。このツールは非同期モードで動作し、サーバーのメインスレッドを遅延から保護するためにトランザクションをキューに書き込みます。
1. データベースと非同期ロギングアーキテクチャ
CoreProtect プラグインは、Bukkit/Paper API のイベントハンドラーを使用してサーバーイベントを傍受します。毎秒数千件のレコードを処理する際にサーバーのメインスレッド(Server Thread)がブロックされるのを防ぐため、プラグインは非同期ロギングモデルを使用します。イベント(ブロックの破壊、チェストのインベントリの変更、コマンドの使用)は、まず内部の動的バッファ DataQueue に置かれます。バックグラウンドのコンシューマースレッド(Consumer Thread)がバッファからトランザクションを読み取り、それらをバッチトランザクション(Batch processing)でデータベースに書き込むことで、ストレージへの負荷を軽減します。
プラグインは、2 種類のデータベース管理システム(DBMS)での動作をサポートしています:
1. SQLite(デフォルトでローカル):すべての情報は、プラグインのディレクトリ内の database.db ファイルに書き込まれます。SQLite はサードパーティのサービスのインストールを必要としないため、トランザクションレベルの低い小規模なローカルサーバーに便利です。
2. MySQL / MariaDB(外部サーバー):別のデータベースサーバーへのネットワーク接続を使用します。このソリューションは、オンライン人数が多い(50 人以上の)大規模サーバーやサーバーネットワークにおける業界標準です。MySQL はインデックスクエリの高い実行速度を保証し、ローカルストレージの断片化を排除します。
データベースのテーブルスキーマ
CoreProtect は、データ保存を最適化するために一連のリレーショナルテーブルを作成します。各レコードに対して完全なテキスト文字列を保存する代わりに、プラグインは一意のプレイヤー名、ワールド、ブロックタイプ、エンティティのために辞書テーブルを使用します。
テーブル | 用途 | 主なフィールド |
|---|---|---|
| ユーザー名の辞書 |
|
| ゲームワールドの辞書 |
|
| ワールド内のブロック変更の記録 |
|
| コンテナ内のアイテムのトランザクション |
|
| 認証セッションのログ(ログイン/ログアウト) |
|
| テキスト看板の内容 |
|
| 生物の死亡とスポーンの記録 |
|
すべての座標 x、y、z は、指定した半径内でのトランザクションの即時検索を保証するために、ワールド識別子 wid とともにインデックス化されます。
2. コマンド構文とフィルタリングパラメータ
CoreProtect のデータベースとのやり取りは、テキストコマンドを使用して行われます。主な操作は、検査、検索、ロールバック、およびロールバックの取り消しです。
インスペクターモード /co inspect または /co i)
このコマンドはクライアントをローカル監査モードに切り替えます。有効化後、プレイヤーはログを取得するためにワールドと対話できます:
· 既存のブロックを左クリックすると、それを設置した人のニックネーム、日付、時刻、座標がチャットに表示されます。
· 空いた面(またはブロック)を右クリックすると、以前その空間を占めていた、または撤去されたブロックの履歴が表示されます。
· コンテナ(チェスト、かまど、樽、シュルカー)を右クリックすると、アイテムの移動ログが表示されます。
クエリのフィルタリングパラメータ /co rollback、 /co restore、 /co lookup)
データの選択のために、プラグインは パラメータ:値 という形式の組み合わせパラメータを使用します。パラメータはスペースで区切ります:
1. ユーザー u:<名前>):確認対象のプレイヤーを指定します。カンマで区切って複数の名前を指定できます(例:u:Stevie,Alex)。自然イベントのロールバックには技術的な識別子を使用します:
· u:#fire – 火の延焼。
· u:#lava – 溶岩の流出。
· u:#water – 水の流出。
· u:#creeper – CREEPER の爆発。
· u:#tnt – TNT の爆発。
· u:#enderman – ENDERMAN によるブロックの移動。
2. 時間 t:<値>):分析のための時間間隔。次の計量単位をサポートします:s(秒)、m(分)、h(時間)、d(日)、w(週)、y(年)。単位を組み合わせることが許可されています。例:t:2w4d6h(2 週間、4 日、6 時間)。
3. 半径 r:<数値>):コマンドの実行者を中心とした、ブロック単位での検索ゾーンの半径。特殊な値もサポートします:
· r:#global – データベース全体での検索(読み込まれたすべてのチャンク内)。
· r:#world – 現在のゲームワールド内での検索。
· r:#chunk – プレイヤーの現在のチャンク内での検索。
· r:#selection(または r:#we)– 検索を現在の WorldEdit の選択範囲の境界に制限します。
4. アクション a:<タイプ>):操作の種類でレコードをフィルタリングします:
· a:block – ブロックの設置と破壊。
· a:+block – ブロックの設置のみ。
· a:-block – ブロックの破壊のみ。
· a:container – インベントリのトランザクション。
· a:+container – コンテナへのアイテムの追加。
· a:-container – コンテナからのアイテムの取り出し。
· a:kill – 動物やモンスターの死亡。
· a:spawn – エンティティのスポーン。
· a:chat – チャットのメッセージ。
· a:command – 入力されたコマンド。
· a:session – プレイヤーの認証。
5. ブロック b:<素材>):検索を指定した素材に制限します(例:b:stone,oak_planks)。
6. 除外 e:<素材>):素材を処理から除外します(例:e:tnt)。
ロールバックのプレビューと操作の取り消し
大規模なロールバック中のミスを最小限に抑えるため、CoreProtect は視覚的なシミュレーションシステムをサポートしています:
1. #preview フラグを付けてロールバックコマンドを実行しても(例:/co rollback u:Griefer t:2h r:20 #preview)、マップファイルは変更されません。代わりに、クライアントは現在のレンダリングセッションでブロック変更のパケットを受信します。管理者は「ロールバック後」の状態のワールドを見ますが、他のプレイヤーにとってはブロックは変更されないままです。
#preview
/co apply
2. 結果を適用するには、コマンド /co apply を使用します。
3. プレビューを取り消すには、コマンド /co cancel を使用します。
4. すでに実行された物理的なロールバックを取り消すには、コマンド /co undo を使用します。これは座標を /co rollback の実行前の状態に戻します。
3. 設定ファイル config.yml の完全な説明
設定ファイルは、制限、ロギングパラメータ、データベースへの接続を制御します。
一般パラメータのブロック(General Settings)
· verbose: true – ロールバックの実行中に、変更された各座標についての詳細なレポートをコンソールに出力します。false に設定した場合は、変更されたブロックの合計数のみが出力されます。
· check-updates: true – 起動時に、開発者のサーバーにプラグインの新しいバージョンがあるかどうかを確認します。
· api-enabled: true – サードパーティのプラグインが CoreProtect のデータと対話することを許可します。
· default-radius: 10 – コマンドでこのパラメータが指定されていない場合のデフォルトのロールバック半径。
· max-radius: 250 – 1 つのコマンドの最大半径を制限します。値 0 は制限を解除します。
ロギングパラメータのブロック(Logging Settings)
これらのパラメータは、どのイベントをデータベースに記録するかを決定します。不要なログを無効にすると、データベースのサイズを削減するのに役立ちます:
· block-place: true / block-break: true – プレイヤーによる通常のブロックの設置と破壊のロギング。
· natural-break: true – ずれや支持ブロックの破壊によるブロックの落下のロギング(例:松明が付いていたブロックを壊した場合)。
· block-movement: true – 砂、砂利、コンクリートの重力による落下のロギング。
· pistons: true – ピストンによるブロックの移動のロギング。
· block-burn: true – 火によるブロックの消失のロギング。
· block-ignite: true – プレイヤーが火打石と打ち金や火の玉を使ってブロックに点火することのロギング。
· explosions: true – TNT、CREEPER、ネザーでのベッド、エンドクリスタルの爆発のロギング。
· entity-kills: true – 村人、動物、モンスター、防具立ての死亡の記録。
· player-chat: true / player-command: true – チャットメッセージとコンソールコマンドのロギング。
· player-session: true – プレイヤーのサーバーへのログインとログアウトの時刻のロギング。
· container-transactions: true – チェスト、かまど、ホッパー、シュルカー内でのアイテムの移動操作のロギング。
データベースのブロック(Database Settings)
· use-mysql: false – データベースの種類の切り替えスイッチ。true に設定した場合、プラグインは外部の MySQL DBMS に接続します。
· table-prefix: co_ – SQL テーブル名の接頭辞。
· mysql-host: localhost – MySQL データベースサーバーの IP アドレスまたはドメイン名。
· mysql-port: 3306 – 接続用のネットワークポート。
· mysql-database: minecraft – 対象データベースの名前。
· mysql-username: root – データベースのユーザー名。
· mysql-password: password – ユーザーのパスワード。
· mysql-ssl: false – データベースサーバーへの接続の SSL 暗号化を有効にします。
4. プラグイン開発者向けの API
CoreProtect は、CoreProtectAPI クラスを通じて、開発者に自身のデータベースへのアクセスを提供します。これにより、他のプラグイン(例:WorldEdit や保護システム)が自身の変更を記録したり、履歴の自動検索を実行したりできます。
API の初期化
API に接続するには、初期化メソッドを使用します:
import net.coreprotect.CoreProtect; |
API インターフェースの主なメソッド
· boolean logPlacement(String user, Location location, Material type, BlockData blockData) – 指定したユーザーの名前で、ブロックの設置をデータベースに記録します。
· boolean logRemoval(String user, Location location, Material type, BlockData blockData) – ブロックの破壊を記録します。
· boolean logContainerTransaction(String user, Location location, Material type, ItemStack itemStack, boolean isAdded) – コンテナへのアイテムの追加(true)または取り出し(false)の操作を記録します。
· List<String[]> performLookup(int time, List<String> restrictUsers, List<String> excludeUsers, List<Object> restrictBlocks, List<Object> excludeBlocks, List<Integer> restrictActions, int radius, Location location) – 指定したフィルタに従って検索を実行し、結果の配列を返します。
· List<String[]> performRollback(int time, List<String> restrictUsers, List<String> excludeUsers, List<Object> restrictBlocks, List<Object> excludeBlocks, List<Integer> restrictActions, int radius, Location location) – ワールド内の変更の非同期ロールバックを開始します。
· List<String[]> performRestore(int time, List<String> restrictUsers, List<String> excludeUsers, List<Object> restrictBlocks, List<Object> excludeBlocks, List<Integer> restrictActions, int radius, Location location) – 変更の非同期復元を開始します。
· boolean hasPlaced(String user, Block block, int time, int offset) – 指定したプレイヤーが特定の時間内にこのブロックを設置したかどうかを確認します。
· boolean hasRemoved(String user, Block block, int time, int offset) – 指定したプレイヤーがこのブロックを破壊したかどうかを確認します。
5. パフォーマンス、互換性、メンテナンス
オンライン人数の多いサーバーで CoreProtect を使用する際、管理者は最新のサーバーアーキテクチャとの対話の特性を考慮します:
· Folia のサポート:Folia のサーバーコアはリージョン化マルチスレッド(Regionized multithreading)を使用しており、これはワールドの操作中にプラグインに厳格なスレッドセーフティを要求します。CoreProtect は Folia での動作に適応しています:/co rollback と /co restore の操作の実行は、リージョンスケジューラ(Region Scheduler)を通じて行われ、これによりチャンクへのアクセスの競合や、ConcurrentModificationException といった重大なエラーを防ぎます。
· MultiPaper のクラスタリング:MultiPaper タイプのサーバーでは、CoreProtect を単一の外部 MySQL データベースを使用するように設定します。これにより、クラスタの異なるサーバーノード上でプレイヤーの行動履歴を同期するのに役立ちます。
· データベースのクリーンアップ(Purge):ローカルの SQLite データベースは時間の経過とともに断片化して肥大化し、コマンドの実行を遅くします。コマンド /co purge t:30d は 30 日より古いレコードを削除します。データベースのクリーンアップ後、SQLite DBMS は将来の書き込みのために空きページを保持するため、SQLite ファイル database.db のサイズは自動的には縮小されません。ディスク上のファイルを物理的に縮小するには、データベースコンソールを通じて VACUUM コマンドを実行するか、サーバーを停止してサードパーティのユーティリティで圧縮を行う必要があります。MySQL DBMS は未使用のディスク領域をより効率的に解放するため、MySQL を使用するとこの問題は解消されます。
結論
CoreProtect は、Minecraft Java Edition のサーバーにおけるロギングと復元のシステムの標準です。LogBlock(MySQL での動作のみをサポートし、ブロックのロギングに限定される)や Prism(設定構造がより複雑)といった代替手段とは異なり、CoreProtect は SQLite による完全に自己完結した起動、コンテナの内容の詳細な追跡、そして独自のロールバックプレビューシステム #preview を提供します。プラグインの唯一の技術的な制限は、大規模なローカル SQLite データベースのクリーンアップ中にディスクストレージにかかる大きな負荷であり、そのため大規模なプロジェクトには高速な NVMe ディスク上で専用の MySQL DBMS を使用することが推奨されます。このプラグインは、友人同士の小規模なプライベートサーバーにも、数百人のアクティブなプレイヤーがいる大規模なプロジェクトにも適しています。
インストール
通常のインストールは約 5 分で完了します。手順は同じで、ローダーと対応するビルドだけが異なります。
- 1Stop your Minecraft server.
- 2Drop the plugin .jar into the server /plugins folder.
- 3Start the server once so the plugin generates its config files.
- 4Edit /plugins/<name>/config.yml as needed, then run /reload confirm or restart.








