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, 安全意识培训, 客户端开发, 数据擦除, 游戏开发