Advertisement
Thijn

VCMP Query

Aug 17th, 2011
481
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 2.95 KB | None | 0 0
  1. <?php
  2. class VCMPQuery {
  3.  
  4.     private $Socket = false;
  5.    
  6.     private $aData = array();
  7.    
  8.     private $aServer = array();
  9.  
  10.     public function __construct($Server, $Port = 5192)
  11.     {
  12.         $this->aServer[0] = $Server;
  13.         $this->aServer[1] = $Port;
  14.         $this->Socket = fsockopen('udp://'.$Server, $Port, $Errno, $Errstr, 2);
  15.         $this->aData[0] = true;
  16.         if(!$this->Socket)
  17.         {
  18.             $this->aData[0] = false;
  19.             return;
  20.         }
  21.        
  22.         socket_set_timeout($this->Socket, 2);
  23.        
  24.         $sPacket = 'VCMP';
  25.         $sPacket .= chr(strtok($Server, '.'));
  26.         $sPacket .= chr(strtok('.'));
  27.         $sPacket .= chr(strtok('.'));
  28.         $sPacket .= chr(strtok('.'));
  29.         $sPacket .= chr($Port & 0xFF);
  30.         $sPacket .= chr($Port >> 8 & 0xFF);
  31.        
  32.         fwrite($this->Socket, $sPacket.'p4150');
  33.        
  34.         if(fread($this->Socket, 10))
  35.         {
  36.             if(fread($this->Socket, 5) == 'p4150')
  37.             {
  38.                 $this->aData[0] = true;
  39.                 return;
  40.             }
  41.         }
  42.        
  43.         $this->aData[0] = false;
  44.     }
  45.    
  46.     public function getInfo()
  47.     {
  48.         // Request server info and player info
  49.         $aData = array();
  50.        
  51.         @fwrite($this->Socket, $this->createPacket('i'));
  52.        
  53.         fread($this->Socket, 11);
  54.    
  55.         $aData['password'] = ord(fread($this->Socket, 1));
  56.        
  57.         $aData['players'] = ord(fread($this->Socket, 2));
  58.        
  59.         $aData['maxplayers'] = ord(fread($this->Socket, 2));
  60.        
  61.         $iStrlen = ord(fread($this->Socket, 4));
  62.         if(!$iStrlen) return -1;
  63.        
  64.         $aData['hostname'] = (string) fread($this->Socket, $iStrlen);
  65.        
  66.         $iStrlen = ord(fread($this->Socket, 4));
  67.         $aData['gamemode'] = (string) fread($this->Socket, $iStrlen);
  68.        
  69.         $iStrlen = ord(fread($this->Socket, 4));
  70.         $aData['mapname'] = (string) fread($this->Socket, $iStrlen);
  71.        
  72.         return $aData;
  73.     }
  74.     public function getPlayers()
  75.     {
  76.         fwrite($this->Socket, $this->createPacket('c'));
  77.         fread($this->Socket, 11);
  78.         $plr_count = ord(fread($this->Socket, 2));
  79.         if ($plr_count > 0)
  80.         {
  81.             $players = array();
  82.             for ($i=0; $i<$plr_count; $i++)
  83.             {
  84.                 $strlen = ord(fread($this->Socket, 1));
  85.                 $plrname = fread($this->Socket, $strlen);
  86.                 $score = $this->getLong(fread($this->Socket, 4));
  87.                 $players[] = array( $plrname, $score);
  88.             }
  89.             return $players;
  90.         }
  91.         return false;
  92.  
  93.     }
  94.    
  95.     public function __destruct()
  96.     {
  97.         @fclose($this->Socket);
  98.     }
  99.    
  100.     private function createPacket($req)
  101.     {
  102.         $sPacket = 'VCMP';
  103.         $sPacket .= chr(strtok($this->aServer[0], '.'));
  104.         $sPacket .= chr(strtok('.'));
  105.         $sPacket .= chr(strtok('.'));
  106.         $sPacket .= chr(strtok('.'));
  107.         $sPacket .= chr($this->aServer[1] & 0xFF);
  108.         $sPacket .= chr($this->aServer[1] >> 8 & 0xFF);
  109.         $sPacket .= $req;
  110.    
  111.         return $sPacket;
  112.     }
  113.    
  114.     public function isAlive()
  115.     {
  116.         return $this->aData[0];
  117.     }
  118.  
  119.     private function getLong($dat)
  120.     {
  121.         $num=0;
  122.         if ((ord(substr($dat,3,1)) & 128) > 0) {
  123.             for ($i=0; $i<strlen($dat); $i++) {
  124.                 $num-=((255-ord(substr($dat,$i,1))) << 8*$i);
  125.             }
  126.             $num--;
  127.         } else {
  128.             for ($i=0; $i<strlen($dat); $i++) {
  129.                 $num+=(ord(substr($dat,$i,1)) << 8*$i);
  130.             }
  131.         }
  132.         return $num;
  133.     }
  134.    
  135. }
  136. ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement