我要加入

Minecraft程式開發討論會

會長:yukkcake / 晨開設日:2013-08-11 00:32:49

  • EXP

  • 資金8072  
  • 關連作品我的世界、我的世界 Classic、我的世界... 看更多
  • 招募制度:邀請制
  • 成員:40 人
  • 昨日人氣:0

事件系統(Event)

推上精選編輯

近期編輯:yukkcake ...看更多


使用方法:

  在方法前面加上@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事件表參考
【其他】設計模式 ─ Observer 模式

運作方式紀錄:

  事件會在叫用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相關的作法,我有空會再深入研究一下
           有人有興趣可以自行補充
    

公會首頁

主選單
Wiki編輯
  規則
模組開發
  MCP
  Forge API
模組討論
  Custom Stuff 2
  自製分享
插件開發
  Craftbukkit
插件討論
  自製分享
輔助程式
公會相關
關聯資料

face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】