進階概述
逐漸發現,進階的內容多而雜,很多零碎的點,比如在任何地方使用本地化、在地圖中創建一個爆炸、給物品添加介紹信息等等,因為沒有一個全面的API文檔和注釋,這些方法都要自己去源碼里尋找。或許用一個具體的實踐來綜合一些小的點比較好。也有可能總結一下常用的API。
規范
一般來說,盡量在重寫父類方法的時候才使用繼承。如果只是創建一些沒有特殊用法或只參與中間合成的物品/方塊等,建議直接使用 new Item()、new Block() 來創建實例,調用相應的 setter 方法設置其屬性。
此外,也可以使用更好的管理注冊表/非本地化等的方法。顯然之前使用的一個大類一個 Loader 的方法過於繁瑣。比如將所有物品/方塊等加入集合,統一進行注冊等。也可以手動創建一個基類,封裝好注冊名/非本地化名等基本操作。
一些概念
ItemBlock
這個前面寫過,是Block對應的Item,本質就是Item的基礎上添加了放置方塊等基本操作。
ItemStack
這個前面也見過,在Minecraft中,每一個格子里放的都是ItemStack,它是物品的實例,擁有堆疊個數等屬性。而Item規定了某一個物品類別,規定了所有屬於這一類的ItemStack的共性,比如作用,比如最大堆疊個數。
就像一把耐久度為滿的鐵斧和一把只剩一半的鐵斧,它們是不同的ItemStack,但都能用來砍樹,因為它們都所屬於ItemAxe這個Item。
特別的,空格子其實等效於Air這個Item,用ItemStack.Empty表示。
事件系統
前面已經用過很多了,Forge為原版Minecraft提供了一套比較完整的事件系統,Mod新添加的東西,還能夠重寫一些方法來得到新的行為。但要影響到原版寫死了的功能,就要依靠事件,比如當生物受到攻擊時、玩家死亡時等等。
如果一個事件定義了 @Cancelable,那么這個事件可以取消,取消后默認行為將不再進行。
Forge事件系統里的事件全部是void的,也有一些事件定義了 @HasResult,那么這個事件提供了Result方法來充當返回值,參與一些判斷。
還可以設置事件的優先級......
常用的事件列表
待更新......
| 事件 | 用法 |
|---|---|
| AttackEntityEvent | 玩家攻擊時觸發 |
| BlockEvent.BreakEvent | 方塊被破壞時觸發 |
| InputEvent.KeyInputEvent | 鍵盤按下時觸發,常用於設置鍵盤快捷鍵 |
| PlayerEvent.BreakSpeed | 玩家破壞方塊時觸發,可設置破壞速度 |
| PlayerInteractEvent下的子事件 | 玩家分別用左/右鍵點擊方塊/實體/物品等時觸發 |
| ProjectileImpactEvent.Arrow | 弓箭射中時觸發 |
| RenderGameOverlayEvent下的子事件 | 渲染Gui時觸發 |
| RenderSpecificHandEvent | 繪制第一人稱視角下的畫面時觸發 |
| RenderPlayerEvent.Pre/Post | 渲染玩家模型前后觸發 |
可參照 fmltutor的1.8.9開發教程,但因游戲版本問題,其中的一些事件並不一定准確。
也可在 net/minecraftforge/event/ 下自行查找需要的事件,或者直接查看 net/minecraftforge/fml/common/eventhandler/Event.java 類的繼承樹(IDEA中為打開某個類,點擊菜單 Navigate-Type Hierarchy)
