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

Mod里制作剑(二)

2023-09-03 21:05 作者:道家深湖  | 我要投稿

前篇:做剑一

浅海:所以我准备开始做剑了。

深湖:那么今天我们讨论代码方面的问题。

浅海:会比上次的多吗?

深湖:那就取决于你已经懂多少了。好,我们从这个问题开始:铁剑的攻击加成是多少?

第一篇里的图

浅海:我打开游戏看到的是6。

深湖:错了。

浅海:昨天你不是也说铁剑的攻击伤害是6吗?

深湖:对,所以我今天问的是“铁剑的攻击加成是多少”,而不是“铁剑的伤害是多少”。

左:模组物品的抽象显示;右上:武器的显示;右下:盔甲的显示

浅海:这还有区别的吗?

深湖:有。玩家徒手的攻击伤害是1,拿着铁剑的伤害是6,说明铁剑的伤害加成是5。如果你仔细观察过的话,你会发现武器、工具会显示拿着的时候,玩家的最终伤害是多少,灰色的字;如果是盔甲的话,会显示属性加某数,而且是蓝色的字。

正因如此,你会清楚盔甲每一件【加】了多少数值,并且产生一个铁剑上写的数值就【是】它在代码底层实现的数值的错觉

浅海:那么代码底层的实现的实际情况是?

深湖:是玩家徒手攻击力为1(半颗心)、攻击速度为4(赫兹),手持其他物品的时候不显示这个数字。当你需要实现一个物品改变这些数值的时候,你需要以此为基础做出修正。比如你希望做一个攻速为8的主手物品,那么你应该做到的攻速加成是+4,而不是8;你想做一个攻击为8的武器,那么你应该在代码里写的是攻击力为8-1=7。

浅海:原来如此。等等,剑的攻速是1.6,徒手的攻速是4,那岂不是……

深湖:对,剑在拖慢你进攻的速度。因此,实际上他的攻速加成是负2.4。如果按照其他地方的显示,它会显示一个难看的红字。

ItemSword的节选
负的加成会用红字

但mc显然不希望你拿到一把剑的时候,天天看着那个攻速变慢而恶心,更何况你也不知道自己的徒手攻速是4、基础攻击是1,这点游戏里没有地方说过。因此……他在某些时候会直接显示最终计算结果,而非修正值。

浅海:所以,在武器和工具上显示的是最终值,盔甲上显示的是加成,因为盔甲有四件,都在修正同一个属性?

深湖:就原版无nbt物品的表现来说是你这样。但底层不是。

浅海:所以底层在主手里的是显示最终值,盔甲栏的,比如“戴在头上时”是显示加成?

深湖:也不是。

浅海:所以是攻击伤害和攻速显示最终值,其他的显示加成值?

深湖:也不是。

浅海:啊,我看到上面那个图了,确实反驳了一切……

深湖:正确答案是,当你的属性修饰符(AttributeModifier)的UUID为特定的两个值的时候,这项修正显示灰色最终值;否则的话,显示蓝色正加成或者红色负加成。

以下是ItemStack里的相关代码。你作为萌新的话不用细看,只需要有个模糊印象,知道这个东西是写在ItemStack::getTooltip里的就行。注意是ItemStack类,不是大家整天摆弄的Item类,这也是很多人找不到这代码在哪的原因之一。

至于这两个UUID具体是什么,它们是在Item里定义的。



浅海:什么什么?

深湖:首先,我想你不知道什么是属性修饰符。

浅海:确实……不是很懂。

深湖:生物有属性。生物都有最大血量这个属性,多数的属性你可以在SharedMonsterAttributes类里查找到。

最常用的那些属性

浅海:monster,怪物,那么玩家的呢?

深湖:这个类名不应该望文生义。

同一条属性,比如血量上限(MAX_HEALTH),玩家和怪物用得是同一条。

另外,不是所有怪物都有这个类里的所有属性,比如新人最常犯的一个错误是误以为所有EntityLivingBase都有ATTACK_DAMAGE。实际上这玩意是EntityMob里注册的,就连EntityLiving、EntityCreature里都不一定有。正因如此,如果你是试图调用牛、羊之类动物的这条属性,就会引发空指针报错,因为牛根本就没有ATTACK_DAMAGE这条属性。实际调用的时候你记得要判定空指针,或者是注意观察那些东西的注册时机。


活物共有的属性,注册于EntityLivingBase
但ATTACK_DAMAGE不在上述地方注册。玩家也在另一个地方注册了它。

浅海:那如果给牛发一把剑,会报错吗?

深湖:不会。因为原版在这里做了判空处理,属性修饰符只对这个生物确实存在的属性生效。当然,你拿在手里的时候,所有的属性修饰符是都看得见描述的,但里面有几条是玩家所没有的属性,所以实际上不会生效。比如玩家没有FOLLOW_RANGE,也就是怪物的视野范围,之类的。玩家没有ai,不需要他,所以根本没注册这条。

浅海:所以……做剑的话只需要像原版一样修改攻速和攻击伤害就行了吧,别的我先不用。

深湖:你最好不用,那些属性有很多个都挺坑的。新人做的时候,望文生义,不起作用的问题时有发生。

浅海:那么UUID是什么?

深湖:你可以看我的这篇文章。简单来说就是个唯一id,这玩意相同的就视为同一个东西。如果你在今天看到一个身份证号为N的人,明天又看到了身份证号为N的人,那么这两人应该被视为同一个人。你不记得他的长相,或者说整容、变性也无关紧要,只要身份证号一样,他们就会被系统认为是同一个人。

浅海:啊……

深湖:我觉得你今天学的够多了,可以先休息了。下周我们再具体谈属性修饰符的写法。



Mod里制作剑(二)的评论 (共 条)

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