Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- /*
- * SOLDAT REFRESH AND REFRESHX PARSER
- * By: ramirez (c) 2007
- * http://devs.soldat.pl/wiki/index.php?title=Refreshx
- *
- * UPDATE: added 2.7.0+ RefreshX support, by SyavX (01-06-2010)
- *
- * Usage:
- * $info = ParseRefresh($packet);
- *
- * Example:
- *
- * <?php
- * include('soldat.refresh.php');
- * $socket = fsockopen('your.server.com', 23073);
- *
- * fputs($socket, "PASSWORD\n");
- * fputs($socket, "REFRESH\n");
- * fputs($socket, "REFRESHX\n");
- *
- * $version = null;
- * while ($data = trim(fgets($socket, 1024))) {
- * if (preg_match('/^Server Version: (.+)$/', $data, $match)) {
- * $version = $match[1];
- * }
- * else if ($data == 'REFRESH') {
- * $info = ParseRefresh(fread($socket, REFRESH_PACKET_SIZE), $version);
- * print_r($info);
- * }
- * else if ($data == 'REFRESHX') {
- * $info = ParseRefresh(fread($socket, RefreshXSize($version)), $version);
- * print_r($info);
- * break;
- * }
- * }
- *
- * fclose($socket);
- * ?>
- */
- define('REFRESH_PACKET_SIZE', 1188);
- function RefreshXSize($version = '2.6.5')
- {
- if ($version >= '2.7.0')
- {
- return 1960;
- }
- else if ($version >= '2.6.5')
- {
- return 1608;
- }
- else
- {
- return 1576;
- }
- }
- function ParseRefresh(&$packet, $version = '2.6.5') {
- if (strlen($packet) == REFRESH_PACKET_SIZE) {
- $refreshx = false;
- }
- else if (strlen($packet) == RefreshXSize($version)) {
- $refreshx = true;
- }
- else {
- return false;
- }
- $info = array(
- 'gamemode' => 0,
- 'players' => 0,
- 'spectators' => 0,
- 'map' => '',
- 'timelimit' => 0,
- 'currenttime' => 0,
- 'timeleft' => 0,
- 'limit' => 0,
- 'player' => array(),
- 'spectator' => array(),
- 'team' => array()
- );
- if ($refreshx) {
- $info = array_merge($info, array(
- 'maxplayers' => 0,
- 'maxspecs' => 0,
- 'nextmap' => '',
- 'passworded' => false,
- 'redflag' => array(),
- 'blueflag' => array()
- ));
- }
- $players = array();
- for ($i = 0; $i < 32; $i++) {
- $players[$i] = array(
- 'name' => '',
- 'ip' => '',
- 'id' => 0,
- 'kills' => 0,
- 'caps' => 0,
- 'deaths' => 0,
- 'team' => 0,
- 'ping' => 0
- );
- if ($refreshx) {
- $players[$i] = array_merge($players[$i], array(
- 'x' => 0,
- 'y' => 0
- ));
- if ($version >= '2.7.0') {
- $players[$i] = array_merge($players[$i], array('tagid' => ''));
- }
- }
- }
- if ($refreshx && $version >= '2.7.0') {
- /*
- 352 = (10 + 1 byte per tagid) * 32 players
- 1152 = 800 + 352
- */
- $pos = 1152;
- }
- else {
- /*
- 800 = (24 + 1 byte per name) * 32 players
- */
- $pos = 800;
- }
- $teams = unpack('C*', substr($packet, $pos, 32)); $pos += 32;
- $kills = unpack('v*', substr($packet, $pos, 64)); $pos += 64;
- if ($version >= '2.6.5') { $caps = unpack('C*', substr($packet, $pos, 32)); $pos += 32; }
- $deaths = unpack('v*', substr($packet, $pos, 64)); $pos += 64;
- if (!$refreshx) { $pings = unpack('C*', substr($packet, $pos, 32)); $pos += 32; }
- else { $pings = unpack('l*', substr($packet, $pos, 128)); $pos += 128; }
- $ids = unpack('C*', substr($packet, $pos, 32)); $pos += 32;
- $ips = unpack('N*', substr($packet, $pos, 128)); $pos += 128;
- if ($refreshx) { $locs = unpack('f*', substr($packet, $pos, 256)); $pos += 256; }
- for ($i = 0; $i < 32; $i++) {
- $players[$i]['name'] = substr($packet, $i*25+1, ord($packet[$i*25]));
- $players[$i]['team'] = $teams[$i+1];
- $players[$i]['kills'] = $kills[$i+1];
- $players[$i]['caps'] = $caps[$i+1];
- $players[$i]['deaths'] = $deaths[$i+1];
- $players[$i]['ping'] = $pings[$i+1];
- $players[$i]['id'] = $ids[$i+1];
- $players[$i]['ip'] = long2ip($ips[$i+1]);
- if ($refreshx) {
- $players[$i]['x'] = $locs[$i+1];
- $players[$i]['y'] = $locs[$i+33];
- if ($version >= '2.7.0') {
- $players[$i]['tagid'] = substr($packet, $i*11+801, 10);
- }
- }
- }
- if ($refreshx) {
- $data = unpack('f*', substr($packet, $pos, 16)); $pos += 16;
- $info['redflag'] = array('x' => $data[1], 'y' => $data[2]);
- $info['blueflag'] = array('x' => $data[3], 'y' => $data[4]);
- }
- $teams = unpack('v*', substr($packet, $pos, 8)); $pos += 8;
- $map = unpack('Clen/A16name', substr($packet, $pos, 17)); $pos += 17;
- $time = unpack('V*', substr($packet, $pos, 8)); $pos += 8;
- $limit = unpack('v', substr($packet, $pos, 2)); $pos += 2;
- $timelimit = $time[1];
- $currenttime = $time[2];
- $timeleft = $currenttime;
- $temp = (floor($timeleft / 60) % 60);
- $info['timeleft'] = floor($timeleft / 3600) . ':' . ($temp < 10 ? '0' : '') . $temp;
- $info['team'] = $teams;
- $info['map'] = substr($map['name'], 0, $map['len']);
- $info['timelimit'] = $timelimit;
- $info['currenttime'] = $timelimit - $currenttime;
- $info['limit'] = $limit[1];
- $info['gamemode'] = ord($packet[$pos++]);
- if ($refreshx) {
- $data = unpack('C*', substr($packet, $pos, 4)); $pos += 4;
- $info['maxplayers'] = $data[1];
- $info['maxspecs'] = $data[2];
- $info['passworded'] = ($data[3] != 0 ? true : false);
- $info['nextmap'] = substr($packet, $pos, $data[4]);
- }
- if ($info['gamemode'] != 2) {
- if ($info['gamemode'] != 3 && $info['gamemode'] != 5) {
- unset($info['team'][1]);
- unset($info['team'][2]);
- }
- unset($info['team'][3]);
- unset($info['team'][4]);
- }
- foreach ($players as $player) {
- if ($player['team'] < 5) {
- $info['players']++;
- $info['player'][] = $player;
- }
- else if ($player['team'] == 5) {
- $info['spectators']++;
- $info['spectator'][] = $player;
- }
- }
- return $info;
- }
- function checkServer($host, $port)
- {
- $host = gethostbyname ($host);
- $socket = @fsockopen($host, $port, $errno, $errstr, 0.3);
- if ($socket)
- {
- return TRUE;
- fclose($socket);
- }
- else
- {
- return FALSE;
- fclose($socket);
- }
- }
- function connectServer($host, $port, $pw)
- {
- $host = gethostbyname ($host);
- $socket = @fsockopen($host, $port);
- if ($socket) {
- $info = array();
- fputs($socket, $pw . "\n");
- fputs($socket, "REFRESHX\n");
- $version = null;
- while ($data = trim(fgets($socket, 1024))) {
- if (preg_match('/^Server Version: (.+)$/', $data, $match)) {
- $version = $match[1];
- }
- else if ($data == 'REFRESH') {
- $info = ParseRefresh(fread($socket, REFRESH_PACKET_SIZE), $version);
- return $info;
- }
- else if ($data == 'REFRESHX') {
- $info = ParseRefresh(fread($socket, RefreshXSize($version)), $version);
- return $info;
- break;
- }
- }
- }
- fclose($socket);
- }
- function sendOnServer($host, $port, $pw, $com)
- {
- $host = gethostbyname($host);
- $socket = @fsockopen($host, $port);
- if ($socket) {
- fputs($socket, $pw . "\n");
- fputs($socket, "/" . $com . "\n");
- return TRUE;
- }
- else {
- return FALSE;
- }
- fclose($socket);
- }
- ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement