提供: Minecraft Modding Wiki
2013年7月11日 (木) 22:56時点における218.222.50.13 (トーク)による版 (1.6からのコーディング方法: fix typo)
移動先: 案内検索


1.6からのコーディング方法

※1.6にアップデートされてから頻繁にForgeのバージョンが上がるので、もしかしたら多少の相違があるかもしれません。

1.6.1では多数の変更があったが、MODのエントリポイントとなる@Modアノテーションがついたクラスはあまり変わっていない。

1.6.1のForgeからはPreInitアノテーションや、Initアノテーションなどの使用が非推奨になり、@Mod.EventHandlerを変わりに使う。


具体的な使用例は以下の通り。

package mods.sample;

import cpw.mods.fml.common.*;
import cpw.mods.fml.common.event.*;
import cpw.mods.fml.common.Mod.*;
import cpw.mods.fml.common.network.NetworkMod;

/**
 * Sample Mod クラス.
 * 
 * Modアノテーションをつけるだけで、Modクラスとして認識される。
 * クラス名は自由に決めることができ、他のクラスを継承する必要もない。
 * なお、Modアノテーションの必須項目は modid のみで、その他は外部ファイルから設定することができ、省略することも可能。
 * 
 * また、NetworkMod は不要であれば省略してもよい。
 * 
 */
@Mod(modid = "sample-mod-id", name = "sample-mod-name")
@NetworkMod(clientSideRequired = true, serverSideRequired = false)
public class ModSample {

    /**
     * 指定したIDのModのインスタンス.
     * 
     * フィールド名、アクセス指定子はなんでもよい。不要であれば省略可能。
     * 自身のインスタンスがインジェクションされる。
     */
    @Instance("sample-mod-id")
    protected static ModSample instance;

    /**
     * サーバー、クライアントで異なる処理を行わせる場合に用いるプロキシークラス.
     * 
     * フィールド名、はなんでもよい。不要であれば省略可能。(public以外のアクセス指定子が使えるかは不明)
     * 実行環境にあわせて、どちらかのインスタンスがインジェクションされる。
     */
    @SideProxy(
        clientSide = "mods.sample.ClientProxy",
        serverSide = "mods.sample.ServerProxy")
    public static SampleProxy proxy;

    /**
     * 初期化前処理.
     * 
     * メソッド名はなんでもよい。不要であれば省略可能。
     * 
     * @param event
     *         FMLの初期化前処理イベント
     */
    @EventHandler
    public void preInit(FMLPreInitializationEvent event) {
        // 初期化前処理
        // 設定ロードや GameRegistory への登録を行うタイミング
        // 追加Blockや追加Itemはこのタイミングで登録を行う
    }

    /**
     * 初期化処理.
     * 
     * メソッド名はなんでもよい。不要であれば省略可能。
     * 
     * @param event
     *         FMLの初期化処理イベント
     */
    @EventHandler
    public void init(FMLInitializationEvent event) {
        // 初期化処理
        // Modのセットアップや、他Modとの連携処理を行うタイミング
    }

    // その他のイベント
    // -----------------------------------------------------

    // ---------------------------------
    // client's events
    // ---------------------------------

    // 初期化後処理イベント
    @EventHandler
    public void postInit(FMLPostInitializationEvent event) {
    }

    // 署名問題イベント。PreInitイベントの前に発生
    @EventHandler
    public void fingerprintWarning(FMLFingerprintViolationEvent event) {
    }

    // IMCメッセージイベント。InitEventのあとに発生
    @EventHandler
    public void handleIMC(IMCEvent event) {
    }

    // ---------------------------------
    // Server's events
    // ---------------------------------

    @EventHandler
    public void handleServerAboutToStart(FMLServerAboutToStartEvent event) {
    }

    @EventHandler
    public void handleServerStarting(FMLServerStartingEvent event) {
    }

    @EventHandler
    public void handleServerStarted(FMLServerStartedEvent event) {
    }

    @EventHandler
    public void handleServerStopping(FMLServerStoppingEvent event) {
    }

    @EventHandler
    public void handleServerStopped(FMLServerStoppedEvent event) {
    }

    // その他アノテーション
    // -----------------------------------------------------

    @Metadata
    protected static MetaData metadata;

    @InstanceFactory
    public static ModSample instance() {
        return new ModSample();
    }
}

(イベントの詳細はModインターフェイスの JavaDoc を参照)

基本的に、前処理で設定の読み込み、及び追加するBlock、Itemのインスタンス生成および登録を行い、初期化処理でそれ以外の初期化処理を行う。殆どのModでは、初期化前処理と初期化処理の2つだけで事足りると思われる。

なお、コンストラクターでは、自身の内部変更のみを行い、FMLや他Modへの干渉は行うべきではない。これは、インスタンスが生成されるタイミングでは、他Modのロードや生成が保証されていないためである。そのため、基本的にはコンストラクターは定義せず、デフォルトのコンストラクターが使用されるようにする方が良い。


基本的に変わったことは、既存のイベントハンドラ用のアノテーションが全て EventHandler に変わっただけである。 そのため既存のMod作者は苦戦することはないはずだが、もし躓くようなら1.5以前のチュートリアルも現時点では参考になるので参照してほしい。