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)