この記事は、Forge Wikiにおいて、Mod開発のビギナー向けのリンクから飛べる[Minecraftフォーラムの記事の一つ]です。Forge Wikiからのリンクではありますが、直接の中身ではないのでご注意ください。また、雑な翻訳です。また、読みやすいように、太字にしたり、見出しをつけたりをしています。
FORGE 4.X++ EVENTS HOW TO
イントロダクション
4.Xでは、いくつかのForge Hookなど古いインターフースを含む、Forgeは様々なことを提供しています。
新しいForgeにおけるイベントの処理の方法は、イベントクラスやイベントメソッドを利用します。イベントバスに登録し、イベント発生時に呼び出されるのです。
では、どうやって使うのか?
最初に、ForgeのプロジェクトをEclipseで開き、net.minecraftforge.eventパッケージと、もしくはそのサブパッケージの中に全てのEvent*クラスは見つかります。アクセスできるすべてのイベントがそこにあり、それらのクラスを用いてイベントの処理ができるようになります。
作成例
以降の例では、すべての生物がアタックした時に発生する、net.minecraftforge.event.entity.living.LivingAttackEventを用います。
最初に、フックを含むクラスを作成します。幾つものクラスに分ける必要はありません。全てのイベントに対し、ひとつのクラスで構いません。--おそらく以下で私の言わんとする意味を理解するでしょう。
以下が、サンプルとして私が書いた例です。
import net.minecraftforge.event.entity.living.LivingAttackEvent; import net.minecraftforge.event.entity.player.PlayerSleepInBedEvent; /** * この名前、継承は不適切です。適切に変更してください。 */ public class EventHookContainerClass { /** * @ForgeSubscribeアノテーションとEventクラスのキャストしたものを引数に入れる必要があります。 * メソッド名はどのような名前でも問題ありませんが、返値はどんな場合でもvoidである必要があります。 */ @ForgeSubscribe public void entityAttacked(LivingAttackEvent event) { /* * ここで、イベントが呼び出された時の処理をかけます。 */ EntityLiving attackedEnt = event.entityLiving; DamageSource attackSource = event.source; /* *全てのイベントでこのようにキャンセルできるわけではありません。 */ if (event.isCancelable()) { event.setCanceled(true); } /* * イベントはよりたくさんのフィールドやメソッドを提供します。詳しくはイベントのリファレンスを読んでください。明白なはずです。 */ } /** * 理解させるために:いろんなイベントを一つのクラスにこのようにまとめることが可能です。 */ @ForgeSubscribe public void onSleepyTime(PlayerSleepInBedEvent event) { event.result = EnumStatus.NOT_POSSIBLE_NOW; } }
そして、以下のように上記のクラスを『register(登録)』してください。
MinecraftForge.EVENT_BUS.register(new EventHookContainerClass());
あなたが登録したクラスは、@ForgeSubscribeアノテーションと引数のEventクラスを継承した型を頼りにパースされます。また、インスタンスを少なくしたいのであれば『unregister』することも可能です。(含まれている全てのメソッドが『unregister』されます。)
イベントクラスにおける階層構造について、スーパークラスを『register』した場合、その継承したすべてのイベントにおいて呼び出されます。 例えば、LivingEventを『register』した場合、そのメソッドは{PlaySoundAtEntityEvent、LivingAttackEvent、LivingDeathEvent、LivingDropsEvent...}などで呼び出されることとなります。 もし、Eventクラスそのものを『register』した場合、そのメソッドは全てのイベントにおいて呼び出されることになります。(ヒント:そうするべきではないです。)