FuryBaM/cs16-goldsrc-client

GitHub: FuryBaM/cs16-goldsrc-client

一个实验性的 CS 1.6 client.dll 替代项目,专为原生 Steam GoldSrc 引擎恢复完整的 CS 客户端逻辑而不依赖 Xash3D。

Stars: 10 | Forks: 0

# 用于 Steam GoldSrc 的 CS 1.6 client.dll 实验性完整替代 `cstrike/cl_dlls/client.dll`,专为 标准 32 位 Steam GoldSrc 适配。DLL 框架和生命周期取自 标准 Half-Life `cl_dll`,而 CS 1.6 HUD、事件和 shared-weapon 代码取自 Velaron/cs16-client。这不是为 Xash3D 打造的版本:未使用活跃的 Xash/mobile/render API。 ## 为什么这个项目是独一无二的 该项目不仅仅是用现代编译器编译旧的 HLSDK 代码。它保留了 原始 32 位 Steam GoldSrc 的契约,同时恢复了 Counter-Strike 特有的客户端逻辑: - **原生 Steam GoldSrc ABI。** 最终产物是一个 PE32/x86 架构的 `client.dll`,包含 引擎期望的完整 44 个导出函数表,不依赖 `xash.dll`、 `mainui.dll` 或移动端 API。 - **原始 VGUI。** 客户端使用 Steam 提供的库 `vgui.dll` 和 `vgui2.dll`、原始 CS 1.6 资源以及兼容的 VGUI1 fallback。界面未被 Xash 实现替换。 - **可用的预测。** Shared-weapon 代码通过标准的 `HUD_PostRunCmd` 执行;客户端适配器将预测与服务器端 `PRECACHE_*`/`SET_MODEL` 回调分离,并且不会调用缺失的引擎函数。 - **稳定的多人游戏。** 修复了生命周期、回调表、玩家索引边界、预测、积分板、观察者 HUD 和语音 HUD。客户端 通过了真实的游戏冒烟测试:连接、出生、购买、射击、 切换武器、死亡、观察和语音通信。 许多旧项目针对 Xash3D、mobile/render API,或者仅包含 基础的 Half-Life `cl_dll`。这里的目标引擎正是原始的 Steam GoldSrc,保留了原始的 CS VGUI,恢复了武器预测,并且 验证了完整的网络游戏会话,而不仅仅是启动本地地图。 ## 变更内容 - 构建目标仅限于 Windows x86,正如 Steam GoldSrc 所要求; - 恢复了标准的 GoldSrc ABI 和完整的 44 个导出函数表; - 使用普通的 GoldSrc 输入 (`input.cpp` + `inputw32.cpp`/SDL2); - 通过标准的 GoldSrc 接口 `IVGui`、`IPanel`、`ISurface` 和 `IInput` 添加了真正的 VGUI2 viewport;标准的 CS menu ID `2`、 `26`–`34` 处理队伍选择、T/CT 模型选择和完整的购买树, 无需 Xash API; - 客户端发布了引擎期望的 `VClientVGUI001` 接口;如果 VGUI2 缺失或未初始化,菜单会自动服务于 现有的 VGUI1 viewport; - `_vgui_menus` 仅在成功创建 viewport 后启用;尚未 实现的 VGUI menu ID 会安全地将当前会话切换回 标准的文本 `ShowMenu`; - 保留了 CS HUD、积分板、雷达、观察者 HUD、客户端武器 预测、武器事件、语音遮罩/静音以及说话者图标; - 保护了 `particleman.dll` 的可选加载,修复了玩家索引边界、 关闭和 GoldSrc 函数表的填充。 - 恢复了 shared-weapon 代码的客户端适配器:服务器端的 `PRECACHE_MODEL`、`PRECACHE_SOUND` 和 `SET_MODEL` 在 `client.dll` 内部变为 no-op,因此第一个 `HUD_PostRunCmd` 在创建武器 预测对象时不再调用空的服务器回调。 - `cl_charset` 和 `con_charset`(这两个原本由 Xash 自行创建)现在拥有 兼容 GoldSrc 的 fallback 和 null-check;第一个 `CHud::Redraw` 不再 解引用缺失的 Xash cvar。 - 挂载了标准的 CS 消息 `AllowSpec` 和 `BuyClose`,因此 GoldSrc 不会 报告缺少处理程序,并能正确关闭活跃菜单。 - 重新启用了带有 9-way blend、pitch/yaw blend 和 CS 步态动画的 Counter-Strike studio renderer:临时的 Half-Life renderer 会给玩家 错误的姿势。危险指针、sequence/gaitsequence 以及模型附件数量被 限制在标准的 GoldSrc 限制内; - `cl_recoil_crosshair_scale` 现在由客户端自行创建:普通的 GoldSrc 不提供此变量,而出生后准星的第一帧以前 会解引用空指针。 - `+showscores` 现在同时设置 GoldSrc `IN_SCORE` 并打开 内置的 CS 积分板;以前的输入处理器会吞没该命令,而不启用 表格的绘制。 - 中心的 `TextMsg`(`Terrorists Win`、`Bomb has been planted` 等) 拥有自己独立的稳定 HUD 层。客户端读取标准的 UTF-8/UTF-16LE `resource/valve_*.txt` 和 `resource/cstrike_*.txt`,服务器 字符串的格式化不会被不安全地传递给 `printf`。 - 注册了两个标准命令 `+commandmenu`/`-commandmenu`。`H` 键 从游戏内的 `commandmenu.txt` 打开原生的 VGUI1 菜单;支持 嵌套部分、`TEAMn`/`MAP` 过滤器、`TOGGLE`、鼠标和热键。 UTF-8 BOM 会被跳过,而 UTF-8 签名会被转换为旧版 `vgui.dll` 期望的单字节编码;这防止了西里尔文菜单的崩溃。 如果文件缺失,则会使用一个小巧的内置备用菜单。 对于 MinGW 构建,外部 C++ 接口 `particleman.dll` 和 `GameClientExports001` 被故意禁用:Steam 模块是使用 MSVC 构建的,其 vtable ABI 与 MinGW 不兼容。VGUI1 是一个特殊的例外:它 小巧的 viewport 被构建为 Microsoft-ABI 兼容的对象,并且仅通过 C 函数与客户端的其余部分进行通信。主要的 GoldSrc API 也保持 纯粹的 C ABI。 目前 VGUI2 涵盖了队伍、模型选择和购买。VGUI1 保留用于 `commandmenu.txt` 并作为备用 viewport。无线电和其他尚未移植的 menu ID 会自动保持经典的文本形式。 语音 HUD 显示说话玩家的姓名,并使用标准的语音状态。 它使用 Steam GoldSrc 已经提供的标准 `vgui.dll`;严禁将 Xash3D 中的该库版本复制到 游戏文件夹中。 ## 构建 ### 1. 安装内容 - Windows 10 或 Windows 11; - **Visual Studio Community 2026** (18.x); - 工作负载 **Desktop development with C++**; - 组件 **MSVC v145 C++ x64/x86 build tools** 和 **Windows 10/11 SDK**; - Git for Windows。 无需单独下载 HLSDK、SDL2 或 VGUI SDK:使用的头文件、 `SDL2.lib` 和 VGUI 导入库已经包含在仓库中。通过 Steam 安装的 Counter-Strike 1.6 仅用于运行和验证 DLL。 ### 2. 获取源码 ``` git clone https://github.com/FuryBaM/cs16-goldsrc-client.git cd cs16-goldsrc-client ``` ### 3. 构建 Release DLL 打开 **Developer PowerShell for VS 2026** 并执行: ``` msbuild .\cs16cldll.sln /m /p:Configuration=Release /p:Platform=x86 powershell -ExecutionPolicy Bypass -File .\scripts\verify-client.ps1 ` -Path .\build\Release\client.dll ``` 或者在 Visual Studio 中打开 `cs16cldll.sln`,选择 **Release** 和 **x86**,然后 执行 **Build → Build Solution**。生成的文件将出现在 `build/Release/client.dll` 中。 验证脚本会确认文件格式为 PE32/x86,包含所有 44 个 GoldSrc 导出,并且不导入 Xash3D 库。Release 使用 静态 MSVC runtime;`SDL2.dll` 和 `vgui.dll` 取自已安装的 Steam GoldSrc。 ### 4. 运行构建的 DLL 1. 关闭 Counter-Strike 1.6。 2. 找到游戏文件夹:Steam -> Counter-Strike -> **Properties** -> **Installed Files** -> **Browse**。 3. 备份 `cstrike/cl_dlls/client.dll`。 4. 复制 `build/Release/client.dll` 并替换 `cstrike/cl_dlls/client.dll`。 5. 添加启动参数 `-insecure -dev -console`。 6. 启动游戏,并首先使用 `map de_dust2` 命令在本地测试 DLL。 在开发和测试修改后的客户端模块时,`-insecure` 是必需的。请勿使用此 DLL 连接到受 VAC 保护的服务器。 ### 常见构建错误 - **MSB8020 / 找不到 v145:** 安装 Visual Studio 2026 和组件 **MSVC v145 C++ x64/x86 build tools**。 - **找不到 Windows SDK:** 通过 Visual Studio Installer -> **Individual components** 添加 Windows 10 或 Windows 11 SDK。 - **构建了错误的架构:** 仅使用 `Platform=x86`;Steam GoldSrc 无法加载 64 位客户端 DLL。 - **无法替换 DLL:** 在复制之前完全关闭游戏。 - **启动时缺少 SDL2.dll 或 vgui.dll:** 通过 Steam 验证游戏文件;请勿从 Xash3D 复制这些库。 VGUI2 头文件位于 `external/hl1_source_sdk` 中;旁边保留了 Source 1 SDK 许可证和 `thirdpartylegalnotices.txt`。 加载时,客户端会动态打开标准的 Steam `vgui2.dll`,检查 GoldSrc 接口的精确版本并发布 `VClientVGUI001`。`client.dll` 故意没有对 `vgui2.dll` 进行硬导入,因此在失败时仍保留可用的 VGUI1 fallback。VGUI2 面板直接注册为 `IClientPanel`,没有 不兼容的静态 `vgui_controls.lib`。`cs_vgui2_status` 命令显示模块、工厂、viewport 和每个接口的状态。 ## 安全安装与验证 1. 关闭游戏并备份 `Half-Life/cstrike/cl_dlls/client.dll`。 2. 将新的 DLL 复制到 `Half-Life/cstrike/cl_dlls/client.dll`。 3. 为了进行测试,添加启动参数 `-insecure -dev -console`。 4. 首先在本地进行测试:`map de_dust2`。 5. 在控制台中,你可以分别打开 `cs_vgui_team`、`cs_vgui_class_t`、 `cs_vgui_class_ct` 或 `cs_vgui_buy`,并使用命令 `cs_vgui_hide` 关闭面板。`cs_vgui_reload_commandmenu` 会重新读取 `commandmenu.txt`,而 `cs_test_centertext` 用于测试中心通知。 6. 检查移动和鼠标、队伍选择、购买、射击、HUD、 积分板、观察者模式和语音。 变量 `cs_vgui_enable 0` 会完全禁用新的 viewport 并恢复 文本菜单;值为 `1` 时,会在下一次更新 userinfo 时重新启用它。 诊断版 MinGW 构建会将启动阶段和服务器 消息处理写入 `%TEMP%\cs16_goldsrc_startup.log`。`enter` 和 `complete` 形式的记录 是成对出现的:如果游戏在未成对的 `enter` 行之后关闭,则该行 显示发生崩溃的回调。诊断构建 还包括 `joinclass` 之后的详细逐帧追踪,并记录 异常代码、模块和崩溃指令的 RVA。它保护登录过程免受 缺失本地玩家和非标准地图名称值的影响。 在开发和测试修改后的客户端模块时,`-insecure` 是必需的。请勿使用它连接到受 VAC 保护的服务器。 如果 GoldSrc 收到尚未实现的 `VGUIMenu`(例如无线电),客户端 会将 userinfo 切换回文本菜单,并请求再次打开菜单。 ## 回滚 恢复 `client.dll` 的备份。如果没有备份:Steam -> Counter-Strike -> Properties -> Installed Files -> Verify integrity of game files。 ## 状态 R11 通过了真实的游戏冒烟测试:连接、出生、HUD、雷达、 射击、VGUI 购买菜单、积分板、无线电和死亡通知均可正常工作。R12 添加了完整的 `H` 菜单,修复了中心消息重复的 问题,并通过了 PE32/x86、44 个导出和导入的验证。远程 玩家姿势的修正对于 studio renderer 来说仍然是一项独立的任务。
标签:C++, GoldSrc引擎, Linux, 动态链接库, 反恐精英1.6, 安全意识培训, 客户端开发, 数据擦除, 游戏开发