Status serwera CS 1.6 tylko i wyłącznie... z tego co pamiętam to przerobiłem to z jakiegoś kombajnu do statusów kilkudziesięciu różnych serwerów gier.
w każdym razie, taki pliczek sobie inkludujesz czy jak CI tam wygodniej
Kod:
<?php
function lgsl_query($ip, $port, $game, $request)
{
$lgsl_feed_url = "";
$lgsl_feed_method = 0;
$lgsl_protocol[$game] = '01'; // 01 - cs1.6 // 05 - css
$qport = $port; // DEFAULT THE QUERY PORT TO THE CONNECTION PORT
switch ($lgsl_protocol[$game])
{
case "01":
$sts_data = lgsl_query_01($ip, $qport, $game, $request);
break;
case "05":
$sts_data = lgsl_query_05($ip, $qport, $game, $request);
break;
}
//---------------------------------------------------------+ INFO o serweie
if ($request == "info") {
if (!is_array($sts_data) || !trim($sts_data['hostname'])) {
unset($sts_data);
$sts_data['status'] = 0;
$sts_data['players'] = 0;
$sts_data['maxplayers'] = 0;
}
else {
$sts_data['status'] = 1;
$sts_data['gamemod'] = str_replace(" ", "", $sts_data['gamemod']); // REMOVE EXTRA SPACING FOR THE GAMEMOD
$sts_data['gamemod'] = trim(strtolower($sts_data['gamemod'])); // LOWERCASE AND TRIM
$sts_data['mapname'] = trim(strtolower($sts_data['mapname'])); // LOWERCASE AND TRIM
$sts_data['players'] = intval($sts_data['players']); // MAKE SURE PLAYER NUMBER IS NUMERIC
$sts_data['maxplayers'] = intval($sts_data['maxplayers']); // MAKE SURE PLAYER NUMBER IS NUMERIC
if (!trim($sts_data['gamemod'])) { $sts_data['gamemod'] = $game; } // GAME IS THE MOD IF NOT SET
if (!$sts_data['mapname']) { $sts_data['mapname'] = "no map"; } // SOMETIMES THE MAP IS NOT SET
if (!trim($sts_data['password'])) { $sts_data['password'] = 0; } // CONVERT EMPTY PASSWORDS
if (strtolower($sts_data['password']) == "false") { $sts_data['password'] = 0; } // CONVERT TEXT FALSE
if (strtolower($sts_data['password']) == "true") { $sts_data['password'] = 1; } // CONVERT TEXT TRUE
}
$sts_data['ip'] = $ip;
$sts_data['port'] = $port;
$sts_data['qport'] = $qport;
$sts_data['cport'] = $port;
$sts_data['gametype'] = $game;
}
return $sts_data;
}
//------------------------------------------------------------------------------------------------------------+
function lgsl_query_01($ip, $port, $game, $request)
{
$fp = @fsockopen("udp://$ip", $port, $errno, $errstr, 1);
if (!$fp) { return FALSE; } // CONNECTION WAS REFUSED
stream_set_timeout($fp, 1, 0); stream_set_blocking($fp, true); // SET TIMEOUT FOR OFFLINE SERVERS
if (($request == "settings" || $request == "players") && $game != "halflifeold") {
$challenge_code = "\xFF\xFF\xFF\xFF\x57"; // CODE NEEDED FOR PLAYERS AND SETTINGS
fwrite($fp, $challenge_code);
$buffer = fread($fp, 4096);
if (!trim($buffer)) { fclose($fp); return FALSE; }
$challenge_code = substr($buffer, 5, 4);
}
if ($game == "halflifeold") {
if ($request == "info") { $challenge = "\xFF\xFF\xFF\xFFdetails\x00"; }
if ($request == "players") { $challenge = "\xFF\xFF\xFF\xFFplayers\x00"; }
if ($request == "settings") { $challenge = "\xFF\xFF\xFF\xFFrules\x00"; }
}
else {
if ($request == "info") { $challenge = "\xFF\xFF\xFF\xFFTSource Engine Query\x00"; }
if ($request == "players") { $challenge = "\xFF\xFF\xFF\xFFU".$challenge_code; }
if ($request == "settings") { $challenge = "\xFF\xFF\xFF\xFFV".$challenge_code; }
}
fwrite($fp, $challenge);
$buffer = fread($fp, 4096);
if (!$buffer) { fclose($fp); return FALSE; } // IF BUFFER EMPTY RETURN
if ($request == "settings") {
$second_packet = fread($fp, 4096);
if (strlen($second_packet) > 0) {
$reverse_check = dechex(ord($buffer[8])); // WORKS BUT MUST BE A CLEANER METHOD
if ($reverse_check[0] == "1") {
$tmp = $buffer; // SWAP THE PACKETS AROUND
$buffer = $second_packet;
$second_packet = $tmp;
}
$buffer = substr($buffer, 13); // REMOVE LONG PACKET HEADER
$second_packet = substr($second_packet, 9); // REMOVE SECOND PACKET HEADER
$buffer = trim($buffer.$second_packet); // JOIN PACKETS AND TRIM
}
else {
$buffer = trim(substr($buffer, 4)); // REMOVE SINGLE PACKET HEADER AND TRIM
}
}
else {
$buffer = trim(substr($buffer, 4)); // REMOVE SINGLE PACKET HEADER AND TRIM
}
fclose($fp); // CLOSE CONNECTION;
if (!trim($buffer)) { return FALSE; } // IF BUFFER EMPTY RETURN
if ($request == "info") {
$tmp = explode("\x00", $buffer);
$place = strlen($tmp[0].$tmp[1].$tmp[2].$tmp[3].$tmp[4]) + 5;
$sts_data['gamemod'] = $tmp[3];
$sts_data['hostname'] = $tmp[1];
$sts_data['mapname'] = $tmp[2];
$sts_data['players'] = ord($buffer[$place]);
$sts_data['maxplayers'] = ord($buffer[$place + 1]);
$sts_data['password'] = ord($buffer[$place + 5]);
$sts_data['datatype'] = $buffer[0]; // m for steam info
$sts_data['version'] = ord($buffer[$place + 2]); // Network Version
$sts_data['description'] = $tmp[4];
$sts_data['server_type'] = $buffer[$place + 3]; // D edicated or L isten
$sts_data['server_os'] = $buffer[$place + 4]; // W indows or L inux
$sts_data['server_secure'] = ord($tmp[14]); // VAC
$sts_data['server_bots'] = ord($tmp[15]); // Number of Bots
if ($sts_data['datatype'] != "m" && $game != "halflifeold") {
return FALSE; // PREVENT USING HALFLIFE FOR HALFLIFE2 SERVERS
}
return $sts_data;
}
if ($request == "players") {
$player_number = 0;
$position = 2; // START POINT
do {
$player_number++; // INCREMENT PLAYER NUMBER
$player[$player_number]['id'] = ord($buffer[$position]);
$position ++; // GET PLAYER GAME ID
while($buffer[$position] != "\x00" && $position < 4000) {
$plejer = htmlspecialchars($buffer[$position], ENT_QUOTES);
$plejer = @mb_convert_encoding($plejer,"HTML-ENTITIES","auto");
$player[$player_number]['name'] .= $plejer; // COLLECT PLAYER NAME
$position ++;
}
$player[$player_number]['score'] = (ord($buffer[$position + 1]))
+ (ord($buffer[$position + 2]) * 256)
+ (ord($buffer[$position + 3]) * 65536)
+ (ord($buffer[$position + 4]) * 16777216);
if ($player[$player_number]['score'] > 2147483648) { $player[$player_number]['score'] -= 4294967296; }
$time = substr($buffer, $position + 5, 4); // PLAYER TIME IN BYTES
if (strlen($time) < 4) { return FALSE; } // CHECK FOR MISSING BYTES
list(,$time) = unpack("f", $time); // CONVERT BYTES TO DECIMAL
$time = mktime(0, 0, $time); // CONVERT DECIMAL TO UNIX TIMESTAMP
$player[$player_number]['time'] = date("H:i:s", $time); // CONVERT TIMESTAMP TO HUMAN READABLE TIME
$position += 9;
}
while ($position < strlen($buffer)); // REPEAT UNTIL THE END OF THE BUFFER
$k=1;
$tab = $player;
while ($player[$k]) {
$player2[$k] = array ('score' => $tab[$k]['score'], 'name' => $tab[$k]['name']);
$k++;
}
@array_multisort ($player2, SORT_DESC);
unset($player);
return $player2;
}
}
?>
Serwer odpytujesz w taki sposób
Kod:
$server['nazwa] = lgsl_query($ip, $port, $typ, "info");
$server['nazwa]['gamemod'] = preg_replace("/[^A-Za-z0-9 \_\-]/", "_", strtolower($sts_data[$k]['gamemod'])); // AND FOLDER USAGE
$server['nazwa]['mapname'] = preg_replace("/[^A-Za-z0-9 \_\-]/", "_", strtolower($sts_data[$k]['mapname']));
$server['nazwa]['player_list'] = lgsl_query($ip, $port, $typ, "players");
w ten sposób do tablicy $server['nazwa] zostają wrzucone infomracje o serwerze,
opcjonalnie ostatnia linia dodaje do tablicy $server['nazwa]['player_list'] listę graczy z fragami uporządkowaną malejąco wg fragów
jako $typ dajesz 'halflife' a jak nie działa to 'halflifeold' (ma to chyba jakiś związek z rodzajem serwera...)
i to wszystko