Skip to content

SPT Realism Mod - 客户端

字数
6113 字
阅读时间
25 分钟

NOTE

这是 SPT Realism Mod客户端部分,需要配合服务端模组一起使用。 兼容 SPT 3.11.4 版本。


一、项目概述

SPT Realism Mod 是一款为离线版逃离塔科夫(SPT-AKI)打造的综合性玩法大修模组。它通过超过 120 个 Harmony 补丁,深度修改了 EFT 原版的武器后坐力、弹道学、医疗系统、换弹机制、武器姿态、音频(听力损伤)、危险区环境、装备系统等诸多核心玩法,使游戏趋近于现实军事模拟体验。

核心设计理念

  1. 完全替换而非修补 -- 模组使用 Harmony Prefix + return false 模式,彻底绕过 BSG 原版逻辑,用自身的物理/数学模型重新计算所有相关数值,而非在原版基础上微调参数。
  2. 数据驱动 -- 所有武器属性、弹药参数、药品效果、危险区配置均通过服务端传输的 JSON 数据驱动,客户端不硬编码游戏内容数据。
  3. 仅影响本地玩家 -- 大部分补丁通过 player.IsYourPlayer 守护,确保只修改本地玩家的游戏体验,不影响 AI/PvE 的行为(但 AI 弹道和装甲穿透仍受影响,因为 Patch 是全局替换)。

版本信息

属性
客户端版本1.6.3
程序集版本0.14.8
目标框架.NET Standard 2.1
模组平台BepInEx 5
兼容版本SPT 3.11.4
许可证CC BY-NC-ND 4.0

二、项目架构

2.1 目录结构

RealismMod/
  Plugin.cs                    -- 入口点,加载与管理所有子系统
  PluginConfig.cs              -- BepInEx 配置绑定(200+ 配置项)
  ConfigurationManagerAttributes.cs -- 配置管理器 UI 属性
  RealismMod.csproj            -- .NET Standard 2.1 项目文件

  Ballistics/                  -- 弹道学与穿透系统
  Weapons/                     -- 武器后坐力/换弹/故障/动画
  Health/                      -- 医疗/药品/伤害/肾上腺素/毒性/辐射
  Player/                      -- 玩家姿态/移动/听力损伤/状态管理
  Gear/                        -- 装备系统(防毒面具/NVG/防弹衣/装置)
  Audio/                       -- 环境音/防毒面具呼吸/盖革计数器
  GameWorld/                   -- 危险区系统(辐射/毒气/安全区/任务区)
  Stats/                       -- 武器属性计算/UI 显示/模板数据
  Controls/                    -- 输入拦截(姿态/架枪/手动装膛)
  VisualEffects/               -- 屏幕后期特效
  SpecialEffects/              -- 核爆视觉特效
  ToolsAndUtils/               -- 工具类/调试/Zone 编辑器
  data/                        -- 危险区 JSON 配置

2.2 技术架构

SERVICE LAYER (SPT Server)
  |
  | JSON over HTTP
  v
Config / Template Data / Mod Settings
  |
  v
BepInEx Plugin Entry (Plugin.cs)
  |
  +--> Harmony Patches (120+ patches)
  |      |
  |      +--> BallisticsPatches   (12 patches)
  |      +--> WeaponPatches       (30+ patches)
  |      +--> HealthPatches       (20+ patches)
  |      +--> PlayerPatches       (25+ patches)
  |      +--> GearPatches         (5 patches)
  |      +--> AudioPatches        (10+ patches)
  |      +--> GameWorldPatches    (10+ patches)
  |      +--> StatsPatches/UIPatches (20+ patches)
  |
  +--> Static Controllers (business logic)
  |      |
  |      +--> BallisticsController   -- 弹道数学模型
  |      +--> ShootController        -- 自定义后坐力引擎
  |      +--> ReloadController       -- 换弹速度计算
  |      +--> StanceController       -- 武器姿态状态机
  |      +--> RealismHealthController-- 医疗/药品/毒性控制器
  |      +--> GearController         -- 装备检查与修正
  |      +--> DeafenController       -- 听力损伤模拟
  |      +--> StatCalc               -- 武器属性计算引擎
  |
  +--> Monobehaviour Components (runtime objects)
         |
         +--> MountingUI              -- 架枪指示器 HUD
         +--> RealismWeatherController-- 事件天气
         +--> RealismAudioController  -- 音频管理
         +--> GasZone / RadiationZone -- 危险区碰撞体
         +--> PlayerZoneBridge        -- 玩家-危险区交互桥接

2.3 Harmony 补丁模式

所有补丁采用 [PatchPrefix] + return false; 模式,原因是 EFT 的原版方法常常包含大量互相关联的副作用,简单叠加 Postfix 会导致双倍计算或不一致。完全替换可以:

  • 确保模组的逻辑是唯一生效的计算路径
  • 避免与原版逻辑冲突(如双重穿甲计算、双重后坐力叠加)

代价是模组必须重新实现被替换方法的所有逻辑路径,包括边界情况和原版所有可能的代码分支,维护成本较高。


三、各子系统详解

3.1 弹道学系统

负责替换 EFT 原版的穿透、伤害、装甲耐久度、跳弹、碎片效应和布娃娃物理。

命中区域 (Hit Zones)

将身体精细划分为 6 个命中区域(A/C/D/心脏/脊椎/未知)和 6 个方向(正面/背面/左/右/上/下),使用碰撞网格的本地空间坐标和命中法线进行分类。不同区域有独立的伤害倍率和出血概率加成。

额外的肢体细分包括:大腿、小腿、前臂、上臂、骨盆、颈部、头部,各有独立的伤害/出血修正。

穿透系统

自定义穿透公式,使用装甲阻力、真实耐久度百分比和材料类型:

  • 钛(Titan)/铝(Aluminium) 获得 1.5 倍耐久缩放
  • 钢制身体装甲始终 100% 耐久计算
  • 随机穿透判定(shot.Randoms.GetRandomFloat
  • "应该被挡住" 规则:耐久 >= 90% 且 armorResist - penPower >= 5

装甲伤害/耐久

使用动量模型代替原版公式:momentum = 质量 * 速度

  • 装甲等级缩放:armorClass^2 * sqrt(duraPercent)
  • 材料特定行为:ArmorSteel(钢甲)、Aramid(芳纶)、Ceramic(陶瓷)、UHMWPE(超高分子量聚乙烯)、Combined(复合材料)、Titan(钛)、Glass(玻璃)
  • 穿甲后减伤:CalcAfterPenStats 根据装甲等级/耐久比降低穿过的伤害和穿透力

碎片效应 (Spalling)

当非霰弹、非近战攻击击中躯干并被装甲阻挡时触发碎片效应,模拟装甲背板碎裂后碎片对身体的二次伤害。碎片伤害由动能、穿透修正装甲等级、碎裂概率和防碎片减少量决定,并随机分布到身体各部位。

击倒与缴械

  • 缴械:根据子弹动能和命中部位(前臂被击中概率翻倍),有几率使目标掉落武器
  • 击倒:腿部中弹且血量归零时,有几率强制切换至匍匐姿态
  • 两者均可针对玩家/Bot 独立开关

命中音效

新增 6 种装甲材料命中音效(芳纶/陶瓷/聚乙烯/钛钢/玻璃/默认)和 3 种跳弹变体,区分近距离/远距离播放。

装甲板碰撞体修改

通过 ModifyPlateColliders 调整装甲板碰撞体尺寸(胸部、背部、侧面、胸部顶部),使命中判定更贴近真实装甲板形状。


3.2 武器系统

后坐力系统

模组最核心的子系统之一。完全替换 EFT 原版的后坐力计算,采用自研物理模型:

  1. 参数初始化 (RecalcWeaponParametersPatch):武器切换时,计算基础垂直后坐力/水平后坐力/相机后坐力/收敛速度/散布基础值,并设置 BSG 后坐力系统的底层参数(阻尼、强度、速度等)
  2. 每发子弹计算 (AddRecoilForcePatch):
    • 伤病修正(黑腿/断臂/骨折/疼痛)
    • 姿态修正(低姿/高姿/短托/主动瞄准)
    • 体重修正(负重影响)
    • 架枪修正(架枪大幅降低后坐力)
    • 射击计数修正(连射惩罚递增)
    • 分解为 vertFactor / horzFactor / dispFactor / camFactor
  3. 每帧插值 (ShootController):通过收敛速度(Convergence)对目标旋转进行缓动插值,实现枪口复位视觉效果
  4. 归零偏移 (Zero Shift):持续射击时,瞄具根据后坐力强度和瞄具精度随机产生瞄准点偏移

视觉后坐力:模组同时叠加了两层视觉后坐力 -- Realism 自定义视觉后坐力 + 可选的 BSG 原版视觉后坐力 -- 使武器在射击时呈现更真实的抖动效果。

换弹系统

完整覆盖所有换弹流程,根据每个武器的配件属性(人机工学/弹匣重量/枪托/握把等)、玩家状态(伤病/负重/技能/体力)和当前姿态(高姿/主动瞄准)计算换弹速度:

换弹速度 = Clamp(
    武器换弹速度修正 * 弹匣重量因子 * 枪托修正 * 负重因子
    * 技能修正 * 伤病修正 * 姿态buff * 手臂体力修正
    * 装备修正 * 肾上腺素加成 * 全局倍率,
    0.7f, 1.4f(常规) / 1.65f(快速)
)

不同换弹类型(标准/快速/内部弹仓/转轮/管式弹仓/霰弹枪逐发装填)各有独立的速度计算路径。

手动装膛 (Manual Chambering)

模拟真实枪械操作:空膛时不会自动装填,玩家需要在弹匣有弹时按检查枪膛键手动将一发弹从弹匣推入枪膛。系统涉及一系列补丁链:

  • 拦截装备武器逻辑,阻止自动装膛
  • 从弹匣退一发弹到枪膛(弹药计数修正)
  • UI 显示膛内弹药信息
  • 强制弹药兼容性检查在操作期间放行

武器故障系统

完全替换故障概率计算:

故障率 = (武器基础故障率 + 消音器因子)
    * 耐久度故障率 ^ N (N 取决于耐久档位)
    * 过热故障率 ^ 3
    * 弹药故障率 * 弹匣故障率
    * 射击计数因子 * 射速因子
    * 故障防护 * 全局倍率

额外功能:

  • 弹药不兼容检测(.366 弹装入 7.62x39 枪械、.300BLK 装入 5.56 枪械等)
  • 爆炸性故障:特定低质量弹药(如 9x18 PM 弹)在低耐久枪械中可能引发炸膛
  • 禁用 Boss 强制故障机制
  • 治疗 BSG 原版已知故障类型检测问题

程序化动画

全面替换 EFT 的程序化武器动画系统(PWA):

  • 瞄准速度:根据人机工学、姿态、伤病、负重、装备重量综合计算
  • 呼吸晃动:完全替换 BreathEffector.Process,支持姿态/伤病/体力修正
  • 武器晃动/惯性:替换 UpdateSwayFactors,根据武器重量、人机工学、操控性计算位移和惯性
  • 相机后坐力:阻止相机跟随枪口,稳定瞄准画面
  • 归零偏移(瞄具):红点和光学瞄具在射击时出现归零漂移

枪口特效 (Muzzle Effects)

根据弹药速度差异、枪口装置数据、武器系统类型(导气式/活塞式)、环境类型(室内/室外)、武器耐久度和热量、弹药口径校准系数等因素,动态调整枪口火焰、烟雾、火花的视觉表现。


3.3 健康系统

药品系统

12+ 种药品类型(止痛药/止痛针/医疗包/手术包/夹板/止血带/凡士林/药丸/酒精/食物等),每种药品有独立的强度/持续时间/延迟/回血量/止痛强度/隧道视觉强度等属性。

战局内使用:经过完整的验证链(物品可用性 > 身体部位检查 > 装备阻挡检查 > 止血带兼容性检查 > 双击解除穿戴检查) 战局外使用:通过 MedEffectStartedPatch 直接操作 HealthControllerClass

自定义效果系统

模组定义了 ICustomHealthEffect 接口和 13+ 种自定义效果:

效果类型功能
TourniquetEffect对肢体施加持续伤害(模拟止血带压迫),10 秒后止血
SurgeryEffect缓慢回血至上限,施加疼痛惩罚,自动移除止血带效果
HealthRegenEffect通用回血,按 DamageTracker 记录扣减
PassiveHealthRegenEffect按水/能量比例和技能自动回血
PainKillerEffect增加止痛强度,持续时间结束后递减
FoodPoisoningEffect食物中毒:资源消耗 + 隧道视觉/脑震荡/颤抖
ResourceRateEffect修改资源消耗率
AdrenalineEffect肾上腺素效果
ToxicityEffect毒性累积 HP 伤害(9 级分级)
RadiationEffect辐射累积 HP 伤害 + 随机轻出血
DetoxificationEffect解毒处理
RadationTreatmentEffect辐射治疗

肾上腺素系统

受到子弹/钝器/近战/狙击伤害时触发。效果包含:

  • 正面:移动速度/换弹/姿态切换/开镜加速
  • 负面:颤抖(Tremor),随时间消失
  • 冷却时间基于抗压技能

刺激物/过量系统

12 种刺激物按类型分组(肾上腺/再生/伤害/凝血/体温/性能/通用/负重)。同类型使用超过 1 个时触发过量定时器,10 秒后施加 debuff。过量后阻止冲刺和战术冲刺。

受伤状态对移动的影响

根据各身体部位 HP 百分比、能量/水分百分比、骨折/零血/疲劳/脱水/中毒/毒性/辐射状态,计算 9 个运动乘数:

  • 瞄准移动速度 / ADS / 姿态切换 / 换弹速度
  • 冲刺速度 / 行走速度 / 体力恢复 / 人机工效 / 后坐力影响

装备阻挡治疗

头盔/耳机/面罩/防弹衣/战术背心阻挡对应身体部位的治疗。面罩/NVG 遮挡口部时阻止进食/吃药。双击装备移除热键可快速脱下阻挡装备。


3.4 音频系统

环境音效

AmbientAudioComponent 动态生成 3D 音源,随机播放环境音效片段(15-90 秒间隔,45-95 米范围),音量根据室内/室外/BTR 内部状态自动调整。

防毒面具

  • 呼吸音效基于玩家健康状态(健康/受伤/重伤/濒死),使用不同呼吸音频片段
  • 对玩家语音施加低通滤波效果

危险检测器

  • 盖革计数器:7 级辐射强度,每级 4 个音频变体,声音频率随辐射强度升高
  • 气体分析仪:计时蜂鸣,音高/频率随毒性浓度升高
  • 均可通过快捷键静音

枪声与移动音量

  • 全局枪声音量修正
  • 射速变化时的音调修正
  • 移动音量分离:玩家/ NPC/ 共享移动音量各自独立控制
  • ADS 时音效降低

听力损伤系统 (Deafening)

模拟射击和爆炸对听力的影响:

  • 玩家射击:根据弹药速度 * 后坐力 + 消音/亚音速因子计算致聋强度
  • 附近 Bot 射击:根据距离 + 口径计算
  • 爆炸/手榴弹:根据距离 + 护耳 + 室内加成计算
  • 护耳:头盔致聋等级 + 耳机降噪分贝数
  • 效果:主音量降低 + 音频模糊 + 画面暗角,随时间逐渐恢复
  • 耳机增益:可通过快捷键 +/- 独立调整耳机增益

3.5 武器姿态与移动

武器姿态系统 (Stances)

7 种武器姿态,通过按键或滚轮切换:

姿态说明
低姿 (Low Ready)枪口朝下,快速切换至瞄准。CQB 首选
高姿 (High Ready)枪口朝上,换弹速度加成,通过低矮空间
短托 (Short Stock)缩短持枪长度,通过狭窄空间
主动瞄准 (Active Aiming)动态瞄准姿态,枪口随鼠标微移
巡逻姿态 (Patrol Stance)放松持枪,节省体力
手枪压缩 (Pistol Compressed)手枪近身快速射击姿态
近战姿态 (Melee Stance)枪托攻击/刺刀冲锋

每种姿态有独立的:

  • 位置偏移和旋转(Lerp/Slerp 缓动过渡)
  • 手臂体力消耗/恢复速度
  • 武器操控性修正(影响晃动和后坐力)
  • 第三/第一人称动画效果

架枪系统 (Mounting)

通过射线检测和碰撞检测实现武器抵靠掩体/地面/墙壁的架枪效果:

  • 双足架(bipod)完全展开时锁定旋转范围
  • 大幅降低后坐力和晃动
  • HUD 方向指示器显示可架设方向
  • 强制低姿配合重型武器(机枪)

移动速度

  • 地面材质影响:混凝土/草地/金属/玻璃/土路等不同材质有独立的速度修正
  • 坡度影响:上坡/下坡的速度变化
  • 武器重量影响:不同武器类型和装备重量影响移动速度
  • 冲刺加速度:替换原版,根据装备/武器/坡度/材质/姿态计算
  • 射击中移动速度惩罚
  • 战术冲刺:比常规冲刺快 15%

体力系统

  • 腰部射击姿势体力消耗与恢复
  • 冲刺体力消耗与恢复
  • 负重惩罚:超重时技能经验获取降低
  • 手臂体力:不同姿态有独立的消耗/恢复速度

3.6 装备系统

防毒面具

  • 自动/手动检测并穿戴防毒面具
  • 滤罐耐久度消耗:根据所处危险区强度、包裹中有毒/放射性物品等因素综合计算
  • 防护系数:滤罐剩余耐久度 * 装甲耐久度因子
  • 呼吸阻力音频效果 + 语音低通滤波

防弹衣/头盔

  • 自定义物品属性(舒适度/毒气防护/辐射防护/防碎片/钝伤穿透率)
  • 防弹衣/背包/头盔/面罩的人机工学和速度惩罚
  • 装备重量舒适度修正

部署装置

  • 危险品分析仪:可放置在地面,采样分析所在区域的毒素/辐射数值。含启动动画和故障概率
  • 发射器:任务装置,校检日期/时间/位置/节日条件后触发爆炸和任务触发器

3.7 危险区系统

动态生成辐射区、毒气区、安全区、任务区和可交互物件。

数据驱动

所有危险区在 JSON 文件中定义,按地图组织(海关/工厂/实验室/储备站/森林/海岸线/立交桥/灯塔/街区/塔科夫街道/GZ 等),支持概率生成和任务条件解锁/阻塞。

区类型

类型功能
辐射区 (RadiationZone)距离衰减辐射强度,带视觉粒子效果
毒气区 (GasZone)距离衰减毒气强度,带视觉粒子效果,支持阀门交互
安全区 (LabsSafeZone)门关闭且密封时提供全面防护,含 HVAC 音效
任务区 (QuestZone)玩家进出检测触发器
交互区 (InteractionZone)阀门旋转/按钮按压,控制关联毒气区强度
资产区 (AssetZone)危险区内的装饰物/容器/光源生成

玩家交互桥接 (PlayerZoneBridge)

挂载在每个玩家身上:

  • 追踪玩家所在区数量(辐射/毒气/安全)
  • 累积所有区的暴露速率
  • 安全区提供全面防护
  • 在危险区中生成时将玩家传送到最近安全生成点
  • Bot 每 10 秒检查防毒面具并承受伤害

游戏世界事件

  • 毒气事件:随机雾浓度/云密度漂移
  • 辐射事件:放射性降雨强度随机变化
  • 爆炸事件:暴雨/闪电/浓云
  • 爆炸前兆:温和但持续的天气

持久化

玩家的累计毒性和辐射值以 ProfileID 为键存储在 JSON 文件中,完成特定任务后清零。


3.8 武器属性计算与 UI 显示

属性计算引擎 (StatCalc.cs)

核心数学引擎,计算所有武器的最终属性:

  • 人机工学:所有配件 ERGO 累加 + 枪托折叠惩罚 + 基础值
  • 后坐力:配件水平/垂直后坐力 Delta 累加 + 抑制器/重量/力矩因子
  • 散布:RecoilAngle +/- Dispersion 范围内的散布基础值
  • 收敛速度:手枪/步枪分开乘数
  • 阻尼:后坐力衰减速度
  • 平衡:武器前后重量分布(影响枪口上跳角度)
  • 操控性:武器长度/姿态综合修正

300 多行的 ModConditionalStatCalc 方法处理特殊配件交互:

  • 折叠枪托的惩罚
  • 缓冲管/枪托适配器
  • 消音器在短枪管上的惩罚
  • 泵动式握把
  • SIG 锥形制退器适配器
  • 各种特殊配件的条件性属性

口径效果映射

5 个独立的 switch 语句将口径字符串映射为枪口视觉效果参数:

  • 烟雾量 (CaliberSmoke)
  • 火焰量 (CaliberFlame)
  • 火花量 (CaliberSparks)
  • 枪口焰 (CaliberMuzzleFlash)
  • 声音响度因子 (CaliberLoudnessFactor)

UI 覆盖

大量补丁覆盖 EFT 的物品属性 UI:

  • 护甲等级字符串显示
  • 弹药面板(热量/碎片概率/弹道系数/故障率/耐久度消耗)
  • 武器配件属性(后坐力/操控性/散布/精度/射速/换弹速度)
  • 自定义图标(平衡/后坐角度)
  • 属性 Delta 显示(配件前后对比值)

四、配置系统

模组通过两层配置生效:

服务端配置 (ServerConfig)

通过 HTTP 从服务端获取,控制功能总开关:

  • recoil_attachment_overhaul -- 后坐力/附件大修
  • realistic_ballistics -- 真实弹道学
  • med_changes -- 医疗系统修改
  • enable_stances -- 武器姿态系统
  • headset_changes -- 听力损伤系统
  • movement_changes -- 移动系统修改
  • gear_weight -- 装备重量系统
  • malf_changes -- 故障系统修改
  • reload_changes -- 换弹系统修改
  • enable_hazard_zones -- 危险区系统
  • manual_chambering -- 手动装膛
  • food_changes -- 食物系统修改

客户端配置 (PluginConfig)

通过 BepInEx ConfigurationManager 暴露 200+ 个可调参数,涵盖:

  • 后坐力强度/散布/相机后坐力/收敛/阻尼的各种倍率
  • 换弹速度全局倍率(手枪/步枪/霰弹枪分开)
  • 弹道学装甲耐久/阻力/伤害倍率
  • 危险区装置音量/面罩呼吸音量
  • 听力损伤恢复速度
  • 装备阻挡治疗/进食
  • 姿态过渡速度/旋转速度/位置偏移
  • 各种调试开关

五、构建与安装

前置条件

  • .NET Framework 4.7.2+ / .NET Standard 2.1 SDK
  • SPT 3.11.4 安装目录
  • BepInEx 5.x

构建

bash
dotnet build -c Release

输出路径通过 .csproj 中的 <OutDir> 配置,默认为 SPT 安装目录的 BepInEx\plugins\

安装

  1. 将构建产物 RealismMod.dll 放入 BepInEx\plugins\Realism\
  2. bundles\sounds\icons\masks\ 目录放入 BepInEx\plugins\Realism\
  3. data\ 目录放入 user\mods\RealismMod\
  4. 确保服务端 Realism Mod 已正确安装并配置

依赖

  • BepInEx 5.x
  • SPT-AKI (3.11.4)
  • spt-reflection
  • spt-common
  • Newtonsoft.Json
  • Unity 2021.3.x (运行时,由 SPT 提供)

六、外部参照


"Preparing for the Future!" -- Vault-Tec Corporation

贡献者

The avatar of contributor named as SamuelNOTCuriousMeow SamuelNOTCuriousMeow

文件历史

撰写