提供: Minecraft Modding Wiki
(→1.6からのコーディング方法) |
細 ((イベントの詳細は[https://github.com/MinecraftForge/FML/blob/master/common/cpw/mods/fml/common/Mod.java Modインターフェイスの JavaDoc] を参照)のサイトが404エラーなので各当部分を削除しました。) |
||
(3人の利用者による、間の4版が非表示) | |||
6行目: | 6行目: | ||
1.6.1では多数の変更があったが、MODのエントリポイントとなる@Modアノテーションがついたクラスはあまり変わっていない。 | 1.6.1では多数の変更があったが、MODのエントリポイントとなる@Modアノテーションがついたクラスはあまり変わっていない。 | ||
− | 1.6.1のForgeからはPreInitアノテーションや、Initアノテーションなどの使用が非推奨になり、@Mod. | + | 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 = " | + | * 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) { | ||
+ | } | ||
− | + | // --------------------------------- | |
− | + | // Server's events | |
− | + | // --------------------------------- | |
+ | @EventHandler | ||
+ | public void handleServerAboutToStart(FMLServerAboutToStartEvent event) { | ||
+ | } | ||
+ | @EventHandler | ||
+ | public void handleServerStarting(FMLServerStartingEvent event) { | ||
} | } | ||
+ | @EventHandler | ||
+ | public void handleServerStarted(FMLServerStartedEvent event) { | ||
+ | } | ||
− | @ | + | @EventHandler |
− | public void | + | 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> | ||
− | + | 基本的に、前処理で設定の読み込み、及び追加する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以前のチュートリアルも現時点では参考になるので参照してほしい。