Skip to content

Protocol Families

Sascha Greuel edited this page Aug 2, 2026 · 1 revision

Protocol families

Home · Supported identifiers · Result fields

GameQ exposes named server identifiers, but many of those classes share one wire-protocol implementation. Understanding that relationship helps when choosing a type, interpreting gq_protocol, or changing a parent parser.

Type and family are different

For a Counter-Strike: Source server:

'gq_type' => 'css',
'gq_protocol' => 'source',

The type identifies the configured game class. The family identifies the parser that handled the response. A named subclass can supply its display name, default query-port offset, normalization map, or join link while inheriting all packet handling from its family.

Major shared families

Family Transport Representative identifiers Characteristics
Source/GoldSource UDP css, tf2, cs16, arkse A2S information, optional players/rules, challenges, and split packets.
GameSpy UDP bf1942, ut, mohaa Backslash-delimited status and player/team fields.
GameSpy 2 UDP arma, halo, swat4 Binary records; several implementations remain beta.
GameSpy 3/4 UDP bf2, crysis, minecraft, ut3 Session/challenge handling and split key/value/player data.
Quake 2 UDP quake2, kingpin Text status response with server variables and players.
Quake 3 UDP quake3, cod4, urbanterror, sof2 Text status response used by many id Tech 3-derived games.
Unreal 2 UDP ut2004, killingfloor Binary rules, players, and teams.
Doom 3 UDP doom3, quake4 id Tech 4 server information and players.
Frostbite/Battlefield TCP bfbc2, bf3, bf4, bfh Framed command responses with server and player records.
RakNet UDP minecraftbe, minecraftpe, raknet Unconnected ping/pong server advertisement.
Valve WON UDP cs15, won Legacy pre-Steam status format.
All-Seeing Eye UDP ase, mta, soldat Compact legacy server status format.

Family names are not interchangeable. GameSpy, GameSpy 2, and GameSpy 3 use different packets, just as Quake 2 and Quake 3 do. Prefer the named identifier from the supported-server table instead of guessing a generic family.

Voice-server protocols

Voice servers use their own formats rather than a shared game-query family:

  • TeamSpeak 2 and TeamSpeak 3 use TCP query services and require an explicit query_port.
  • Ventrilo uses its status protocol and can return server and client information.
  • Mumble has a dedicated status implementation.

Permissions, visibility settings, allowlists, and flood protection can affect the data a voice server returns even when its client port is reachable.

Dedicated game formats

Some identifiers implement a format specific to one game or a small group. Examples include SA-MP, Teeworlds, Terraria/TShock, OpenTTD, Tibia, StarMade, Stationeers, and Ultima Online/UOX3. They still use the same GameQ server, query, result, and filter pipeline; only their packet construction and parsing differ.

Other implementations obtain status through an HTTP API, query plugin, or master list rather than only a direct native socket. Their additional settings and service dependencies are documented under protocol-specific options.

Why shared families matter to developers

A fix in a parent parser can affect dozens of named games. When changing a shared family:

  1. preserve the established initial request unless the family itself changed;
  2. account for older and newer response variants;
  3. run every child protocol fixture, not only the motivating game;
  4. keep subclass-specific normalization and port offsets intact;
  5. add malformed-response tests at the lowest shared layer that owns the rule.

See architecture and adding a protocol for the extension boundaries.

Clone this wiki locally