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