覆盖与一致性审计
本页记录本 Wiki 的审计过程与结果:覆盖了什么、有意排除了什么、哪些结论证据不足、审计中发现并修正了哪些问题,以及哪些验证没有执行。它不是“已全面分析”的声明。
返回 首页。
1. 快照、范围与日期#
| 项 | 值 |
|---|---|
| 源码 | D:\Code\CSGO\Counter-Strike-Global-Offensive,提交 f82112a2388b841d72cb62ca48ab1846dfcc11c8(2020-04-23);共 21 个提交,最早为 2020-04-22 的 Initial commit 与 CS:GO Source |
| 跟踪文件 | 14,245 个(git ls-files);73 个顶层目录 |
| 工作区差异 | 存在未跟踪目录 docs/(内含一份既有中文结构报告);本 Wiki 未把它当作证据,只以源码为准 |
| 审计日期 | 2026-10-31(第一轮与第二轮同日完成,第二轮记录见第 8 节) |
| 范围 | csgo_partner 构建组的运行时主路径 + CS:GO 玩法 + 地图编译器 + 其余内容工具入口;Windows PC 客户端与 Windows/Linux 专用服务器为主线 |
2. 机械检查(已执行)#
| 检查 | 结果 |
|---|---|
| 源码引用存在性与行号范围 | 49 个正文页面 + 首页 + 本页的约 4,100 条引用全部由脚本逐条校验:文件存在、起止行在文件范围内;校验时同时输出每条引用首行内容用于人工抽查 |
| Wiki 内部链接 | 无断链(只校验目标文件存在,不校验页内锚点) |
| 孤立页面 | 无(每个页面都能从首页或父页面到达) |
| 占位符 | 无未转换的引用占位符 |
| 文本损坏扫描 | 第二轮发现第一轮因 shell 弯引号转义损坏了 6 处句子,已全部修复(见第 8 节);另用“行尾无标点”“同一短语重复”“弯引号不配对”三种规则扫描全部页面,未再发现损坏 |
| 密钥 | 未复制任何密钥;仓库中被置空的主服务器公钥仅以“已置空”事实提及(engine/net_ws.cpp:4567);统计校验种子、武器脚本密钥等硬编码常量只说明用途,不复制值 |
链接与行号有效不等于语义正确;语义层面的检查见第 5、6 节。
3. 反向盘点覆盖矩阵#
以“需要理解的职责或运行入口”为单位,从顶层目录与入口重新盘点(不依赖页面树)。
3.1 进程入口与注册点#
| 对象 | 类型 | 对应页面 | 状态 |
|---|---|---|---|
launcher_main WinMain / POSIX main | 进程入口 | 客户端启动链 | 已覆盖 |
launcher LauncherMain | DLL 入口 | 客户端启动链 | 已覆盖 |
dedicated_main / dedicated DedicatedMain | 进程入口 | 专用服务器 | 已覆盖 |
CEngineAPI::Run、CDedicatedServerAPI::ModInit/RunFrame | 引擎入口 | 客户端启动链、专用服务器 | 已覆盖 |
CreateInterface / EXPOSE_* | 模块注册 | 接口工厂 | 已覆盖 |
IServerGameDLL、IServerGameClients、IServerGameEnts、IBaseClientDLL | 游戏 DLL 契约 | 游戏 DLL 契约 | 已覆盖 |
LINK_ENTITY_TO_CLASS、地图实体解析 | 实体注册 | 实体系统 | 已覆盖 |
IGameSystem / CAutoGameSystem | 隐式注册 | 实体系统 | 已覆盖 |
| ConVar/ConCommand 注册、命令缓冲与权限 | 隐式注册 / 分派 | 基础库层、输入与命令 | 已覆盖 |
客户端发来的 net_StringCmd | 网络命令入口 | 输入与命令 | 已覆盖(第二轮) |
| 无连接包:A2S 查询、RCON、挑战 | 网络入口 | 服务器运维面 | 已覆盖(第二轮) |
| 游戏事件、用户消息 | 事件分发 | 实体系统、网络通道 | 已覆盖 |
SendTable/RecvTable、IMPLEMENT_SERVERCLASS/CLIENTCLASS | 网络注册 | 实体复制 | 已覆盖 |
实体 vscripts 键值与 RunScriptCode 等输入 | 脚本入口 | VScript | 已覆盖(第二轮) |
响应规则 Speak / 无线电命令 | 台词分派 | 场景与响应规则 | 已覆盖(第二轮) |
工具 main:vbsp/vvis/vrad | 工具入口 | 地图编译器 | 已覆盖(函数级,第二轮) |
工具 main:vtex/studiomdl/shadercompile、Hammer | 工具入口 | 内容工具链 | 已覆盖(入口级) |
3.2 顶层目录#
| 目录 | 对应页面 | 状态 | 说明 |
|---|---|---|---|
appframework、interfaces | 接口工厂 | 已覆盖 | |
tier0~tier3、vstdlib、mathlib | 基础库层 | 已覆盖 | 职责级;未逐个分析容器与数学实现 |
launcher_main、launcher | 客户端启动链 | 已覆盖 | |
dedicated_main、dedicated | 专用服务器、VGUI 与本地化 | 已覆盖 | VGUI 管理界面见 VGUI 页第 6 节;工程脚本引用的 Tracker/AdminServer 目录不在仓库中(证据不足) |
engine、engine_ds | 引擎 及子页 | 已覆盖 | 第二轮补入 audio/、voice_codecs/、输入/命令、服务器运维、VGUI 面板、世界渲染;engine_ds 产物与 srcds 实际加载的 engine 模块的关系未闭环(N1) |
game/client、game/server、game/shared(含 cstrike15) | 游戏 DLL、CS:GO 及子页 | 已覆盖 | 其他游戏子目录(hl2、portal* 等)有意排除 |
game/server/nav_*、game/*/cstrike15/bot | 导航网格、Bot 决策 | 已覆盖(第二轮) | 网格编辑器、合并/简化算法、NextBot(CS:GO 未使用)、合作模式专用逻辑有意排除;未编译的旧副本已在页内标注 |
game/client 视图渲染(viewrender、clientshadowmgr、glow_outline_effect 等) | 客户端视图渲染管线 | 已覆盖(第二轮) | DetailObjectSystem、ClientLeafSystem 内部未展开 |
game/shared/econ | 物品与经济 | 已覆盖(U1 未决) | 见第 4 节 |
matchmaking、gcsdk | 匹配与 GC | 已覆盖 | 其他游戏的标题适配目录排除 |
materialsystem | 材质系统 | 已覆盖 | 第二轮补入材质代理、渲染目标分配、纹理加载;ps3gcm、各 Shader 实现、togl 未展开 |
studiorender、bonesetup、particles | 模型、动画与粒子 | 已覆盖 | 第二轮补入快速路径、LOD、flex |
引擎世界渲染文件(gl_rsurf、gl_lightmap、r_areaportal、staticpropmgr、shadowmgr、disp_* 等) | 引擎世界渲染 | 已覆盖(第二轮) | brushbatchrender、buildcubemaps、顶视图未展开 |
soundsystem、soundemittersystem | 引擎音频管线 | 已覆盖(第二轮) | Miles SDK 缺失;DSP 算法、混音组未展开 |
avi、videocfg | 语音与视频 | 已覆盖(第二轮) | 第一轮把 videocfg 归为视频是错的,它是显示设置配置(videocfg/videocfg.cpp:3);Bink SDK 缺失 |
inputsystem | 输入与命令 | 已覆盖(第二轮) | 手柄死区、IME、输入上下文栈未展开 |
vgui2、vguimatsurface、localize | VGUI 与本地化 | 已覆盖(第二轮) | 控件库见下方排除行 |
responserules、choreoobjects、scenefilecache | 场景与响应规则 | 已覆盖(第二轮) | 第一轮的排除理由“CS:GO 玩法依赖小”不成立(K30);choreoobjects/ 目录只有 vpc,源码在 game/shared(choreoobjects/choreoobjects.vpc:20-29) |
filesystem、vpklib、datacache | 文件系统与缓存 | 已覆盖 | 第二轮补入异步 I/O 与 QueuedLoader(PC 上不生效) |
datamodel、dmserializers、dmxloader | DataModel 与 DMX | 已覆盖 | 属性类型系统、撤销栈未展开 |
vscript | VScript | 已覆盖 | 第二轮补入实体脚本作用域与客户端 VM;各语言运行时未展开 |
utils/vbsp、utils/vvis、utils/vrad | 地图编译器 | 已覆盖(函数级,第二轮) | utils/vmpi 只有头文件与预编译库,分布式行为无法验证 |
hammer、hammer_launcher、fgdlib、其余 utils、tools | 内容工具链 | 已覆盖(入口级) | studiomdl、vtex、shadercompile 内部算法未展开 |
scaleformui | HUD | 已覆盖 | SDK 缺失 |
vpc_scripts、devtools、lib、CreateSolution.bat | 构建 | 已覆盖 | |
common(协议与辅助) | 网络通道 | 已覆盖(协议部分) | 其中第三方 SDK 子目录排除 |
public | 多页(接口头文件) | 已覆盖(按需引用) | 作为契约中心被引用,未单独成页 |
unittests、unitlib | 概览 | 已覆盖(缺失事实) | 只有 1 个跟踪测试文件 |
README.md、aREADTHEREADME、根目录提示文本 | 概览、物品与经济 | 已覆盖 | README 与代码存在差异(K15) |
thirdparty、external、dx9sdk、dx10sdk | — | 有意排除 | 第三方代码 |
serverbrowser、tracker、VGUI 控件库(vgui_controls、dme_controls、matsys_controls、game_controls)、vlocalize | VGUI 与本地化(仅提及) | 有意排除 | 服务于引擎面板与工具,不在 CS:GO 玩法主路径 |
响应规则编辑工具(responserules_cli、ResponseEditor) | — | 有意排除 | 离线工具 |
fow、raytrace、bitmap、vtf、resourcefile、togl、materialobjects、mdlobjects、movieobjects、mdllib、meshutils、fbxutils、dmeutils、dmxeditlib | — | 有意排除 | 支撑库或工具侧对象库,只做存在性确认 |
docs(未跟踪) | — | 不适用 | 非源码,未作为证据 |
3.3 机制级盘点(第二轮新增)#
| 对象 | 对应页面 | 状态 | 说明 |
|---|---|---|---|
| 实体句柄序列号、实体列表、edict 复用、空间分区 | 实体句柄与实体列表 | 已覆盖 | 体素树算法未展开 |
CVerifiedUserCmd、预测存储槽与误差平滑 | 预测内部机制、输入与预测 | 已覆盖 | |
LagRecord 动画层与姿态参数 | 延迟补偿 | 已覆盖 | |
| 观战、接管 Bot、教练、投票、成就统计、MVP、人质 | 玩家外围系统 | 已覆盖 | 客户端观战 HUD、人质跟随寻路未展开 |
| 刀、电击枪、霰弹枪、左轮、连发、消音器、开镜、客户端弹道特效 | 特殊武器机制 | 已覆盖 | 双枪、机瞄内部、开镜遮罩 HUD 未展开 |
| 存档/读档 | 实体系统 | 有意排除 | 引擎在多人游戏中拒绝存档 |
point_template | 实体系统 | 证据不足 | 仓库没有地图文件,无法确认 CS:GO 地图用法 |
sv_log、sv_uploaddata、Steam P2P 伪套接字 | 服务器运维面(仅提及) | 有意排除 | |
内容文件(.nav、BotProfile.db、BotChatter.db、response_rules.txt、scenes.image、声音脚本、物品 schema、GameModes.txt) | 各相关页 | 证据不足 | 仓库中不存在,只能描述加载与使用机制 |
3.4 状态计数#
按上表统计:入口/注册点 17 项全部“已覆盖”(1 项为入口级);目录行 34 行中“已覆盖”29 行(其中 1 行 U1 未决、1 行仅缺失事实、1 行入口级)、“有意排除”4 行、“不适用”1 行;机制级 9 项中“已覆盖”5 项、“有意排除”2 项、“证据不足”2 项。没有被判定为“遗漏”的核心对象。这只是盘点项的计数,不代表语义覆盖率。
4. 证据不足与未决问题#
4.1 第一轮未决问题的处理#
| ID | 问题 | 第二轮结论 | 页面 |
|---|---|---|---|
| U1 | 运行时物品 schema 如何在正常启动时加载 | 仍未决,已缩小范围:逐一检查了 7 个可能的 schema 加载入口,没有一个在正常启动时填充 schema;缺少的证据是原始加载代码(推断已被裁剪)或运行日志 | 物品与经济 |
| U2 | 射击传入物品定义索引固定为 0 的后果 | 后果已闭环:所有玩家射击路径都传 0(game/shared/cstrike15/weapon_csbasegun.cpp:731-746);查找失败时这一枪在任何网络事件、声音、伤害之前被丢弃,但弹药已扣(game/shared/cstrike15/fx_cs_shared.cpp:237-242)。实际是否失败取决于缺失的 schema 是否有 0 号或 default 条目 | 特殊武器机制、武器与射击 |
| U3 | csgo_partner 能否实际构建 | 仍未决:缺 gc_clientsystem.h、Scaleform/Bink/Miles/CELT SDK、vphysics 等,未执行构建 | 构建 |
| U4 | client/server 是否共享 matchmaking.dll 中的 GameTypes 实例 | 已闭环:两个游戏 DLL 都用 GameFactory 重新获取 g_pGameTypes,组查找不会返回它,随后由 matchmaking 工厂返回其单例(engine/sys_dll.cpp:1018-1036、matchmaking/main.cpp:160-166) | 比赛模式 |
| U5 | VPK 是否优先于松散文件 | 已闭环:FindFile 对相对路径先遍历全局 VPK 列表,且不受 path ID 约束(filesystem/basefilesystem.cpp:4171-4189) | 文件系统与缓存 |
| U6 | 专用服务器 gameinfo 建议目录写死为 left4dead 的影响 | 已闭环:只有在既无 -game/-vproject、又非 Steam 文件系统时才会询问该函数,且失败后继续回退(public/filesystem_init.cpp:1063-1127) | 专用服务器 |
| U7 | m_iAccountMoneyEarnedForNextRound 何时生效 | 已闭环:冻结期结束后获得的钱记入该字段,下一回合才可花(game/server/cstrike15/cs_player.cpp:6000-6005) | 玩家 |
4.2 第二轮新增的未决问题#
| ID | 问题 | 现状 | 页面 |
|---|---|---|---|
| N1 | srcds 模块表加载名为 engine 的模块(dedicated/sys_windows.cpp:268),与 engine_ds 工程产物的关系 | VPC 中未找到输出名覆盖,无法闭环 | 音频、构建 |
| N2 | 无线电响应是 scene 类型还是 speak 类型 | 取决于缺失的 response_rules.txt;只有 scene 类型会传递队伍过滤器,影响“仅队友可听” | 场景与响应规则 |
| N3 | cl_modelfastpath 注释称在 css15 上不工作,默认值却是 1(game/client/viewrender.cpp:5730-5733) | 文档漂移,运行效果未验证 | 模型、动画与粒子 |
| N4 | Bot 反应延迟约为配置值的 2/3、IncreaseDangerNearby 疑似方向写反、区域人数统计基本无人维护 | 均为推断,需运行验证 | Bot 决策、导航网格 |
| N5 | CreateEntityByName 路径触发两次 OnEntityCreated;ValidateUserCmd 忽略传入的分屏槽位;句柄序列号回绕与 IsStaticProp 序列号冲突 | 前两项为观察,后两项为推断 | 实体句柄与实体列表、预测内部机制 |
| N6 | valve.rc、autoexec.cfg 的实际执行顺序;banned_user.cfg/banned_ip.cfg 只写不读 | 仓库无 cfg 内容,无法闭环 | 输入与命令、服务器运维面 |
| N7 | PC 构建未定义 BINK_VIDEO(vpc_scripts/source_video_base.vpc:37-38),启动视频与 playvideo 是否实际失效 | 推断,发行版构建配置未知 | 语音与视频 |
| N8 | 未加载导航网格时 m_desiredDMSpawns 不初始化;DoCoopSpawnAndNavInit 找不到调用方 | 观察,影响未验证 | 导航网格 |
4.3 观察到但未验证的代码问题#
以下问题只在静态阅读中发现,未构建、未复现,也未评估可利用性:
HandleCommand_Buy_Internal使用未初始化的itemNameUsed(game/server/cstrike15/cs_player.cpp:7726);FireOutput两个分支对延迟的处理不一致(game/server/cbase.cpp:280、game/server/cbase.cpp:289)。- 开启开发 ConVar
dev_reportmoneychanges时,ReleaseControlOfBot可能解引用空 Bot 指针(game/server/cstrike15/cs_player.cpp:15713-15729);议题不是是/否类型时,VoteControllerThink不再重新调度自身(game/server/vote_controller.cpp:675-680)。 - 一行注释为
temp test的代码让 Bot 在敌人可见时总是瞄腹部(game/server/cstrike15/bot/cs_bot_weapon.cpp:255-256)。 - 安全相关观察三项(详见 服务器运维面 的约束与边界):非
DEDICATED构建中 RCON 的截图与取控制台日志请求不检查认证;客户端读取服务器公钥/签名时长度未与 1024 字节栈缓冲比较;会话密钥用以时间为种子的RandomInt生成。
5. 关键结论台账(节选)#
| ID | 规范化结论 | 条件 | 证据 | 页面 | 状态 |
|---|---|---|---|---|---|
| K1 | 模块通过版本字符串 + CreateInterface 连接;FindSystem 向父组回退 | 全部 AppSystem 组 | appframework/AppSystemGroup.cpp:322-358 | 接口工厂、启动链 | 已验证 |
| K2 | 每帧时间被切成整数 tick;网络更新只在最后一个 tick 发送 | 服务端总是;客户端 CL_Move 对回环连接默认例外 | engine/host.cpp:4079-4096、engine/sv_main.cpp:3475-3483、engine/cl_main.cpp:2767-2774 | 主循环、网络通道 | 已修正(第一轮增加回环例外;第二轮修复网络通道页中被损坏的该句) |
| K3 | 引擎线程化(服务器 tick 在线程池运行)只用于监听服务器 | 非 DEDICATED 构建,且运行时要求服务器与本地客户端同时活跃 | engine/host.cpp:4168-4172、engine/host.cpp:4648-4660 | 主循环 | 已验证(第二轮补充运行时条件:即使 srcds 加载的是非 DEDICATED 引擎,也没有活跃的本地客户端) |
| K4 | 玩家命令在收到时排队,在下一次 GameFrame 的物理模拟中执行 | 非暂停 | game/server/player.cpp:3778-3783、game/server/physics_main.cpp:2282-2339 | 输入与预测、Bot | 已验证 |
| K5 | 实体只打包一次、所有客户端共享;差量必须以客户端确认过的帧为基准 | 非本地后门 | engine/sv_packedentities.cpp:539-608、engine/baseclient.cpp:1437-1444 | 实体复制 | 已验证 |
| K6 | TerminateRound 每回合只生效一次 | m_iRoundWinStatus != WINNER_NONE 时直接返回 | game/shared/cstrike15/cs_gamerules.cpp:13325-13326 | 规则与回合 | 已验证 |
| K7 | CheckWinConditions 由事件驱动调用,而非在 Think 中轮询 | CS:GO 规则 | game/shared/cstrike15/cs_gamerules.cpp:6303 | 规则与回合 | 已验证(检索) |
| K8 | C4 激活时 CT 不能因团灭获胜 | T 不重生 | game/shared/cstrike15/cs_gamerules.cpp:7058-7087 | 规则、C4 | 已验证 |
| K9 | 拆弹时间:有拆弹器 5 秒,否则 10 秒 | — | game/shared/cstrike15/weapon_c4.cpp:1055 | C4 | 已验证 |
| K10 | 后坐力实现被裁剪 | 本快照 | game/shared/cstrike15/weapon_csbase.cpp:3833-3836 | 武器、特殊武器、Bot 决策、概览 | 已验证 |
| K11 | Bot 管理器在 EndGameFrame 中驱动 | — | game/shared/cstrike15/cs_gamerules.cpp:9886-9893 | Bot、主循环 | 已修正(第一轮) |
| K12 | 游戏模式只执行 exec 项配置,离线时额外限定三个 Bot 难度 ConVar | 非自定义类型 | game/shared/cstrike15/gametypes.cpp:1697-1815 | 比赛模式 | 已修正(第一轮) |
| K13 | 地图预置实体由 BSP 实体字符串创建;运行时实体动态创建 | — | game/server/mapentities.cpp:520-569 | 地图加载、实体系统 | 已修正(第一轮) |
| K14 | Bot 命令跳过引擎解码与游戏层校验,直接进入玩家层 ProcessUsercmds | — | game/shared/cstrike15/bot/bot.h:886-888 | Bot | 已修正(第一轮) |
| K15 | README 称经济源码已移除,但 econ 代码存在且被编译,只是部分裁剪 | — | README.md:3、game/client/client_econ_base.vpc | 物品与经济 | 文档漂移(保留双方证据) |
| K16 | client 与 server 运行时使用 matchmaking.dll 中的 GameTypes 单例 | 两端都经 GameFactory 获取 | game/server/gameinterface.cpp:793-796、engine/sys_dll.cpp:1018-1036 | 比赛模式 | 已验证(第二轮,原 U4) |
| K17 | 相对路径文件先在全部已挂载 VPK 中查找,不受 path ID 约束 | SUPPORT_VPK | filesystem/basefilesystem.cpp:4171-4189 | 文件系统 | 已验证(第二轮,原 U5) |
| K18 | CQueuedLoader 在 PC 上不生效 | IsPC() | filesystem/QueuedLoader.cpp:1801-1812 | 文件系统 | 已验证 |
| K19 | 按键按下被哪一层消费,松开事件就只交给那一层 | 全部按键事件 | engine/keys.cpp:1180-1218 | 输入与命令 | 已验证 |
| K20 | 远程客户端的 FCVAR_GAMEDLL 命令必须带 FCVAR_GAMEDLL_FOR_REMOTE_CLIENTS 才会执行 | 默认设置 | engine/sv_client.cpp:1558-1601 | 输入与命令 | 已验证 |
| K21 | RCON 失败默认导致永久 IP 封禁 | sv_rcon_banpenalty 默认 0 | engine/sv_rcon.cpp:501-505 | 服务器运维面 | 已验证 |
| K22 | 监听服务器强制关闭 sv_pure | 非专用服务器 | engine/sv_main.cpp:2779-2782 | 服务器运维面 | 已验证(对抗抽查) |
| K23 | 服务端只把 game sound 的哈希与随机种子发给客户端,由客户端解析具体 wav | 声音条目版本 > 1 | game/shared/SoundEmitterSystem.cpp:756-764 | 音频 | 已验证 |
| K24 | 不可靠声音每个快照最多 20 条,超出丢弃 | 多人模式 | engine/baseclient.cpp:1406 | 音频 | 已验证 |
| K25 | CS:GO 的可听判定在 CanPlayerHearTalker,sv_alltalk 已不被读取 | — | game/shared/cstrike15/cs_gamerules.cpp:15582-15594 | 语音与视频 | 已验证 |
| K26 | AddViewToScene 当场绘制,视图顺序即调用顺序 | 全部视图 | game/client/viewrender.cpp:1332-1343 | 客户端视图渲染 | 已验证 |
| K27 | RTT 阴影在 CS:GO 中被强制关闭,动态阴影靠 CSM | CSTRIKE15 | game/client/clientshadowmgr.cpp:4336-4343 | 客户端视图渲染 | 已验证(对抗抽查) |
| K28 | 普通材质代理在主线程调用,只有“队列友好”代理推迟到渲染线程 | 队列渲染模式 | materialsystem/cmatqueuedrendercontext.cpp:1425-1451 | 材质系统 | 已验证 |
| K29 | 启动结束后封禁渲染目标分配 | -tools 除外 | materialsystem/cmaterialsystem.cpp:5141-5150 | 材质系统 | 已验证 |
| K30 | 玩家无线电默认经过响应规则系统 | bot_chatter_use_rr 默认 1 | game/server/cstrike15/cs_player.cpp:240、game/server/cstrike15/cs_player.cpp:8499-8516 | 场景与响应规则、Bot 决策 | 已验证(推翻第一轮的排除理由) |
| K31 | .nav 为 v16;地图激活时忽略加载错误码;添加 Bot 时可能自动生成网格并重启地图 | PC | game/server/nav_file.cpp:39、game/server/gameinterface.cpp:1375-1383、game/server/cstrike15/bot/cs_bot_manager.cpp:1037-1060 | 导航网格 | 已验证 |
| K32 | CS 中导航区域的阻挡判定恒为“未阻挡” | 非合作任务模式 | game/server/cstrike15/cs_nav_area.cpp:213-222 | 导航网格 | 已验证 |
| K33 | Bot 在敌人可见时总是瞄腹部 | 本快照 | game/server/cstrike15/bot/cs_bot_weapon.cpp:185-268 | Bot 决策 | 已修正(对抗审计把“所有 Bot 都瞄腹部”收窄为“敌人可见时”) |
| K34 | 刀背刺要求朝向点积大于 0.475 | — | game/shared/cstrike15/weapon_knife.cpp:404-418 | 特殊武器 | 已验证(对抗抽查) |
| K35 | 射击者不接收自己的 TE_FireBullets | 玩家预测武器 | game/server/recipientfilter.cpp:288-303 | 特殊武器 | 已验证 |
| K36 | 实体句柄 = 槽位 + 序列号;移除实体时序列号自增并在 0x7fff 回绕 | 两端 | game/shared/entitylist_base.cpp:237-262 | 实体句柄 | 已验证(对抗抽查) |
| K37 | edict 释放后 1 秒内不复用,除非显式允许或已耗尽 | — | engine/pr_edict.cpp:133-171 | 实体句柄 | 已验证 |
| K38 | 无预测误差时不重跑已确认的命令 | cl_pred_optimize ≥ 2(默认) | game/client/prediction.cpp:1676-1703 | 预测内部机制 | 已验证 |
| K39 | 延迟补偿对位置插值,但动画层与姿态参数取较旧记录 | — | game/server/player_lagcompensation.cpp:412-442 | 延迟补偿 | 已验证 |
| K40 | 没有 vis 数据时 vrad 只算直接光 | — | utils/vrad/vrad.cpp:2315-2321 | 地图编译器 | 已验证 |
6. 独立对抗审计#
两轮都在停止补充正文后单独执行“试图证明 Wiki 有错”的检查。第二轮的子代理只负责撰写各自领域,对抗审计由主代理在同一上下文中完成,并非独立代理审查。
第一轮
- 绝对化措辞扫描:修正了 5 处过度概括(K13、K14、实体复制的“唯一权威”、文件系统的“所有资源”、网络消息“全部为 Protobuf”)。
- 高风险结论复核:发现并修正 K2(回环例外)、K11、K12 三处与源码不符或缺条件的表述。
- 替代路径检查:覆盖动态注册(
IGameSystem自动注册、EXPOSE_*、LINK_ENTITY_TO_CLASS)、条件编译(DEDICATED、CLIENT_DLL/GAME_DLL、SWDS、NO_STEAM_GAMECOORDINATOR、GC_UPDATE_ITEM_SCHEMA_SUPPORTED)与跨模块工厂查找顺序。 - 裁剪标记检索:全仓
Removed for partner depot共 44 个文件、131 处;涉及玩法的已在相关页面标注。
第二轮
- 文本完整性:从上一轮会话记录中定位到 6 条含弯引号的替换命令,逐一核对目标位置,共修复 6 处损坏(网络通道 2 处、实体复制 1 处、Bot 1 处、投掷物 1 处、玩家 1 处);其余替换核对无损。
- 绝对化措辞扫描:对 15 个新页面中约 100 处“总是/所有/全部/唯一/恒为/永不”等表述逐条查看上下文,抽查源码后收窄了 K33(Bot 瞄腹部只在敌人可见分支)。
- 高风险结论抽查:重读 K22、K27、K34、K36 与
wait命令失效推断的源码(m_bWaitEnabled既未初始化也无调用者设置,s_CommandBuffer为静态存储因而为假),均与页面一致。 - 跨页一致性:核对了
engine与engine_ds的表述(构建页、音频页、专用服务器页一致,N1 保持未决)、K3 线程化条件、sv_pure、sv_alltalk、BINK_VIDEO在多页中的说法,未发现矛盾。 - 推翻第一轮结论:第一轮把
responserules列为“CS:GO 玩法依赖小”而排除,第二轮证明玩家无线电默认走响应规则(K30),已改为覆盖;第一轮把videocfg归为视频播放,已更正。
未发现未处理的阻断级矛盾。仍未被源码闭环的高风险结论见第 4 节。
7. 未执行的命令与验证#
- 未执行
CreateSolution.bat、devtools\bin\vpc.exe、devtools\bin\protoc.exe、任何编译、链接、单元测试、地图编译器或游戏运行。 - 未做性能测量、安全审计、渗透测试或网络抓包;页面中关于性能、并行、安全的表述都是对代码结构的描述或明确标注的推断。
- 未在多个平台上核对条件编译分支;主机平台(X360/PS3)与 OSX 路径只做存在性确认。
- 页内锚点(
#后的标题)未被脚本校验。
8. 第二轮补全记录#
第一轮会话在写完 36 页、尚未完成最后核对时因上下文超限中断。第二轮的工作:
- 核对完成度:36 个计划页面均已存在;发现上一轮用 shell 字符串替换写文件时,中文弯引号被 PowerShell 当作字符串定界符,导致 6 处句子被截断或错位,已全部修复。
- 补全范围:把第一轮列为“有意排除”或“未展开”、且属于运行时主路径的内容拆成 6 个互不重叠的领域,由 6 个子代理并行撰写,各自只写自己拥有的页面;主代理负责父页面导航、首页、本审计页与跨页修正。新增 15 页:
- 深化已有页面:材质系统(代理、渲染目标、纹理加载)、模型(快速路径、LOD、flex)、输入与预测(
CVerifiedUserCmd)、延迟补偿(动画层)、文件系统(异步 I/O、QueuedLoader)、VScript(实体作用域、客户端 VM)、Demo(REPLAY_ENABLED从未定义)、比赛模式(U4)、专用服务器(U6)等。 - 仍然保留的边界:见首页“有意排除的区域”与本页第 3、4 节。