一、盔甲耐久度
盔甲类型的实体,包括头盔和护甲,其耐久度是盔甲组件armor自带的。
armor包括两个主要的参数,如下:
-- 伤害吸收率
inst.components.armor.absorb_percent
-- 耐久度
inst.components.armor.condition
inst.components.armor.maxcondition
初始化盔甲时的语句如下:
-- 为实例添加 "armor" 组件,使其具有护甲属性
inst:AddComponent("armor")
-- 初始化护甲的耐久度和伤害吸收率
inst.components.armor:InitCondition(TUNING.ARMOR_LUNARPLANT, TUNING.ARMOR_LUNARPLANT_ABSORPTION)
其中,第一个位置的参数为护甲耐久度,即总共可以接受多少伤害,以生命值为单位;
第二个位置的参数为护甲伤害吸收率,即穿戴时可以抵挡多少百分比的伤害,数值在0~1;
以亮茄盔甲为例,数值的定义为:
-- 护甲耐久度计算:威尔逊生命值的6倍,加上200点额外耐久度(官方笔记:相当于防御10点平面伤害的20次攻击)
ARMOR_LUNARPLANT = wilson_health * 6 * multiplayer_armor_durability_modifier + 20 * 10,
-- 护甲吸收率计算:基础吸收率为80%,乘以多人游戏中的护甲吸收率修正系数
ARMOR_LUNARPLANT_ABSORPTION = 0.8 * multiplayer_armor_absorption_modifier,
-- 护甲平面防御值:固定为10
ARMOR_LUNARPLANT_PLANAR_DEF = 10,
-- 头盔耐久度计算:与护甲耐久度相同
ARMOR_LUNARPLANT_HAT = wilson_health * 6 * multiplayer_armor_durability_modifier + 20 * 10,
-- 头盔吸收率计算:与护甲吸收率相同
ARMOR_LUNARPLANT_HAT_ABSORPTION = 0.8 * multiplayer_armor_absorption_modifier,
-- 头盔平面防御值:固定为10
ARMOR_LUNARPLANT_HAT_PLANAR_DEF = 10,
-- 对月亮阵营伤害的抗性:固定为90%
ARMOR_LUNARPLANT_LUNAR_RESIST = 0.9,
-- 套装效果的月亮阵营伤害抗性:计算0.75的平方根(约为0.866),再除以基础抗性0.9
ARMOR_LUNARPLANT_SETBONUS_LUNAR_RESIST = math.sqrt(0.75) / 0.9, -- 因为两件套装组合才能达到这个效果
-- 反射位面伤害:固定为10点
ARMOR_LUNARPLANT_REFLECT_PLANAR_DMG = 10,
-- 对阴影敌人反射的位面伤害:固定为20点
ARMOR_LUNARPLANT_REFLECT_PLANAR_DMG_VS_SHADOW = 20,
其中修正系数定义为0.7。
若我们想要对原本不可修补的盔甲进行修补,只需要从修改armor组件的condition值下手即可。
armor有专门用于修理耐久度的函数,一些其他常用的函数也在下方:
-- 初始化
InitCondition(amount, absorb_percent)
-- 初始化,且无耐久度(但是会显示100%)
InitIndestructible(absorb_percent)
-- 获取当前耐久度
GetPercent()
-- 增加弱点:如果攻击者或者攻击者的武器有相应的tag,则增加bonus_damage点伤害
AddWeakness(tag, bonus_damage)
-- 移除弱点
RemoveWeakness(tag)
-- 设置伤害吸收度
SetAbsorption(absorb_percent)
-- 设置耐久度百分比
SetPercent(amount)
-- 设置耐久度值
SetCondition(amount)
-- 修复耐久
Repair(amount)
二、工具耐久度
这里的工具是指按照工作次数来消耗耐久的实体,而之前提到的盔甲是通过受攻击时通过计算攻击血量来作为耐久度。
具体地,工具包括武器、斧头、锤子、铲子等,他们是通过设置最大使用次数来完成耐久度玩法的,为他们增添最大使用次数的代码如下:
-- 增添使用组件
inst:AddComponent("finiteuses")
inst.components.finiteuses:SetMaxUses(TUNING.SPEAR_USES) -- 设置最大使用次数
inst.components.finiteuses:SetUses(TUNING.SPEAR_USES) -- 设置初始使用次数
为了进一步丰富玩法,我们还可以为不同的工作设置不同的消耗次数,如使用锤子功能时消耗1点耐久,使用铲子功能时消耗3点耐久等。具体的方法如下:
-- 设置最大使用次数
SetMaxUses(val)
-- 设置当前使用次数
SetUses(val)
-- 设置不同动作对应的消耗次数
SetConsumption(action, uses)
-- 使用num次(也就是减少num次使用次数)
Use(num)
-- 设置使用次数百分比
SetPercent(amount)
-- 恢复使用次数
Repair(repairvalue)
当然,如果想区分不同工作消耗的耐久度,就必须先为工具添加可以完成对应工作的组件。(详见主页 )
三、新鲜度
说是新鲜度,其实应该叫他腐烂度,因为新鲜度对应的组件为perishable,译为可腐烂的。
除了常见的可以食用的物品,火腿棒、可以放在装备栏的小动物的存活时间也是通过该组件来完成的。从接一下,就是所有在在装备栏存放时背景图标为绿色(新鲜状态)的物品都拥有该组件。
添加该组件的方法如下:
inst.Addcomponent("perishable")
-- 设置当前腐烂时间
inst.components.perishable:SetPerishTime(time)
其他方法如下:
-- 增加距离完全腐烂的时间,也就是增加新鲜度
AddTime(time)
-- 设置腐烂速率
SetLocalMultiplier(newMult)
-- 设置新的最大腐烂时间
SetNewMaxPerishTime(newtime) -- 改变最大腐烂时间后,物品的腐烂百分比不会改变
-- 设置腐烂度百分比
SetPercent(percent)
-- 减少腐烂度百分比
ReducePercent(amount)
-- 开始腐烂
StartPerishing()
-- 停止腐烂
StopPerishing()
同时,具有新鲜度的物品通常具有三个标签,对应三种新鲜状态,分别是:
fresh:新鲜的(绿色)
stale:一般的(黄色)
spoiled:接近腐烂的(红色)
当我们为容器中的某个格子单独设置腐烂时间时,可以通过上面的方法完成;
而极地熊獾桶是添加了preserver组件来完成保鲜:
inst:AddComponent("preserver")
inst.components.preserver:SetPerishRateMultiplier(TUNING.BEARGERFUR_SACK_PRESERVER_RATE)
四、燃料
其他的一些具有耐久度的物品大多是采用了燃料组件来设置其可以使用的时间。如眼球伞、贝雷帽等衣服。而一些其他的不可放进物品栏的实体也会采用燃料组件,比如营火等。
为物品添加燃料组件的方法如下:
-- 为实例添加 "fueled" 组件,使其具有燃料属性
inst:AddComponent("fueled")
-- 设置燃料类型
inst.components.fueled.fueltype = FUELTYPE.USAGE
-- 初始化燃料水平为 TUNING.EYEBRELLA_PERISHTIME
inst.components.fueled:InitializeFuelLevel(TUNING.EYEBRELLA_PERISHTIME)
-- 设置燃料耗尽时的回调函数为 eyebrella_perish
inst.components.fueled:SetDepletedFn(eyebrella_perish)
其他常用的方法如下:
-- 将燃料值设为空
MakeEmpty()
-- 燃料耗尽时的回调函数
SetDepletedFn(fn(inst))
-- 检查燃料是否为空
IsEmpty()
-- 检查燃料是否已满
IsFull()
-- 设置燃料段数
SetSections(num)
-- 设置燃料消耗倍率函数
SetMultiplierFn(fn(inst,fuel_obj))
-- 获取当前燃料段的百分比
GetSectionPercent()
-- 获取当前燃料的百分比
GetPercent()
-- 设置当前燃料的百分比
SetPercent(amount)
-- 开始消耗燃料
StartConsuming()
-- 初始化燃料水平
InitializeFuelLevel(fuel)
-- 改变当前燃料值
DoDelta(amount, doer)
-- 停止消耗燃料
StopConsuming()
另外一些使用燃料值计算耐久度的实体可以用针线包来修复,关于针线包的说明会在[耐久度与专精修补] 中详细介绍
五、其他关于耐久度的物品
亮茄系列以及虚空系列的套装可以通过对应的修补套件来修补,但是对于任何耐久度的装备,修理后都会将耐久度提升至100%,并且不可设置,其对应的代码为:
MakeForgeRepairable(inst, FORGEMATERIALS.LUNARPLANT, OnBroken, OnRepaired)
-- 第一个位置为实体
-- 第二个位置为标签,即可被带有同样标签的修补工具修补
-- 第三个位置为损坏时的回调函数,由于他们损坏后都不会消失,而是不可装备,所以要在回调函数中写出
-- 第四个位置是修补时的回调函数
与之配套的修补套件需要配备以下代码:
local function OnRepaired(inst, target, doer)
doer:PushEvent("repair")
end
inst:AddComponent("forgerepair")
inst.components.forgerepair:SetRepairMaterial(material)
inst.components.forgerepair:SetOnRepaired(OnRepaired)
六、总结
在耐久度方面,
具有护甲度效果的实体应用的是armor自带的耐久度;
具有工具功能的实体应用的是finiteuses通过设置使用次数来实现耐久度;
具有新鲜度的实体通过腐烂度perishable来实现“耐久度”;
普通的衣服与其他消耗类物品通常采用fueled来实现耐久度,这也是最推荐的方法。