dwgx@blog:~$dwgx
> cd ../posts

jar 一つで十個のプラグイン分の仕事:DarkPixel

// created

DarkPixel は Paper 1.21.4 サーバー向けに書いた統合プラグインで、ロビー、ランク、アンチチート、管理ツールといった、普段ならそれぞれ別々に入れる機能を一つの jar にまとめている。こうすればバージョンを上げるたびにどの前提プラグインが先に壊れるか賭けなくて済むし、設定もあちこちに散らばらず、機能同士でデータを直接共有できる。

技術スタックに凝ったところはない。Java 21、Paper API 1.21.4-R0.1-SNAPSHOT、Gradle 8.8。前提は ProtocolLib、NBTAPI、PacketEvents で、パケット送信と NBT はこれらを避けて通れない。Gson と NanoHTTPD はそのまま jar に shade して入れている。

機能はすべて一つの Global にぶら下がって互いにデータをやり取りする。ランクシステムには RankServer を内蔵していて、NanoHTTPD で HTTP を立ててインスタンス間の同期を行う。ポートが埋まっていたら自動的に client に降格して他のインスタンスへ繋ぎに行くので、起動できずにそのままクラッシュすることはない。/aichat は DeepSeek に接続し、ホワイトリストとレート制限を付けた。/dashboard はチェストメニュー、アンチチート DarkAC は首振りチートを専門に検出し、/darkban/freeze は管理コマンド一式、/reloadconfig は非同期ホットリロードで、設定を変えるのに再起動が要らない。

主な落とし穴はパケット周りだ。この手の機能はバージョンに特に敏感で、Paper が上がるたびに戻って一通り確認する必要がある。データベースは一つ用心してあって、MySQL のパスワードは環境変数 DARKPIXEL_DB_PASSWORD から読む。いつか手が滑ってコミットしてしまわないようにだ。CI は GitHub Actions、Ubuntu + Temurin JDK 21 で、push すると自動で jar が出る。

現在は 1.0-SNAPSHOT で動いていて、挙げた機能はどれも使えるし、まだぼちぼち機能を足している。コードは github.com/dwgx/darkpixel にあり、MIT ライセンス。サーバーを立てたい人はそのまま持っていって改造してくれていい。