PHP + Gameserver

hi.

ich will über php einige variablen auf einem cs-server abfragen.

wie mache ich das am besten? soweit bin ich schon:

$log = "Log: ";

$h = fsockopen($ip, 7130, $errno, $errmsg, 5);

if (!$h) { die("keine verbindung."); }
else {

$log .= fputs($h, "rcon_password nix");
$log .= fputs($h, "rcon sv_gravity");

echo $log;

der rcon port ist meines wissens nach 7130..

wieso funktioniert das nicht?

ich bitte um hilfe.

thx,
little_Newbie :)
 
probier mal:

Code:
allgemein.php:
<?
$csinfo=new CounterStrike;
$status=$csinfo->getServerInfo($serveradr,$serverport,1000);
require(\\"cs.php\\");
?>

<?=$csinfo->m_servervars[\"servername\"]?>  //fragt den Servernamen ab 
<?=$csinfo->m_servervars[\"serveraddress\"]?> //fragt die Serveradresse ab
<?=$csinfo->m_servervars[\"mapname\"]?>  //fragt die aktuelle Map ab
<?=$csinfo->m_servervars[\"currentplayers\"]?>  //fragt die aktuellen Spieler  auf dem Server ab
<?=$csinfo->m_servervars[\"maxplayers\"]?>  //fragt nach der max. Spieleranzahl für den Server 

// Wenn man von jeder Map auf dem Server auch gleich ein Screenshort 
// anzeigen lassen möchte, so muss man die Bilder genauso wie die 
// eigentlichen Mapnamen nennen und diese folgend einbinden: 
<img border=\\"0\\" src=\\"maps/<?=$csinfo->m_servervars[\\"mapname\\"]?>.jpg\\" width=\\"289\\" height=\\"219\\">
<?
include(spieler.php);
include(regeln.php);
?>

Aufruf: www.lalala.de/allgemein.php?serveradr=12.45.456.123&serverport=27015

Code:
spieler.php
<?
$csinfo=new CounterStrike;
$status=$csinfo->getServerPlayers($HTTP_GET_VARS[\\"serveradr\\"],$HTTP_GET_VARS[\\"serverport\\"],1000);
?>
//Nun müssen wir die Informationen eines jeden Spielers der auf dem 
// Server ist abfragen: 
<div align=\\"center\\">
<center>
<table border=\\"0\\" cellpadding=\\"0\\" cellspacing=\\"0\\" style=\\"border-collapse: collapse\\" bordercolor=\\"#111111\\" width=\\"304\\" height=\\"40\\" id=\\"AutoNumber1\\">
<tr>
<td width=\\"171\\" height=\\"15\\" align=\\"center\\"><b>
<font size=\\"2\\" face=\\"Verdana\\">Name</font></b></td>
<td width=\\"54\\" height=\\"15\\" align=\\"center\\">
<p align=\\"center\\"><b><font size=\\"2\\" face=\\"Verdana\\">Frags</font></b></td>
<td width=\\"72\\" height=\\"15\\" align=\\"center\\"><b>
<font size=\\"2\\" face=\\"Verdana\\">Spielzeit</font></b></td>
</tr>
<? if (is_array($csinfo->m_playerinfo)) { ?>
<? while (list(,$player) = each ($csinfo->m_playerinfo)) { ?>
<tr>
<td width=\\"171\\" height=\\"21\\" align=\\"center\\"><font size=\\"2\\" face=\\"Verdana\\"><?=$player[\\"name\\"]?></font></td>
<td width=\\"54\\" height=\\"21\\" align=\\"center\\"><font size=\\"2\\" face=\\"Verdana\\" color=\\"#FF0000\\"><?=$player[\\"frags\\"]?></font></td>
<td width=\\"72\\" height=\\"21\\" align=\\"center\\"><font size=\\"2\\" face=\\"Verdana\\"><?=$player[\\"time\\"]?></font></td>
</tr>
<? } ?>
<? } else { ?>
<tr>
<td colspan=\\"3\\" align=\\"center\\"><font size=\\"2\\" face=\\"Verdana\\">Keine Spieler auf dem Server</font></td>
</tr>
<? } ?>
</table>
</center>
</div>

Es stehen folgende Informationen der Spieler zur Verfügung:
<?=$player["name"]?> Spielername
<?=$player["frags"]?> Frags des Spielers
<?=$player["time"]?> Zeit, wie lange der Spieler schon auf dem Server ist


Code:
regeln.php
<?
$csinfo=new CounterStrike;
$status=$csinfo->getServerRules($HTTP_GET_VARS[\\"serveradr\\"],$HTTP_GET_VARS[\\"serverport\\"],1000);
?>
<div align=\\"center\\">
<center>
<table border=\\"0\\" cellpadding=\\"0\\" cellspacing=\\"0\\" style=\\"border-collapse: collapse\\" bordercolor=\\"#111111\\" width=\\"195\\" height=\\"19\\" id=\\"AutoNumber1\\">
<tr>
<td width=\\"124\\" height=\\"10\\" align=\\"center\\"><b>
<font size=\\"2\\" face=\\"Verdana\\">Einstellung</font></b></td>
<td width=\\"65\\" height=\\"10\\" align=\\"center\\"><b>
<font size=\\"2\\" face=\\"Verdana\\">Wert</font></b></td>
</tr>
<? while (list($name,$value) = each ($csinfo->m_serverrules)) { ?>
<tr>
<td width=\\"124\\" height=\\"5\\" align=\\"center\\"><font size=\\"2\\" face=\\"Verdana\\"><?=$name?></font></td>
<td width=\\"65\\" height=\\"5\\" align=\\"center\\"><font size=\\"2\\" face=\\"Verdana\\"><?=$value?></font></td>
</tr>
<? } ?>
</table>
</center>
</div>

folgende Informationen sind hier verfügbar:
<?=$name?> Regelbezeichnung
<?=$value?> Wert der jeweiligen Regel

und zum Schluss brauchst du noch die oben per require einbezogene cs.php:

Code:
cs.php:

<?
function fragsort ($a, $b) {   
    if ($a[\"frags\"] == $b[\"frags\"]) return 0;
    if ($a[\"frags\"] > $b[\"frags\"]) {
        return -1;
    } else {
        return 1;
    }
}    


Class CounterStrike {
    var $m_playerinfo        =\"\";        // Info about players
    var $m_servervars        =\"\";        // Info about the server current map, players etc
    var $m_serverrules  =\"\";        // Serverrules
    
    //
    // Get exact time, used for timeout counting
    //
    function timenow() {
        return doubleval(ereg_replace('^0\.([0-9]*) ([0-9]*)$','\\2.\\1',microtime()));
    }
    
    //
    // 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;        
    }
    
    function getnextstring(&$data) {
        $temp=\"\";
        $counter=0;
        while (ord($data[$counter++])!=0) $temp.=$data[$counter-1];
        $data=substr($data,strlen($temp)+1);
        return $temp;
    }

    function getnextbytevalue(&$data) {
        $temp=ord($data[0]);
      $data=substr($data,1);
      return $temp;
    }

    function getnextfragvalue(&$data) {
        $frags=ord($data[0])+(ord($data[1])<<8)+(ord($data[2])<<16)+(ord($data[3])<<24);
        if ($frags>=4294967294) $frags-=4294967296;
        $data=substr($data,4);
        return $frags;
    }

    function getnextplaytime(&$data) {
        $decnumber=ord($data[0])+(ord($data[1])<<8)+(ord($data[2])<<16)+(ord($data[3])<<24);
        $binnumber=base_convert($decnumber,10,2);
        while (strlen($binnumber) < 32) $binnumber=\"0\".$binnumber;
        $exp=abs(base_convert(substr($binnumber,1,8),2,10))-127;
        if (substr($binnumber,0,1)==\"1\") $exp=0-$exp;
        $man=1;$manadd=0.5;
        for ($counter=9;$counter<32;$counter++) {
            if (substr($binnumber,$counter,1)==\"1\") $man+=$manadd;
            $manadd=$manadd/2;
        }
        $time=round(pow(2,$exp)*$man);
        $playtime=\"\";
        if ($time>3600) {
            $playtime=sprintf(\"%2dh\",$time/3600);
        }
        $time%=3600;
        $playtime=$playtime.sprintf(\"%2dm\",$time/60);    
        $time%=60;
        $playtime=$playtime.sprintf(\"%2ds\",$time);
        $data=substr($data,5);
        return $playtime;
    }

    // **********************************************************************
    // getServerRules
    // Read rules/setup from the gameserver into m_serverrules
    // Return true if successful
    // **********************************************************************
    function getServerRules($serveraddress,$portnumber,$waittime) {
        $cmd=\"\xFF\xFF\xFF\xFFrules\x00\";        
        $serverdata=$this->getServerData($cmd,$serveraddress,$portnumber,$waittime)    ;
        // Check length of returned data, if < 5 something went wrong
        if (strlen($serverdata)<5) return false;            
        // Figure out how many rules there are
        $rules=(ord($serverdata[5]))+(ord($serverdata[6])*256);
        if ($rules!=0) {
            // Strip OOB data                
            $serverdata=substr($serverdata,7);
            for ($i=1;$i<=$rules;$i++) {
                $rulename        =$this->getnextstring($serverdata);
                $rulevalue    =$this->getnextstring($serverdata);
                $this->m_serverrules[$rulename]=$rulevalue;
            }
            return true;
        } else {
            return false;
        }
    }    

    
    // **********************************************************************
    // getServerinfo
    // Read information about the gameserver into m_servervars
    // Serveraddress,servername,current map etc etc
    // Return true if successful
    // **********************************************************************
    function getServerInfo($serveraddress,$portnumber,$waittime) {
        $cmd=\"\xFF\xFF\xFF\xFFinfo\x00\";        
        $serverdata=$this->getServerData($cmd,$serveraddress,$portnumber,$waittime)    ;
        // Check length of returned data, if < 5 something went wrong
        if (strlen($serverdata)<5) return false;        
        // Strip OOB data                
        $serverdata=substr($serverdata,5);
        $this->m_servervars[\"serveraddress\"]    =$this->getnextstring($serverdata);
        $this->m_servervars[\"servername\"]            =$this->getnextstring($serverdata);
        $this->m_servervars[\"mapname\"]                =$this->getnextstring($serverdata);
        $this->m_servervars[\"game\"]                        =$this->getnextstring($serverdata);
        $this->m_servervars[\"gamename\"]                =$this->getnextstring($serverdata);
        $this->m_servervars[\"currentplayers\"]    =$this->getnextbytevalue($serverdata);
        $this->m_servervars[\"maxplayers\"]            =$this->getnextbytevalue($serverdata);    
        return true;
}    


    // **********************************************************************
    // Get Playerinfo
    // Read information about the players into m_playerinfo
    // Name,frags,playtime
    // Return true if successful
    // **********************************************************************
    function getServerPlayers($serveraddress,$portnumber,$waittime) {
        // Servercommand
        $cmd=\"\xFF\xFF\xFF\xFFplayers\x00\";
        $serverdata=$this->getServerData($cmd,$serveraddress,$portnumber,$waittime);
        
        // Check length of returned data, if < 5 something went wrong
        if (strlen($serverdata)<5) return false;
        
        // Check number of players to read data for
        $players=ord($serverdata[5]);
        
         // Strip OOB data and other stuff
        $serverdata=substr($serverdata,7);
        for ($i=1;$i<=$players;$i++) {
            $playername                            =htmlspecialchars($this->getnextstring($serverdata));
            $frags                                    =$this->getnextfragvalue($serverdata);
            $playtime                                =$this->getnextplaytime($serverdata);
            $this->m_playerinfo[$i] =array(\"name\"=>$playername,\"frags\"=>$frags,\"time\"=>$playtime);
        }
        // Sort players in fragorder
        if ($players>1) usort($this->m_playerinfo,\"fragsort\");
        return true;
    }
}
?>

PS: php darf glaub ich nicht im safe_mode laufen, ansonsten müsste es funzen :)
(ich weiss der Code ist nicht besonders toll, und geschweige die HTML-Seiten, aber das kannst du ja anpassen :))
 
Zurück
Oben