/** * 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(); }
/** * 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(); }
/** * 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(); }
/** * 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(); }
/** * 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(); }
/** * 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(); }