Mod里制作剑(四)

深湖:我想在正式开始之前,我应该纠正我在第二篇里的一个错误,或者说是含混的地方。
浅海:哪里?
深湖:我当时是这么说的:
正确答案是,当你的属性修饰符(AttributeModifier)的UUID为特定的两个值的时候,这项修正显示灰色最终值;否则的话,显示蓝色正加成或者红色负加成。
浅海:我做了实际尝试,确实是这样的啊?
深湖:只是格式上确实是这样,但是显示的具体数字内容不是。
举例来说,你使用了ATTACK_SPEED_MODIFIER(攻速修饰符)修改了……攻击伤害属性,修改内容为“加2”,那么这里显示的不是你的总攻击伤害,也不是你的基础攻击伤害+2。它的值是你的基础攻击速度+2,但是描述是“X 攻击伤害”,驴唇不对马嘴。这就是上面你看到有两条攻击伤害属性,还自相矛盾的原因。
如果你感兴趣的话,上图对应的的代码是:
因此,攻击修饰符就修饰攻击,攻速修饰符就修饰攻速,不要乱搞了。
此外,因为这显示的不是最终值,而是基础值+修正值后的结果。如果有多件用这个UUID修正同一个属性的装备——当然他们会因为UUID互相冲突而无法同时生效——这东西也只能预览这一件的理论效果。
对,这玩意总是按照加法来预览,所以如果你是百分比+100%,他不会按照攻速(基础值为4)的4*(1+100%)=8来计算,而是会算出错误的4+100%=500%。很愚蠢。所以这个UUID的修饰符还是留给类型为0的加法修饰符吧。
浅海:好的。说了这么多,总之我不按照原版未计划的方式使用这两个UUID的修饰符,就不会有问题,对吧?而且即使有也只是显示问题。
深湖:对!就是这样。
浅海:那么今天我们讲修饰符的另一个要素,也就是具体的修正值?
深湖:对。这一项很好理解。如果值填3,那么它类型为0(普通加法)的时候,就是属性+3;为1或者2(百分比加成)的时候,就代表+300%。
浅海:也就是说,如果我修正值填10000,类型为0(普通加法),就能让玩家拿着的时候,攻击力是……基础的1点,加10000,最后是10001。
深湖:错了。
浅海:为什么?

深湖:如图。最后的结果是2048。如果你去SharedMonsterAttributes里去看看它的定义,就会知道攻击力这条属性被限制在0~2048,根本没法达到一万。你的加成再多,也顶不出这个限制。
浅海:可我做出来,看到预览的时候确实是10001攻击伤害啊?
深湖:我想前面你看过那个代码的实现原理了,这个数值不可靠,他总是返回基础值加修正值,而非实际的属性最终值。你应该做的是实际获取属性值看一眼,就比如这样……
浅海:我试试……为什么我获取出来属性值为1?超出范围的修饰符会被丢弃吗?
深湖:不会丢弃。获取出来为1是你获取的方式不对。要么你是获取了BaseValue(基础值),要么是因为你试图在前端获取攻击伤害这条属性。
如果你仔细看过这些属性的定义的话,你会发现有的属性在构造的时候,没有进行setShoudlWatch(true),也就是说前端是根本不知道你最后身上的实际攻击力是多少的。哦,基础值还是知道的,如果这个基础值是实体初始化的那个数,也没有被其他模组乱改过的话。
如果你想在前端临时查看,最暴力的方法就是像我上面那样给这个属性,在后端的某个地方强行设置为setShouldWatch(true)。类似地,我记得有几条属性在1.12.2是watch的,在高版本又不watch了。在前端去试图显示东西的时候务必注意这条属性是否会同步给前端。实际上,如果只是为了调试,那么在后端打条log就足够了。