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

Lavender (RISE): 自作の 1.8.x MC チートクライアント

// created

Lavender は 1.8.x の Minecraft チートクライアントで、コードネームは RISE、昔からずっと作りたかったものだ。数年寝かせていたのを引っ張り出して再公開した。今はアーカイブ済みのプロジェクトで、もうメンテナンスはしていない。1.8 は当時 PvP サーバーと Hypixel が最も盛り上がっていたバージョンで、この古いエンジンの上で、頭の中にあった小技を一つずつ形にしたかった。チートクライアントは界隈で散々作り尽くされているが、いざ一から自作するとなると思っていたよりずっと面倒だった。

Lavender

Module、Component、Command はどれも手動で new して register するようなことはしない。起動時にリフレクションでパッケージをスキャンし、基底クラスを継承したものは全部自動でマネージャに収まる。新機能を書くときはクラスを書くだけでよく、後から登録処理を足しに戻る必要はない。当時は単に面倒だっただけだが、今振り返ると、この自動発見の仕組みがむしろ一番気に入っている点だ。

ベースは MCP でデコンパイルした net.minecraft.* に直接手を入れている。マルチバージョン対応として ViaMCP を組み込んでいて、1.8 クライアントでもより高いバージョンのサーバーに接続できる。イベントは自作の EventBus を通し、レンダリング・キー入力・ネットワークパケットはすべてこれで分配している。module/impl/ の下は全部実際のクラスだ: Combat には KillAura、Velocity、Criticals、Movement には Flight、Speed、Scaffold、Render には ESP、Tracers、HUD がずらり、Exploit には Crasher、Disabler、PingSpoof といった定番の手口を詰め込んでいる。GUI はテーマ付きの自作 ClickGUI で、設定は latest.json に保存し、クライアントを閉じるときに自動で書き戻す。

一番面倒なのはビルドだ。リポジトリには Gradle/Maven スクリプトがなく、当時は IDEA で手動で設定していた: src/java をソースルートに指定し、Lombok、ViaMCP、1.8 のライブラリと assets は全部自分で放り込み、natives のパスも -Djava.library.path で手動指定する必要がある。エントリポイントは Start.java で起動引数を手で組み立てている(--version Lavender --assetIndex 1.8 --userProperties {} のあの一連だ)。再現するにはそれなりの根気がいる。ビルドスクリプトは補完せず、当時の手作業のままの状態で残してある。

バージョンは 1.0 で止まったきり動かしていない。今はアーカイブしてメンテナンスもせず、AGPL-3.0 の下で公開している。放出したのは、当時一緒にいじっていた数人への記念みたいなものだ。