読者です 読者をやめる 読者になる 読者になる

頼りないニモニック

はっきりいって個人の日記レベル

MinecraftのMODを作ってみた

Minecraft Java プログラミング

Minecraftを購入してから半月、Javaの復習も兼ねてMODを制作してみます。ちょうどMinecraft 1.5が公開されたため、これに合わせます。
もちろんMODの制作経験は皆無、最終的な目標は地形を外部形式にエクスポートし、その後何らかの方法でWeb上に公開すること。既に同様のMODが存在しますが外部形式へ保存が目的であり、データ加工とWeb公開はMODの範囲外として考えます。


環境はLinuxディストリビューションLinux Mint 14 nadia 64bit。開発環境はEclipseを用いましたが、コンパイルはMinecraft Forgeに付属するツール群を用いました。
Javaの設定、パス設定などはここでは記述しません。

作業手順

  1. Minecraft Forgeのソースをダウンロードし展開
  2. forgeディレクトリ内の install.sh に実行権限を与えて実行。ここで必要なファイルはダウンロードされ、MCPからデコンパイルまでやってくれる
  3. Linuxの場合は例によって、forge/mcp/jars/bin 直下のファイルを修正します (詳細)
  4. Eclipseからプロジェクトを forge/mcp/eclipse からインポートし、適宜クラスパスを修正する

なお、forge/mcp/src 直下はソースファイル群となりますが必要ならばバックアップしておきましょう。
ModLoaderを利用する場合は forge/mcp/src/minecraft/net/minecraft/src 以下に mod_****.java とクラスファイルを追加します。「mod_」がプレフィクスになっているようで、これ以外にするとModLoaderが認識できないようです。

テストコード

まずは簡単なMODから作ります。これはプレイヤーが移動する度に、プレイヤーの足元のブロックのID/データ番号をチャット欄に流すというもの。

ここで各メソッドがいつ呼び出されるかを時系列順にまとめると、

  1. コンストラクタ。Minecraft起動時に呼び出される
  2. loadメソッドコンストラクタで呼び出された後、メニューが表示されるよりも前に呼び出される
  3. clientConnectメソッド。サーバに接続、すなわちゲームを開始した時に呼び出されるが、描画が始まる前であるためプレイヤーのインスタンス取得できない
  4. onTickInGameメソッド。ゲームが開始された後にTickごとに呼び出される。Tickが始まるのは描画開始後。事前にModLoader.setInGameHookで有効化が必要

このため四番目のonTickInGameメソッドを使ってゲーム開始直後、または随時動作するような処理を書いていきます。

プレイヤーの座標は Minecraftクラスのフィールド posX, posY, posZ で取得できますが、実数値である上にプレイヤーの視線座標となっています。下半身(ブロック)座標はそれぞれの値をintにキャストして (3/16追記) X,Y軸方向に 1だけデクリメントした座標となります。すなわち、プレイヤーの足元のブロックはY軸をさらに1だけデクリメントした座標となります。

実行結果

移動する度に「ブロックID/データ」の形式で出力されます。
ちなみにブロックIDだけでは不十分である理由はこちらを見ればわかりますが、木材や羊毛などは同じブロックIDでも色違いは追加データ(Metadata)で区別しています。

f:id:nanase_t:20130315232526p:plain

そのため、このように種類の違う木材は同じブロックIDでも・・・

f:id:nanase_t:20130315232728p:plain

このように別々の追加データで区別されているのがわかります。

今日はここまで。