Counter-Strike Statusscript

MikeOverDSL

Grünschnabel
Hallo allerseits!

Ich suche für ein CS-Status-Script die nötigen Variablen, um aus dem Server die verbleibende Zeit und die nächste Map auszulesen.
Gibt es irgendwo eine Zusammenfassung aller Variablen, um solch ein StatusScript zu basteln?

Danke und Gruß...Michael
 
UTFSB

Original geschrieben von BomberJack
apric hat mich auf eine gute idee gebraucht und zwar habe ich hier ein skript was für die abfrage von Counter Strike servern benutzt wird das auch relativ schnell geht bloß mir fehlet da der überblick vieleicht kann ja mal wer anders sich das durchschauen und mit den bereits vorhanden code vergleichen das ich endlich meine abfragen machen kann :D.
PHP:
<?

Class Hl_Server_Query {
        var $m_playerinfo = "";
        var $m_servervars = "";
        var $m_serverrules = "";

        function timenow() {
                return doubleval(ereg_replace('^0\.([0-9]*) ([0-9]*)$','\\2.\\1',microtime()));
        }

        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);
                fwrite($cssocket,$command,strlen($command));
                $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="";
                $playtime=sprintf("%2d:",$time/3600);
                $time%=3600;
                $playtime=$playtime.sprintf("%2d:",$time/60);
                $time%=60;
                $playtime=$playtime.sprintf("%2d",$time);
                $data=substr($data,5);
                if(strstr($playtime," ")){
                $playtime = str_replace(" ","0",$playtime);
                }
                return $playtime;
        }

        function getServerRules($serveraddress,$portnumber,$waittime) {
                $cmd="\xFF\xFF\xFF\xFFrules\x00";
                $serverdata=$this->getServerData($cmd,$serveraddress,$portnumber,$waittime);
                if (strlen($serverdata)<5) return false;
                $rules=(ord($serverdata[5]))+(ord($serverdata[6])*256);
                if ($rules!=0) {
                        $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;
                }
        }

        function getServerInfo($serveraddress,$portnumber,$waittime) {
                $cmd="\xFF\xFF\xFF\xFFinfo\x00";
                $serverdata=$this->getServerData($cmd,$serveraddress,$portnumber,$waittime);
                if (strlen($serverdata)<5) return false;
                $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;
        }

        function getServerPlayers($serveraddress,$portnumber,$waittime) {
                $cmd="\xFF\xFF\xFF\xFFplayers\x00";
                $serverdata=$this->getServerData($cmd,$serveraddress,$portnumber,$waittime);
                if (strlen($serverdata)<5) return false;
                $players=ord($serverdata[5]);
                $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);
                }
                if ($players>1) usort($this->m_playerinfo,"fragsort");
                return true;
        }
}
?>
 
lang lang ists her, da hab ich mich mal mit serverquerys beschäftigt :)
das hier ist eins meiner ersten hl-server query scripte, nix mit funktionen oder klassen, einfach nur purer code und nicht viel :)

also, hf..

PHP:
<?php

$ip = "62.80.117.128";
$port = "27015";

$con = fsockopen("udp://".$ip, $port);
fwrite($con, sprintf('%c%c%c%c%s%c', 0xFF, 0xFF, 0xFF, 0xFF, "infostring", 0x00));
fread($con, 24); //******** wegfiltern



$status = socket_get_status($con);
if($status["unread_bytes"] != 0){
  $data = "";
  while($status["unread_bytes"] != 0){
    $data .= fread($con, 1);
    $status = socket_get_status($con);
  }

  $data = explode("\\",$data);

  $info["players"] = $data[5];
  $info["lan"] = ($data[9]=="0") ? false : true;
  $info["maxplayers"] = $data[11];
  $info["gamedir"] = $data[13];
  $info["description"] = $data[15];
  $info["hostname"] = $data[17];
  $info["map"] = $data[19];
  $info["dedicated"] = ($data[21]=="d") ? true : false;
  $info["password"] = ($data[23]=="0") ? false : true;
  $info["os"] = ($data[25]=="w") ? "Windows" : "Linux";

  echo "Auf dem Server \"".$info["hostname"]."\" spielen zur Zeit ".$info["players"]." von ".$info["maxplayers"]."<br><br>
        OS: ".$info["os"].", Passwort: ".$info["password"].", Dedicated: ".$info["dedicated"].", Map: ".$info["map"].", Description: ".$info["description"].",
        Gamedir: ".$info["gamedir"].", Lan: ".$info["lan"];
}else{
  //Keine Verbindung
}

?>
 
weisst jemand rein zufällig ob man auch für Gameserver mit Q3-Engine (wie RtCW, ET, Jedi...) einen Statusscript anwenden kann?
 
natürlich kann man das.

dein spiel - welches es auch immer ist - ruft ja auch einige spieldaten ab. Diese werden angezeigt, wenn du aus der liste der server auswählst. So wars jedenfalls vor ner zeit noch... ;)

und da diese abfragen über bestimmte an den spielport gesendete befehle und die antworten darauf funktionieren, kannst du das gleiche auch mit php machen.

nur musst du entweder die abfragen irgendwie rausfinden. Am besten schaust du einfach mal bei google etc. nach, weil das immer jemand anderes schon vorher gemacht hat. Oft geben auch die firmen die kommandos raus.
 
Socke, kannst du mir diesen Teil hier erklären?
PHP:
fwrite($con, sprintf('%c%c%c%c%s%c', 0xFF, 0xFF, 0xFF, 0xFF, "infostring", 0x00));
 
damit einem das server protocol was zurückschickt, muss man ihm halt genau das schicken, was es will. und das hl protocol erwartet erst 4 x 255 bytes (0xFF), danach einen string, was man von ihm will ("infostring", gibt auch "details" und noch ein paar) und danach ein zero byte (0x00). dann ist es zufrieden und man bekommt das zurückgeschickt, was man haben will. kannst ja mal bei google nach dem server protocol suchen, sollte es dich interessieren. so lässt sich das nämlich auch auf ut etc. übertragen.
 
ich mag auch klassen, nur so isses vielleicht für den anfang ein wenig einfacher, oder hast du dein erstes hl server query script mit klassen geschrieben :p
 
Zurück