温度 Temperature
温度是角色与环境共同参与的生存机制。体温会向所在地环境温度、热源、冷源和食物效果变化;低于冰点会冻伤,高于过热阈值会中暑,保暖或隔热装备可以减慢对应方向的变化。
概述
体温由 components/temperature.lua 管理,初始值为 35,并限制在 -20 至 90 之间。每次更新会先取得所在地的环境温度,再叠加温度修正、潮湿惩罚、装备与携带物品的热源/冷源、腹内食物效果,最后根据环境偏冷或偏热决定体温变化速率。
角色处于低于冰点的温度时会触发 startfreezing,高于 70 时会触发 startoverheating。离开对应区间会触发相反事件。温度效果不只是屏幕提示:组件会持续向生命组件施加 cold 或 hot 伤害。默认冻伤速率为 150 / 120 生命值每秒;过热默认使用同一速率,除非实体单独设置了过热伤害速率。
体温计算
每次更新的大致流程如下:
- 读取环境温度:通常使用当前位置的
GetTemperatureAtXZ(x, z);若附近存在有效的温度覆盖区域,则使用最近覆盖区域的温度,否则使用世界温度。 - 计算基础温差:环境温度 + 温度修正 + 潮湿惩罚 − 当前体温。潮湿惩罚会随潮湿百分比线性增加,最大幅度为
30,因此潮湿时会更容易感到寒冷。 - 加入热源和冷源:装备栏、物品栏、溢出容器以及手持物品中的
heater都会参与计算。热源只在其温度高于当前体温时加热,冷源只在其温度低于当前体温时降温。 - 根据环境方向限制速率:环境温度不低于
35时,升温会受到夏季隔热影响,而降温按1的常规速率或过热时的5速率处理;环境更冷时则对降温应用冬季保暖,升温按常规或解冻速率处理。 - 应用保鲜容器等外部速率倍率,并把体温限制在实体自身的最小、最大温度范围内。
直接调用 DoDelta 改变体温时同样会应用隔热:升温使用夏季隔热,降温使用冬季隔热;传入跳过隔热参数时才不会应用这一步。
季节与环境
世界环境温度由 components/worldtemperature.lua 计算,基础来源包括季节温度、昼夜阶段温度、连续噪声,以及可能的全局温度倍率和基准点修正。源码中的季节曲线随季节进度变化,昼夜也会加入不同的阶段修正;因此同一季节内,环境温度并非固定值。
洞穴网络会把世界温度乘以 0.6,并使用 0 作为修正基准。当前位置温度还可以被温度覆盖区域改写,例如特定地形或局部热源区域;温度组件会优先采用最近且处于有效半径内的覆盖者。
昼夜本身还会影响夏季隔热:地表黄昏加入 60,夜晚加入 120。这不是直接改变角色当前体温,而是让体温变化更慢。避雨或其他 sheltered 状态也会提供夏季隔热;在非常炎热且处于遮蔽状态时,树荫冷却逻辑会把目标温度拉向 45,其触发条件是当前体温超过 63。
过冷与过热
过冷
当前体温低于冰点时,角色进入冻结状态,并按时间持续受到 cold 伤害。装备冬季保暖、靠近热源、携带或食用升温物品,都可以让体温更快回到安全区间。体温组件的默认冻伤致死时间由 120 和角色生命上限共同决定;个别角色可以通过 SetFreezingHurtRate 覆盖默认速率。
过热
当前体温高于 70 时进入过热状态,并持续受到 hot 伤害。夏季隔热装备、树荫、冰冷热源和降温食物可以降低体温;源码中,过热时降温使用更快的解冻速率 5。个别实体也可以通过 SetOverheatHurtRate 使用独立的过热伤害速率。
温度伤害默认不是非致命伤害:NONLETHAL_TEMPERATURE 的当前值为关闭状态,因此不能仅依赖温度系统自动保留最低生命值。
保暖、隔热与热源
装备的 insulator 分为冬季和夏季两种类型。冬季隔热只在环境偏冷、角色正在降温时发挥作用;夏季隔热只在环境偏热、角色正在升温时发挥作用。当前版本的基础档位为:
| 档位 | 数值 |
|---|---|
| 小型隔热 | 60 |
| 中型隔热 | 120 |
| 大型隔热 | 240 |
角色自身的胡须会增加冬季隔热,同时减少夏季隔热。遮蔽状态还会增加 180 的夏季隔热;黄昏和夜晚的额外隔热则见上一节。
heater 不等同于 insulator:热源和冷源会直接改变温差,隔热则主要减慢体温朝环境方向变化的速度。实际处理时,冬季优先准备冬季隔热和稳定热源,夏季优先准备夏季隔热、树荫或冷源;单纯堆叠错误季节的隔热类型,不能有效解决当前方向的体温变化。
可作为典型例子的装备包括:带有夏季隔热和冷源的
冰帽,以及带有夏季隔热和冷源的
西瓜帽。它们的具体冷却目标分别由 40 和 55 给出。
食物温度效果
食物通过 edible.temperaturedelta 和 edible.temperatureduration 提供腹内热量或冷量。吃下食物后,效果会保存一段时间并作为隐式热源/冷源参与体温计算,而不是简单地把当前体温瞬间改成某个固定值。新的有效温度食物会覆盖之前的腹内温度效果。
当前版本的通用温度效果为:
| 类型 | 体温修正 | 持续时间档位 |
|---|---|---|
| 升温食物 | 40 |
5、10 或 15 |
| 降温食物 | -40 |
5、10 或 15 |
升温食物只在当前体温低于 62 时继续发挥作用;降温食物只在当前体温高于 12 时继续发挥作用。食物的 chill 会按其温度效果持续时间稀释升温效果;食谱或香料还可以修改温度效果的幅度和持续时间。
实战处理
- 准备阶段:根据季节制作对应类型的隔热装备;冬季优先冬季隔热,夏季优先夏季隔热。若要跨季节使用同一套装备,要确认其类型是否真正对应当前环境方向。
- 寒冷时:靠近有效热源,穿冬季隔热装备,并在体温仍低于安全区间时食用升温食物。热源的有效性取决于其
heater类型、距离、有效半径以及角色是否潮湿。 - 炎热时:进入树荫或其他遮蔽区域,使用夏季隔热装备、冰冷热源和降温食物。潮湿会使热源的加热效果按
0.75的因素削弱,因此淋雨后不能只依赖篝火快速回温。 - 注意体温上限与阈值:体温达到过热阈值或低于冰点就会开始持续伤害;离开危险区后仍需要等待体温实际回到阈值以内,单纯离开热源或冷源不会立即清除状态。
- 特殊容器:冰箱会以冷却速率
1处理其中物品,并且通常不会把物品冷却到低于冰点;带有lowcool标签的容器使用更低的冷却速率。睡袋可以提供自己的环境温度覆盖。
代码参考
scripts/components/temperature.lua:体温初始化、OnUpdate环境与热源计算、GetInsulation隔热汇总、危险阈值事件和温度伤害。scripts/components/worldtemperature.lua:季节、昼夜、噪声与全局修正组成的世界温度。scripts/components/temperatureoverrider.lua:局部温度覆盖与当前位置温度查询。scripts/components/edible.lua:食物温度效果写入腹内温度状态。scripts/components/insulator.lua:冬季/夏季隔热类型与数值接口。scripts/components/health.lua:cold、hot温度伤害及非致命温度选项。scripts/tuning.lua:体温阈值、速率、隔热、潮湿和食物温度相关平衡常量。