This page covers the Protocol Buffer message types and shared objects used for Dota 2 match management: lobby and party state objects pushed by the GC via SOCache, match result data, and the supporting enumerations defined in the common match management proto.
The primary source files are:
For general message IDs, see page 4.1. For client lobby and party API methods, see pages 3.3 and 3.4. For server-side match sign-out messages, see page 4.3.
The match management protocol spans several proto files and covers the full match lifecycle from party formation to post-match data.
Protocol file layout:
| File | Key Types |
|---|---|
dota_gcmessages_common_match_management.proto | CSODOTAParty, CSODOTAPartyMember, CSODOTAPartyInvite, CMsgReadyCheckStatus, CMsgLeaverState |
dota_gcmessages_common.proto | CMsgDOTAMatch, CMsgDOTARealtimeGameStats, CMatchPlayerTimedStats |
dota_match_metadata.proto | CDOTAMatchMetadata, CDOTAMatchMetadataFile, CDOTAMatchMetadata_Team_KillInfo |
Lifecycle Entity Mapping:
Sources: protocol/dota_gcmessages_common_match_management.pb.go489-546 protocol/dota_match_metadata.pb.go214-230
CSODOTALobby is the shared object that represents a Dota 2 lobby. It is pushed by the GC via CMsgSOCacheSubscribed and updated via CMsgSOMultipleObjects. Consumer code subscribes to it through the SOCache (see page 2.1) using the CSO type registered for lobbies. The lobby state tracks the lobby configuration, slot assignments, member list, and current game state.
Lobby States:
The lobby lifecycle is tracked via CSODOTALobby_State protocol/dota_gcmessages_common_lobby.pb.go205-215:
UI (0): Initial formation.READYUP (4): Players accepting the match.SERVERSETUP (1): Game server allocation.RUN (2): Active gameplay.POSTGAME (3): Result processing.Sources: protocol/dota_gcmessages_common_lobby.pb.go205-215
CSODOTAParty is the shared object for party state. Like CSODOTALobby, it is maintained via the SOCache. The party_id field is marked with [(key_field) = true], which is the protobuf annotation the SOCache container uses to index objects.
Sources: protocol/dota_gcmessages_common_match_management.proto85-148 protocol/dota_gcmessages_common_match_management.pb.go489-546
Each party member's per-member matchmaking data is embedded in CSODOTAParty.members as a CSODOTAPartyMember:
Party Member Attributes:
Sources: protocol/dota_gcmessages_common_match_management.proto67-83 protocol/dota_gcmessages_common_match_management.pb.go66-82
CSODOTAPartyInvite is a separate shared object representing a pending party invitation. It appears in both CSODOTAParty.sent_invites and CSODOTAParty.recv_invites.
| Field | Type | Purpose |
|---|---|---|
group_id | uint64 | Key field for the invite protocol/dota_gcmessages_common_match_management.proto157 |
sender_id | fixed64 | Steam ID of the inviting player protocol/dota_gcmessages_common_match_management.proto158 |
sender_name | string | Display name of sender protocol/dota_gcmessages_common_match_management.proto159 |
members | repeated PartyMember | Members visible in the invite protocol/dota_gcmessages_common_match_management.proto160 |
invite_gid | fixed64 | Unique invite GID protocol/dota_gcmessages_common_match_management.proto164 |
Sources: protocol/dota_gcmessages_common_match_management.proto150-165
Two enumerations control role/lane selection. ELaneSelection is a single-value enum used for position assignment. ELaneSelectionFlags is a bitmask used in CSODOTAPartyMember.lane_selection_flags to express which roles a player is willing to fill.
ELaneSelection (single role) protocol/dota_gcmessages_common_match_management.pb.go23-28:
| Value | Integer | Description |
|---|---|---|
k_ELaneSelection_SAFELANE | 0 | Safe lane / carry |
k_ELaneSelection_OFFLANE | 1 | Off lane |
k_ELaneSelection_MIDLANE | 2 | Mid lane |
k_ELaneSelection_SUPPORT | 3 | Soft support |
k_ELaneSelection_HARDSUPPORT | 4 | Hard support |
ELaneSelectionFlags (bitmask groups) protocol/dota_gcmessages_common_match_management.pb.go65-75:
| Value | Integer | Description |
|---|---|---|
k_ELaneSelectionFlags_SAFELANE | 1 | Safelane bit |
k_ELaneSelectionFlags_OFFLANE | 2 | Offlane bit |
k_ELaneSelectionFlags_MIDLANE | 4 | Midlane bit |
k_ELaneSelectionFlags_SUPPORT | 8 | Support bit |
k_ELaneSelectionFlags_HARDSUPPORT | 16 | Hard support bit |
k_ELaneSelectionFlagGroup_CORE | 7 | Safe + Off + Mid |
k_ELaneSelectionFlagGroup_SUPPORT | 24 | Support + Hard Support |
k_ELaneSelectionFlagGroup_ALL | 31 | All roles |
k_ELaneSelectionFlagGroup_HIGHDEMAND | 18 | Offlane + Hard Support |
Sources: protocol/dota_gcmessages_common_match_management.proto8-27 protocol/dota_gcmessages_common_match_management.pb.go22-117
The ready check flow uses three messages and one embedded status struct:
Ready check message flow:
CMsgReadyCheckStatus is embedded in CSODOTAParty.ready_check and contains:
start_timestamp, finish_timestamp protocol/dota_gcmessages_common_match_management.proto182-183initiator_account_id protocol/dota_gcmessages_common_match_management.proto184ready_members — repeated ReadyMember structs with account_id and EReadyCheckStatus protocol/dota_gcmessages_common_match_management.proto185EReadyCheckStatus values: k_EReadyCheckStatus_Unknown (0), k_EReadyCheckStatus_NotReady (1), k_EReadyCheckStatus_Ready (2) protocol/dota_gcmessages_common_match_management.proto47-49
EReadyCheckRequestResult values returned in CMsgPartyReadyCheckResponse protocol/dota_gcmessages_common_match_management.proto53-57:
| Value | Integer | Meaning |
|---|---|---|
k_EReadyCheckRequestResult_Success | 0 | Check started |
k_EReadyCheckRequestResult_AlreadyInProgress | 1 | Another check is active |
k_EReadyCheckRequestResult_NotInParty | 2 | Requester not in a party |
k_EReadyCheckRequestResult_SendError | 3 | GC send failure |
k_EReadyCheckRequestResult_UnknownError | 4 | Unknown error |
Sources: protocol/dota_gcmessages_common_match_management.proto176-197 protocol/dota_gcmessages_common_match_management.pb.go206-218
EHighPriorityMMState is stored in CSODOTAParty.high_priority_state and indicates why a party does or does not have high-priority queue access:
| Value | Integer | Meaning |
|---|---|---|
k_EHighPriorityMM_Unknown | 0 | State unknown |
k_EHighPriorityMM_MissingMMData | 1 | Matchmaking data unavailable |
k_EHighPriorityMM_ResourceMissing | 2 | No priority resource |
k_EHighPriorityMM_ManuallyDisabled | 3 | Disabled by Valve |
k_EHighPriorityMM_Min_Enabled | 64 | Threshold; values ≥ 64 are enabled states |
k_EHighPriorityMM_AllRolesSelected | 65 | All roles selected |
k_EHighPriorityMM_UsingResource | 66 | Consuming priority tokens |
k_EHighPriorityMM_FiveStack | 67 | Full five-player party |
k_EHighPriorityMM_HighDemand | 68 | High-demand role selected |
Sources: protocol/dota_gcmessages_common_match_management.proto34-44 protocol/dota_gcmessages_common_match_management.pb.go155-164
CMsgLeaverState is sent by the game server or GC to report match abandonment conditions:
| Field | Type | Purpose |
|---|---|---|
lobby_state | uint32 | Lobby state at time of detection protocol/dota_gcmessages_common_match_management.proto168 |
game_state | DOTA_GameState | Game rules state protocol/dota_gcmessages_common_match_management.proto169 |
leaver_detected | bool | Whether a leaver was identified protocol/dota_gcmessages_common_match_management.proto170 |
first_blood_happened | bool | If true, leaver penalty applies protocol/dota_gcmessages_common_match_management.proto171 |
discard_match_results | bool | Whether to discard match outcome protocol/dota_gcmessages_common_match_management.proto172 |
mass_disconnect | bool | True for server-side mass disconnect protocol/dota_gcmessages_common_match_management.proto173 |
Sources: protocol/dota_gcmessages_common_match_management.proto167-174 protocol/dota_gcmessages_common_match_management.pb.go558-575
CDOTAMatchMetadata and its sub-messages contain detailed analytics data. This includes information on player inventories, team-wide kill information, and custom statistics.
EPlayerInventorySnapshotFlags protocol/dota_match_metadata.proto16-17CDOTAMatchMetadata_Team_KillInfo_KillType protocol/dota_match_metadata.pb.go56-61CDOTAMatchMetadataFile contains the match_id, public metadata, and encrypted private_metadata protocol/dota_match_metadata.proto23-26Metadata Structure Mapping:
Sources: protocol/dota_match_metadata.pb.go95-151 protocol/dota_match_metadata.proto20-207
When matchmaking fails to start, the GC returns an EStartFindingMatchResult enumeration indicating the specific failure reason:
| Value | Integer | Meaning |
|---|---|---|
k_EStartFindingMatchResult_OK | 1 | Success protocol/dota_gcmessages_client_match_management.pb.go69 |
k_EStartFindingMatchResult_MatchmakingDisabled | 102 | MM is down protocol/dota_gcmessages_client_match_management.pb.go73 |
k_EStartFindingMatchResult_CompetitiveRankSpreadTooLarge | 111 | Rank disparity protocol/dota_gcmessages_client_match_management.pb.go82 |
k_EStartFindingMatchResult_MemberAlreadyInLobby | 112 | Conflict protocol/dota_gcmessages_client_match_management.pb.go83 |
k_EStartFindingMatchResult_RestrictedFromRanked | 135 | Account restriction protocol/dota_gcmessages_client_match_management.pb.go60 |
Sources: protocol/dota_gcmessages_client_match_management.pb.go21-63
Refresh this wiki