Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: podłączenie do serwera counter-strike i...
Forum PHP.pl > Forum > PHP
Najki
Pytanie kieruję do osób obeznanych w tym temacie (php-CS)

Po pierwsze: skrypt musi podłączyć się do serwera gry Counter-Strike (np. 62.21.96.9:27016).
Po drugie: skrypt powinien wprowadzić hasło RCON.
Po trzecie: skrypt powinien sprawdzić wartość komendy "sv_password" (lub innej) i przypisać go do zmiennej (lub tablicy) w php.

Jak to zrobić? Może ktoś ma już coś takiego gotowego?
hwao
Sam nie dawno cos takiego pisalem tylko nie pamietam nic kodu...
Wiem ze otwiera sie polaczenie fsockopen" title="Zobacz w manualu PHP" target="_manual() na podanym ip i porcie. Jak sie uda to otrzymujesz dane od serwera po wyslaniu odpowiednich pakietow (na jakiejsc stronie bylo opisane co wysylac zeby co dostac). Wiem tez ze sprawa sie komplikowala w roznych wersjach (1.5 1.6 source ). Opisz jakiej potrzebujesz to moze pomoge
Najki
Dzięki, byłoby super!

Ja potrzebuje do wersji 1.6.
W sumie jedyna komenda, której sprawdzenie mi wystarczy to "sv_password" (hasło na serwer), ale gdyby była możliwość prostego zadawania innych zapytań (np. przez jakąś tablicę czy coś) to byłoby jeszcze bardziej super winksmiley.jpg.
hwao
Jeszcze przed szkola dam narazie tyle:
http://phphomepage.mirrors.phpclasses.org/...1815.html#class
http://www.hosthideout.com/archive/index.php/t-1611.html

Jak wroce postaram sie o wiecej
Najki
To pierwsze jest do CS Source, więc raczej niewiele mi da.

Mówisz, że niedawno coś takiego pisałeś. Nie masz już ani śladu po kodzie?
hwao
Niestety kodu nie mam ale moge sporobwac pomuc odezwij sie domnie na jakims komunikatorze (dane w mojim profilu)
ennics
koledzy, jeśli można by było upublicznić Wasze privy to byłbym wdzięczny, mam podobny orzech do zgryzienia.

Najki, próbowałem CURL, ale narazie bez większych efektów.

pozdr.!
Najki
To może popracujemy nad tym razem, lub coś? Hwao niewiele mi zdążył pomóc przed padem GG.

Znalazłem skrypt phpRCON (logowanie, zarządzanie serwerem, odpalanie komend, listy banów etc). Jest w nim klasa Rcon, którą możnaby jakoś przerobić. Ja niestety nie znam się na klasach, nie wiem jak ich skutecznie używać itp., więc ktoś musiałby tu pomóc (ennics? hwao?). To jest ta klasa:
http://bez-strachu.pl/najki/rcon_hl_net.txt
To co robimy dalej? tongue.gif


UPDATE: Znalazłem coś ciekawego.
Plik "librcon.php"
  1. <?
  2. #Lib half-life rcon v 0.2 by Mariusz \"Aiv\" Dalewski <aiv@battlefield1942.pl>
  3. function rcon_open($ip, $port) {
  4. $socket = fsockopen(&#092;"udp://$ip\", $port, $err1, $err2);
  5. return $socket;
  6. }
  7.  
  8. function rcon_close($socket) {
  9. fclose($socket);
  10. }
  11.  
  12. function rcon_public_command($socket, $command, $timeout = 5) {
  13. fwrite($socket,&#092;"xFFxFFxFFxFF$command0\");
  14. socket_set_timeout($socket, $timeout);
  15. $response = rcon_read($socket);
  16. return $response;
  17. }
  18.  
  19. function rcon_command($socket, $challenge, $password, $command, $timeout = 5) {
  20. fwrite($socket,&#092;"xFFxFFxFFxFFrcon $challenge \"$password\" $command0\");
  21. socket_set_timeout($socket, $timeout);
  22. $response = rcon_read($socket);
  23. return $response;
  24. }
  25.  
  26. function rcon_get_challenge($socket, $timeout = 5) {
  27. fwrite($socket,&#092;"xFFxFFxFFxFFchallenge rcon0\");
  28. socket_set_timeout($socket, $timeout);
  29. $header = fread($socket, 5);
  30. $status = socket_get_status($socket);
  31. $package = fread($socket, $status['unread_bytes']);
  32. $challenge = explode(' ', trim($package));
  33. $response = $challenge[2];
  34. return $response;
  35. }
  36.  
  37. function rcon_read($socket) {
  38. while($header = fread($socket, 5)) {
  39. $status = socket_get_status($socket);
  40. $package = fread($socket, $status['unread_bytes']);
  41. $headers[] = $header;
  42. $packages[] = $package;
  43.  
  44. if (substr($package, 2, 2) == &#092;"x00x12\") {
  45. $packages_more[$header] = $package;
  46. }
  47. }
  48.  
  49. for($i = 0; $i != count($packages); $i++) {
  50. if (substr($packages[$i],2,2) == &#092;"x00x02\") {
  51. $package_more = $packages_more[$headers[$i]];
  52. $package_more = substr($package_more,4);
  53. $package_more = substr($package_more,0,strlen($package_more)-1);
  54. $package = $packages[$i];
  55. $package = substr($package,10);
  56. $package .= $package_more;
  57. $new[] = $package;
  58. } elseif (substr($packages[$i],2,2) != &#092;"x00x12\" && substr($packages[$i],strlen($packages[$i])-2) == \"x00x00\") {
  59. $packages[$i] = substr($packages[$i],0,strlen($packages[$i])-2);
  60. $new[] = $packages[$i];
  61. }
  62. }
  63. if ($new)
  64. $response = @implode('', $new);
  65. else
  66. $response = @implode('', $packages);
  67.  
  68.  return $response;
  69. }
  70.  
  71. function parse_info($package) {
  72. $parse = explode(&#092;"0\", $package);
  73. $response[address] = $parse[0];
  74. $response[hostname] = $parse[1];
  75. $response[map] = $parse[2];
  76. $response[gamedir] = $parse[3];
  77. $response[description] = $parse[4];
  78. $response[players] = ord($package[strlen($package)-3]);
  79. $response[max] = ord($package[strlen($package)-2]);
  80. $response[protocol] = ord($package[strlen($package)-1]);
  81. return $response;
  82. }
  83.  
  84. function parse_infostring($package) {
  85. $parse = explode(&#092;"0\", $package);
  86. $parse = explode(&#092;"\", $parse[1]);
  87. for ($i = 1; $i < count($parse); ($i += 2)) {
  88. $response[$parse[$i]] = $parse[($i+1)];
  89. }
  90. return $response;
  91. }
  92.  
  93. function parse_players($package) {
  94. $users = ord($package[0]);
  95.  
  96. $offset = 1;
  97. for ($i = 0; $i < $users; $i++) {
  98. $gracz = ord($package[$offset++]);
  99.  
  100. $nick = '';
  101. while ($package[$offset] != &#092;"x00\") {
  102. $nick .= $package[$offset];
  103. $offset++;
  104. }
  105. $offset++;
  106.  
  107. $llong = unpack(&#092;"llong\",$package[$offset].$package[$offset+1].$package[$offset+2].$package[$offset
    +3]);
  108. $frags = $llong['long'];
  109. $offset += 4;
  110.  
  111. $ffloat = unpack(&#092;"ffloat\",$package[$offset].$package[$offset+1].$package[$offset+2].$package[$offset
    +3]);
  112. $time = $ffloat['float'];
  113. $offset += 4;
  114.  
  115. $minutes = floor($time / 60);
  116. $h = floor($minutes / 60);
  117. $seconds = floor($time - ($minutes * 60));
  118. $minutes = $minutes - ($h * 60);
  119.  
  120. $time = sprintf(&#092;"%02s:%02s:%02s\", $h, $minutes, $seconds);
  121.  
  122. $response[$i][id] = $gracz;
  123. $response[$i][nick] = $nick;
  124. $response[$i][frags] = $frags;
  125. $response[$i][time] = $time;
  126. }
  127. return $response;
  128. }
  129.  
  130. function parse_rules($package) {
  131. $parse = explode(&#092;"0\", $package);
  132. for ($i = 1; $i < count($parse); ($i=$i+2)) {
  133. $response[$parse[$i]] = $parse[($i+1)];
  134. }
  135.  
  136. return $response;
  137. }
  138. ?>

Plik "test.php"
  1. <?
  2. include('librcon.php');
  3. $ip = 'your server ip';
  4. $port = 'your server port';
  5. $rcon_password = 'your rcon password';
  6. $command = 'command';
  7.  
  8. // Public query
  9. $socket = rcon_open($ip, $port);
  10. $response = rcon_public_command($socket, 'infostring');
  11. $infostring = parse_infostring($response);
  12. rcon_close($socket);
  13. print_r($infostring);
  14.  
  15. // Rcon
  16. $socket = rcon_open($ip, $port);
  17. $challenge = rcon_get_challenge($socket);
  18. $command = rcon_command($socket, $challenge, $rcon_password, $command);
  19. rcon_close($socket);
  20. print_r($command);
  21. ?>

Jest git! smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.