CD Code Digest Hub /CS:GO

匹配框架与 Game Coordinator

10 分钟阅读 7 个章节

本页区分三层“在线”能力:引擎内的 匹配框架(matchmaking.dll,管理会话、房间、搜索、服务器选择)、它的 CS:GO 标题适配(matchmaking/cstrike15),以及服务器与客户端和 Valve Game Coordinator(GC) 的通信契约。前两者在仓库中有实现;GC 一侧只有协议与接入残片。

相关页面:客户端启动链 · 比赛模式 · 物品与经济 · 构建与物理组织

相关源码文件#

  • 框架:matchmaking/mm_framework.cpp、matchmaking/main.cpp、matchmaking/mm_session_*.cpp、matchmaking/steam_lobbyapi.cpp、matchmaking/servermanager.cpp、matchmaking/datacenter.cpp
  • CS:GO 适配:matchmaking/cstrike15/mm_title.cpp、matchmaking/cstrike15/mm_title_main.cpp、matchmaking/cstrike15/mm_title_gamesettingsmgr.cpp
  • 工程:matchmaking/matchmaking_inc.vpc、matchmaking/matchmaking_cstrike15_inc.vpc
  • GC 协议:game/shared/cstrike15/cstrike15_gcmessages.proto、game/shared/base_gcmessages.proto、gcsdk/steammessages.proto

1. 模块的加载与驱动#

  • 引擎在 Mod 组创建时加载 matchmaking(专用服务器为 matchmaking_ds),取 IMatchFramework 并加入 AppSystem 组:engine/sys_dll2.cpp:2180-2231。
  • Host_Init 中初始化匹配框架:engine/host.cpp:5654;每个 tick 的 NET_RunFrame 调用 g_pMatchFramework->RunFrame():engine/net_ws.cpp:3664-3667。
  • matchmaking 模块内部工厂先尝试委托工厂,再查自身接口;作为 AppSystem 的 QueryInterface 只回答 IMatchFramework:matchmaking/main.cpp:42-67、matchmaking/main.cpp:160-166。
  • 工程定义了 NO_STEAM_GAMECOORDINATOR,但仍链接 gcsdk 库:matchmaking/matchmaking_inc.vpc:9、matchmaking/matchmaking_inc.vpc:68;CS:GO 适配工程还编译了 gametypes.cpp:matchmaking/matchmaking_cstrike15_inc.vpc:35。

2. CMatchFramework#

功能行为证据
Init初始化标题适配(MM_Title_Init → CMatchTitle::Init)并注册 Steam 邀请监听matchmaking/mm_framework.cpp:78-89、matchmaking/cstrike15/mm_title_main.cpp:29-32
RunFrame处理邀请、局域网无连接管理器、匹配系统、当前会话 Update、标题 RunFrame,以及延迟的组队会话matchmaking/mm_framework.cpp:106-151
CreateSessionsystem/network 为 offline 时创建 CMatchSessionOfflineCustom,否则创建 CMatchSessionOnlineHost;关闭旧会话后替换matchmaking/mm_framework.cpp:667-712
MatchSessionjoinsession → CMatchSessionOnlineClient;其余(快速/自定义匹配)→ CMatchSessionOnlineSearch;joininvitesession 只在 X360 分支有实现matchmaking/mm_framework.cpp:714-783

会话设置全部用 KeyValues 表达(如 system/network、options/action)。定义 SWDS 时(matchmaking_ds 工程即如此:matchmaking/matchmaking_cstrike15_ds.vpc:15)创建/匹配会话为空操作:matchmaking/mm_framework.cpp:672、matchmaking/mm_framework.cpp:716。

主机会话状态#

在线主机会话 CMatchSessionOnlineHost 的状态依次为:初始化、创建中、大厅、匹配对手、匹配重启、启动中(专用服务器搜索等)、加载地图、游戏中、结束:matchmaking/mm_session_online_host.h:95-105。相关命令处理包括开始、匹配、取消、专用服务器搜索完成、监听服务器启动、排队连接:matchmaking/mm_session_online_host.cpp:181-610。

3. CS:GO 标题适配#

CMatchTitle 提供标题 ID、玩家数、连接前准备、启动服务器地图、事件处理等标题相关逻辑:matchmaking/cstrike15/mm_title.cpp:38-396。例如 StartServerMap 负责把会话设置转换为开服动作:matchmaking/cstrike15/mm_title.cpp:248;它同时是游戏事件监听者:matchmaking/cstrike15/mm_title.cpp:396。

4. GC 协议(只有契约)#

CS:GO 的 GC 消息号从 9100 起,覆盖匹配开始/停止、客户端到服务器 ping、GC 向服务器/客户端预约、服务器预约响应、回合统计、比赛结束、踢人等:game/shared/cstrike15/cstrike15_gcmessages.proto:43-60。对应消息体在同一文件中定义,例如匹配开始与服务器预约:game/shared/cstrike15/cstrike15_gcmessages.proto:414、game/shared/cstrike15/cstrike15_gcmessages.proto:527。

游戏代码中可以看到 GC 数据的消费点,例如规则对象依据 GC 下发的封禁信息踢出有冷却的玩家:game/shared/cstrike15/cs_gamerules.cpp:9042-9094;服务端在 Steam API 就绪时激活 GC 客户端系统:game/server/gameinterface.cpp:1389-1411。

5. 缺失与裁剪#

项现状证据
GC 后端(game/gc 等)目录不存在本次文件检查
gcsdk 游戏侧工程gcsdk_game.vpc 不存在;目录只有 steamextra 辅助代码、steammessages.proto 与 include 配置;有预编译 lib/public/gcsdk.libvpc_scripts/projects.vgc:445-448、gcsdk/gcsdk_game_include.vpc
GCClientSystem()服务端调用它,但全仓库没有声明;客户端 include 的 gc_clientsystem.h 不存在game/server/gameinterface.cpp:1397-1405、game/client/cstrike15/Scaleform/itempickup_scaleform.cpp:31
服务端 GC 回调UpdateGCInformation、ReportGCQueuedMatchStart、NetworkIDValidated、ClientConnectionValidatePreNetChan 等函数体为 Removed for partner depotgame/server/cstrike15/cs_gameinterface.cpp:149-165、game/server/cstrike15/cs_gameinterface.cpp:432-434
主服务器公钥置为 { 0 },注释 Removed for partner depotengine/net_ws.cpp:4567

约束与边界#

  • 官方匹配需要 GC、Steam 后端与数据中心服务;本仓库无法单独验证任何在线匹配流程。
  • X360/PS3 的会话实现(x360_*、sys_session.cpp)与其他游戏的标题适配目录(portal2/、swarm/ 等)不在本 Wiki 范围内。