ITickHandler#tickStart, tickEndの引数の調査

Minecraft 1.4.7, Minecraft Forge #534。

ゲーム内でTickごとに実行される処理を記述するのに使われるITickHandlerと呼ばれるインターフェースが存在する。その中で、実際にTickの始まり/終わりのそれぞれで呼ばれるメソッドがtickStart, tickEndだが、それぞれ定義は次のようになっている。

    /**
     * Called at the "start" phase of a tick
     * 
     * Multiple ticks may fire simultaneously- you will only be called once with all the firing ticks
     * 
     * @param type
     * @param tickData
     */
    public void tickStart(EnumSet<TickType> type, Object... tickData);
    
    /**
     * Called at the "end" phase of a tick
     * 
     * Multiple ticks may fire simultaneously- you will only be called once with all the firing ticks
     * 
     * @param type
     * @param tickData
     */
    public void tickEnd(EnumSet<TickType> type, Object... tickData);

typeはともかく、tickDataはこれだけでは何が渡されるのかも分からない。そこで、呼び出し元を探してこれをまとめてみることにした。

以下、基本的なITickHandlerの理解はできているものとし、TickTypeによって場合分けをする。

基本的に、tickStart/tickEndはcpw.mods.fml.common.FMLCommonHandlerから呼び出される。そして、 on(Pre|Post)\w+Tick()メソッドで実際に値を代入して実行しているため、これを見ることで調査が可能。

TickType.WORLD

FMLCommonHandler#on(Pre|Post)WorldTickメソッドが該当。実際の引数はWorldのインスタンス

TickType.WORLDLOAD

FMLCommonHandler#onWorldLoadTickメソッドが該当。こちらはワールドロード時に呼び出され、読み込み可能なWorld全てについて一度ずつ呼び出される。引数はTickType.WORLDと同じく該当するWorldのインスタンス

このTickTypeの時は、tickEndは呼び出されない。

TickType.SERVER

FMLCommonHandler#on(Pre|Post)ServerTickメソッドが該当。引数はなし。

TickType.CLIENT

FMLCommonHandler#on(Pre|Post)ClientTickメソッドが該当。引数はTickType.SERVERと同様になし。

TickType.Render

FMLCommonHandler#onRenderTick(Start|End)メソッドが該当。引数はPartial Render Timeと呼ばれる補正用?の値。一度レンダリング関連で使ったことがあるものの理解はできていない。

TickType.Player

FMLCommonHandler#onPlayer(Pre|Post)Tickメソッドが該当。引数はEntityPlayerインスタンスで、注意点としてはServer/Client両方で呼び出されること。