Il est possible d'interroger un serveur de jeu basé sur le moteur Goldsource (Half-Life et ses Mods) ou Source (Half-Life 2 et ses Mods) en utilisant des paquets UDP/IP. Cet article décrit le format des différents paquets pouvant être envoyés ou reçus ainsi que le protocole utilisé pour les acheminer.
Types de données
Chaque requête ou réponse utilise cinq types de base, assemblés pour former un flux de données. Tous ces types sont little-endian, il n'y a donc aucune conversion à effectuer sur un processeur x86.
Type |
Description
|
byte |
Caractère non signé (8 bits).
|
short |
Entier court signé (16 bits).
|
long |
Entier long signé (32 bits).
|
float |
Nombre à virgule flottante (32 bits).
|
string |
Suite d'octets de longueur variable terminée par le caractère NUL.
|
Protocole
La taille des paquets utilisés par le protocole d'interrogation est de 1400 octets (sans compter l'en-tête UDP/IP). Chaque réponse contient un en-tête propre au protocole, mais si une réponse nécessite plus d'un paquet elle sera alors découpée et chaque paquet comprendra un en-tête additionnel.
Réponse simple
Donnée |
Type |
Commentaire
|
En-tête |
long |
Toujours égal à -1 (0xFFFFFFFF).
|
Données
|
Réponse multi-paquets
Donnée |
Type |
Commentaire
|
En-tête |
long |
Toujours égal à -2 (0xFFFFFFFE).
|
ID |
long |
Numéro unique attribué par le serveur à chaque paquet appartenant à la même réponse.
|
Nombre et numéro de paquet |
byte |
Les 4 bits de poids fort représentent le numéro du paquet courant (en commençant à 0) et les 4 bits de poids faible représentent le nombre total de paquets (de 2 à 15).
|
Données
|
Donnée |
Type |
Commentaire
|
En-tête |
long |
Toujours égal à -2 (0xFFFFFFFE).
|
ID |
long |
Même signification que pour un serveur Goldsource, cependant si le bit de poids fort est à 1 alors la réponse a été compressé avec l'algorithme Bzip2 avant d'être découpée. Après avoir récupéré et assemblé tous les paquets il faut décompresser la réponse (avec BZ2_bzBuffToBuffDecompress() en C ou bzdecompress() en PHP par exemple) avant de pouvoir la traiter.
|
Nombre de paquets |
byte |
Nombre total de paquets de la réponse.
|
Numéro de paquet |
byte |
La numérotation commence à 0.
|
Taille des paquets |
short |
Uniquement présent dans la nouvelle version du moteur Source, il s'agit de la taille maximale que peut prendre un paquet avant qu'un découpage ne se produise (auparavant il était impossible de changer cette taille). Cela concerne uniquement le protocole de jeu, dans celui d'interrogation des serveurs il n'est toujours pas possible de demander des paquets de plus petite taille que celle par défaut.
La valeur par défaut est de 1248 octets (0x04E0), mais l'administrateur du serveur peut la diminuer.
|
Uniquement présent dans le premier paquet (numéro 0) si la réponse a été compressé :
Donnée |
Type |
Commentaire
|
Taille de la réponse |
long |
Nombre d'octet qu'occupe la réponse une fois décompressée.
|
Somme CRC32 |
long |
Somme de contrôle CRC32 de la réponse décompressée.
|
|
Données
|
Comme les paquets UDP peuvent arriver dans le désordre et en différé, chaque paquet devrait être contrôlé avec son ID et son numéro pour s'assurer qu'il s'agit toujours de la même réponse et que tous les paquets sont arrivés.
Requêtes
Le format des requêtes est le même que celui des réponses (il est rare de devoir faire une requête multi-paquets toutefois). Les requêtes doivent être envoyées en UDP sur le port d'écoute du serveur (généralement 27015).
A2A_PING
Cette requête qui ne retourne aucune donnée exploitable ne sert qu'à vérifier que le serveur répond correctement. Elle peut être utilisée pour calculer le temps de latence du serveur.
Format de la requête
Donnée |
Type |
Valeur
|
En-tête |
byte |
'i' (105)
|
Format de la réponse
Donnée |
Type |
Commentaire |
Valeur de l'exemple
|
En-tête |
byte |
Toujours égal à 'j' (106). |
106
|
Contenu |
string |
Toujours une chaîne vide. |
|
FF FF FF FF 6A 30 30 30 30 30 30 30 30 30 30 30 ÿÿÿÿj00000000000
30 30 30 00 000.
|
Donnée |
Type |
Commentaire |
Valeur de l'exemple
|
En-tête |
byte |
Toujours égal à 'j' (106). |
106
|
Contenu |
string |
Toujours une chaîne composée de quatorze 0. |
00000000000000
|
A2S_INFO
Cette requête permet d'obtenir des informations sur le serveur comme son nom ou le jeu joué actuellement.
Format de la requête
Donnée |
Type |
Valeur
|
En-tête |
byte |
'T' (84)
|
Contenu |
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.
|
Format de la réponse
FF FF FF FF 6D 37 37 2E 31 31 31 2E 31 39 34 2E ÿÿÿÿm77.111.194.
31 31 30 3A 32 37 30 31 35 00 46 52 20 2D 20 56 110:27015.FR - V
65 72 79 47 61 6D 65 73 2E 6E 65 74 20 2D 20 44 eryGames.net - D
65 61 74 6D 61 74 63 68 20 2D 20 6F 6E 6C 79 20 eatmatch - only
73 75 72 66 5F 73 6B 69 20 2D 20 6E 67 52 00 73 surf_ski - ngR.s
75 72 66 5F 73 6B 69 00 63 73 74 72 69 6B 65 00 urf_ski.cstrike.
43 6F 75 6E 74 65 72 2D 53 74 72 69 6B 65 00 0C Counter-Strike..
12 2F 64 6C 00 01 77 77 77 2E 63 6F 75 6E 74 65 ./dl..www.counte
72 2D 73 74 72 69 6B 65 2E 6E 65 74 00 00 00 01 r-strike.net....
00 00 00 00 9E F7 0A 00 01 01 00 ....ž÷.....
|
Donnée |
Type |
Commentaire |
Valeur de l'exemple
|
En-tête |
byte |
Toujours égal à 'm' (109). |
109
|
Adresse |
string |
Adresse IP et port du serveur. |
77.111.194.110:27015
|
Nom |
string |
Nom du serveur. |
FR - VeryGames.net - Deatmatch - only surf_ski - ngR
|
Carte |
string |
Nom de la carte jouée actuellement. |
surf_ski
|
Dossier |
string |
Nom du dossier contenant les fichiers du jeu. |
cstrike
|
Jeu |
string |
Nom complet du jeu. |
Counter-Strike
|
Joueurs |
byte |
Nombre de joueurs actuellement en train de jouer |
12
|
Places |
byte |
Nombre maximum de joueurs que le serveur peut accueillir. |
18
|
Protocole |
byte |
Version du protocole utilisé par le serveur. |
47
|
Serveur |
byte |
Indique le type du serveur :
- 'd' pour un serveur dédié
- 'l' pour un serveur non dédié
- 'p' pour un serveur HLTV
|
'd'
|
Environnement |
byte |
Indique le système d'exploitation du serveur :
- 'l' pour Linux
- 'w' pour Windows
|
'l'
|
Visibilité |
byte |
Indique si le serveur requiert un mot de passe :
- 0 pour public
- 1 pour privé
|
0
|
Mod |
byte |
Indique si le jeu est un Mod :
|
1
|
Uniquement présent si le jeu est un Mod :
Donnée |
Type |
Commentaire |
Valeur de l'exemple
|
Lien |
string |
URL du site d'information du Mod. |
www.counter-strike.net
|
Lien de téléchargement |
string |
URL du site où télécharger le Mod. |
|
|
byte |
Toujours égal à 0. |
0
|
Version |
long |
Version du Mod installée sur le serveur. |
1
|
Taille |
long |
Espace (en octet) qu'occupe le Mod sur le disque dur. |
184000000
|
Genre |
byte |
Indique le genre du Mod :
- 0 pour un Mod solo et multijoueur
- 1 pour un Mod uniquement multijoueur
|
0
|
Dll |
byte |
Indique si le Mod utilise sa propre dll :
- 0 pour la dll d'Half-Life
- 1 pour une dll propriétaire
|
1
|
|
VAC |
byte |
Indique si le serveur utilise le VAC :
- 0 pour non sécurisé
- 1 pour sécurisé
|
1
|
Bots |
byte |
Nombre de bots présents sur le serveur. |
0
|
FF FF FF FF 49 07 50 75 62 6C 69 63 20 53 65 72 ÿÿÿÿI.Public Ser
76 65 72 20 54 69 63 6B 20 31 30 30 20 77 77 77 ver Tick 100 www
2E 6C 61 72 75 73 68 2E 64 65 00 64 6D 5F 6C 6F .larush.de.dm_lo
63 6B 64 6F 77 6E 00 68 6C 32 6D 70 00 54 65 61 ckdown.hl2mp.Tea
6D 20 44 65 61 74 68 6D 61 74 63 68 00 40 01 0F m Deathmatch.@..
10 00 64 77 00 01 31 2E 30 2E 30 2E 31 32 00 ..dw..1.0.0.12.
|
Donnée |
Type |
Commentaire |
Valeur de l'exemple
|
En-tête |
byte |
Toujours égal à 'I' (73). |
73
|
Protocole |
byte |
Version du protocole utilisé par le serveur. |
7
|
Nom |
string |
Nom du serveur. |
Public Server Tick 100 www.larush.de
|
Carte |
string |
Nom de la carte jouée actuellement. |
dm_lockdown
|
Dossier |
string |
Nom du dossier contenant les fichiers du jeu. |
hl2mp
|
Jeu |
string |
Nom complet du jeu. |
Team Deathmatch
|
AppID |
short |
Steam Application ID du jeu. |
320
|
Joueurs |
byte |
Nombre de joueurs actuellement en train de jouer |
15
|
Places |
byte |
Nombre maximum de joueurs que le serveur peut accueillir. |
16
|
Bots |
byte |
Nombre de bots présents sur le serveur. |
0
|
Serveur |
byte |
Indique le type du serveur :
- 'd' pour un serveur dédié
- 'l' pour un serveur non dédié
- 'p' pour un serveur SourceTV
|
'd'
|
Environnement |
byte |
Indique le système d'exploitation du serveur :
- 'l' pour Linux
- 'w' pour Windows
|
'w'
|
Visibilité |
byte |
Indique si le serveur requiert un mot de passe :
- 0 pour public
- 1 pour privé
|
0
|
VAC |
byte |
Indique si le serveur utilise le VAC :
- 0 pour non sécurisé
- 1 pour sécurisé
|
1
|
Uniquement s'il s'agit d'un serveur The Ship :
Donnée |
Type |
Commentaire |
Exemple de valeur
|
Mode |
byte |
Indique le mode de jeu :
- 0 pour Hunt
- 1 pour Elimination
- 2 pour Duel
- 3 pour Deathmatch
- 4 pour Team VIP
- 5 pour Team Elimination
|
0
|
Témoins |
byte |
Nombre minimum de témoins nécessaire pour qu'un joueur se fasse arrêter. |
2
|
Durée |
byte |
Durée (en seconde) avant qu'un joueur ne se fasse arrêter quand il est vu par un/des témoin(s). |
1
|
|
Version |
string |
Version du jeu installée sur le serveur. |
1.0.0.12
|
Note: Sur un serveur Rag Doll Kung Fu le type de serveur est toujours égal à 0.
A2S_SERVERQUERY_GETCHALLENGE
Les serveurs ne répondent à certaines requêtes que si un nombre particulier (appelé challenge) y est joint. La requête ci-dessous permet d'obtenir ce challenge.
Format de la requête
Donnée |
Type |
Valeur
|
En-tête |
byte |
'W' (87)
|
Format de la réponse
FF FF FF FF 41 4B A1 D5 22 ÿÿÿÿAK¡Õ"
|
Donnée |
Type |
Commentaire |
Valeur de l'exemple
|
En-tête |
byte |
Toujours égal à 'A' (65). |
65
|
Challenge |
long |
Nombre à joindre aux requêtes le nécessitant. |
584425803
|
A2S_PLAYER
Cette requête permet d'obtenir des informations sur les joueurs actuellement présents sur le serveur.
Note: Cette requête nécessite un challenge.
Format de la requête
Donnée |
Type |
Valeur
|
En-tête |
byte |
'U' (85)
|
Challenge |
long |
variable
|
FF FF FF FF 55 ED 9A E1 0C ÿÿÿÿUíšá.
|
Format de la réponse
FF FF FF FF 44 02 01 5B 44 5D 2D 2D 2D 2D 3E 54 ÿÿÿÿD..[D]---->T
2E 4E 2E 57 3C 2D 2D 2D 2D 00 0E 00 00 00 B4 97 .N.W<----.....´—
00 44 02 4B 69 6C 6C 65 72 20 21 21 21 00 05 00 .D.Killer !!!...
00 00 69 24 D9 43 ..i$ÙC
|
Donnée |
Type |
Commentaire |
Valeur de l'exemple
|
En-tête |
byte |
Toujours égal à 'D' (68). |
68
|
Joueurs |
byte |
Nombre de joueurs dont les informations sont fournies. |
2
|
Pour chaque joueur présent dans la réponse on trouve les données suivantes :
Donnée |
Type |
Commentaire
|
Index |
byte |
Numéro du joueur dans cette réponse.
|
Nom |
string |
Nom du joueur.
|
Score |
long |
Score du joueur (généralement le nombre de frags).
|
Durée |
float |
Durée (en seconde) depuis laquelle le joueur est connecté sur le serveur.
|
|
1 |
[D]---->T.N.W<---- |
14 |
514.37036
|
2 |
Killer !!! |
5 |
434.28445
|
|
Note: Lorsqu'un joueur est en train de se connecter au serveur il est comptabilisé dans le nombre de joueurs de la réponse, mais ces données ne sont pas contenues dans cette dernière.
A2S_RULES
Voir aussi
Articles connexes
Liens externes
Template:Otherlang:fr
Template:Otherlang:fr:en