Server queries: Difference between revisions

From Valve Developer Community
Jump to navigation Jump to search
m (WIP banner)
m (Progress save)
Line 70: Line 70:
| Number || [[byte]] || The number of the packet. Starts at 0.
| Number || [[byte]] || The number of the packet. Starts at 0.
|-
|-
| Size || [[short]] || ([[Orange Box]] Engine and above only) Maximum size of packet before packet switching occurs. The default value is 1248 bytes (0x04E0), but the server administrator can decrease this. For older engine versions: the maximum and minimum size of the packet was unchangeable.
| Size || [[short]] || ([[Orange Box]] Engine and above only.) Maximum size of packet before packet switching occurs. The default value is 1248 bytes (0x04E0), but the server administrator can decrease this. For older engine versions: the maximum and minimum size of the packet was unchangeable.
|-
|-
| colspan="3" | This is only present in the first packet of the response and only if the response is being compressed.
| colspan="3" | This is only present in the first packet of the response and only if the response is being compressed.
Line 80: Line 80:
| CRC32 sum || [[long]] || CRC32 checksum of uncompressed response.
| CRC32 sum || [[long]] || CRC32 checksum of uncompressed response.
|}
|}
To uncompress this response: collect and assemble all the packets of the answer, then pass that into a function like [http://www.bzip.org/1.0.3/html/util-fns.html#bzbufftobuffdecompress BZ2_bzBuffToBuffDecompress()] in C, [http://fr.php.net/manual/fr/function.bzdecompress.php bzdecompress()] in PHP, or [http://docs.python.org/2/library/bz2.html bz2.decompress()] in Python.
|-
|-
| colspan="3" | Payload
| colspan="3" | Payload
Line 109: Line 110:


Ping the server to see if it exists, this can be used to calculate the latency to the server.
Ping the server to see if it exists, this can be used to calculate the latency to the server.
{{Warning|According to an official, Valve mailing list posted on the [[Talk:Server_queries#A2A_PING_no_longer_supported.3F|Talk Page]], A2A_PING is no longer supported on Counter Strike: Source and Team Fortress 2 servers at this time, and is considered a deprecated feature.}}


=== Request format ===
=== Request format ===
Line 115: Line 118:
! Data || Type || Value
! Data || Type || Value
|-
|-
| Heading || [[byte]] || 'i' (0x69)
| Header || [[byte]] || 'i' (0x69)
|}
|}
=== Reply format ===


==== [[Goldsource]] servers ====
{| style="background:transparent;"
|
FF FF FF FF 69                                    ÿÿÿÿi         
|}
 
=== Response format ===
 
==== [[Goldsource]] Server ====


{| class=standard-table
{| class=standard-table
! Data || Type || Value
! Data || Type || Value
|-
|-
| Heading || [[byte]] || 'j' (0x6A)
| Header || [[byte]] || 'j' (0x6A)
|-
|-
| Content || [[string]] || Null
| Payload || [[string]] || Null
|}
 
{| style="background:transparent;"
|
FF FF FF FF 6A 00                                  ÿÿÿÿj.         
|}
|}


==== [[Source]] servers ====
==== [[Source]] Server ====


{| class=standard-table
{| class=standard-table
Line 136: Line 150:
| Heading || [[byte]] || 'j' (0x6A)
| Heading || [[byte]] || 'j' (0x6A)
|-
|-
| Content || [[string]] || '00000000000000'
| Payload || [[string]] || '00000000000000'
|}
|}


{{Warning|According to an official, Valve mailing list posted on the [[Talk:Server_queries#A2A_PING_no_longer_supported.3F|Talk Page]], A2A_PING is no longer supported on Counter Strike: Source and Team Fortress 2 servers at this time, and is considered a deprecated feature.}}
{| style="background:transparent;"
|
FF FF FF FF 6A 30 30 30 30 30 30 30 30 30 30 30    ÿÿÿÿj00000000000
30 30 30 00                                        000.
|}
 
== A2S_INFO ==


== A2S_SERVERQUERY_GETCHALLENGE ==
Retrieves information about the server including, but not limited to: its name, the map currently being played, and the number of players.


=== Request format ===
=== Request format ===
Challenge values are required for <code>A2S_PLAYER</code> and <code>A2S_RULES</code> requests, you can use this request to get one.
{{note|You can also send <code>A2S_PLAYER</code> and <code>A2S_RULES</code> queries with a challenge value of <code>-1 (0xFF FF FF FF)</code> and they will respond with a challenge value to use (using the reply format below).}}
{{Warning|As of September 29, 2009, the implementation of this query does not function in Goldsource nor Left4Dead2 servers.  Use the method described above as a workaround.  For more, see the [[Talk:Server Queries#A2S_SERVERQUERY_GETCHALLENGE not working since last HLDS update|Talk Page]]}}
FF FF FF FF 57
=== Reply format ===


{| class=standard-table
{| class=standard-table
! Data || Type || Comment
! Data || Type || Value
|-
|-
| Type || [[byte]] || Should be equal to 'A' (0x41)
| Header || [[byte]] || 'T' (0x54)
|-
|-
| Challenge || [[long]] || The challenge number to use
| Payload || [[string]] || "Source Engine Query"
|}
|}


Example reply:
FF FF FF FF 41 32 42 59 45
== A2S_INFO ==
=== Request format ===
Server info can be requested by sending the following byte values in a UDP packet to the server.
{|style="background:transparent;"
{|style="background:transparent;"
|
|
Line 174: Line 178:
  6E 65 20 51 75 65 72 79 00                        ne Query
  6E 65 20 51 75 65 72 79 00                        ne Query
|}
|}
i.e. -1 (int), 'T' ([[byte]]), "Source Engine Query" ([[string]])


=== Reply format ===
=== Response format ===
==== [[Source]] servers ====
 
==== [[Goldsource]] servers ====
 
{{Warning|This is obsolete.  GoldSource servers (except for HLTV ones?) now report using the same protocol as Source servers.  To differentiate between (for example) Counter-Strike and Counter-Strike: Source, or other games with the same gamedir, use the Steam AppId.}}
 
{| class=standard-table
{| class=standard-table
! Data || Type || Comment
! Data !! Type !! Comment
|-
|-
| Type || [[byte]] || Should be equal to 'I' (0x49)
| Header || [[byte]] || Always equal to 'm' (0x6D.)
|-
|-
| Version || [[byte]] || Network version. 0x07 is the current Steam version. Goldsource games will return 48 (0x30), also refered to as protocol version.
| Address || [[string]] || IP address and port of the server.
|-
|-
| Server Name || [[string]] || The Source server's name, eg: "Recoil NZ CS Server #1"
| Name || [[string]] || Name of the server.
|-
|-
| Map || [[string]] || The current map being played, eg: "de_dust"
| Map || [[string]] || Current map the server has loaded.
|-
|-
| Game Directory || [[string]] || The name of the folder containing the game files, eg: "cstrike"
| Folder || [[string]] || Name of the folder containing the game files.
|-
|-
| Game Description || [[string]] || A friendly string name for the game type, eg: "Counter Strike: Source"
| Game || [[string]] || Full name of the game.
|-
|-
| AppID || [[short]] || [[Steam Application IDs|Steam Application ID]]
| Players || [[byte]] || Number of players on the server.
|-
|-
| Number of players || [[byte]] || The number of players currently on the server
| Max. Players || [[byte]] || Maximum number of players the server reports it can hold.
|-
|-
| Maximum players || [[byte]] || Maximum allowed players for the server
| Protocol || [[byte]] || Protocol version used by the server.
|-
|-
| Number of bots || [[byte]] || Number of bot players currently on the server
| Server type || [[byte]] || Indicates the type of server: <ul><li>'D' for dedicated server</li><li>'L' for non-dedicated server</li><li>'P' for a HLTV server</li></ul>
|-
|-
| Dedicated || [[byte]] || 'l' for listen, 'd' for dedicated, 'p' for SourceTV
| Environment || [[byte]] || Indicates the operating system of the server: <ul><li>'L' for Linux</li><li>'W' for Windows</li></ul>
|-
|-
| OS || [[byte]] || Host operating system. 'l' for Linux, 'w' for Windows
| Visibility || [[byte]] || Indicates whether the server requires a password: <ul><li>0 for public</li><li>1 for private</li></ul>
|-
|-
| Password || [[byte]] || If set to 0x01, a password is required to join this server
| Mod || [[byte]] || Indicates whether the game is a mod: <ul><li>0 for [[Half-Life]]</li><li>1 for [[Half-Life]] mod</li></ul>
|-
|-
| Secure || [[byte]] || if set to 0x01, this server is VAC secured
| colspan="3" | These fields are only present in the response if "Mod" is 1:
{| style="margin:10px"
! Data || Type || Comment
|-
|-
| Game Version || [[string]] || The version of the game, eg: "1.0.0.22"
| Link || [[string]] || URL to mod website.
|-
|-
| Extra Data Flag (EDF) || [[byte]] || if present this specifies which additional data fields will be included
| Download Link || [[string]] || URL to download the mod.
|-
|-
| if ( EDF & 0x80 ) || [[short]] || The server's game port # is included
| NULL || [[byte]] || NULL byte (0x00)
|-
|-
| if ( EDF & 0x10 ) || [[long]] [[long]] || The server's SteamID is included
| Version || [[long]] || Version of mod installed on server.
|-
|-
| if ( EDF & 0x40 ) || [[short]] [[string]] || The spectator port # and then the spectator server name are included
| Size || [[long]] || Space (in bytes) the mod takes up.
|-
|-
| if ( EDF & 0x20 ) || [[string]] || The game tag data string for the server is included [future use]
| Type || [[byte]] || Indicates the type of mod: <ul><li>0 for single '''and''' multiplayer mod</li><li>1 for multiplayer '''only''' mod</li></ul>
|-
|-
| if ( EDF & 0x01 ) || [[long]] [[long]] || The server's 64-bit GameID is included
| DLL || [[byte]] || Indicates whether mod uses its own DLL: <ul><li>0 if it uses the [[Half-Life]] DLL</li><li>1 if it uses its own DLL</li></ul>
|}
|}
Example reply:
{|style="background:transparent;"
|
FF FF FF FF 49 02 67 61 6D 65 32 78 73 2E 63 6F    ÿÿÿÿI.game2xs.co
6D 20 43 6F 75 6E 74 65 72 2D 53 74 72 69 6B 65    m Counter-Strike
20 53 6F 75 72 63 65 20 23 31 00 64 65 5F 64 75    Source #1.de_du
73 74 00 63 73 74 72 69 6B 65 00 43 6F 75 6E 74    st.cstrike.Count
65 72 2D 53 74 72 69 6B 65 3A 20 53 6F 75 72 63    er-Strike: Sourc
65 00 F0 00 05 10 04 64 6C 00 00 31 2E 30 2E 30    e......dl..1.0.0
2E 32 32 00                                        .22.
|}
=====[[The Ship]] servers=====
{| class=standard-table
! Data || Type || Comment
|-
| Type || [[byte]] || Should be equal to 'I' (0x49)
|-
| Version || [[byte]] || Network version. 0x07 is the current Steam version.
|-
| Server Name || [[string]] || The Source server's name, eg: "Xtra The Ship #1 [Hunt]"
|-
| Map || [[string]] || The current map being played, eg: "batavier"
|-
| Game Directory || [[string]] || The name of the folder containing the game files, eg: "ship"
|-
| Game Description || [[string]] || A friendly string name for the game type, eg: "The Ship"
|-
| AppID || [[short]] || [[Steam Application IDs|Steam Application ID]]
|-
| Number of players || [[byte]] || The number of players currently on the server
|-
| Maximum players || [[byte]] || Maximum allowed players for the server
|-
| Number of bots || [[byte]] || Number of bot players currently on the server
|-
| Dedicated || [[byte]] || 'l' for listen, 'd' for dedicated, 'p' for SourceTV
|-
| OS || [[byte]] || Host operating system. 'l' for Linux, 'w' for Windows
|-
| Password || [[byte]] || If set to 0x01, a password is required to join this server
|-
| Secure || [[byte]] || if set to 0x01, this server is VAC secured
|-
| Game Mode || [[byte]] || 0x00 for Hunt, 0x01 for Elimination, 0x02 for Duel, 0x03 for Deathmatch, 0x04 for Team VIP, 0x05 for Team Elimination
|-
| Witness Count || [[byte]] || The minimum number of witnesses for a player to be arrested.
|-
|-
| Witness Time || [[byte]] || Time in seconds before player is arrested while being witnessed.
| VAC || [[byte]] || Specifies whether the server uses VAC: <ul><li>0 for unsecured</li><li>1 for secured</li></ul>
|-
|-
| Game Version || [[string]] || The version of the game, eg: "1.0.0.14"
| Bots || [[byte]] || Number of bots on the server.
|}
|}


Example reply:
{{Note|HLTV servers may respond with a late request that is either incomplete or incorrect if the number of slots is 255.}}
{|style="background:transparent;"
 
|
== A2S_SERVERQUERY_GETCHALLENGE ==
FF FF FF FF 49 07 53 68 69 70 20 53 65 72 76 65    ÿÿÿÿI.Ship Serve
 
72 00 62 61 74 61 76 69 65 72 00 73 68 69 70 00    r.batavier.ship.
=== Request format ===
54 68 65 20 53 68 69 70 00 60 09 01 05 00 6C 77    The Ship.`....lw
00 00 01 03 03 31 2E 30 2E 30 2E 34 00            .....1.0.0.4.
|}


=====[[Goldsource]] servers=====
Challenge values are required for <code>A2S_PLAYER</code> and <code>A2S_RULES</code> requests, you can use this request to get one.
{{note|You can also send <code>A2S_PLAYER</code> and <code>A2S_RULES</code> queries with a challenge value of <code>-1 (0xFF FF FF FF)</code> and they will respond with a challenge value to use (using the response format below).}}
{{Warning|As of September 29, 2009, the implementation of this query does not function in Goldsource nor Left4Dead2 servers.  Use the method described above as a workaround.  For more, see the [[Talk:Server Queries#A2S_SERVERQUERY_GETCHALLENGE not working since last HLDS update|Talk Page]]}}


WARNING: This is obsolete. GoldSource servers (except for HLTV ones?) now report using the same protocol as Source servers.  To differentiate between (for example) Counter-Strike and Counter-Strike: Source, or other games with the same gamedir, use the Steam AppId.
  FF FF FF FF 57


{| class=standard-table
=== Response format ===
! Data || Type || Comment
|-
| Type || [[byte]] || Should be equal to 'm' (0x6D)
|-
| Game IP || [[string]] || Game Server IP address and port
|-
| Server Name || [[string]] || The server's name, eg: "Recoil NZ CS Server #1"
|-
| Map || [[string]] || The current map being played, eg: "de_dust"
|-
| Game Directory || [[string]] || The name of the folder containing the game files, eg: "cstrike"
|-
| Game Description || [[string]] || A friendly string name for the game type, eg: "Counter-Strike"
|-
| Number of players || [[byte]] || The number of players currently on the server
|-
| Maximum players || [[byte]] || Maximum allowed players for the server
|-
| Version || [[byte]] || Network version. 0x07 is the current Steam version.
|-
| Dedicated || [[byte]] || 'l' for listen, 'd' for dedicated, 'p' for HLTV
|-
| OS || [[byte]] || Host operating system. 'l' for Linux, 'w' for Windows
|-
| Password || [[byte]] || If set to 0x01, a password is required to join this server
|-
| IsMod || [[byte]] || If set to 0x01, this byte is followed by [[#ModInfo|ModInfo]]
|-
| Secure || [[byte]] || if set to 0x01, this server is VAC secured
|-
| Number of bots || [[byte]] || Number of bot players currently on the server
|}


======ModInfo======
{| class=standard-table
{| class=standard-table
! Data || Type || Comment
! Data || Type || Comment
|-
|-
| URLInfo || [[string]] || URL containing information about this mod
| Type || [[byte]] || Should be equal to 'A' (0x41)
|-
|-
| URLDL || [[string]] || URL to download this mod
| Challenge || [[long]] || The challenge number to use
|-
| Nul || [[byte]] || 0x00
|-
| ModVersion || [[long]] || Version of the installed mod
|-
| ModSize || [[long]] || The download size of this mod
|-
| SvOnly || [[byte]] || If 1 this is a server side only mod
|-
| ClDLL || [[byte]] || If 1 this mod has a custom client dll
|}
|}


=====[[SiN 1 Multiplayer]] servers=====
Example response:
SiN 1 Multiplayer servers respond to the "Source Engine Query" request. Their reply is in the same format as Source's.


Example reply:
  FF FF FF FF 41 32 42 59 45
{|style="background:transparent;"
|
  FF FF FF FF 49 2F 53 65 6E 73 65 6D 61 6E 6E 20    ÿÿÿÿI/Sensemann
53 69 4E 20 44 4D 00 70 61 72 61 64 6F 78 00 53    SiN DM.paradox.S
69 4E 20 31 00 53 69 4E 20 31 00 1D 05 00 10 00    iN 1.SiN 1......
6C 77 00 00 31 2E 30 2E 30 2E 30 00                lw..1.0.0.0.
|}
 
=====[[Rag Doll Kung Fu]] servers=====
 
Rag Doll Kung Fu servers respond to the "Source Engine Query" request. Their reply is in the same format as Source's.
Example reply:
{|style="background:transparent;"
|
FF FF FF FF 49 FC 54 68 65 20 44 75 64 65 27 73    ÿÿÿÿIüThe Dude's
20 64 6F 6A 6F 00 53 6F 63 63 65 72 00 52 44 4B      dojo.Soccer.RDK
46 53 6F 63 63 65 72 00 52 61 67 44 6F 6C 6C 4B    FSoccer.RagDollK
75 6E 67 46 75 3A 20 53 6F 63 63 65 72 00 EA 03    ungFu: Soccer.ê.
01 04 00 00 77 00 00 32 2E 33 2E 30 2E 30 00        ....w..2.3.0.0.
|}


== A2S_PLAYER ==
== A2S_PLAYER ==
=== Request format ===
=== Request format ===
  FF FF FF FF 55 <4 byte challenge number>
  FF FF FF FF 55 <4 byte challenge number>
The challenge number can either be set to <code>-1 (0xFF FF FF FF)</code> to have the server reply with <code>S2C_CHALLENGE</code>, or use the value from a previous <code>A2S_SERVERQUERY_GETCHALLENGE</code> request.
The challenge number can either be set to <code>-1 (0xFF FF FF FF)</code> to have the server response with <code>S2C_CHALLENGE</code>, or use the value from a previous <code>A2S_SERVERQUERY_GETCHALLENGE</code> request.
== Reply format ==
== Response format ==
The players response has two sections, the initial header:
The players response has two sections, the initial header:
{| class=standard-table
{| class=standard-table
Line 403: Line 299:
  FF FF FF FF 56 <4 byte challenge number>
  FF FF FF FF 56 <4 byte challenge number>
The challenge number can either be set to <code>-1 (0xFF FF FF FF)</code> to have the server reply with <code>S2C_CHALLENGE</code>, or use the value from a previous <code>A2S_SERVERQUERY_GETCHALLENGE</code> request.
The challenge number can either be set to <code>-1 (0xFF FF FF FF)</code> to have the server reply with <code>S2C_CHALLENGE</code>, or use the value from a previous <code>A2S_SERVERQUERY_GETCHALLENGE</code> request.
== Reply format ==
== Response format ==
The rules response has two sections, the initial header:
The rules response has two sections, the initial header:
{| class=standard-table
{| class=standard-table

Revision as of 18:06, 28 December 2012

Under construction.png
This page is actively undergoing a major edit.
As a courtesy, please do not edit this while this message is displayed.
If this page has not been edited for at least several hours to a few days, please remove this template. This message is intended to help reduce edit conflicts; please remove it between editing sessions to allow others to edit the page.

The person who added this notice will be listed in its edit history should you wish to contact them.

Template:Otherlang2

You can query information from a running game server using UDP/IP packets. This document describes the packet formats and protocol to access this data.

Data Types

All server queries consist of five basic types of data packed together into a data stream. All types are little endian, which is the default on most languages on x86 CPUs. Java users should use ByteBuffer to convert.

Name Description
byte 8 bit character or unsigned integer
short 16 bit signed integer
long 32 bit signed integer
float 32 bit floating point
long long 64 bit unsigned integer
string variable-length byte field, encoded in UTF-8, terminated by 0x00

Protocol

Steam uses a packet size of 1400 bytes + IP/UDP headers. If a request or response needs more packets for the data it starts the packets with an additional header.

Simple Response

Data Type Comment
Header long Always equal to -1 (0xFFFFFFFF). Means it isn't split.
Payload

Multi-packet Response

Goldsource Server

Data Type Comment
Header long Always equal to -2 (0xFFFFFFFE). Means the packet is split.
ID long Unique number assigned by server per answer.
Packet number byte Upper 4 bits represent the number of the current packet (starting at 0) and bottom 4 bits represent the total number of packets (2 to 15).
Payload

Source Server

Data Type Comment
Header long Always equal to -2 (0xFFFFFFFE). Means the packet is split.
ID long Same as the Goldsource server meaning. However, if the Wikipedia icon most significant bit is 1, then the response was compressed with bzip2 before being cut and sent. Refer to compression procedure below.
Total byte The total number of packets in the response.
Number byte The number of the packet. Starts at 0.
Size short (Orange Box Engine and above only.) Maximum size of packet before packet switching occurs. The default value is 1248 bytes (0x04E0), but the server administrator can decrease this. For older engine versions: the maximum and minimum size of the packet was unchangeable.
This is only present in the first packet of the response and only if the response is being compressed.
Data Type Comment
Size long Size of the whole response once it is decompressed.
CRC32 sum long CRC32 checksum of uncompressed response.

To uncompress this response: collect and assemble all the packets of the answer, then pass that into a function like BZ2_bzBuffToBuffDecompress() in C, bzdecompress() in PHP, or bz2.decompress() in Python.

Payload

Because UDP packets can arrive in different order or delayed, every packet should be verified by its "ID" and "Number"! Every request or response with or without this header is continued with an integer -1 (0xFFFFFFFF) and the user data. So by reading the first 4 bytes you can decide whether the data is split (-2) or in one packet (-1).

Warning.pngWarning:TF2 currently does not split replies, expect A2S_PLAYER and A2S_RULES to be simply cut off after 1260 bytes.

Requests

The server responds to 5 queries:

A2A_PING
Ping the server.
A2S_SERVERQUERY_GETCHALLENGE
Returns a challenge number for use in the player and rules query.
A2S_INFO
Basic information about the server.
A2S_PLAYER
Details about each player on the server.
A2S_RULES
The rules the server is using.

Queries should be sent in UDP packets to the listen port of the server.

A2A_PING

Ping the server to see if it exists, this can be used to calculate the latency to the server.

Warning.pngWarning:According to an official, Valve mailing list posted on the Talk Page, A2A_PING is no longer supported on Counter Strike: Source and Team Fortress 2 servers at this time, and is considered a deprecated feature.

Request format

Data Type Value
Header byte 'i' (0x69)
FF FF FF FF 69                                     ÿÿÿÿi           

Response format

Goldsource Server

Data Type Value
Header byte 'j' (0x6A)
Payload string Null
FF FF FF FF 6A 00                                  ÿÿÿÿj.           

Source Server

Data Type Value
Heading byte 'j' (0x6A)
Payload string '00000000000000'
FF FF FF FF 6A 30 30 30 30 30 30 30 30 30 30 30    ÿÿÿÿj00000000000
30 30 30 00                                        000.

A2S_INFO

Retrieves information about the server including, but not limited to: its name, the map currently being played, and the number of players.

Request format

Data Type Value
Header byte 'T' (0x54)
Payload string "Source Engine Query"
FF FF FF FF 54 53 6F 75 72 63 65 20 45 6E 67 69   ÿÿÿÿTSource Engi
6E 65 20 51 75 65 72 79 00                        ne Query

Response format

Goldsource servers

Warning.pngWarning:This is obsolete. GoldSource servers (except for HLTV ones?) now report using the same protocol as Source servers. To differentiate between (for example) Counter-Strike and Counter-Strike: Source, or other games with the same gamedir, use the Steam AppId.
Data Type Comment
Header byte Always equal to 'm' (0x6D.)
Address string IP address and port of the server.
Name string Name of the server.
Map string Current map the server has loaded.
Folder string Name of the folder containing the game files.
Game string Full name of the game.
Players byte Number of players on the server.
Max. Players byte Maximum number of players the server reports it can hold.
Protocol byte Protocol version used by the server.
Server type byte Indicates the type of server:
  • 'D' for dedicated server
  • 'L' for non-dedicated server
  • 'P' for a HLTV server
Environment byte Indicates the operating system of the server:
  • 'L' for Linux
  • 'W' for Windows
Visibility byte Indicates whether the server requires a password:
  • 0 for public
  • 1 for private
Mod byte Indicates whether the game is a mod:
These fields are only present in the response if "Mod" is 1:
Data Type Comment
Link string URL to mod website.
Download Link string URL to download the mod.
NULL byte NULL byte (0x00)
Version long Version of mod installed on server.
Size long Space (in bytes) the mod takes up.
Type byte Indicates the type of mod:
  • 0 for single and multiplayer mod
  • 1 for multiplayer only mod
DLL byte Indicates whether mod uses its own DLL:
  • 0 if it uses the Half-Life DLL
  • 1 if it uses its own DLL
VAC byte Specifies whether the server uses VAC:
  • 0 for unsecured
  • 1 for secured
Bots byte Number of bots on the server.
Note.pngNote:HLTV servers may respond with a late request that is either incomplete or incorrect if the number of slots is 255.

A2S_SERVERQUERY_GETCHALLENGE

Request format

Challenge values are required for A2S_PLAYER and A2S_RULES requests, you can use this request to get one.

Note.pngNote:You can also send A2S_PLAYER and A2S_RULES queries with a challenge value of -1 (0xFF FF FF FF) and they will respond with a challenge value to use (using the response format below).
Warning.pngWarning:As of September 29, 2009, the implementation of this query does not function in Goldsource nor Left4Dead2 servers. Use the method described above as a workaround. For more, see the Talk Page
FF FF FF FF 57

Response format

Data Type Comment
Type byte Should be equal to 'A' (0x41)
Challenge long The challenge number to use

Example response:

FF FF FF FF 41 32 42 59 45

A2S_PLAYER

Request format

FF FF FF FF 55 <4 byte challenge number>

The challenge number can either be set to -1 (0xFF FF FF FF) to have the server response with S2C_CHALLENGE, or use the value from a previous A2S_SERVERQUERY_GETCHALLENGE request.

Response format

The players response has two sections, the initial header:

Data Type Comment
Type byte Should be equal to 'D' (0x44)
Num Players byte The number of players reported in this response

Then for each player the following fields are sent:

Data Type Comment
Index byte The index into [0.. Num Players] for this entry
Player Name string Player's name
Kills long Number of kills this player has
Time connected float The time in seconds this player has been connected
Note.pngNote: Java users can read the player score as an int and reverse the bytes with Integer.reverseBytes(int i).
Warning.pngWarning:As of September 29, 2009, Left4Dead2 returns an index of zero for all players.

A2S_RULES

Request format

FF FF FF FF 56 <4 byte challenge number>

The challenge number can either be set to -1 (0xFF FF FF FF) to have the server reply with S2C_CHALLENGE, or use the value from a previous A2S_SERVERQUERY_GETCHALLENGE request.

Response format

The rules response has two sections, the initial header:

Data Type Comment
Type byte Should be equal to 'E' (0x45)
Num Rules short The number of rules reported in this response

Then for each rule the following fields are sent:

Data Type Comment
Rule Name string The name of the rule
Rule Value string The rule's value

Implementations

See Also