Minecraft 1.12.2 Mod開發筆記——進階概述、事件系統和常用事件


進階概述

逐漸發現,進階的內容多而雜,很多零碎的點,比如在任何地方使用本地化、在地圖中創建一個爆炸、給物品添加介紹信息等等,因為沒有一個全面的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)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM