« Minecraft MOD開発 10 | トップページ | クラス変数とインスタンス変数 »

2014年3月18日 (火)

Minecraft MODで出来る事

「ブロックに○○したときに××するMODを作ることができますか?」という質問に対する一般的な答え。

Block.javaを読んでみる。常に1を返すquantityDroppedというメソッドがある。いつも同じ値を返すのであれば、Minecraft本体はなぜBlock.quantityDroppedを呼び出すのだろうか?

class Blockを継承(extends)したBlockClay.javaではquantityDroppedが呼ばれたときに4を返す。ここで重要なのは、Minecraft本体にとってはclass Blockを継承したものであれば、メソッドの動作が異なっていてもかまわないということだ。

つまり、class Blockを継承したクラスを作り、publicなメソッドを独自に実装(オーバーライド)すればブロックの動作を変えることができる(可能性がある)。ここで実装するメソッドはclass Blockに元から存在するものでなければならない。Minecraft本体はclass Blockだと思って呼んでいる。新しいメソッドを作っても、それをMinecraft本体が知る手段がない。

質問の○○に当てはまる部分については、「class Blockのpublicなメソッドが呼ばれたときの動作は、MODで変更できる(かもしれない)」というのが答えだ。ブロックが破壊されたときに呼ばれるonBlockDestroyedByPlayer、ドロップするアイテムの数を知るために呼ばれるquantityDropped、ドロップするアイテムのIDを決めるために呼ばれるidDropped、ブロックが右クリックされたときに呼ばれるonBlockActivated等の動作はMODで変更できる。ブロックの固さを得るgetBlockHardnessはブロックが存在するx, y, z座標も引数として呼ばれるので、深さによって固さを変えることもできるだろう。

××の部分については、Javaでできることなら何でもできる。たとえばclass Dateを使って現在の時刻を取得して動作を変えても良い。

MODで書いたコードが呼ばれるもう一つのチャンスは、インターフェースだ。Javaの世界では大文字のIから始まるファイルではインターフェースを定義するのが普通になっている。interface IFuelHandlerにはint getBurnTimeというメソッドがある。アイテムスタックを引数として呼ばれるので、idを調べるなりなんなりして燃焼時間をtick(1/20秒)単位で返せば、かまどでその時間だけ燃える。IFuelHandlerを実装(implements)するクラスはintを返すgetBurnTimeメソッドを持っていれば、動作の内容は自由だ。

各メソッドが呼び出されるタイミングをシーケンス図によって説明する。@Modを付けたクラスはMinecraft ForgeからMODのコアだと認識される。これをclass ModCoreだとする。ゲームの起動時に、ModCore.preInitが呼び出される。ModCoreはアイテムを登録するregisterItem、ブロックを登録するregisterBlock、燃料のハンドラを登録するregisterFuelHandler等を実行する。次にModCore.initが呼び出される。ModCoreはレシピを登録するaddRecipe等を実行する。

ここからゲームが開始され、プレイヤーの行動等によって各メソッドが呼び出される。MODで追加したアイテムをプレイヤーが食べた場合は、registerItemで登録したclass MyItemのonEatenメソッドが呼び出される。アイテムを落とした場合は、MyItem.onDroppedByPlayerが呼び出される。MODで追加したブロックをプレイヤーが破壊した場合は、registerBlockで登録したclass MyBlockのonBlockDestroyedByPlayerが呼び出される。右クリックした場合は、MyBlock.onBlockActivatedが呼び出される。MODで追加したアイテムをかまどへ投入した場合は、MyFuelHandler.getBurnTimeが呼び出され燃え続ける時間が決まる。

この記事では重要な概念であるtickとentityについて説明していない。これらについては私がまだ理解していないので、またの機会に。

« Minecraft MOD開発 10 | トップページ | クラス変数とインスタンス変数 »

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1499066/55421367

この記事へのトラックバック一覧です: Minecraft MODで出来る事:

« Minecraft MOD開発 10 | トップページ | クラス変数とインスタンス変数 »