使用方法:
在方法前面加上@ForgeSubscribe會使該方法的類別被視為事件訂閱者,
方法只能有一個net.minecraftforge.even.Event型別的參數(或是繼承自Event),
而且要是public / not static,
在模組Init時使用MinecraftForge.EVENT_BUS.register(事件訂閱者);可使該訂閱者被通知。
叫用規則:
而假如訂閱了EntityEvent,EntityEvent底下的Event發生時(比方說LivingFallEvent)也會被通知事件
然後@ForgeSubscribe(priority = EventPriority.優先度) 可以改變事件處理method的優先權
高優先權的method會較早被通知,
在@Cancelable事件上可以使用event.setCanceled(true);取消事件,使較低優先權的不被通知。
至於同優先級別競爭如下:
同一個訂閱者的方法,根據字母排序,越小的越優先(如a比b早)
同一個模組,不同訂閱者,先註冊先執行
不同模組,由Mod主類別的字母排序來決定優先順序,越小越早
其他資訊整理:
【白玉樓之夢】Mod教程 Extra编(1) – Forge的事件系统
【Forge Wiki】Event Reference事件表參考
【其他】Listeners vs Handlers
運作方式紀錄:
事件會在叫用MinecraftForge.EVENT_BUS.post(event)被建立
EVENT_BUS是EventBus.class的實體,其中post中會照順序invoke那個event裡面所有的listener
listener的排序應該是在EventBus的register(訂閱者物件)方法中決定
register方法會分析傳入的Object的class中有哪些method包含ForgeSubscribe的Annotation
然後針對每個method要訂閱的event和他的全部super
都執行一次(private)register(event,你的訂閱者物件,method);
註:此方法中有一行 ASMEventHandler listener = new ASMEventHandler(target, method);
我猜應該是coremod相關的作法,我有空會再深入研究一下
有人有興趣可以自行補充