Advertisement
Thijn

LU Query - Class

Nov 24th, 2011
234
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 9.00 KB | None | 0 0
  1. <?php
  2. class LUQuery {
  3.  
  4.     private $Socket = false;
  5.    
  6.     private $aData = array();
  7.  
  8.     private $servInfoReq = 0;
  9.     private $playerInfoReq = 0;
  10.     private $teamInfoReq = 0;
  11.     private $playerInfoExtraReq = 0;
  12.  
  13.     public function __construct($Server, $Port = 2301)
  14.     {
  15.         $this->Defines();
  16.         $this->Socket = fsockopen('udp://'.$Server, $Port, $Errno, $Errstr, 2);
  17.         $this->aData[0] = true;
  18.         if(!$this->Socket)
  19.         {
  20.             $this->aData[0] = false;
  21.             return;
  22.         }
  23.        
  24.         socket_set_timeout($this->Socket, 2);
  25.        
  26.         $packet = "\xFF\xFFUGP\x00";
  27.         $packet .= "\x01";
  28.         $packet .= ugp_header_ping;
  29.         fwrite($this->Socket, $packet);
  30.         if (fread($this->Socket, 2))
  31.         {
  32.             if (fread($this->Socket, 3) == "UGP")
  33.             {
  34.                 $this->aData[0] = true;
  35.                 return;
  36.             }
  37.         }
  38.         $this->aData[0] = false;
  39.     }
  40.    
  41.     public function GetInfo()
  42.     {
  43.         // Request server info and player info
  44.         $aData = array();
  45.         $this->servInfoReq = ugp_servinf_name | ugp_servinf_mode | ugp_servinf_playercount | ugp_servinf_maxplayers;
  46.         $this->playerInfoReq = ugp_playerlist_id | ugp_playerlist_name | ugp_playerlist_team | ugp_playerlist_score | ugp_playerlist_kills | ugp_playerlist_deaths | ugp_playerlist_extraflags;
  47.         $this->playerInfoExtraReq = ugp_playerlist_extra_ping | ugp_playerlist_extra_pos | ugp_playerlist_extra_health | ugp_playerlist_extra_armour | ugp_playerlist_extra_skin;
  48.         fwrite( $this->Socket, $this->createPacket( ugp_req_serverinfo | ugp_req_playerlist ) );
  49.         fread($this->Socket, 10);
  50.         $PacketType = ord(fread($this->Socket,1)) - 128;
  51.         if ( $PacketType == 1 )
  52.         {
  53.             $GameID = ord(fread($this->Socket,1));
  54.             $aData["GameID"] = $GameID;
  55.             $Flags = ord( fread($this->Socket,1) );
  56.             if ( $Flags & ugp_req_serverinfo )
  57.             {
  58.                 $ServerInfoReply = ord( fread($this->Socket,1) );
  59.  
  60.                 if ( $ServerInfoReply & ugp_servinf_gamename )
  61.                 {
  62.                     $GameNameLen = ord( fread($this->Socket,1) );
  63.                     $GameName = fread($this->Socket,$GameNameLen);
  64.                     $GameName = preg_replace('/[^(\x20-\x7F)]*/','', $GameName);
  65.                     $aData["GameName"] = $GameName;
  66.                 }
  67.                 if ( $ServerInfoReply & ugp_servinf_flags )
  68.                 {
  69.                     $ServerInfoReplyFlags = ord( fread($this->Socket,1) );
  70.                     $GameName = preg_replace('/[^(\x20-\x7F)]*/','', fread($this->Socket,$GameNameLen) );
  71.                     $aData["GameName"] = $GameName;
  72.                 }
  73.                 if ( $ServerInfoReply & ugp_servinf_name )
  74.                 {
  75.                     $ServerNameLen = ord( fread($this->Socket,1) );
  76.                     $ServerName = preg_replace('/[^(\x20-\x7F)]*/','', fread($this->Socket,$ServerNameLen) );
  77.                     $aData["ServerName"] = $ServerName;
  78.                 }
  79.                 if ( $ServerInfoReply & ugp_servinf_mode )
  80.                 {
  81.                     $ServerModeLen = ord( fread($this->Socket,1) );
  82.                     $ServerMode = preg_replace('/[^(\x20-\x7F)]*/','', fread($this->Socket,$ServerModeLen) );
  83.  
  84.                     $aData["ServerMode"] = $ServerMode;
  85.                 }
  86.                 if ( $ServerInfoReply & ugp_servinf_map )
  87.                 {
  88.                     $ServerMapLen = ord( fread($this->Socket,1) );
  89.                     $ServerMap = preg_replace('/[^(\x20-\x7F)]*/','', fread($this->Socket,$ServerMapLen) );
  90.  
  91.                     $aData["ServerMap"] = $ServerMap;
  92.                 }
  93.                 if ( $ServerInfoReply & ugp_servinf_playercount )
  94.                 {
  95.                     $ServerPlayers = ord( fread($this->Socket,1) );
  96.  
  97.                     $aData["ServerPlayers"] = $ServerPlayers;
  98.                 }
  99.                 if ( $ServerInfoReply & ugp_servinf_maxplayers )
  100.                 {
  101.                     $ServerMaxPlayers = ord( fread($this->Socket,1) );
  102.  
  103.                     $aData["ServerMaxPlayers"] = $ServerMaxPlayers;
  104.                 }
  105.             }
  106.             if ( $Flags & ugp_req_teamlist )
  107.             {
  108.                 //echo fread($this->Socket,9000);
  109.             }
  110.             if ( $Flags & ugp_req_playerlist )
  111.             {
  112.                 $Players = ord( fread($this->Socket, 1) );
  113.                 if ( $Players > 0 )
  114.                 {
  115.                     $PlayerReply = ord( fread($this->Socket,1) );
  116.                     if ( $PlayerReply & ugp_playerlist_extraflags )
  117.                     {
  118.                         $ExtraFlags = ord( fread($this->Socket,1) );
  119.                     }
  120.  
  121.                     for($i = 1; $i <= $Players; $i++)
  122.                     {
  123.                         if ( isset( $ExtraFlags ) )
  124.                         {
  125.                             $aData["Player"][$i]["ExtraFlags"] = $ExtraFlags;
  126.                         }
  127.                         if ( $PlayerReply & ugp_playerlist_id )
  128.                         {
  129.                             $NickID = ord(fread($this->Socket,1));
  130.                            
  131.                             $aData["Player"][$i]["ID"] = $NickID;
  132.                         }
  133.                         if ( $PlayerReply & ugp_playerlist_name )
  134.                         {
  135.                             $NickLen = ord(fread($this->Socket,1));
  136.                             $Nick = preg_replace('/[^(\x20-\x7F)]*/','', fread($this->Socket,$NickLen) );
  137.                            
  138.                             $aData["Player"][$i]["Nick"] = $Nick;
  139.                         }
  140.                         if ( $PlayerReply & ugp_playerlist_team )
  141.                         {
  142.                             $Team = ord( fread($this->Socket,1) );
  143.                            
  144.                             $aData["Player"][$i]["Team"] = $Team;
  145.                         }
  146.                         if ( $PlayerReply & ugp_playerlist_score )
  147.                         {
  148.                             $Score = ord( fread($this->Socket,4) );
  149.                            
  150.                             $aData["Player"][$i]["Score"] = $Score;
  151.                         }
  152.                         if ( $PlayerReply & ugp_playerlist_kills )
  153.                         {
  154.                             $Kills = ord( fread($this->Socket,4) );
  155.                            
  156.                             $aData["Player"][$i]["Kills"] = $Kills;
  157.                         }
  158.                         if ( $PlayerReply & ugp_playerlist_deaths )
  159.                         {
  160.                             $Deaths = ord( fread($this->Socket,4) );
  161.                            
  162.                             $aData["Player"][$i]["Deaths"] = $Deaths;
  163.                         }
  164.                         if ( $PlayerReply & ugp_playerlist_extraflags )
  165.                         {
  166.                             if ( $ExtraFlags & ugp_playerlist_extra_ping )
  167.                             {
  168.                                 $ping = ord( fread($this->Socket,2) );
  169.                                 $aData["Player"][$i]["Ping"] = $ping;
  170.                             }
  171.                             if ( $ExtraFlags & ugp_playerlist_extra_timejoined )
  172.                             {
  173.                                 $timejoined = ord( fread($this->Socket,8) );
  174.                                 $aData["Player"][$i]["TimeJoined"] = $timejoined;
  175.                             }
  176.                             if ( $ExtraFlags & ugp_playerlist_extra_pos )
  177.                             {
  178.                                 $posXArr = unpack( "f", fread($this->Socket,4) );
  179.                                 $posYArr = unpack( "f", fread($this->Socket,4) );
  180.                                 $posZArr = unpack( "f", fread($this->Socket,4) );
  181.                                 $posX = $posXArr[1];
  182.                                 $posY = $posYArr[1];
  183.                                 $posZ = $posZArr[1];
  184.                                 $aData["Player"][$i]["Pos"]["X"] = $posX;
  185.                                 $aData["Player"][$i]["Pos"]["Y"] = $posY;
  186.                                 $aData["Player"][$i]["Pos"]["Z"] = $posZ;
  187.                             }
  188.                             if ( $ExtraFlags & ugp_playerlist_extra_health )
  189.                             {
  190.                                 $health = ord( fread($this->Socket,1) );
  191.                                 $aData["Player"][$i]["Health"] = $health;
  192.                             }
  193.                             if ( $ExtraFlags & ugp_playerlist_extra_armour )
  194.                             {
  195.                                 $armour = ord( fread($this->Socket,1) );
  196.                                 $aData["Player"][$i]["Armour"] = $armour;
  197.                             }
  198.                             if ( $ExtraFlags & ugp_playerlist_extra_skin )
  199.                             {
  200.                                 $skin = ord( fread($this->Socket,1) );
  201.                                 $aData["Player"][$i]["Skin"] = $skin;
  202.                             }
  203.                            
  204.                         }
  205.                     }
  206.                 }
  207.             }
  208.         }
  209.         return $aData;
  210.     }
  211.     private function createPacket($req)
  212.     {
  213.         $packet = "\xFF\xFFUGP\x00"; //Header
  214.         $packet .= "\x01"; //Version
  215.         $packet .= ugp_header_query; //Type, query or ping
  216.         $packet .= chr($req);
  217.         if ( $req & ugp_req_serverinfo )
  218.         {
  219.             $packet .= chr($this->servInfoReq);
  220.         }
  221.         if ( $req & ugp_req_teamlist )
  222.         {
  223.             $packet .= chr($this->teamInfoReq);
  224.         }
  225.         if ( $req & ugp_req_playerlist )
  226.         {
  227.             $packet .= chr($this->playerInfoReq);
  228.  
  229.             if ( $this->playerInfoReq & ugp_playerlist_extraflags )
  230.             {
  231.                 $packet .= chr($this->playerInfoExtraReq);
  232.             }
  233.         }
  234.         if ( $req & ugp_req_rulelist )
  235.         {
  236.             $packet .= chr(ugp_req_rulelist);
  237.         }
  238.         return $packet;
  239.     }
  240.    
  241.     public function IsAlive()
  242.     {
  243.         return $this->aData[0];
  244.     }
  245.    
  246.     private function Defines()
  247.     {
  248.         // Header Flags
  249.         define("ugp_header_ping", "\x00" );
  250.         define("ugp_header_query", "\x01" );
  251.        
  252.         // Request Flags
  253.         define("ugp_req_serverinfo", 0x01 );
  254.         define("ugp_req_playerlist", 0x02 );
  255.         define("ugp_req_teamlist", 0x04 );
  256.         define("ugp_req_rulelist", 0x08 );
  257.  
  258.         // Server Info Flags
  259.         define("ugp_servinf_gamename", 0x01 );
  260.         define("ugp_servinf_flags", 0x02 );
  261.         define("ugp_servinf_name", 0x04 );
  262.         define("ugp_servinf_mode", 0x08 );
  263.         define("ugp_servinf_map", 0x10 );
  264.         define("ugp_servinf_playercount", 0x20 );
  265.         define("ugp_servinf_maxplayers", 0x40 );
  266.  
  267.         // Server Info Server Flags (Bit 2 in info flags)
  268.         define("ugp_servinfflags_passworded", 0x01);
  269.         define("ugp_servinfflags_version", 0x02);
  270.         define("ugp_servinfflags_os", 0x04);
  271.                
  272.         // Team List Flags
  273.         define("ugp_teamlist_name", 0x01);
  274.         define("ugp_teamlist_score", 0x02);
  275.         define("ugp_teamlist_playercount", 0x04);
  276.         define("ugp_teamlist_colour", 0x08);
  277.  
  278.         // Player List Flags
  279.         define("ugp_playerlist_id", 0x01);
  280.         define("ugp_playerlist_name", 0x02);
  281.         define("ugp_playerlist_team", 0x04);
  282.         define("ugp_playerlist_score", 0x08);
  283.         define("ugp_playerlist_kills", 0x10);
  284.         define("ugp_playerlist_deaths", 0x20);
  285.         define("ugp_playerlist_extraflags", 0x40);
  286.  
  287.         define("ugp_playerlist_extra_ping", 0x01);
  288.         define("ugp_playerlist_extra_timejoined", 0x02);
  289.         define("ugp_playerlist_extra_pos", 0x04);
  290.         define("ugp_playerlist_extra_health", 0x08);
  291.         define("ugp_playerlist_extra_armour", 0x10);
  292.         define("ugp_playerlist_extra_skin", 0x20);
  293.     }
  294. }
  295. ?>
  296.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement