• 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)

  • 相关阅读:
    git工具命令整理
    使用nodeJs操作redis
    electron 7.x 设置开发环境与生产模式 隐藏菜单栏和开发者工具 devtools
    electron 打包问题 解决
    sso单点登录之跨域cookie共享 (跨域缓存共享)
    浏览器线程执行顺序
    JS如何将变量作为一个对象的Key
    DevOps流程的简单总结
    通过key 寻找数组内对象的某一项
    根据key查找对象数组中符合的一项 返回对象(递归)
  • 原文地址:https://www.cnblogs.com/moonfan/p/12421670.html
Copyright © 2020-2023  润新知