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()
 {
     // Will hold the packets after sorting
     $packets = [];
     // We need to pre-sort these for split packets so we can do extra work where needed
     foreach ($this->packets_response as $response) {
         $buffer = new Buffer($response);
         // Pull out the header
         $header = $buffer->read(5);
         // Add the packet to the proper section, we will combine later
         $packets[$header][] = $buffer->getBuffer();
     }
     unset($buffer);
     $results = [];
     // Now let's iterate and process
     foreach ($packets as $header => $packetGroup) {
         // Figure out which packet response this is
         if (!array_key_exists($header, $this->responses)) {
             throw new Exception(__METHOD__ . " response type '{$header}' is not valid");
         }
         // Now we need to call the proper method
         $results = array_merge($results, call_user_func_array([$this, $this->responses[$header]], [new Buffer(implode($packetGroup))]));
     }
     unset($packets);
     return $results;
 }
Beispiel #3
0
 /**
  * Handles processing the server status data
  *
  * @param \GameQ\Buffer $buffer
  *
  * @return array
  * @throws \GameQ\Exception\Protocol
  */
 protected function processStatus(Buffer $buffer)
 {
     // Set the result to a new result instance
     $result = new Result();
     // Always dedicated
     $result->add('dedicated', true);
     // Pull out the server information
     $result->add('password', (bool) $buffer->readInt8());
     $result->add('num_players', $buffer->readInt16());
     $result->add('max_players', $buffer->readInt16());
     // These are read differently for these last 3
     $result->add('servername', $buffer->read($buffer->readInt32()));
     $result->add('gametype', $buffer->read($buffer->readInt32()));
     $result->add('language', $buffer->read($buffer->readInt32()));
     unset($buffer);
     return $result->fetch();
 }
Beispiel #4
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();
 }