Build / API / Integration
既存の Markdown ガイドを wiki へ再配置したページです。ビルドターゲット、公開 API、WordPress 連携をまとめています。
Build Matrix
RankingPlugin build matrix
このプロジェクトは共通ソース + バージョン別オーバーレイで、以下の 2 系統を同時ビルドする構成です。
- - `paper-1_21_11`
- - Paper API: `1.21.11-R0.1-SNAPSHOT`
- - Java: `21`
- - 出力 JAR: `RankingPlugin-1.21.11.jar`
- - `paper-26_1`
- - Paper API: `26.1.1.build.+`
- - Java: `25`
- - 出力 JAR: `RankingPlugin-26.1plus.jar`
ビルド
./gradlew buildAll
出力先:
- - `paper-1_21_11/build/libs/RankingPlugin-1.21.11.jar`
- - `paper-26_1/build/libs/RankingPlugin-26.1plus.jar`
分割した互換処理
共通コードから参照する内部互換処理は、各ターゲットに応じて以下へ分割しています。
- - `paper-1_21_11/src/main/java/com/example/rankingplugin/compat/ServerRuntimeCompat.java`
- - `paper-26_1/src/main/java/com/example/rankingplugin/compat/ServerRuntimeCompat.java`
現在は次の差分を分離しています。
- - TPS / MSPT 取得のフォールバック順
- - 自動化/FakePlayer 判定の内部クラス名探索
必要になれば、この方式で 26.1 専用の追加修正をさらに増やせます。
Plugin API Guide
RankingPlugin 連携ガイド
このプラグインは、外部プラグインから **ServicesManager API** と **Bukkit Event** の2本立てで連携できます。
1. plugin.yml
name: YourAddon
main: your.package.YourAddon
version: 1.0.0
api-version: 1.21
softdepend: [RankingPlugin]
`depend` でも動きますが、起動順の都合で止まりたくないなら `softdepend` が扱いやすいです。
2. まず持っておくと便利なクラス
外部連携プラグインでは、最低でも次の3クラス構成にしておくと拡張しやすいです。
- - `RankingBridge`
- - `RankingPluginApi` の取得と null 安全化をまとめる
- - `RankingEventListener`
- - スコア変動、ビンゴ達成、ボス出現イベントを受ける
- - `YourFeatureService`
- - 実際の報酬、GUI、Discord通知などを行う本体
この分け方にすると、将来 API が増えても差し替えが楽です。
3. APIの取得
import com.example.rankingplugin.api.RankingPluginApi;
import org.bukkit.Bukkit;
RankingPluginApi api = Bukkit.getServicesManager().load(RankingPluginApi.class);
if (api == null) {
getLogger().warning("RankingPlugin API が見つかりませんでした");
return;
}
long score = api.getScore("mizugorou_n");
long after = api.addScore("mizugorou_n", 1000);
long money = api.getCurrency("mizugorou_n");
主なAPI
- - `getServerId()`
- - `getScore(playerName)`
- - `addScore(playerName, delta)`
- - `setScore(playerName, score)`
- - `getRank(playerName)`
- - `getTopScores(limit)`
- - `getMonthlyTop(YearMonth, limit)`
- - `getCurrency(playerName)`
- - `addCurrency(playerName, amount)`
- - `setCurrency(playerName, amount)`
- - `isOnlineHere(playerName)`
- - `isOnlineElsewhere(playerName)`
- - `getOnlineServers(playerName)`
- - `getJackpotPool()`
- - `getMiniJackpotPool()`
4. 追加されたイベント通知
4-1. スコア変動通知
import com.example.rankingplugin.api.events.RankingScoreChangeEvent;
import org.bukkit.event.EventHandler;
import org.bukkit.event.Listener;
public class RankingEventListener implements Listener {
@EventHandler
public void onScore(RankingScoreChangeEvent e) {
if (e.getDelta() <= 0) return;
// 例: 一定値を超えたら独自UI更新
}
}
取れる値:
- - `getServerId()`
- - `getPlayerName()`
- - `getOldScore()`
- - `getNewScore()`
- - `getDelta()`
4-2. ビンゴ達成通知
import com.example.rankingplugin.api.events.RankingBingoAchievedEvent;
@EventHandler
public void onBingo(RankingBingoAchievedEvent e) {
// boardType は "3x3" or "5x5"
// gainedLines は今回増えたライン数
}
取れる値:
- - `getServerId()`
- - `getPlayerId()`
- - `getPlayerName()`
- - `getBoardType()`
- - `getLinesBefore()`
- - `getLinesAfter()`
- - `getGainedLines()`
- - `getTriggeredNumber()`
4-3. ボス出現通知
import com.example.rankingplugin.api.events.RankingBossSpawnEvent;
@EventHandler
public void onBoss(RankingBossSpawnEvent e) {
getLogger().info(e.getDisplayName() + " Lv" + e.getLevel() + " spawned at " + e.getWorldName());
}
取れる値:
- - `getServerId()`
- - `getBossType()`
- - `getDisplayName()`
- - `getLevel()`
- - `getWorldName()`
- - `getX()/getY()/getZ()`
現在は主に次のボスで通知します。
- - `GIANT_BOSS`
- - `AWAKENED_WARDEN`
- - `AWAKENED_WITHER`
- - `ULTIMATE_VEX`
5. 自分のプラグイン側で用意すると楽な薄いラッパー例
public final class RankingBridge {
private final JavaPlugin plugin;
private RankingPluginApi api;
public RankingBridge(JavaPlugin plugin) {
this.plugin = plugin;
}
public void reload() {
this.api = Bukkit.getServicesManager().load(RankingPluginApi.class);
}
public boolean isAvailable() {
return api != null;
}
public long addScore(String playerName, long delta) {
return api != null ? api.addScore(playerName, delta) : 0L;
}
}
この形にしておくと、将来 RankingPlugin が無効でも自分のプラグインが落ちにくいです。
6. 連携時のおすすめ方針
- - Bukkitイベントでは **重いDB処理を直接しない**
- - `softdepend` を使うなら、APIが null の場合を必ず許容する
- - スコア加算は毎tickより、**ある程度まとめて**呼ぶ方が負荷が安定する
- - ボス通知を使うプラグインでは、座標付きメッセージ、地図マーカー、Discord通知などに分離すると保守しやすい
7. 今後増やすとさらに便利なもの
今後このAPIを広げるなら、次のようなイベントも相性が良いです。
- - `RankingBossDefeatedEvent`
- - `RankingFeverStartedEvent`
- - `RankingSeasonChangedEvent`
- - `RankingMiniQuestStartedEvent`
必要になったら、この方針のまま追加しやすい構造になっています。
WordPress Status Guide
WordPress 連携ガイド
1. Minecraft 側
`config.yml` の `external_status` を使います。
external_status:
enabled: true
endpoint_url: "https://YOUR_WORDPRESS_DOMAIN/wp-json/mc-status/v1/heartbeat"
token: "YOUR_SHARED_SECRET"
interval_seconds: 15
immediate_on_joinquit: true
include_player_list: true
include_player_stats: true
include_server_icon: true
player_list_limit: 20
`server-id` と `server-name` も設定してください。
2. WordPress 側
1. `mc-status-bridge.php` を `wp-content/plugins/mc-status-bridge/` に置く
2. WordPress のプラグイン画面で **MC Status Bridge** を有効化
3. WordPress 管理画面 `設定 > MC Status Bridge` で token を設定
4. 固定ページにショートコードを置く
[mc_server_status]
特定のサーバーだけなら:
[mc_server_status server_id="Kure"]
3. 表示される内容
- - サーバーアイコン (`server-icon.png`)
- - オンライン / オフライン
- - 現在人数 / Max人数
- - 参加プレイヤー名
- - 各プレイヤーの現在スコアとランク
4. オフライン判定
Minecraft サーバーからの heartbeat が一定時間来なくなると、WordPress 側で自動的に OFFLINE 表示になります。
Wiki Coverage Update
この wiki では通常の src/main/java だけでなく、ビルド別の互換実装 paper-1_21_11 / paper-26_1 も掲載対象に拡張しています。
compat.ServerRuntimeCompatdimension.compat.ResourceWorldCompatfantasy.compat.FantasySpawnCompat
そのため、現在の掲載数は 273 logical classes / 73 packages です。物理的な Java ソースファイル数としては、ビルド別重複を含めてさらに多くなります。