Advertisement
Guest User

SOLDAT REFRESH AND REFRESHX PARSER

a guest
Jun 1st, 2010
423
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 6.99 KB | None | 0 0
  1. <?php
  2.  
  3. /*
  4. *  SOLDAT REFRESH AND REFRESHX PARSER
  5. *   By: ramirez (c) 2007
  6. *   http://devs.soldat.pl/wiki/index.php?title=Refreshx
  7. *
  8. *  UPDATE: added 2.7.0+ RefreshX support, by SyavX (01-06-2010)
  9. *
  10. *  Usage:
  11. *   $info = ParseRefresh($packet);
  12. *
  13. *  Example:
  14. *
  15. *   <?php
  16. *   include('soldat.refresh.php');
  17. *   $socket = fsockopen('your.server.com', 23073);
  18. *
  19. *   fputs($socket, "PASSWORD\n");
  20. *   fputs($socket, "REFRESH\n");
  21. *   fputs($socket, "REFRESHX\n");
  22. *
  23. *   $version = null;
  24. *   while ($data = trim(fgets($socket, 1024))) {
  25. *       if (preg_match('/^Server Version: (.+)$/', $data, $match)) {
  26. *           $version = $match[1];
  27. *       }
  28. *       else if ($data == 'REFRESH') {
  29. *           $info = ParseRefresh(fread($socket, REFRESH_PACKET_SIZE), $version);
  30. *           print_r($info);
  31. *       }
  32. *       else if ($data == 'REFRESHX') {
  33. *           $info = ParseRefresh(fread($socket, RefreshXSize($version)), $version);
  34. *           print_r($info);
  35. *           break;
  36. *       }
  37. *   }
  38. *
  39. *   fclose($socket);
  40. *   ?>
  41. */
  42.  
  43. define('REFRESH_PACKET_SIZE',  1188);
  44.  
  45. function RefreshXSize($version = '2.6.5')
  46. {
  47.     if ($version >= '2.7.0')
  48.     {
  49.         return 1960;
  50.     }
  51.     else if ($version >= '2.6.5')
  52.     {
  53.         return 1608;
  54.     }
  55.     else
  56.     {
  57.         return 1576;
  58.     }
  59. }
  60.  
  61. function ParseRefresh(&$packet, $version = '2.6.5') {
  62.     if (strlen($packet) == REFRESH_PACKET_SIZE) {
  63.         $refreshx = false;
  64.     }
  65.     else if (strlen($packet) == RefreshXSize($version)) {
  66.         $refreshx = true;
  67.     }
  68.     else {
  69.         return false;
  70.     }
  71.  
  72.     $info = array(
  73.         'gamemode'    => 0,
  74.         'players'     => 0,
  75.         'spectators'  => 0,
  76.         'map'         => '',
  77.         'timelimit'   => 0,
  78.         'currenttime' => 0,
  79.         'timeleft'    => 0,
  80.         'limit'       => 0,
  81.         'player'      => array(),
  82.         'spectator'   => array(),
  83.         'team'        => array()
  84.     );
  85.  
  86.     if ($refreshx) {
  87.         $info = array_merge($info, array(
  88.             'maxplayers' => 0,
  89.             'maxspecs'   => 0,
  90.             'nextmap'    => '',
  91.             'passworded' => false,
  92.             'redflag'    => array(),
  93.             'blueflag'   => array()
  94.         ));
  95.     }
  96.  
  97.     $players = array();
  98.     for ($i = 0; $i < 32; $i++) {
  99.         $players[$i] = array(
  100.             'name'   => '',
  101.             'ip'     => '',
  102.             'id'     => 0,
  103.             'kills'  => 0,
  104.             'caps'   => 0,
  105.             'deaths' => 0,
  106.             'team'   => 0,
  107.             'ping'   => 0
  108.         );
  109.  
  110.         if ($refreshx) {
  111.             $players[$i] = array_merge($players[$i], array(
  112.                 'x' => 0,
  113.                 'y' => 0
  114.             ));
  115.             if ($version >= '2.7.0') {
  116.                 $players[$i] = array_merge($players[$i], array('tagid' => ''));
  117.             }
  118.         }
  119.     }
  120.    
  121.     if ($refreshx && $version >= '2.7.0') {
  122.         /*
  123.         352 = (10 + 1 byte per tagid) * 32 players
  124.         1152 = 800 + 352
  125.         */
  126.         $pos = 1152;
  127.     }
  128.     else {
  129.         /*
  130.         800 = (24 + 1 byte per name) * 32 players
  131.         */
  132.         $pos = 800;
  133.     }
  134.  
  135.     $teams                            = unpack('C*', substr($packet, $pos, 32));  $pos += 32;
  136.     $kills                            = unpack('v*', substr($packet, $pos, 64));  $pos += 64;
  137.     if ($version >= '2.6.5') {  $caps = unpack('C*', substr($packet, $pos, 32));  $pos += 32;  }
  138.     $deaths                           = unpack('v*', substr($packet, $pos, 64));  $pos += 64;
  139.     if (!$refreshx)          { $pings = unpack('C*', substr($packet, $pos, 32));  $pos += 32;  }
  140.     else                     { $pings = unpack('l*', substr($packet, $pos, 128)); $pos += 128; }
  141.     $ids                              = unpack('C*', substr($packet, $pos, 32));  $pos += 32;
  142.     $ips                              = unpack('N*', substr($packet, $pos, 128)); $pos += 128;
  143.     if ($refreshx)           { $locs  = unpack('f*', substr($packet, $pos, 256)); $pos += 256; }
  144.  
  145.     for ($i = 0; $i < 32; $i++) {
  146.         $players[$i]['name']   = substr($packet, $i*25+1, ord($packet[$i*25]));
  147.         $players[$i]['team']   = $teams[$i+1];
  148.         $players[$i]['kills']  = $kills[$i+1];
  149.         $players[$i]['caps']   = $caps[$i+1];
  150.         $players[$i]['deaths'] = $deaths[$i+1];
  151.         $players[$i]['ping']   = $pings[$i+1];
  152.         $players[$i]['id']     = $ids[$i+1];
  153.         $players[$i]['ip']     = long2ip($ips[$i+1]);
  154.  
  155.         if ($refreshx) {
  156.             $players[$i]['x'] = $locs[$i+1];
  157.             $players[$i]['y'] = $locs[$i+33];
  158.             if ($version >= '2.7.0') {
  159.                 $players[$i]['tagid'] = substr($packet, $i*11+801, 10);
  160.             }
  161.         }
  162.     }
  163.  
  164.     if ($refreshx) {
  165.         $data = unpack('f*', substr($packet, $pos, 16)); $pos += 16;
  166.         $info['redflag']  = array('x' => $data[1], 'y' => $data[2]);
  167.         $info['blueflag'] = array('x' => $data[3], 'y' => $data[4]);
  168.     }
  169.  
  170.     $teams = unpack('v*', substr($packet, $pos, 8));            $pos += 8;
  171.     $map   = unpack('Clen/A16name', substr($packet, $pos, 17)); $pos += 17;
  172.     $time  = unpack('V*', substr($packet, $pos, 8));            $pos += 8;
  173.     $limit = unpack('v', substr($packet, $pos, 2));             $pos += 2;
  174.  
  175.     $timelimit = $time[1];
  176.     $currenttime = $time[2];
  177.     $timeleft = $currenttime;
  178.     $temp = (floor($timeleft / 60) % 60);
  179.     $info['timeleft'] = floor($timeleft / 3600) . ':' . ($temp < 10 ? '0' : '') . $temp;
  180.  
  181.     $info['team'] = $teams;
  182.     $info['map'] = substr($map['name'], 0, $map['len']);
  183.     $info['timelimit'] = $timelimit;
  184.     $info['currenttime'] = $timelimit - $currenttime;
  185.     $info['limit'] = $limit[1];
  186.     $info['gamemode'] = ord($packet[$pos++]);
  187.  
  188.     if ($refreshx) {
  189.         $data = unpack('C*', substr($packet, $pos, 4)); $pos += 4;
  190.         $info['maxplayers'] = $data[1];
  191.         $info['maxspecs']   = $data[2];
  192.         $info['passworded'] = ($data[3] != 0 ? true : false);
  193.         $info['nextmap']    = substr($packet, $pos, $data[4]);
  194.     }
  195.  
  196.     if ($info['gamemode'] != 2) {
  197.         if ($info['gamemode'] != 3 && $info['gamemode'] != 5) {
  198.             unset($info['team'][1]);
  199.             unset($info['team'][2]);
  200.         }
  201.         unset($info['team'][3]);
  202.         unset($info['team'][4]);
  203.     }
  204.  
  205.     foreach ($players as $player) {
  206.         if ($player['team'] < 5) {
  207.             $info['players']++;
  208.             $info['player'][] = $player;
  209.         }
  210.         else if ($player['team'] == 5) {
  211.             $info['spectators']++;
  212.             $info['spectator'][] = $player;
  213.         }
  214.     }
  215.  
  216.     return $info;
  217. }
  218.  
  219.     function checkServer($host, $port)
  220.     {
  221.      $host = gethostbyname ($host);
  222.      $socket = @fsockopen($host, $port, $errno, $errstr, 0.3);
  223.      if ($socket)
  224.      {
  225.         return TRUE;
  226.         fclose($socket);
  227.      }
  228.      else
  229.      {
  230.         return FALSE;
  231.         fclose($socket);
  232.      }
  233.     }
  234.  
  235.     function connectServer($host, $port, $pw)
  236.     {
  237.         $host = gethostbyname ($host);
  238.         $socket = @fsockopen($host, $port);    
  239.         if ($socket) {
  240.             $info = array();
  241.             fputs($socket, $pw . "\n");
  242.             fputs($socket, "REFRESHX\n");
  243.  
  244.             $version = null;
  245.  
  246.             while ($data = trim(fgets($socket, 1024))) {
  247.                 if (preg_match('/^Server Version: (.+)$/', $data, $match)) {
  248.                     $version = $match[1];
  249.                 }
  250.                 else if ($data == 'REFRESH') {
  251.                     $info = ParseRefresh(fread($socket, REFRESH_PACKET_SIZE), $version);
  252.                     return $info;
  253.                 }
  254.                 else if ($data == 'REFRESHX') {
  255.                     $info = ParseRefresh(fread($socket, RefreshXSize($version)), $version);
  256.                     return $info;
  257.                     break;
  258.                 }
  259.             }
  260.         }
  261.         fclose($socket);
  262.     }
  263.  
  264.     function sendOnServer($host, $port, $pw, $com)
  265.     {
  266.         $host = gethostbyname($host);
  267.         $socket = @fsockopen($host, $port);
  268.  
  269.         if ($socket) {
  270.             fputs($socket, $pw . "\n");
  271.             fputs($socket, "/" . $com . "\n");
  272.  
  273.             return TRUE;
  274.         }
  275.         else {
  276.             return FALSE;
  277.         }
  278.  
  279.         fclose($socket);
  280.     }
  281.    
  282. ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement