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