Minecraft 1.8.9 クライアントを自作した
これはゼロから組み上げた Minecraft 1.8.9 クライアントだ。1.8.9 を選んだのは、昔ながらの PvP が根強く人気で、構造が明快で、資料も多いから。ベースは MCP 9.18(stable_22)で逆コンパイルしたバニラで、src/net/minecraft はほぼ上流をそのまま貼り付け、自作分は全部 src/client と src/dwgx に押し込んでバニラと隔離してある。壊しても気軽にロールバックできるようにするためだ。
ビルドはあえて泥臭くした。Java 8 を素の javac で手動コンパイル、Gradle も Maven も使わず、いくつかの PowerShell スクリプトでコンパイルと起動を支え、出力は out\classes へ、依存は lib/* にぶら下げる。どこにもブラックボックスはなく、いじりたいステップがあればその蓋を開ける。ここで一度ハマった落とし穴がある。--assets と --assetsDir を同時に渡してはいけない。さもないと MultipleArgumentsForOption をそのまま投げてくる。先に公式ランチャーでバニラを一度走らせて assets を落としておけばきれいになる。
自作した層は機能が一通り揃っている。戦闘は KillAura、AutoClicker、Velocity、移動は Fly、Speed、Eagle、NoFall、NoSlow、ワールドは AntiVoid、AutoTool、FastPlace、Stealer。すべて自作のモジュールフレームワークにぶら下げ、イベント配信は優先度付きの同期バスを通し、走査中に書き換えられて崩れないようスナップショット配信を使っている。さらに読み取り専用のランタイムブリッジ(GameBridge、PlayerBridge、WorldBridge)を一枚かぶせ、データの読み取りは全部ここを通すことで、機能層がゲーム状態を勝手に触らないようにしている。
UI に一番力を入れた。ClickGUI と HUD はどちらも NanoVG のベクター描画で、土台は LWJGL 2 から 3.3.3 へ移行した。HUD エディタはドラッグ、スナップ、アンカー、ドッキングに対応し、スライダー、ドロップダウン、トグル、カラーピッカーはすべてコンポーネントに切り出した。設定は JSON を profile 単位で保存し、アトミック書き込み+バックアップ付き。アカウントは Microsoft OAuth + Xbox Live を通し、ついでに en/zh/ja の三言語対応も入れた。
書いているうちにゲーム内 IRC まで詰め込んだ。チャンネル、フレンド、DM、フィードがあり、ローカルは SQLite でキャッシュ、バックエンドは独立した Netty + MariaDB(IRCServer/ の部分は JDK 21 が要る)。メインメニューにも自己満足を少々。アニメーション背景、Flappy Bird、Kirby、Nyan Cat、倉庫番、それに GLSL シェーダー背景と Bing 壁紙の取得。
今もぼちぼち進めていて、主に LWJGL 2→3 移行の仕上げ、モジュールのリファクタ、UI の書き直しをやっている。ビルドスクリプトは Windows 専用でパスがベタ書き、自分で使う分には問題ないが、他人が動かしたいならまずパスを直すこと。今のところ license は付けていないので、デフォルトで全権利を保留する。