匹配框架与 Game Coordinator
本页区分三层“在线”能力:引擎内的 匹配框架(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 |
CreateSession | system/network 为 offline 时创建 CMatchSessionOfflineCustom,否则创建 CMatchSessionOnlineHost;关闭旧会话后替换 | matchmaking/mm_framework.cpp:667-712 |
MatchSession | joinsession → 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.lib | vpc_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 depot | game/server/cstrike15/cs_gameinterface.cpp:149-165、game/server/cstrike15/cs_gameinterface.cpp:432-434 |
| 主服务器公钥 | 置为 { 0 },注释 Removed for partner depot | engine/net_ws.cpp:4567 |
约束与边界#
- 官方匹配需要 GC、Steam 后端与数据中心服务;本仓库无法单独验证任何在线匹配流程。
- X360/PS3 的会话实现(
x360_*、sys_session.cpp)与其他游戏的标题适配目录(portal2/、swarm/等)不在本 Wiki 范围内。