提供: Minecraft Modding Wiki
移動先: 案内検索
(ページの作成:「 ==1.6からのコーディング方法== ※1.6にアップデートされてから頻繁にForgeのバージョンが上がるので、もしかしたら多少の相...」)
 
((イベントの詳細は[https://github.com/MinecraftForge/FML/blob/master/common/cpw/mods/fml/common/Mod.java Modインターフェイスの JavaDoc] を参照)のサイトが404エラーなので各当部分を削除しました。)
 
(4人の利用者による、間の5版が非表示)
6行目: 6行目:
 
1.6.1では多数の変更があったが、MODのエントリポイントとなる@Modアノテーションがついたクラスはあまり変わっていない。
 
1.6.1では多数の変更があったが、MODのエントリポイントとなる@Modアノテーションがついたクラスはあまり変わっていない。
  
1.6.1のForgeからはPreInitアノテーションや、Initアノテーションなどの使用が非推奨になり、@Mod.EventHandlerを変わりに使う。
+
1.6.1のForgeからはPreInitアノテーションや、Initアノテーションなどの使用が非推奨になり、@Mod.EventHandlerを代わりに使う。
  
  
15行目: 15行目:
 
package mods.sample;
 
package mods.sample;
  
import cpw.mods.fml.common.Mod;
+
import cpw.mods.fml.common.*;
 +
import cpw.mods.fml.common.event.*;
 +
import cpw.mods.fml.common.Mod.*;
 
import cpw.mods.fml.common.network.NetworkMod;
 
import cpw.mods.fml.common.network.NetworkMod;
  
 
+
/**
@Mod(modid = "foo", version = "1.0.0", name = "sample")
+
* Sample Mod クラス.
 +
*
 +
* Modアノテーションをつけるだけで、Modクラスとして認識される。
 +
* クラス名は自由に決めることができ、他のクラスを継承する必要もない。
 +
* なお、Modアノテーションの必須項目は modid のみで、その他は外部ファイルから設定することができ、省略することも可能。
 +
*
 +
* また、NetworkMod は不要であれば省略してもよい。
 +
*
 +
*/
 +
@Mod(modid = "sample-mod-id", name = "sample-mod-name")
 
@NetworkMod(clientSideRequired = true, serverSideRequired = false)
 
@NetworkMod(clientSideRequired = true, serverSideRequired = false)
 
public class ModSample {
 
public class ModSample {
  
 +
    /**
 +
    * 指定したIDのModのインスタンス.
 +
    *
 +
    * フィールド名、アクセス指定子はなんでもよい。不要であれば省略可能。
 +
    * 自身のインスタンスがインジェクションされる。
 +
    */
 +
    @Instance("sample-mod-id")
 +
    protected static ModSample instance;
 +
 +
    /**
 +
    * サーバー、クライアントで異なる処理を行わせる場合に用いるプロキシークラス.
 +
    *
 +
    * フィールド名、はなんでもよい。不要であれば省略可能。(public以外のアクセス指定子が使えるかは不明)
 +
    * 実行環境にあわせて、どちらかのインスタンスがインジェクションされる。
 +
    */
 +
    @SidedProxy(
 +
        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) {
 +
    }
  
     @Mod.EventHandler
+
     // ---------------------------------
     public void preInit(FMLPreInitializationEvent event) {
+
     // Server's events
        //前処理
+
    // ---------------------------------
  
 +
    @EventHandler
 +
    public void handleServerAboutToStart(FMLServerAboutToStartEvent event) {
 +
    }
  
 +
    @EventHandler
 +
    public void handleServerStarting(FMLServerStartingEvent event) {
 
     }
 
     }
  
 +
    @EventHandler
 +
    public void handleServerStarted(FMLServerStartedEvent event) {
 +
    }
  
     @Mod.EventHandler
+
     @EventHandler
     public void Init(FMLInitializationEvent event) {
+
     public void handleServerStopping(FMLServerStoppingEvent event) {
        //処理
+
    }
  
 +
    @EventHandler
 +
    public void handleServerStopped(FMLServerStoppedEvent event) {
 
     }
 
     }
  
 +
    // その他アノテーション
 +
    // -----------------------------------------------------
 +
 +
    @Metadata
 +
    protected static MetaData metadata;
 +
 +
    @InstanceFactory
 +
    public static ModSample instance() {
 +
        return new ModSample();
 +
    }
 
}
 
}
  
 
</source>
 
</source>
  
基本的に変わったことはEventHandlerだけなのでそこまで苦戦することはないはずだが、もし躓くようなら1.5のチュートリアルも現時点では参考になるので参照してほしい。
+
基本的に、前処理で設定の読み込み、及び追加するBlock、Itemのインスタンス生成および登録を行い、初期化処理でそれ以外の初期化処理を行う。殆どのModでは、初期化前処理と初期化処理の2つだけで事足りると思われる。
 +
 
 +
なお、コンストラクターでは、自身の内部変更のみを行い、FMLや他Modへの干渉は行うべきではない。これは、インスタンスが生成されるタイミングでは、他Modのロードや生成が保証されていないためである。そのため、基本的にはコンストラクターは定義せず、デフォルトのコンストラクターが使用されるようにする方が良い。
 +
 
 +
 
 +
 
 +
基本的に変わったことは、既存のイベントハンドラ用のアノテーションが全て EventHandler に変わっただけである。
 +
そのため既存のMod作者は苦戦することはないはずだが、もし躓くようなら[[1.5以前のチュートリアル]]も現時点では参考になるので参照してほしい。

2015年12月20日 (日) 11:12時点における最新版


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以外のアクセス指定子が使えるかは不明)
     * 実行環境にあわせて、どちらかのインスタンスがインジェクションされる。
     */
    @SidedProxy(
        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();
    }
}

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

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


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