示例#1
0
 /**
  * Handles processing the details data into a usable format
  *
  * @param \GameQ\Buffer $buffer
  *
  * @return mixed
  * @throws \GameQ\Exception\Protocol
  */
 protected function processDetails(Buffer $buffer)
 {
     // Set the result to a new result instance
     $result = new Result();
     $result->add('protocol', $buffer->readInt8());
     $result->add('hostname', $buffer->readString());
     $result->add('map', $buffer->readString());
     $result->add('game_dir', $buffer->readString());
     $result->add('game_descr', $buffer->readString());
     $result->add('steamappid', $buffer->readInt16());
     $result->add('num_players', $buffer->readInt8());
     $result->add('max_players', $buffer->readInt8());
     $result->add('num_bots', $buffer->readInt8());
     $result->add('dedicated', $buffer->read());
     $result->add('os', $buffer->read());
     $result->add('password', $buffer->readInt8());
     $result->add('secure', $buffer->readInt8());
     // Special result for The Ship only (appid=2400)
     if ($result->get('steamappid') == 2400) {
         $result->add('game_mode', $buffer->readInt8());
         $result->add('witness_count', $buffer->readInt8());
         $result->add('witness_time', $buffer->readInt8());
     }
     $result->add('version', $buffer->readString());
     // Extra data flag
     if ($buffer->lookAhead(1) !== false) {
         $edf = $buffer->readInt8();
         if ($edf & 0x80) {
             $result->add('port', $buffer->readInt16Signed());
         }
         if ($edf & 0x10) {
             $result->add('steam_id', $buffer->readInt64());
         }
         if ($edf & 0x40) {
             $result->add('sourcetv_port', $buffer->readInt16Signed());
             $result->add('sourcetv_name', $buffer->readString());
         }
         if ($edf & 0x20) {
             $result->add('keywords', $buffer->readString());
         }
         if ($edf & 0x1) {
             $result->add('game_id', $buffer->readInt64());
         }
         unset($edf);
     }
     unset($buffer);
     return $result->fetch();
 }
示例#2
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();
 }