Beispiel #1
0
 /**
  * Handle player info, different than quake3 base
  *
  * @param Buffer $buffer
  *
  * @return array
  * @throws \GameQ\Exception\Protocol
  */
 protected function processPlayers(Buffer $buffer)
 {
     // Set the result to a new result instance
     $result = new Result();
     // Loop until we are out of data
     while ($buffer->getLength()) {
         // Make a new buffer with this block
         $playerInfo = new Buffer($buffer->readString("\n"));
         // Add player info
         $result->addPlayer('frags', $playerInfo->readString(" "));
         $result->addPlayer('ping', $playerInfo->readString(" "));
         // Skip first "
         $playerInfo->skip(1);
         // Add player name, encoded
         $result->addPlayer('name', utf8_encode(trim($playerInfo->readString('"'))));
         // Skip space
         $playerInfo->skip(1);
         // Add team
         $result->addPlayer('team', $playerInfo->read());
         // Clear
         unset($playerInfo);
     }
     // Clear
     unset($buffer);
     return $result->fetch();
 }
Beispiel #2
0
 /**
  * Process the response
  *
  * @return array
  * @throws \GameQ\Exception\Protocol
  */
 public function processResponse()
 {
     // Create a new buffer
     $buffer = new Buffer(implode('', $this->packets_response));
     // Burn the header
     $buffer->skip(4);
     // Create a new result
     $result = new Result();
     // Variables
     $result->add('gamename', $buffer->readPascalString(1, true));
     $result->add('port', $buffer->readPascalString(1, true));
     $result->add('servername', $buffer->readPascalString(1, true));
     $result->add('gametype', $buffer->readPascalString(1, true));
     $result->add('map', $buffer->readPascalString(1, true));
     $result->add('version', $buffer->readPascalString(1, true));
     $result->add('password', $buffer->readPascalString(1, true));
     $result->add('num_players', $buffer->readPascalString(1, true));
     $result->add('max_players', $buffer->readPascalString(1, true));
     $result->add('dedicated', 1);
     // Offload the key/value pair processing
     $this->processKeyValuePairs($buffer, $result);
     // Offload processing player and team info
     $this->processPlayersAndTeams($buffer, $result);
     unset($buffer);
     return $result->fetch();
 }
Beispiel #3
0
 /**
  * Overload the default detail process since this version is different
  *
  * @param \GameQ\Buffer $buffer
  *
  * @return array
  */
 protected function processDetails(Buffer $buffer)
 {
     // Set the result to a new result instance
     $result = new Result();
     $result->add('serverid', $buffer->readInt32());
     // 0
     $result->add('serverip', $buffer->readPascalString(1));
     // empty
     $result->add('gameport', $buffer->readInt32());
     $result->add('queryport', $buffer->readInt32());
     // 0
     // We burn the first char since it is not always correct with the hostname
     $buffer->skip(1);
     // Read as a regular string since the length is incorrect (what we skipped earlier)
     $result->add('servername', utf8_encode($buffer->readString()));
     // The rest is read as normal
     $result->add('mapname', utf8_encode($buffer->readPascalString(1)));
     $result->add('gametype', $buffer->readPascalString(1));
     $result->add('numplayers', $buffer->readInt32());
     $result->add('maxplayers', $buffer->readInt32());
     $result->add('currentwave', $buffer->readInt32());
     unset($buffer);
     return $result->fetch();
 }
Beispiel #4
0
 /**
  * Process the response
  *
  * @return array
  */
 public function processResponse()
 {
     // Holds the processed packets
     $processed = [];
     // Iterate over the packets
     foreach ($this->packets_response as $response) {
         // Make a buffer
         $buffer = new Buffer($response, Buffer::NUMBER_TYPE_BIGENDIAN);
         // Packet type = 0
         $buffer->readInt8();
         // Session Id
         $buffer->readInt32();
         // We need to burn the splitnum\0 because it is not used
         $buffer->skip(9);
         // Get the id
         $id = $buffer->readInt8();
         // Burn next byte not sure what it is used for
         $buffer->skip(1);
         // Add this packet to the processed
         $processed[$id] = $buffer->getBuffer();
         unset($buffer, $id);
     }
     // Sort packets, reset index
     ksort($processed);
     // Offload cleaning up the packets if they happen to be split
     $packets = $this->cleanPackets(array_values($processed));
     // Create a new buffer
     $buffer = new Buffer(implode('', $packets), Buffer::NUMBER_TYPE_BIGENDIAN);
     // Create a new result
     $result = new Result();
     // Parse the server details
     $this->processDetails($buffer, $result);
     // Parse the player and team information
     $this->processPlayersAndTeams($buffer, $result);
     unset($buffer);
     return $result->fetch();
 }
Beispiel #5
0
 /**
  * Handles processing the server details from goldsource response
  *
  * @param \GameQ\Buffer $buffer
  *
  * @return array
  * @throws \GameQ\Exception\Protocol
  */
 protected function processDetailsGoldSource(Buffer $buffer)
 {
     // Set the result to a new result instance
     $result = new Result();
     $result->add('address', $buffer->readString());
     $result->add('hostname', $buffer->readString());
     $result->add('map', $buffer->readString());
     $result->add('game_dir', $buffer->readString());
     $result->add('game_descr', $buffer->readString());
     $result->add('num_players', $buffer->readInt8());
     $result->add('max_players', $buffer->readInt8());
     $result->add('version', $buffer->readInt8());
     $result->add('dedicated', $buffer->read());
     $result->add('os', $buffer->read());
     $result->add('password', $buffer->readInt8());
     // Mod section
     $result->add('ismod', $buffer->readInt8());
     // We only run these if ismod is 1 (true)
     if ($result->get('ismod') == 1) {
         $result->add('mod_urlinfo', $buffer->readString());
         $result->add('mod_urldl', $buffer->readString());
         $buffer->skip();
         $result->add('mod_version', $buffer->readInt32Signed());
         $result->add('mod_size', $buffer->readInt32Signed());
         $result->add('mod_type', $buffer->readInt8());
         $result->add('mod_cldll', $buffer->readInt8());
     }
     $result->add('secure', $buffer->readInt8());
     $result->add('num_bots', $buffer->readInt8());
     unset($buffer);
     return $result->fetch();
 }
Beispiel #6
0
 /**
  * Handle processing the status buffer
  *
  * @param Buffer $buffer
  *
  * @return array
  */
 protected function processStatus(Buffer $buffer)
 {
     // Set the result to a new result instance
     $result = new Result();
     // By default dedicted
     $result->add('dedicated', 1);
     // Lets peek and see if the data starts with a \
     if ($buffer->lookAhead(1) == '\\') {
         // Burn the first one
         $buffer->skip(1);
     }
     // Explode the data
     $data = explode('\\', $buffer->getBuffer());
     // No longer needed
     unset($buffer);
     // Init some vars
     $numPlayers = 0;
     $numTeams = 0;
     $itemCount = count($data);
     // Now lets loop the array
     for ($x = 0; $x < $itemCount; $x += 2) {
         // Set some local vars
         $key = $data[$x];
         $val = $data[$x + 1];
         // Check for <variable>_<count> variable (i.e players)
         if (($suffix = strrpos($key, '_')) !== false && is_numeric(substr($key, $suffix + 1))) {
             // See if this is a team designation
             if (substr($key, 0, $suffix) == 'teamname') {
                 $result->addTeam('teamname', $val);
                 $numTeams++;
             } else {
                 // Its a player
                 if (substr($key, 0, $suffix) == 'playername') {
                     $numPlayers++;
                 }
                 $result->addPlayer(substr($key, 0, $suffix), utf8_encode($val));
             }
         } else {
             // Regular variable so just add the value.
             $result->add($key, $val);
         }
     }
     // Add the player and team count
     $result->add('num_players', $numPlayers);
     $result->add('num_teams', $numTeams);
     // Unset some stuff to free up memory
     unset($data, $key, $val, $suffix, $x, $itemCount);
     // Return the result
     return $result->fetch();
 }