<html>
<head>
<title>Battlefield Vietnam Server Status</title>
<style type="text/css">
<!--
div.scroll {
background-color: #FFFFFF;
border: 1px solid #000000;
overflow-y: scroll;
position: absolute;
height: 100px;
width: 400px;
left: 50px;
top: 50px;
}
body,td,th {
color: #000000;
font-family:sans-serif;
}
body {
background-color: #FFFFFF;
}
-->
</style>
</head>
<body>
<?
// Getting info from a Battlefield Vietnam Server Using
// the new Gamespy protocol. Written by Hans Nieser.
// h.nieser@xs4all.nl
// Some vars
$remoteIP = "213.202.206.23";
$remotePort = "15567";
$queryString = "\xFE\xFD\x00"."bfvs"."\xFF\xFF\xFF";
$timeOut = 2;
// Open socket
$sock = fsockopen("udp://".$remoteIP, $remotePort, $errno, $errstr, $timeOut);
stream_set_timeout($sock, $timeOut);
// Display error if socket failed to topen
if (!$sock) {
// Display error
echo "Error: $errno - $errstr<br />\n";
// Retrieve info and start parsing
} else {
// Send query and get response
fwrite($sock, $queryString) or die("Failed to send query to server");
$response = fread($sock, 4096);
//do {
// $data = fread($sock, 1024);
// if (strlen($data) == 0) {
// break;
// }
// $response .= $data;
//} while (true);
fclose($sock);
// Remove first 4 chars from the response
$response = substr($response, 5);
// Start parsing server rules
do {
// Extract key
$delimiterpos = strpos($response, chr(0));
$ruleKey = substr($response, 0, $delimiterpos);
$response = substr($response, $delimiterpos+1);
// Extract value
$delimiterpos = strpos($response, chr(0));
$ruleValue = substr($response, 0, $delimiterpos);
$response = substr($response, $delimiterpos+1);
// Store parsed rule in a 2-dimensional array
if ($ruleKey) {
$rule["key"] = $ruleKey;
$rule["value"] = $ruleValue;
$rules[] = $rule;
$cycle = true;
// Stop parsing rules if we find an empty one
} else {
$cycle = false;
}
} while ($cycle);
// Parse playercount
$playercount = ord(substr($response, 0, 1));
$response = substr($response, 1);
// Remove player info headers (43 chars)
$response = substr($response, 43);
// Start parsing players
do {
// Extract playername
$delimiterpos = strpos($response, chr(0));
$playerName = substr($response, 0, $delimiterpos);
$response = substr($response, $delimiterpos+1);
// Only extract the rest if we actually found a new player
if ($playerName) {
// Extract score
$delimiterpos = strpos($response, chr(0));
$playerScore = substr($response, 0, $delimiterpos);
$response = substr($response, $delimiterpos+1);
// Extract deaths
$delimiterpos = strpos($response, chr(0));
$playerDeaths = substr($response, 0, $delimiterpos);
$response = substr($response, $delimiterpos+1);
// Extract ping
$delimiterpos = strpos($response, chr(0));
$playerPing = substr($response, 0, $delimiterpos);
$response = substr($response, $delimiterpos+1);
// Extract team
$delimiterpos = strpos($response, chr(0));
$playerTeam = substr($response, 0, $delimiterpos);
$response = substr($response, $delimiterpos+1);
// Extract kills
$delimiterpos = strpos($response, chr(0));
$playerKills = substr($response, 0, $delimiterpos);
$response = substr($response, $delimiterpos+1);
}
// Store parsed player in a 2-dimensional array
if ($playerName) {
$player["name"] = $playerName;
$player["score"] = $playerScore;
$player["deaths"] = $playerDeaths;
$player["ping"] = $playerPing;
$player["team"] = $playerTeam;
$player["kills"] = $playerKills;
$players[] = $player;
$cycle = true;
// Stop parsing players if we find an empty one
} else {
$cycle = false;
}
} while($cycle);
// Parse teamcount
$teamcount = ord(substr($response, 0, 1));
$response = substr($response, 1);
// Remove team info headers (8 chars)
$response = substr($response, 8);
// Start parsing teams
do {
// Extract teamname
$delimiterpos = strpos($response, chr(0));
$teamName = substr($response, 0, $delimiterpos);
$response = substr($response, $delimiterpos+1);
// Store parsed teamname in an array
if ($teamName) {
$teams[] = $teamName;
$cycle = true;
// Stop parsing players if we find an empty one
} else {
$cycle = false;
}
} while($cycle);
// Display parsed serverrules
echo("<table width='100%' border='1'><tr><td>Ip Address </td><td>Game</td><td>Players(Total/Max)</td><td>Server Name</td><td>Game Type </td><td>Map</td></tr><tr><td>".$remoteIP.":15567</td>");
foreach($rules as $rule) {
/* $file = fopen("rules.dat", "a");
fwrite($file, $rule["key"]."=".$rule["value"]."<br>\n");
fclose($file);*/
if ($rule["key"] == "game_id") {
$grule= "<td>".$rule["value"]."</td>";
}
if ($rule["key"] == "mapname") {
$marule= "<td>".$rule["value"]."</td>";
}
if ($rule["key"] == "numplayers") {
$nrule = "<td>(".$rule["value"]."/";
}
if ($rule["key"] == "maxplayers") {
$mrule = $rule["value"].")</td>";
}
if ($rule["key"] == "hostname") {
$hrule = "<td>(".$rule["value"].")</td>";
}
if ($rule["key"] == "gametype") {
$grule = "<td>(".$rule["value"].")</td>";
}
}
echo($grule.$nrule.$mrule.$hrule.$grule.$marule);
echo("</tr></table>");
// Display parsed players
?>
<table width="100%" border="1">
<tr>
<td>
<div align="center">
Players
</div>
</tr>
<tr>
<td>
<div style="width:100%;height:100%;">
<table width='100%' border='1'><tr><td>Name</td><td>Score(Kills/Deaths)</td><td>Ping</td></tr>
<?php
if(is_array($players)) {
foreach($players as $player) {
$name = $player["name"];
$score = $player["score"];
$deaths = $player["deaths"];
$ping = $player["ping"];
$team = $player["team"];
$kills = $player["kills"];
echo ("<tr><td>".$name."</td><td>".$score."(".$kills."/".$deaths.")</td><td>".$ping."</td></tr>");
}
?>
</table>
<?php
} else {
}
}
?>
</div></td>
</tr>
</table>
</body>
</html>