作祟 Haunt
作祟是鬼魂玩家对可作祟目标执行的专属动作。目标是否接受、成功后发生什么、成功概率与冷却时间都由目标的 hauntable 组件及其 prefab 配置决定;部分复活物品还允许鬼魂通过作祟直接复活。
概述
鬼魂玩家可以对满足条件的实体执行“作祟”。动作要求目标有效、不在 limbo、拥有 hauntable 组件,且不能是被手持的物品、已经处于 haunted 状态或带有 catchable 标签;满足条件后,游戏向鬼魂发送 haunt 事件,并调用目标的 hauntable:DoHaunt。因此,“能看到作祟动作”不等于“这次一定成功”:最终结果由目标自己的 onhaunt 回调决定。
作祟目标与成功结果
目标通过 hauntable 组件注册作祟回调。默认回调直接返回成功,但常见目标会使用标准辅助函数或 prefab 自定义函数改变结果。代码中确认的结果类型包括:
- 移动或被抛出:
MakeHauntableLaunch在随机判定成功后调用Launch,并把本次作祟的 haunt value 设为对应档位。 - 惊慌:
MakeHauntablePanic会唤醒睡眠中的目标;判定成功后设置panic与惊慌计时器,目标 AI 可据此进入惊慌行为。 - 点燃、冻结、改变 prefab、掉落物品、播放动画或进入指定状态:这些效果分别由
standardcomponents.lua中对应的MakeHauntable*函数和目标 prefab 的回调实现。 - 复活:红色护符、复活石和多人传送门等实体把 haunt value 设为
9999;具体复活流程仍由目标 prefab 与玩家复活事件处理。
成功后,组件会给目标添加 haunted 标签并记录 haunt value;目标也可以在后续逻辑中停止作祟状态。作祟失败则由目标回调返回 false 或空值,不应按成功效果处理。
冷却与概率
作祟冷却不是全局固定值,而是写入目标 hauntable.cooldown 的实体属性。标准辅助函数使用的默认档位为:
| 档位 | 冷却 |
|---|---|
| 极短 | 1 秒 |
| 短 | 3 秒 |
| 中 | 5 秒 |
| 长 | 7 秒 |
| 极长 | 10 秒 |
成功概率同样由目标回调决定。源码提供的概率常量为:100%、75%、50%、25%、10%、0.5% 与 0.1%。这些常量只是可供各实体使用的档位,不代表所有目标共享同一个作祟概率;例如标准“抛出”和“惊慌”函数会在回调中先进行 math.random() 判定,只有通过后才执行效果。
默认情况下,成功作祟会触发冷却;组件还提供关闭“成功后冷却”的配置项,是否修改取决于目标自身的 prefab 配置。
鬼魂复活
作祟复活与复活尸体是两套机制:
通过可作祟复活物品复活
某些复活目标的 haunt value 使用 9999。成功作祟后,目标可以向鬼魂发出 respawnfromghost 事件;玩家复活处理会检查玩家仍是鬼魂,随后进入复活流程、暂时禁用控制并最终移除 playerghost 标签,发送 ms_respawnedfromghost 事件。红色护符的源码还明确要求它在死亡后通过作祟触发其效果。
由其他玩家使用复活物品
鬼魂玩家可以接受带有 reviver 标签的物品;玩家源码会据此触发复活,并默认施加生命上限惩罚。复活者自身会获得 80 的理智变化;复活物品带有 noreviverhealthpenalty 标签时可以跳过该生命惩罚。
复活尸体
启用对应游戏模式属性时,玩家实体会添加 revivablecorpse 组件。尸体必须带有 corpse 标签,并通过 CanBeRevivedBy 的额外条件检查;满足条件后,活着的复活者执行 REVIVE_CORPSE,动作时长使用 6 秒,再由尸体组件发送 respawnfromcorpse 事件。该机制不是鬼魂对普通目标的作祟。
风险与限制
作祟的直接风险取决于目标回调:目标可能被抛出、惊慌、点燃、改变状态或触发其他实体特有的效果;源码没有为“作祟”统一规定一个额外伤害或统一惩罚。鬼魂也不能对已被手持、已作祟或不可作祟的目标执行有效动作。
复活则有明确的代价:使用带 reviver 标签的复活物品时,默认会对被复活玩家施加 0.25 的生命惩罚;复活者获得 80 的理智变化。复活尸体还受尸体标签、复活者资格和动作持续时间限制。
代码参考
scripts/actions.lua:ACTIONS.HAUNT的目标检查与动作执行。scripts/components/hauntable.lua:作祟回调、成功状态、haunt value、冷却与特效状态。scripts/standardcomponents.lua:抛出、惊慌等标准MakeHauntable*行为及概率判定。scripts/prefabs/player_common_extensions.lua:鬼魂复活事件与尸体复活事件处理。scripts/components/revivablecorpse.lua:尸体是否可复活、复活速度与复活事件。scripts/prefabs/player_common.lua:复活物品接收、生命惩罚与理智变化;以及复活尸体组件的启用条件。scripts/prefabs/amulet.lua:红色护符通过作祟复活的目标配置。scripts/tuning.lua:作祟冷却、概率、haunt value 与复活相关平衡常量。
试金石
绚丽之门