Witam. Mam pytanie. Szukam kodu, który będzie mi wyświetlał status serwera CS. A dokładnie chodzi mi o liczbę graczy. Znalazłem coś takiego:
  1. <?php
  2. function lgsl_query($ip, $port, $game, $request)
  3. {
  4.  
  5. $lgsl_feed_url = "";
  6. $lgsl_feed_method = 0;
  7. $lgsl_protocol[$game] = '01'; // 01 - cs1.6 // 05 - css
  8. $qport = $port; // DEFAULT THE QUERY PORT TO THE CONNECTION PORT
  9.  
  10. switch ($lgsl_protocol[$game])
  11. {
  12. case "01":
  13. $sts_data = lgsl_query_01($ip, $qport, $game, $request);
  14. break;
  15. case "05":
  16. $sts_data = lgsl_query_05($ip, $qport, $game, $request);
  17. break;
  18. }
  19.  
  20. //---------------------------------------------------------+ INFO o serweie
  21. if ($request == "info") {
  22. if (!is_array($sts_data) || !trim($sts_data['hostname'])) {
  23. unset($sts_data);
  24. $sts_data['status'] = 0;
  25. $sts_data['players'] = 0;
  26. $sts_data['maxplayers'] = 0;
  27. }
  28. else {
  29. $sts_data['status'] = 1;
  30. $sts_data['gamemod'] = str_replace(" ", "", $sts_data['gamemod']); // REMOVE EXTRA SPACING FOR THE GAMEMOD
  31. $sts_data['gamemod'] = trim(strtolower($sts_data['gamemod'])); // LOWERCASE AND TRIM
  32. $sts_data['mapname'] = trim(strtolower($sts_data['mapname'])); // LOWERCASE AND TRIM
  33. $sts_data['players'] = intval($sts_data['players']); // MAKE SURE PLAYER NUMBER IS NUMERIC
  34. $sts_data['maxplayers'] = intval($sts_data['maxplayers']); // MAKE SURE PLAYER NUMBER IS NUMERIC
  35. if (!trim($sts_data['gamemod'])) { $sts_data['gamemod'] = $game; } // GAME IS THE MOD IF NOT SET
  36. if (!$sts_data['mapname']) { $sts_data['mapname'] = "no map"; } // SOMETIMES THE MAP IS NOT SET
  37. if (!trim($sts_data['password'])) { $sts_data['password'] = 0; } // CONVERT EMPTY PASSWORDS
  38. if (strtolower($sts_data['password']) == "false") { $sts_data['password'] = 0; } // CONVERT TEXT FALSE
  39. if (strtolower($sts_data['password']) == "true") { $sts_data['password'] = 1; } // CONVERT TEXT TRUE
  40. }
  41.  
  42. $sts_data['ip'] = $ip;
  43. $sts_data['port'] = $port;
  44. $sts_data['qport'] = $qport;
  45. $sts_data['cport'] = $port;
  46. $sts_data['gametype'] = $game;
  47. }
  48. return $sts_data;
  49. }
  50.  
  51.  
  52. //------------------------------------------------------------------------------------------------------------+
  53.  
  54.  
  55.  
  56. function lgsl_query_01($ip, $port, $game, $request)
  57. {
  58. $fp = @fsockopen("udp://$ip", $port, $errno, $errstr, 1);
  59.  
  60. if (!$fp) { return FALSE; } // CONNECTION WAS REFUSED
  61.  
  62. stream_set_timeout($fp, 1, 0); stream_set_blocking($fp, true); // SET TIMEOUT FOR OFFLINE SERVERS
  63.  
  64.  
  65. if (($request == "settings" || $request == "players") && $game != "halflifeold") {
  66. $challenge_code = "\xFF\xFF\xFF\xFF\x57"; // CODE NEEDED FOR PLAYERS AND SETTINGS
  67. fwrite($fp, $challenge_code);
  68. $buffer = fread($fp, 4096);
  69. if (!trim($buffer)) { fclose($fp); return FALSE; }
  70. $challenge_code = substr($buffer, 5, 4);
  71. }
  72.  
  73.  
  74.  
  75. if ($game == "halflifeold") {
  76. if ($request == "info") { $challenge = "\xFF\xFF\xFF\xFFdetails\x00"; }
  77. if ($request == "players") { $challenge = "\xFF\xFF\xFF\xFFplayers\x00"; }
  78. if ($request == "settings") { $challenge = "\xFF\xFF\xFF\xFFrules\x00"; }
  79. }
  80. else {
  81. if ($request == "info") { $challenge = "\xFF\xFF\xFF\xFFTSource Engine Query\x00"; }
  82. if ($request == "players") { $challenge = "\xFF\xFF\xFF\xFFU".$challenge_code; }
  83. if ($request == "settings") { $challenge = "\xFF\xFF\xFF\xFFV".$challenge_code; }
  84. }
  85.  
  86. fwrite($fp, $challenge);
  87.  
  88. $buffer = fread($fp, 4096);
  89.  
  90. if (!$buffer) { fclose($fp); return FALSE; } // IF BUFFER EMPTY RETURN
  91.  
  92. if ($request == "settings") {
  93. $second_packet = fread($fp, 4096);
  94. if (strlen($second_packet) > 0) {
  95. $reverse_check = dechex(ord($buffer[8])); // WORKS BUT MUST BE A CLEANER METHOD
  96.  
  97. if ($reverse_check[0] == "1") {
  98. $tmp = $buffer; // SWAP THE PACKETS AROUND
  99. $buffer = $second_packet;
  100. $second_packet = $tmp;
  101. }
  102.  
  103. $buffer = substr($buffer, 13); // REMOVE LONG PACKET HEADER
  104. $second_packet = substr($second_packet, 9); // REMOVE SECOND PACKET HEADER
  105. $buffer = trim($buffer.$second_packet); // JOIN PACKETS AND TRIM
  106. }
  107. else {
  108. $buffer = trim(substr($buffer, 4)); // REMOVE SINGLE PACKET HEADER AND TRIM
  109. }
  110. }
  111. else {
  112. $buffer = trim(substr($buffer, 4)); // REMOVE SINGLE PACKET HEADER AND TRIM
  113. }
  114. fclose($fp); // CLOSE CONNECTION;
  115.  
  116. if (!trim($buffer)) { return FALSE; } // IF BUFFER EMPTY RETURN
  117.  
  118. if ($request == "info") {
  119. $tmp = explode("\x00", $buffer);
  120. $place = strlen($tmp[0].$tmp[1].$tmp[2].$tmp[3].$tmp[4]) + 5;
  121. $sts_data['gamemod'] = $tmp[3];
  122. $sts_data['hostname'] = $tmp[1];
  123. $sts_data['mapname'] = $tmp[2];
  124. $sts_data['players'] = ord($buffer[$place]);
  125. $sts_data['maxplayers'] = ord($buffer[$place + 1]);
  126. $sts_data['password'] = ord($buffer[$place + 5]);
  127. $sts_data['datatype'] = $buffer[0]; // m for steam info
  128. $sts_data['version'] = ord($buffer[$place + 2]); // Network Version
  129. $sts_data['description'] = $tmp[4];
  130. $sts_data['server_type'] = $buffer[$place + 3]; // D edicated or L isten
  131. $sts_data['server_os'] = $buffer[$place + 4]; // W indows or L inux
  132. $sts_data['server_secure'] = ord($tmp[14]); // VAC
  133. $sts_data['server_bots'] = ord($tmp[15]); // Number of Bots
  134.  
  135. if ($sts_data['datatype'] != "m" && $game != "halflifeold") {
  136. return FALSE; // PREVENT USING HALFLIFE FOR HALFLIFE2 SERVERS
  137. }
  138. return $sts_data;
  139. }
  140.  
  141. if ($request == "players") {
  142. $player_number = 0;
  143. $position = 2; // START POINT
  144.  
  145. do {
  146. $player_number++; // INCREMENT PLAYER NUMBER
  147. $player[$player_number]['id'] = ord($buffer[$position]);
  148. $position ++; // GET PLAYER GAME ID
  149.  
  150. while($buffer[$position] != "\x00" && $position < 4000) {
  151. $plejer = htmlspecialchars($buffer[$position], ENT_QUOTES);
  152. $plejer = @mb_convert_encoding($plejer,"HTML-ENTITIES","auto");
  153. $player[$player_number]['name'] .= $plejer; // COLLECT PLAYER NAME
  154. $position ++;
  155. }
  156.  
  157. $player[$player_number]['score'] = (ord($buffer[$position + 1]))
  158. + (ord($buffer[$position + 2]) * 256)
  159. + (ord($buffer[$position + 3]) * 65536)
  160. + (ord($buffer[$position + 4]) * 16777216);
  161.  
  162. if ($player[$player_number]['score'] > 2147483648) { $player[$player_number]['score'] -= 4294967296; }
  163.  
  164. $time = substr($buffer, $position + 5, 4); // PLAYER TIME IN BYTES
  165. if (strlen($time) < 4) { return FALSE; } // CHECK FOR MISSING BYTES
  166. list(,$time) = unpack("f", $time); // CONVERT BYTES TO DECIMAL
  167. $time = mktime(0, 0, $time); // CONVERT DECIMAL TO UNIX TIMESTAMP
  168. $player[$player_number]['time'] = date("H:i:s", $time); // CONVERT TIMESTAMP TO HUMAN READABLE TIME
  169.  
  170. $position += 9;
  171. }
  172. while ($position < strlen($buffer)); // REPEAT UNTIL THE END OF THE BUFFER
  173.  
  174. $k=1;
  175. $tab = $player;
  176. while ($player[$k]) {
  177. $player2[$k] = array ('score' => $tab[$k]['score'], 'name' => $tab[$k]['name']);
  178. $k++;
  179. }
  180. @array_multisort ($player2, SORT_DESC);
  181. unset($player);
  182. return $player2;
  183. }
  184. }
  185.  
  186. ?>

I pisze Serwer odpytujesz w taki sposób:

$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");



I pisze jeszcze :
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 gdzie mam co wpisać, aby wyświetlał mi info o serwie. Bo nie wiem gdzie to mam po wklejać i co trzeba zmienić/dodać.