Dialoguer avec un serveur Counter-Strike : Source en PHP
Date de publication : 4/09/2007
Par
Adrien Pellegrini (Page d'accueil)
Comment récupérer des informations à propos d'un serveur Counter Strike
: Source ? Comment lancer des commandes RCON depuis un site Web ?
Comment faire une demande au "master server" de Steam pour récupérer
la liste des serveurs disponibles ? Tout ceci vous est expliqué dans cet article.
I. Introduction
I.1. À lire
II. Requête sur un serveur
II.1. Challenge number
II.1.1. Format de la requête
II.1.2. Format de la réponse
II.1.3. Script
II.2. Informations sur le serveur
II.2.1. Format de la requête
II.2.2. Format de la réponse
II.2.3. Script
II.3. Informations sur les règles du serveur
II.3.1. Format de la requête
II.3.2. Format de la réponse
II.3.3. Script
II.4. Informations sur les joueurs
II.4.1. Format de la requête
II.4.2. Format de la réponse
II.4.3. Script
III. Commande RCON
III.1. Format de la requête
III.2. Format de la réponse
III.3. Script
IV. Lister les serveurs
IV.1. Format de la requête
IV.2. Format de la réponse
IV.3. Script
V. Scripts divers
V.1. Voir l'état du serveur
V.2. Fonctions utilisées
V.3. Classe
VI. Liens & remerciements
I. Introduction
On peut facilement récupérer toutes sortes d'informations en
envoyant des paquets
TCP
ou
UDP
prédéfinis à des servers. Ceux-ci nous renverront un ou plusieurs
paquets, appelé réponse, qui contiendront l'information désirée.
Les paquets utilisés par Steam ont une taille de 1400 bytes plus
les entêtes IP/UDP (ou de 4096 bytes pour les commandes RCON).
Les réponses obtenues par le serveur sont généralement peu lisibles.
Pour les rendre plus lisible, j'ai écrit à la fin de cet article
une série de fonctions qui permettent de convertir les réponses.
I.1. À lire
Chaque sous partie va être séparée comme suit :
- Format de la requête correspond à la commande qu'il
faut envoyer au serveur pour récupérer la réponse appropriée.
- Format de la réponse explique les différentes parties
qui composent la réponse.
- Script nous montre le code PHP utilisé.
II. Requête sur un serveur
Un serveur répond à quatre requêtes qui sont les suivantes :
- récupérer un numéro de défi (challenge number)
- récupérer des informations à propos du serveur
- récupérer des informations sur les joueurs présents sur le serveur
- récupérer des informations sur les règles du serveur
Les requêtes doivent se faire via le protocole
UDP.
II.1. Challenge number
Le challenge number est requis pour les requêtes concernant
la récupération des règles du serveur ainsi que des joueurs
présents dessus.
II.1.1. Format de la requête
0020 ff ff ff ff 57 ....W
|
| Donnée |
Type |
| 0xFFFFFF |
int |
| W ou 0x57 |
byte |
II.1.2. Format de la réponse
0020 ff ff ff ff 41 fa 05 a4 00 ....A....
|
| Donnée |
Type |
Explication |
| 0xFFFFFF |
int |
- |
| Challenge |
long |
Le "chanllenge number" à utiliser |
II.1.3. Script
define('PACKET_SIZE', '1400');
define('SERVERQUERY_GETCHALLENGE', "\xFF\xFF\xFF\xFF\x57");
define ('REPLY_GETCHALLENGE', "\x41");
$_ip = '82.149.249.243';
$_port = '27017';
$socket = stream_socket_client('udp://'.$_ip.':'.$_port, $errno, $errstr, 30);
$cmd = SERVERQUERY_GETCHALLENGE;
$length = strlen($cmd);
fwrite($socket, $cmd, $length);
$response = fread($socket, PACKET_SIZE);
$pattern = "#\xFF\xFF\xFF\xFF".REPLY_GETCHALLENGE."#";
$response = preg_replace($pattern, '', $response);
|
II.2. Informations sur le serveur
Cette partie consiste à récupérer toutes les informations
disponibles sur un serveur tel que son nom, nombre de joueurs
maximum, nombre de joueurs présents, carte en cours ...
II.2.1. Format de la requête
| Requête au format hexadécimal |
0020 FF FF FF FF 54 53 6F 75 72 63 65 20 45 6E 67 69 ÿÿÿÿTSource Engi
0030 6E 65 20 51 75 65 72 79 00 ne Query
|
| Donnée |
Type |
| 0xFFFFFF |
int |
| T |
byte |
| Source Engine Query |
string |
II.2.2. Format de la réponse
| Réponse au format hexadécimal |
0020 ff ff ff ff 49 07 ....I.
0030 77 77 77 2e 63 6c 61 6e 6b 69 6c 6c 65 72 7a 2e www.clankillerz.
0040 64 65 20 2e 2e 3a 3a 50 75 62 6c 69 63 20 6f 6e de ..::Public on
0050 6c 79 20 48 69 67 68 73 6b 69 6c 6c 3a 3a 2e 2e ly Highskill::..
0060 00 64 65 5f 64 75 73 74 32 00 63 73 74 72 69 6b .de_dust2.cstrik
0070 65 00 43 6f 75 6e 74 65 72 2d 53 74 72 69 6b 65 e.Counter-Strike
0080 3a 20 53 6f 75 72 63 65 00 f0 00 00 0f 00 64 77 : Source......dw
0090 00 01 31 2e 30 2e 30 2e 33 34 00 ..1.0.0.34.
|
| Donnée |
Type |
Explication |
| 0xFFFFFF |
int |
- |
| Type |
byte |
Type est toujours égal à 'I' (0x49) |
| Version |
byte |
Version du réseau Steam, actuellement 0x07 |
| Nom du server |
string |
- |
| Carte |
string |
- |
| Répertoire du jeu |
string |
Le nom du répertoire qui contient les fichiers du jeu (ex: "cstrike") |
| Description du jeu |
string |
Le nom complet du jeu (ex: "Counter-Strike : Source") |
| AppID |
short |
Steam Application ID, pour CSS c'est 240 |
| Nombre de joueurs |
byte |
- |
| Nombre maximum de joueur |
byte |
- |
| Nombre de bots |
byte |
- |
| Serveur dédié |
byte |
'l' pour listen, 'd' pour dedicated et 'p' pour Source TV |
| OS |
byte |
Système d'exploitation; 'l' pour Linux et 'w' pour Windows |
| Mot de passe |
byte |
Indique si le serveur est verrouillé par mot de passe; si 0x01 il y a un mot de passe |
| Sécurisé |
byte |
Indique si VAC est activé; si 0x01 VAC est activé |
| Version du jeu |
string |
Version du jeu (ex: "1.0.0.34") |
II.2.3. Script
| Envoi de la requête et récupération de la réponse |
define('PACKET_SIZE', '1400');
define('SERVERQUERY_INFO', "\xFF\xFF\xFF\xFFTSource Engine Query");
define ('REPLY_INFO', "\x49");
$_ip = '82.149.249.243';
$_port = '27017';
$socket = stream_socket_client('udp://'.$_ip.':'.$_port, $errno, $errstr, 30);
$cmd = SERVERQUERY_INFO;
$length = strlen($cmd);
fwrite($socket, $cmd, $length);
$response = fread($socket, PACKET_SIZE);
$pattern = "#\xFF\xFF\xFF\xFF".REPLY_INFO."#";
$response = preg_replace($pattern, '', $response);
|

La réponse obtenue après la requête n'est pas très lisible.
| Formatage de la réponse pour la rendre plus lisible |
$server['version'] = getByte($response);
$server['ip'] = $_ip;
$server['port'] = $_port;
$server['name'] = trim(getString($response));
$server['map'] = getString($response);
$server['gamedir'] = getString($response);
$server['gamedesc'] = getString($response);
$server['appid'] = getShortSigned($response);
$server['numplayers'] = getByte($response);
$server['maxplayers'] = getByte($response);
$server['bot'] = getByte($response);
$data = chr(getByte($response));
$server['dedicated'] = 0;
$server['sourcetv'] = 0;
$server['listen'] = 0;
if ($data == 'd') $server['dedicated'] = 1;
if ($data == 'p') $server['sourcetv'] = 1;
if ($data == 'l') $server['listen'] = 1;
$data = chr(getByte($response));
$server['os'] = 'undefined';
if ($data == 'l')
{
$server['os'] = 'linux';
}
elseif ($data == 'w')
{
$server['os'] = 'windows';
}
$data = getByte($response);
$server['password'] = 0;
if ($data == 1)
{
$server['password'] = 1;
}
$data = getByte($response);
$server['secure'] = 1;
if ($data == 1)
{
$server['secure'] = 1;
}
$server['gameversion'] = getString($response);
|
L'affichage du tableau $server nous donne :
Array
(
[version] => 7
[ip] => 82.149.249.243
[port] => 27017
[name] => www.clankillerz.de ..::Public only Highskill::..
[map] => de_dust2
[gamedir] => cstrike
[gamedesc] => Counter-Strike: Source
[appid] => 240
[numplayers] => 0
[maxplayers] => 15
[bot] => 0
[dedicated] => 1
[sourcetv] => 0
[listen] => 0
[os] => windows
[password] => 0
[secure] => 1
[gameversion] => 1.0.0.34
)
|
II.3. Informations sur les règles du serveur
Cette partie consiste à récupérer toutes les règles
sur un serveur tel que mp_timelimit, sv_alltalk, ...
II.3.1. Format de la requête
FF FF FF FF 56 <4 byte challenge number> ....V
|
| Donnée |
Type |
| 0xFFFFFF |
int |
| V (ou 0x56) |
byte |
| Challenge Number |
long |
II.3.2. Format de la réponse
| Réponse au format hexadécimal |
0020 ff ff ff ff 45 41 ....EA
0030 00 6d 61 74 74 69 65 5f 6d 75 67 6d 6f 64 00 31 .mattie_mugmod.1
0040 00 6d 61 74 74 69 65 5f 65 76 65 6e 74 73 63 72 .mattie_eventscr
0050 69 70 74 73 00 31 00 65 76 65 6e 74 73 63 72 69 ipts.1.eventscri
0060 70 74 73 5f 76 65 72 00 31 2e 33 2e 30 2e 30 30 pts_ver.1.3.0.00
0070 36 00 6d 61 6e 69 5f 72 65 73 65 72 76 65 5f 73 6.mani_reserve_s
0080 6c 6f 74 73 00 30 00 6d 61 6e 69 5f 61 64 6d 69 lots.0.mani_admi
0090 6e 5f 70 6c 75 67 69 6e 5f 76 65 72 73 69 6f 6e n_plugin_version
00a0 00 31 2e 32 42 65 74 61 52 20 56 53 50 00 6d 61 .1.2BetaR VSP.ma
00b0 6e 69 5f 74 69 63 6b 72 61 74 65 00 31 30 30 00 ni_tickrate.100.
00c0 6d 61 6e 69 5f 6e 65 78 74 6d 61 70 00 63 73 5f mani_nextmap.cs_
00d0 6f 66 66 69 63 65 00 65 73 74 5f 76 65 72 73 69 office.est_versi
00e0 6f 6e 00 30 2e 34 31 37 61 00 6d 70 5f 74 65 61 on.0.417a.mp_tea
00f0 6d 70 6c 61 79 00 30 00 6d 70 5f 66 72 61 67 6c mplay.0.mp_fragl
0100 69 6d 69 74 00 30 00 6d 70 5f 66 61 6c 6c 64 61 imit.0.mp_fallda
0110 6d 61 67 65 00 31 00 6d 70 5f 77 65 61 70 6f 6e mage.1.mp_weapon
0120 73 74 61 79 00 30 00 6d 70 5f 66 6f 72 63 65 72 stay.0.mp_forcer
0130 65 73 70 61 77 6e 00 31 00 6d 70 5f 66 6f 6f 74 espawn.1.mp_foot
0140 73 74 65 70 73 00 31 00 6d 70 5f 66 6c 61 73 68 steps.1.mp_flash
0150 6c 69 67 68 74 00 31 00 6d 70 5f 61 75 74 6f 63 light.1.mp_autoc
0160 72 6f 73 73 68 61 69 72 00 31 00 64 65 63 61 6c rosshair.1.decal
0170 66 72 65 71 75 65 6e 63 79 00 34 35 00 6d 70 5f frequency.45.mp_
0180 74 65 61 6d 6c 69 73 74 00 68 67 72 75 6e 74 3b teamlist.hgrunt;
0190 73 63 69 65 6e 74 69 73 74 00 6d 70 5f 61 6c 6c scientist.mp_all
01a0 6f 77 4e 50 43 73 00 31 00 6d 70 5f 66 72 69 65 owNPCs.1.mp_frie
01b0 6e 64 6c 79 66 69 72 65 00 31 00 73 76 5f 67 72 ndlyfire.1.sv_gr
01c0 61 76 69 74 79 00 38 30 30 00 73 76 5f 73 74 6f avity.800.sv_sto
01d0 70 73 70 65 65 64 00 37 35 00 73 76 5f 6e 6f 63 pspeed.75.sv_noc
01e0 6c 69 70 61 63 63 65 6c 65 72 61 74 65 00 35 00 lipaccelerate.5.
01f0 73 76 5f 6e 6f 63 6c 69 70 73 70 65 65 64 00 35 sv_noclipspeed.5
0200 00 73 76 5f 73 70 65 63 61 63 63 65 6c 65 72 61 .sv_specaccelera
0210 74 65 00 35 00 73 76 5f 73 70 65 63 73 70 65 65 te.5.sv_specspee
0220 64 00 31 00 73 76 5f 73 70 65 63 6e 6f 63 6c 69 d.1.sv_specnocli
0230 70 00 30 00 73 76 5f 6d 61 78 73 70 65 65 64 00 p.0.sv_maxspeed.
0240 33 32 30 00 73 76 5f 61 63 63 65 6c 65 72 61 74 320.sv_accelerat
0250 65 00 35 00 73 76 5f 61 69 72 61 63 63 65 6c 65 e.5.sv_airaccele
0260 72 61 74 65 00 31 30 00 73 76 5f 77 61 74 65 72 rate.10.sv_water
0270 61 63 63 65 6c 65 72 61 74 65 00 31 30 00 73 76 accelerate.10.sv
0280 5f 77 61 74 65 72 66 72 69 63 74 69 6f 6e 00 31 _waterfriction.1
0290 00 73 76 5f 66 6f 6f 74 73 74 65 70 73 00 31 00 .sv_footsteps.1.
02a0 73 76 5f 72 6f 6c 6c 73 70 65 65 64 00 32 30 30 sv_rollspeed.200
02b0 00 73 76 5f 72 6f 6c 6c 61 6e 67 6c 65 00 30 00 .sv_rollangle.0.
02c0 73 76 5f 66 72 69 63 74 69 6f 6e 00 34 00 73 76 sv_friction.4.sv
02d0 5f 62 6f 75 6e 63 65 00 30 00 73 76 5f 73 74 65 _bounce.0.sv_ste
02e0 70 73 69 7a 65 00 31 38 00 72 5f 56 65 68 69 63 psize.18.r_Vehic
02f0 6c 65 56 69 65 77 44 61 6d 70 65 6e 00 31 00 72 leViewDampen.1.r
0300 5f 4a 65 65 70 56 69 65 77 44 61 6d 70 65 6e 46 _JeepViewDampenF
0310 72 65 71 00 37 2e 30 00 72 5f 4a 65 65 70 56 69 req.7.0.r_JeepVi
0320 65 77 44 61 6d 70 65 6e 44 61 6d 70 00 31 2e 30 ewDampenDamp.1.0
0330 00 72 5f 4a 65 65 70 56 69 65 77 5a 48 65 69 67 .r_JeepViewZHeig
0340 68 74 00 31 30 2e 30 00 72 5f 41 69 72 62 6f 61 ht.10.0.r_Airboa
0350 74 56 69 65 77 44 61 6d 70 65 6e 46 72 65 71 00 tViewDampenFreq.
0360 37 2e 30 00 72 5f 41 69 72 62 6f 61 74 56 69 65 7.0.r_AirboatVie
0370 77 44 61 6d 70 65 6e 44 61 6d 70 00 31 2e 30 00 wDampenDamp.1.0.
0380 72 5f 41 69 72 62 6f 61 74 56 69 65 77 5a 48 65 r_AirboatViewZHe
0390 69 67 68 74 00 30 2e 30 00 6d 70 5f 74 69 6d 65 ight.0.0.mp_time
03a0 6c 69 6d 69 74 00 35 30 30 00 73 76 5f 61 6c 6c limit.500.sv_all
03b0 74 61 6c 6b 00 30 00 6d 70 5f 64 79 6e 61 6d 69 talk.0.mp_dynami
03c0 63 70 72 69 63 69 6e 67 00 30 00 6e 65 78 74 6c cpricing.0.nextl
03d0 65 76 65 6c 00 00 6d 70 5f 61 75 74 6f 74 65 61 evel..mp_autotea
03e0 6d 62 61 6c 61 6e 63 65 00 31 00 6d 70 5f 6d 61 mbalance.1.mp_ma
03f0 78 72 6f 75 6e 64 73 00 30 00 6d 70 5f 72 6f 75 xrounds.0.mp_rou
0400 6e 64 74 69 6d 65 00 34 00 6d 70 5f 66 72 65 65 ndtime.4.mp_free
0410 7a 65 74 69 6d 65 00 35 00 6d 70 5f 63 34 74 69 zetime.5.mp_c4ti
0420 6d 65 72 00 33 35 00 6d 70 5f 6c 69 6d 69 74 74 mer.35.mp_limitt
0430 65 61 6d 73 00 30 00 6d 70 5f 68 6f 73 74 61 67 eams.0.mp_hostag
0440 65 70 65 6e 61 6c 74 79 00 33 00 73 76 5f 76 6f epenalty.3.sv_vo
0450 69 63 65 65 6e 61 62 6c 65 00 31 00 73 76 5f 63 iceenable.1.sv_c
0460 6f 6e 74 61 63 74 00 77 77 77 2e 63 6c 61 6e 6b ontact.www.clank
0470 69 6c 6c 65 72 7a 2e 64 65 00 73 76 5f 70 61 75 illerz.de.sv_pau
0480 73 61 62 6c 65 00 30 00 73 76 5f 63 68 65 61 74 sable.0.sv_cheat
0490 73 00 30 00 63 6f 6f 70 00 30 00 64 65 61 74 68 s.0.coop.0.death
04a0 6d 61 74 63 68 00 31 00 74 76 5f 70 61 73 73 77 match.1.tv_passw
04b0 6f 72 64 00 30 00 74 76 5f 72 65 6c 61 79 70 61 ord.0.tv_relaypa
04c0 73 73 77 6f 72 64 00 30 00 73 76 5f 70 61 73 73 ssword.0.sv_pass
04d0 77 6f 72 64 00 30 00 word.0.
|
| Donnée |
Type |
Explication |
| 0xFFFFFF |
int |
- |
| Type |
byte |
Type est toujours égal à 'E' (0x45) |
| Nombre de règle |
short |
- |
| Nom de la règle |
string |
- |
| Valeur de la règle |
string |
- |
II.3.3. Script
| Envoi de la requête et récupération de la réponse |
define('PACKET_SIZE', '1400');
define('SERVERQUERY_GETCHALLENGE', "\xFF\xFF\xFF\xFF\x57");
define('SERVERQUERY_RULES', "\xFF\xFF\xFF\xFF\x56");
define('REPLY_GETCHALLENGE', "\x41");
define('REPLY_RULES', "\x45");
$_ip = '82.149.249.243';
$_port = '27017';
$socket = stream_socket_client('udp://'.$_ip.':'.$_port, $errno, $errstr, 30);
$cmd = SERVERQUERY_GETCHALLENGE;
$length = strlen($cmd);
fwrite($socket, $cmd, $length);
$response = fread($socket, PACKET_SIZE);
$pattern = "´\xFF\xFF\xFF\xFF".REPLY_GETCHALLENGE."´";
$challengeNumber = preg_replace($pattern, '', $response);
$cmd = SERVERQUERY_RULES.$challengeNumber;
$length = strlen($cmd);
fwrite($socket, $cmd, $length);
$response = fread($socket, PACKET_SIZE);
$pattern = "#\xFF\xFF\xFF\xFF".REPLY_RULES."#";
$response = preg_replace($pattern, '', $response);
|
| Formatage de la réponse pour la rendre plus lisible |
$ruleNumber = getShortSigned($response);
while ($response !== false)
{
$name = getString($response);
$rules[$name] = getString($response);
}
|
L'affichage du tableau $rules nous donne :
Array
(
[mattie_mugmod] => 1
[mattie_eventscripts] => 1
[eventscripts_ver] => 1.3.0.006
[mani_reserve_slots] => 0
[mani_admin_plugin_version] => 1.2BetaR VSP
[mani_tickrate] => 100
[mani_nextmap] => cs_office
[est_version] => 0.417a
[mp_teamplay] => 0
[mp_fraglimit] => 0
[mp_falldamage] => 1
[mp_weaponstay] => 0
[mp_forcerespawn] => 1
[mp_footsteps] => 1
[mp_flashlight] => 1
[mp_autocrosshair] => 1
[decalfrequency] => 45
[mp_teamlist] => hgrunt;scientist
[mp_allowNPCs] => 1
[mp_friendlyfire] => 1
[sv_gravity] => 800
[sv_stopspeed] => 75
[sv_noclipaccelerate] => 5
[sv_noclipspeed] => 5
[sv_specaccelerate] => 5
[sv_specspeed] => 1
[sv_specnoclip] => 0
[sv_maxspeed] => 320
[sv_accelerate] => 5
[sv_airaccelerate] => 10
[sv_wateraccelerate] => 10
[sv_waterfriction] => 1
[sv_footsteps] => 1
[sv_rollspeed] => 200
[sv_rollangle] => 0
[sv_friction] => 4
[sv_bounce] => 0
[sv_stepsize] => 18
[r_VehicleViewDampen] => 1
[r_JeepViewDampenFreq] => 7.0
[r_JeepViewDampenDamp] => 1.0
[r_JeepViewZHeight] => 10.0
[r_AirboatViewDampenFreq] => 7.0
[r_AirboatViewDampenDamp] => 1.0
[r_AirboatViewZHeight] => 0.0
[mp_timelimit] => 500
[sv_alltalk] => 0
[mp_dynamicpricing] => 0
[nextlevel] =>
[mp_autoteambalance] => 1
[mp_maxrounds] => 0
[mp_roundtime] => 4
[mp_freezetime] => 5
[mp_c4timer] => 35
[mp_limitteams] => 0
[mp_hostagepenalty] => 3
[sv_voiceenable] => 1
[sv_contact] => www.clankillerz.de
[sv_pausable] => 0
[sv_cheats] => 0
[coop] => 0
[deathmatch] => 1
[tv_password] => 0
[tv_relaypassword] => 0
[sv_password] => 0
)
|
II.4. Informations sur les joueurs
Cette partie consiste à récupérer quelques informations à propos
des joueurs présents sur le serveur tel que leur pseudo,
nombre de skills et temps présents sur le serveur.
II.4.1. Format de la requête
0020 FF FF FF FF 55 <4 byte challenge number> ....U
|
| Donnée |
Type |
| 0xFFFFFF |
int |
| U (ou 0x55) |
byte |
| Challenge Number |
long |
II.4.2. Format de la réponse
0020 ff ff ff ff 44 08 ....D.
0030 00 c2 bb 7d c3 87 4b c5 bd 7b c2 ab 30 30 37 7c ...}..K..{..007|
0040 6c 6f 57 62 49 72 64 00 33 00 00 00 39 97 6d 45 loWbIrd.3...9.mE
0050 01 42 69 6c 6c 79 74 68 65 4b 69 64 00 05 00 00 .BillytheKid....
0060 00 83 01 82 44 02 c5 a0 c4 ac c5 98 c5 8e e2 84 ....D...........
0070 a2 c2 aa c2 b9 7c 20 4c 75 6b 40 73 31 39 38 39 .....| Luk@s1989
0080 28 63 68 29 00 01 00 00 00 3d 5a 49 43 03 44 72 (ch).....=ZIC.Dr
0090 2e 45 76 69 6c 20 5b 47 45 52 5d 00 01 00 00 00 .Evil [GER].....
00a0 cf 29 a3 42 04 46 61 74 74 69 58 78 5e 00 0e 00 .).B.FattiXx^...
00b0 00 00 dc 5f 4d 44 05 5e 53 6f 4f 6e 59 20 3a 3e ..._MD.^SoOnY :>
00c0 20 3a 3e 20 3a 3e 00 01 00 00 00 2b 23 8e 42 07 :> :>.....+
00d0 49 73 4e 23 50 77 4e 62 00 01 00 00 00 b4 bd 21 IsN
00e0 43 0d 21 62 45 6a 6b 32 31 4f 2a 00 1e 00 00 00 C.!bEjk21O*.....
00f0 66 a9 0b 45 f..E
|
| Donnée |
Type |
Explication |
| 0xFFFFFF |
int |
- |
| Type |
byte |
Type est toujours égal à 'D' (0x44) |
| Nombre de joueurs |
byte |
- |
| Index |
byte |
Index compris entre 0 et le nombre de joueurs |
| Nom du joueur |
string |
- |
| Kills |
long |
- |
| Temps connecté |
float |
Temps en seconde |
II.4.3. Script
| Envoi de la requête et récupération de la réponse |
|