════════════════════════════════════════════════════════════
RealTrafficV 真实交通模组 v1.3.3（修复版）
崩溃修复与自检说明
════════════════════════════════════════════════════════════

【v1.3.3 更新】
────────────────────────────────────────────────────────────
崩溃日志不生成 → 已修复 + 新增运行痕迹日志：
  ① 路径修复：原日志固定写 DLL 所在目录，GTA5 装在
     Program Files 下会被 UAC 拦截、写失败被静默吞掉 → 日志
     永远不落盘。现在启动时做可写性探测：DLL 目录可写就写
     那里；不可写自动回退到「我的文档\GTA5\RealTrafficV.log」
     （必要时自动创建目录）。
  ② 启动日志写明文件位置：进游戏后日志第一行会打印
     RealTrafficV.log 的完整路径，直接按路径找。
  ③ 新增运行痕迹 [TRACE]：事故登记、玩家碰撞触发（含责任
     判定）、警车生成、追捕警车生成、逃逸报警、打架报警等
     关键事件全部落盘。即使原生层崩溃（脚本 try/catch 捕获
     不到、不会写异常日志），也能从最后一条 TRACE 精确定位
     崩溃发生在哪一步。
  说明：脚本层异常（.NET 异常）会记录 [context] 异常日志；
  原生崩溃不经过 .NET 异常，靠 TRACE 痕迹定位——两者配合
  即可覆盖绝大部分崩溃排查场景。

【v1.3.2 更新】
────────────────────────────────────────────────────────────
撞车事故触发灵敏度：轻轻碰到也算剐蹭。
  原因：原玩家碰撞检测只依赖车辆损坏记录
  （HAS_ENTITY_BEEN_DAMAGED_BY_ENTITY），极轻接触不产生
  损坏记录就会漏掉。
  修复：新增接触检测（IS_ENTITY_TOUCHING_ENTITY）——两车
  碰撞体积正在接触且任一车辆速度>0.2m/s 即视为剐蹭；
  双方静止贴贴（等红灯溜车停稳）不误触发。损坏记录、
  接触剐蹭、近距离任意车碰撞记录三者任一命中即触发事故。

【v1.3.1 更新】
────────────────────────────────────────────────────────────
① 逃逸车"提示逃逸但不动"修复：
   原逻辑里逃逸车处于事故态（每帧被 SET_VEHICLE_FORWARD_SPEED
   压到 0），且又被跟车逻辑当作"前车急刹"刹停 → 车永远开不走。
   新增 AgentState.Fleeing 专用状态：逃逸期间本模组巡航/限速
   逻辑完全不干预，由事故系统每帧强推 DRIVE_WANDER+18m/s，
   追捕结束自动恢复普通巡航。
② 打架后"没有处理结果"修复：
   打完架不再原地走开把车留在路中，改为双方上车驾车离开并
   弹出明确通知；所有事故（私了/打架/逃逸/警察处理）解决后
   新增 6 秒清理倒计时，司机上车动画完成后立即安排离开与
   车辆回收（原逻辑要等事故超时，最长滞留路中 40 秒）。
③ 加载崩溃排查结论：
   v1.3 DLL 经 CLR 级验证健康（可加载、13 类型、118 方法、
   依赖完整、0 解析失败）；v1.3.1 新增代码全部在异常保护内、
   构造器未改，不会在游戏加载阶段执行。
   若装 v1.3 后"加载就崩"，请按下述安装清单排查：
   · RealTrafficV.dll 必须直接放在 GTA5 根目录（与
     ScriptHookV.dll 同级），不能放在子文件夹；
   · 确认根目录已有 ScriptHookVDotNet.asi + ScriptHookVDotNet3.dll
     （官方 Release 包 v3.6.0），且没被旧版/精简版覆盖；
   · 删除根目录里旧版 RealTrafficV.dll（同名覆盖即可），
     确认没有第二份 DLL；
   · 若仍崩溃，把 GTA5 根目录 RealTrafficV.log 发来定位。
   如急需可玩，可先回退 v1.2 安装包（撞警车崩溃为已知问题）。

【v1.3 更新（撞警车崩溃 + 私了/报警触发变低）】
────────────────────────────────────────────────────────────
新增问题定位：两个症状是同一个根因——
  模组生成的警车 / 没有拉警笛的巡逻警车（VehicleClass=18
  应急车辆）被交通管理器当普通车接管：
  · 玩家撞到这类警车 → 事故系统把"警员"当普通司机处理，
    对其强发手机报警/打架/站立任务 → 原生任务系统崩溃；
  · 模组警车在赶往事故点途中被"跟车/限速"逻辑每帧覆盖
    任务（TASK_VEHICLE_DRIVE_TO_COORD 与 SET_VEHICLE_FORWARD
    _SPEED 互相打架）→ 警车到不了现场 → 报警流程频繁以
    "警察未到、双方离开"收场 → 私了/报警"看起来变低"。
修复：
  · TrafficManager：应急车辆（GET_VEHICLE_CLASS==18，警车/
    消防/救护）一律不收集、不管理、不参与事故；
  · AccidentSystem：新增 IsPoliceVehicle 判定；RegisterAccident、
    OnPlayerHitVehicle、OnNpcHitPlayer、DetectPlayerAccident
    四处入口全部拦截应急车辆（双保险）；
  · SpawnPolice / SpawnChasePolice / RoadEvents 救援警车：
    生成后开启警笛（语义真实 + 兜底排除）；
  · 程序集版本升至 1.3.0.0。

一、崩溃根因（v1.2 已修复项）
────────────────────────────────────────────────────────────
原版在"事故双方报警后"游戏崩溃，全部指向 GTA5 原生层。
脚本层异常会被 try/catch 吞进 RealTrafficV.log，而原生崩溃
（动画/任务系统、物理引擎）不会留下任何日志——这是排查时
最迷惑的点。三大高危命中点集中在报警流程：

① 事故司机报警时，对"站在路中被撞倒/死亡"的司机每帧强推
   TASK_USE_MOBILE_PHONE（.Exists() 只校验句柄、不校验生死
   与倒地状态）→ 触发原生动画/任务系统崩溃。
② 警车以 14m/s 直冲被 SET_VEHICLE_FORWARD_SPEED(0) 每帧
   钉死的事故残骸 → 物理冲量环。
③ 玩家按 E 贿赂 / F 接受处理时，ReleasePolice 先标记
   no-longer-needed 再对警车/警员发任务，且漏查
   s.PoliceCar.Exists() → 悬挂句柄崩溃。

次要累积风险：④ REQUEST_MODEL 无配对
SET_MODEL_AS_NO_LONGER_NEEDED（模型越积越多）；⑤ 警车被删
后无限重生；⑥ UpdateBlockedTraffic 中 (s.Position -
veh.Position).Normalized 零向量产生 NaN；⑦ 前车司机不下车
留在车流中。

二、修复清单
────────────────────────────────────────────────────────────
【AccidentSystem.cs】
· 新增 IsPedAlive（IS_PED_DEAD_OR_DYING）/ IsPedRagdoll
  （IS_PED_RAGDOLL）两个存活校验助手；
· 新增 TaskCallPolice：只对健康未倒地的 NPC 派打电话任务；
  新增 TaskHangUp 安全挂断；
· ExitDriver / FaceEachOther / ReturnDriver / UpdateSettle /
  UpdateFight / UpdateFlee / RefuseSettle / CleanupSite /
  OnPlayerHitVehicle 全部加存活校验（对死亡/倒地 ped 一律
  不再派任务）；
· UpdatePolice 重构：警员到场先挂断电话并解禁双方司机；
  警察生成带 6 秒冷却 + PoliceSpawnAttempts<3 上限（杜绝
  无限重生）；SpawnPolice / SpawnChasePolice 改为侧向偏移
  进场、降速至 10m/s、停车距离 3.5f，减少对事故残骸的冲撞；
  模型用毕即 SET_MODEL_AS_NO_LONGER_NEEDED；异常落 CrashLog；
· BribePolice / AcceptPoliceProcessing：先让警员上车离开、
  再 ReleasePolice（顺序不能反），并补 s.PoliceCar.Exists()
  检查（两处都改）；
· UpdateBlockedTraffic：零向量 NaN 兜底（回退用
  -RearVeh.ForwardVector / WorldNorth）；
· RegisterAccident：前车也进入 AgentState.InAccident（防止
  AI 把被撞车开走）。

【RoadEvents.cs】
· 碰瓷者模型用毕释放；
· UpdatePedInjuries 各阶段加 IS_PED_DEAD_OR_DYING 保护；
· SpawnInjuryResponse 模型释放 + 异常落日志；
· HandleScamInput：F 键反击前对碰瓷者/玩家加死亡保护。

【VehicleAgent.cs】
· UpdateInAccident 仅在 Vehicle.Speed > 0.5f 时才校正为 0
  （减少与警车冲量的对抗，消除物理崩溃环）。

【RealTrafficV.cs】
· Aborted（脚本卸载）时同时清理 Accidents 与 Events
  （原版只清事故，行人事件残留句柄）。

三、自检结果
────────────────────────────────────────────────────────────
· 全量源码编译通过（mcs，C# 7.2，引用 ScriptHookVDotNet3
  3.6.0 官方 Release 程序集）；
· 残留高危模式扫描：所有 TASK_USE_MOBILE_PHONE /
  TASK_STAND_STILL / TASK_COMBAT_PED / 警员 DRIVE_WANDER
  调用均已收敛到存活校验之后；Normalized 零向量均有兜底；
· 程序集元数据校验：RealTrafficV v1.2.0.0，117 个方法全部
  可解析，引用 ScriptHookVDotNet3 3.6.0；
· 剩余 3 个编译警告均为原代码遗留的无用变量（targetPed、
  _scammers、_rnd），非本次修改引入，不影响运行。

四、安装与运行环境（重要）
────────────────────────────────────────────────────────────
· 覆盖安装：把 RealTrafficV.dll 放入 GTA5 根目录即可
  （删除/覆盖旧版 DLL）；
· 本模组需要 ScriptHookVDotNet3（SHVDN）3.6.0 及以上版本，
  注意：必须使用官方 GitHub Release 包
  （ScriptHookVDotNet.zip，内含 ScriptHookVDotNet3.dll +
  ScriptHookVDotNet.asi），而不是 NuGet 包——NuGet 包只有
  加载器、没有 GTA API；
· 若以前用的是旧版 SHVDN（Legacy 版 / ScriptHookVDotNet2），
  请一并更新，否则新版模组无法加载。

五、源码重新编译（可选）
────────────────────────────────────────────────────────────
· 源码在 源码/ 目录，工程文件 RealTrafficV.csproj 已指向
  PackageReference ScriptHookVDotNet3 3.6.0；
· 用 Visual Studio 打开 csproj 还原后直接 Build 即可；
· 命令行方式（Linux/mono）：
  mcs -target:library -out:RealTrafficV.dll \
      -r:System.Windows.Forms \
      -r:ScriptHookVDotNet3.dll \
      -langversion:7.2 源码/*.cs

════════════════════════════════════════════════════════════
