webview.php:
Code: Select all
<? require("quake3.php");?>
<?
$q3=new Quake3;
$serveradr="208.83.232.26";
$serverport=27960;
$website="www.gaminggroups.com";
$status=$q3->getServerStatus($serveradr,$serverport,1500);
if ($status) {
?>
</HEAD><body text=#FFFFFF bgcolor=#2B3856>
<center>
<table BORDER=0 CELLSPACING=0 CELLPADDING=2 WIDTH=100% bgcolor=#000000>
<tr><td style="border-width: 0" VALIGN=top><table id="0" class="drag" BORDER=1 CELLSPACING=0 CELLPADDING=2 WIDTH=100% bgcolor=#000000>
<tr>
<td COLSPAN=3 CLASS="cellHeading">
<table BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH=100% bgcolor=#000000>
<tr><td style="text-align: center" class="transparent"><font class="headingText" color=#FFFFFF><?=$q3->m_servervars["sv_hostname"]?></font></td></tr></table>
</td></tr>
</table>
<table id="1" class="drag" BORDER=1 CELLSPACING=0 CELLPADDING=0 WIDTH=100%" bgcolor=#625D5D >
<tr>
<td COLSPAN=3 CLASS="row1" style="text-align: center"><?=$q3->m_servervars["version"]?></td>
</tr>
<tr>
<td WIDTH=40%><table BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH=100%>
<tr>
<td CLASS="row2" style="text-align: center"><?=$q3->m_servervars["sv_currentclients"]?> of max. <?=$q3->m_servervars["sv_maxclients"]?> players</td>
</tr>
<tr>
<td CLASS="row1" style="text-align: center">Cap Limit: <?=$q3->m_servervars["capturelimit"]?></td>
</tr>
<tr>
<td CLASS="row2" style="text-align: center"> DM Flags: <?=$q3->m_servervars["dmflags"]?></a></td>
</tr>
<tr>
<td CLASS="row1" style="text-align: center">Max Rate: <?=$q3->m_servervars["sv_maxRate"]?></td>
</tr>
<tr>
<td CLASS="neutral" style="text-align: center"><br>
<br>
<br>
<br>
<br>
<br>
<br>
</td>
</tr>
</table>
<td CLASS="cellHeading" WIDTH=20%>Map: <?=$q3->m_servervars["mapname"]?><br>
<img TITLE="q3dm18" WIDTH=128 HEIGHT=128 SRC="images/maps/q3dm18.jpg">
</td>
<td WIDTH=40%>
<table BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH=100% bgcolor=#000000>
<tr>
<td CLASS="row2" style="text-align: center"><?=$q3->m_servervars["gamename"] ?><?=$q3->m_servervars["g_ufreezeVersion"]?></td>
</tr>
<tr>
<td CLASS="row1" style="text-align: center">Frag Limit: <?=$q3->m_servervars["fraglimit"]?></td>
</tr>
<tr>
<td CLASS="row2" style="text-align: center">Time Limit: <?=$q3->m_servervars["timelimit"]?></td>
</tr>
<tr>
<td CLASS="neutral" style="text-align: center"><br>
<br>
<br>
<br>
<br>
<br>
<br>
</td>
</tr>
</table>
</td>
</tr>
</table>
<table id="2" class="drag" BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH=100%" bgcolor=#000000>
<tr>
<td id="players" VALIGN=top WIDTH=70%>
<table BORDER=0 CELLSPACING=0 CELLPADDING=2 WIDTH=100% bgcolor=#000000>
<tr>
<td CLASS="cellHeading" WIDTH=64%>Player Name</td>
<td CLASS="cellHeading" WIDTH=18%>Score</td>
<td CLASS="cellHeading" WIDTH=18%>Ping</td>
</tr>
</table>
<table BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH=100% bgcolor=#000000>
<? if (is_array($q3->m_playerinfo)) { ?>
<? while (list(,$player) = each ($q3->m_playerinfo)) { ?>
<TR>
<TD WIDTH=64%><?=htmlspecialchars($player["name"])?> </TD><TD WIDTH=18%> <?=$player["frags"]?></TD><TD WIDTH=18%><?=$player["ping"]?></TD>
</TR>
<? } ?>
<? } else { ?>
<TR>
<TD COLSPAN="3">No players on server right now</TD>
</TR>
<? } ?>
</table>
</td>
<td id="rules" VALIGN=top WIDTH=30%>
<table BORDER=0 CELLSPACING=0 CELLPADDING=2 WIDTH=100% bgcolor=#000000>
<tr>
<td CLASS="cellHeading" WIDTH=40%>Rule</td>
<td CLASS="cellHeading" WIDTH=60%>
<table BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH=100% bgcolor=#000000>
<tr><td style="text-align: center" class="transparent"><font class="headingText">Value</font></td><td align=right valign=top width=10 class="transparent"></td></table>
</td>
</tr>
</table>
<table BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH=100% bgcolor=#000000 >
<tr CLASS="row2" ><td CLASS="cell2" style="text-align: left" WIDTH=40%>-IP</td>
<td CLASS="cell2" style="text-align: left" WIDTH=60%><? echo $serveradr; echo ":".$serverport;?></td>
</tr>
<tr CLASS="row1" ><td CLASS="cell1" style="text-align: left" WIDTH=40%>-URL</td>
<td CLASS="cell1" style="text-align: left" WIDTH=60%><?echo $website;?></td>
</tr>
<tr CLASS="row1" ><td CLASS="cell1" style="text-align: left" WIDTH=40%>g_autothawtime</td>
<td CLASS="cell1" style="text-align: left" WIDTH=60%><?=$q3->m_servervars["g_autoThawTime"]?></td>
</tr>
<tr CLASS="row2" ><td CLASS="cell2" style="text-align: left" WIDTH=40%>g_maxGameClients</td>
<td CLASS="cell2" style="text-align: left" WIDTH=60%><?=$q3->m_servervars["g_maxGameClients"]?></td>
</tr>
<tr CLASS="row1" ><td CLASS="cell1" style="text-align: left" WIDTH=40%>g_needpass</td>
<td CLASS="cell1" style="text-align: left" WIDTH=60%><?=$q3->m_servervars["g_needpass"]?></td>
</tr>
<tr CLASS="row2" ><td CLASS="cell2" style="text-align: left" WIDTH=40%>g_thawtime</td>
<td CLASS="cell2" style="text-align: left" WIDTH=60%><?=$q3->m_servervars["g_thawTime"]?></td>
</tr>
<tr CLASS="row1" ><td CLASS="cell1" style="text-align: left" WIDTH=40%>gamename</td>
<td CLASS="cell1" style="text-align: left" WIDTH=60%><?=$q3->m_servervars["gamename"] ?></td>
</tr>
<tr CLASS="row2" ><td CLASS="cell2" style="text-align: left" WIDTH=40%>Protocol</td>
<td CLASS="cell2" style="text-align: left" WIDTH=60%><?=$q3->m_servervars["protocol"]?></td>
</tr>
<tr CLASS="row1" ><td CLASS="cell1" style="text-align: left" WIDTH=40%>Max Ping</td>
<td CLASS="cell1" style="text-align: left" WIDTH=60%><?=$q3->m_servervars["sv_maxPing"]?></td>
</tr>
<tr CLASS="row2" ><td CLASS="cell2" style="text-align: left" WIDTH=40%>Min Ping</td>
<td CLASS="cell2" style="text-align: left" WIDTH=60%><?=$q3->m_servervars["sv_minPing"]?></td>
</tr>
</tr>
<tr CLASS="row2" ><td CLASS="cell2" style="text-align: left" WIDTH=40%>sv_privateClients</td>
<td CLASS="cell2" style="text-align: left" WIDTH=60%><?=$q3->m_servervars["sv_privateClients"]?></td>
</tr>
</table>
</td>
</tr>
</table></td>
</tr>
</table><table id="footer" style="position:absolute; left:0px" BORDER=1 CELLSPACING=0 CELLPADDING=2 WIDTH=100% bgcolor=#000000>
<tr><td style="text-align:left;" class="transparent"></td><td style="text-align:right;" class="transparent">Scores Red: <?=$q3->m_servervars["Score_Red"]?> Blue: <?=$q3->m_servervars["Score_Blue"]?></tr></td></table></center>
</body></html>
<? } ?>
quake3.php:
Code: Select all
<?
// **********************************************************************************************
// Class Quake3
// Author : Henrik Schack Jensen (henrik@schack.dk)
//
// Changelog:
// Version 1.00 03/13/2001 Initial release
// A utilityclass (PHP4 only) to do serverstatus-queries against Quake3Arena servers
//
// Syntax:
//
// Function getServerStatus(serveraddress,serverport,timeout)
// Get player/servervar info from server
//
// All results are returned in membervariables:
//
//
// Demosource is available at http://www.gameserver.dk/
// **********************************************************************************************
//
// Function used to sort players by frags
// Needs to be defined globally in order for usort to call it
//
function fragsort ($a, $b) {
if ($a["frags"] == $b["frags"]) return 0;
if ($a["frags"] > $b["frags"]) {
return -1;
} else {
return 1;
}
}
Class Quake3 {
var $m_playerinfo =""; // Info about players
var $m_servervars =""; // Info about the server
//
// Get exact time, used for timeout counting
//
function timenow() {
return doubleval(ereg_replace('^0\.([0-9]*) ([0-9]*)$','\\2.\\1',microtime()));
}
//
// Function to remove funny characters from playernames
//
function removefunchars($data) {
$result="";
$skipnextchar=false;
for ($i=0;$i<strlen($data);$i++) {
if (!$skipnextchar) {
$currentchar=ord(substr($data,$i,1));
if (($currentchar==27) || ($currentchar==94)) {
$skipnextchar=true;
} else {
if (($currentchar>=32) && ($currentchar<=127)) $result=$result.chr($currentchar);
if (($currentchar>=160) && ($currentchar<=255)) $result=$result.chr($currentchar-128);
}
} else {
$skipnextchar=false;
}
}
return $result;
}
//
// Read raw data from server
//
function getServerData($command,$serveraddress,$portnumber,$waittime) {
$serverdata ="";
$serverdatalen=0;
if ($waittime< 500) $waittime= 500;
if ($waittime>2000) $waittime=2000;
$waittime=doubleval($waittime/1000.0);
if (!$cssocket=fsockopen("udp://".$serveraddress,$portnumber,$errnr)) {
$this->errmsg="No connection";
return "";
}
socket_set_blocking($cssocket,true);
socket_set_timeout($cssocket,0,500000);
fwrite($cssocket,$command,strlen($command));
// Mark
$starttime=$this->timenow();
do {
$serverdata.=fgetc($cssocket);
$serverdatalen++;
$socketstatus=socket_get_status($cssocket);
if ($this->timenow()>($starttime+$waittime)) {
$this->errmsg="Connection timed out";
fclose($cssocket);
return "";
}
} while ($socketstatus["unread_bytes"] );
fclose($cssocket);
return $serverdata;
}
// **********************************************************************
// getServerStatus
// Read rules/setup from the gameserver into m_servervars
// Return true if successful
// **********************************************************************
function getServerStatus($serveraddress,$portnumber,$timeout) {
$cmd="\xFF\xFF\xFF\xFFgetstatus\n";
$serverdata=$this->getServerData($cmd,$serveraddress,$portnumber,$timeout);
if (strlen($serverdata)>20) {
$serverdata=substr($serverdata,20);
} else {
return false;
}
$srvvars=substr($serverdata,0,strpos($serverdata,"\n"))."\\";
$players=substr($serverdata,strpos($serverdata,"\n")+1);
// Skip the last linefeed
$players=substr($players,0,strlen($players)-1);
// Split playerinfo and fill into array
$playercount=0;
if (strlen($players)) {
$playercollection=explode("\n",$players);
while (list($key,$data) = each ($playercollection)) {
eregi("^([-0-9]+) ([-0-9]+) \"(.*)\"",$data,$player);
$this->m_playerinfo[$key]=array("frags"=>$player[1],"ping"=>$player[2],"name"=>$this->removefunchars($player[3]));
$playercount++;
}
}
// Fake servervar containing number of current players
$this->m_servervars["sv_currentclients"]=$playercount;
if ($playercount>0) usort($this->m_playerinfo,"fragsort");
// Split servervars and fill into array
$name_tok = strtok ($srvvars,"\\");
$val_tok = strtok ("\\");
while (strlen($name_tok)) {
$this->m_servervars[$name_tok]=$val_tok;
$name_tok = strtok ("\\");
$val_tok = strtok ("\\");
}
return true;
}
}
?>