欢迎光临散文网 会员登陆 & 注册

工具质地和盔甲质地(Material)(上)

2022-10-13 18:11 作者:道家深湖  | 我要投稿

新的ToolMaterial,武器/工具质地

新的ArmorMaterial,盔甲质地

以上代码一般写在ModItems里,但实际上如果你搞明白本质,写在哪无所谓。

说白了就是原版用了枚举,以至于我们没法直接地构造XXMaterial对象,需要靠forge提供的黑魔法EnumHelper来添加。

一个常见的错误,是setRepairItem里所指定的物品写在了后面,导致不能修理。看我前面ToolMaterial的示意,BLOOD_IRON_INGOT的声明在TOOL_MATERIAL_BLOOD后面。如果你把顺序调换,会导致setRepairMaterial调用的时候,BLOOD_IRON_INGOT对应的构造函数还没调用,修理材料被设置为null而失灵。都是泪。

Material这个词,很多人第一反应是“材料”,但是MC里有太多类似的概念,所以这里我先称之为质地。叫它什么无所谓,总之是这么个东西。

在大宝剑那课,我讲了使用“Item.ToolMaterial.DIAMOND”引用原版的钻石质地。好,现在问题来了,如果我不想用钻石,而是想用一种我mod自己引入的东西维修怎么办?

在回答这个问题之前,我们先要搞清楚一件事:真的有必要引入一个新质地吗?

我们回想一下原版不同质地的剑或者镐有什么区别。

首先,钻石剑和木剑的伤害不一样。那么,为了做出伤害不一样的剑,就要写不同的质地吗?其实不用。我们看一段代码,来自ItemSword:

剑之所以有伤害加成,都是在这写出来的。你覆写这函数,甚至能让剑加盔甲值和生命上限。这里攻击的加成数值是attackDamage,他是一个private final float变量,不好修改,尴尬至极。要想改攻击加成,只能直接重写这个属性修改器的整个方法getItemAttributeModifiers。

ItemSword里有个getAttackDamage,但那玩意不管用。他是AI生物判断要不要换武器时用的,光覆写这玩意不影响伤害。

钻石和铁耐久度也不一样,但你也看到了,setMaxDamage就解决了。所以单纯做一个耐久度问题的话,也用不着管材质。

金的东西更好附魔。对的,我们来看这个接口:

看见没,这个也能无视材质手写。

那用来修理的物品呢?你总不能用金锭修钻石镐……

嗯,sorry,有接口真的了不起。你改这个接口,真的能写出一个道具可以同时被金、铁、钻石甚至是木炭修复。

挖掘速度?ItemTool里有个protected float efficiency,斧子和镐子用到了,你改就行。是的,钻石剑和木剑挖泥巴速度一样,因为不检测材质。

挖掘等级?来看看ItemPickaxe::canHarvestBlock。你甚至可以写出一个能挖黑曜石,却不能挖铁矿石的镐子。所谓挖掘等级这种概念,只有你照顾它的时候才有意义。

那没了,对吧。所有ToolMaterial的问题都能靠覆写接口解决。那为什么还要有ToolMaterial?为了像mc那样一做一整套,即使钻石锄实际上几乎没有玩家去合成,钻石镐则是大家的共同目标。不然,你随便继承个什么质地,然后覆写接口就可以了。

盔甲的问题则比较复杂。物品就只有一张贴图,盔甲穿在身上还有另外两张——对的,两张,实际上盔甲有两个图层,各有一张,再加手上的物品图标,一共三张。

当然了,这是指你打算正常制作普通盔甲,而不是那种有特殊模型(比如犄角)的情况。

先说到这里。下篇直接咕了,啥时候有空啥时候写。



工具质地和盔甲质地(Material)(上)的评论 (共 条)

分享到微博请遵守国家法律