tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
14
ZUGRIFFE
3615
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    MikeOverDSL MikeOverDSL ist offline Grünschnabel
    Registriert seit
    Jun 2003
    Beiträge
    2
    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
     

  2. #2
    Registriert seit
    Jan 2002
    Ort
    Betelgeuse
    Beiträge
    709
    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 .
    PHP-Code:
    <?

    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>1usort($this->m_playerinfo,"fragsort");
                    return 
    true;
            }
    }
    ?>
     
    been there, done that, lived it, left it

  3. #3
    Avatar von socKe|bla
    socKe|bla socKe|bla ist offline Mitglied Brokat
    Registriert seit
    Sep 2002
    Ort
    bottrop
    Beiträge
    344
    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-Code:
    <?php

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

    $con fsockopen("udp://".$ip$port);
    fwrite($consprintf('%c%c%c%c%s%c'0xFF0xFF0xFF0xFF"infostring"0x00));
    fread($con24); //******** wegfiltern



    $status socket_get_status($con);
    if(
    $status["unread_bytes"] != 0){
      
    $data "";
      while(
    $status["unread_bytes"] != 0){
        
    $data .= fread($con1);
        
    $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
    }

    ?>
     

  4. #4
    Registriert seit
    Apr 2002
    Ort
    keine Angaben
    Beiträge
    578
    weisst jemand rein zufällig ob man auch für Gameserver mit Q3-Engine (wie RtCW, ET, Jedi...) einen Statusscript anwenden kann?
     

  5. #5
    Registriert seit
    Jan 2002
    Ort
    Betelgeuse
    Beiträge
    709
    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.
     
    been there, done that, lived it, left it

  6. #6
    Registriert seit
    Apr 2002
    Ort
    keine Angaben
    Beiträge
    578
    Socke, kannst du mir diesen Teil hier erklären?
    PHP-Code:
    fwrite($consprintf('%c%c%c%c%s%c'0xFF0xFF0xFF0xFF"infostring"0x00)); 
     

  7. #7
    Avatar von socKe|bla
    socKe|bla socKe|bla ist offline Mitglied Brokat
    Registriert seit
    Sep 2002
    Ort
    bottrop
    Beiträge
    344
    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.
     

  8. #8
    Registriert seit
    Apr 2002
    Ort
    keine Angaben
    Beiträge
    578
    Super, ich danke dir.
     

  9. #9
    Registriert seit
    Jan 2002
    Ort
    Betelgeuse
    Beiträge
    709
    nix mit klassen
    ich mag klassen.
     
    been there, done that, lived it, left it

  10. #10
    Avatar von socKe|bla
    socKe|bla socKe|bla ist offline Mitglied Brokat
    Registriert seit
    Sep 2002
    Ort
    bottrop
    Beiträge
    344
    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
     

  11. #11
    Registriert seit
    Dec 2001
    Ort
    Bayern
    Beiträge
    122
    Tag,
    socke könntest du bitte nochmal dein Script durchschaun, ich glaub da sind zwei Fehler drinnen. Zeile 20 und 33 bekomm ich fehler wegen den \ ... ?

    Ausserdem braucht das bei mir extrem lang zum laden der Daten, woran kann das liegen?

    Danke Bandit
     

  12. #12
    Avatar von socKe|bla
    socKe|bla socKe|bla ist offline Mitglied Brokat
    Registriert seit
    Sep 2002
    Ort
    bottrop
    Beiträge
    344
    sry, hatte den code nicht mehr getestet, da fehlten ein paar \
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    
    <?php
     
    $ip = "213.202.197.15";
    $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
    }
     
    ?>

    und wenns so lang zum laden braucht gibts den server nicht

    //Edit
    oha, der fehler lag wieder mal um dummen forum, dass manchmal \ weglässt
    Geändert von socKe|bla (25.06.03 um 22:35 Uhr)
     

  13. #13
    Registriert seit
    Dec 2001
    Ort
    Bayern
    Beiträge
    122
    Hallo,
    also hab jetzt mal geschaut ob ich noch übers Hl Server Protokoll finde und hab dabei nen Script mit Klassen gefunden. Leider scheint es bei mir net zu ****en, villeicht könnte es sich mal von euch wer ansehen und mir sagen ob es bei euch villeicht funktioniert?

    Tutorial - CS Sript

    P.s.: Sind zwei Scripte, das erste is auch einfach nur purer Code

    Bandit
     

  14. #14
    Registriert seit
    Oct 2004
    Ort
    Bayern
    Beiträge
    307
    moin,
    ich nutze die oben angegebene Class. Allerdings hab ich das problem, dass sich manche Server auslesen lassen und andere nicht!

    woran kann das liegen?

    Greatz
     
    Being crazy is normal!
    I developed a Webradio
    Please visit my web development blog

  15. #15
    MikeOverDSL MikeOverDSL ist offline Grünschnabel
    Registriert seit
    Jun 2003
    Beiträge
    2
    Danke für die Antwort, aber mittlerweile haben wir ein recht umfangreiches Statusscript gecodet, welches für nahezu alle Online-Games funktionert!

    Zu sehen auf unserer Clanpage für CS 1.6: http://www.senility.de
     

Ähnliche Themen

  1. Counter-Strike:Source - Bilder Größe ?
    Von Serial-Killer94 im Forum Smalltalk
    Antworten: 11
    Letzter Beitrag: 01.12.08, 15:19
  2. Counter-Strike: Source Hintergrund
    Von Rumpelbube im Forum Creative Lounge
    Antworten: 0
    Letzter Beitrag: 25.01.08, 19:30
  3. Antworten: 0
    Letzter Beitrag: 09.12.07, 23:18
  4. Character Studio + Counter-Strike
    Von escape im Forum 3D Studio Max
    Antworten: 3
    Letzter Beitrag: 30.04.04, 23:40
  5. Counter-Strike Models in 3D Max
    Von kab00m im Forum 3D Studio Max
    Antworten: 1
    Letzter Beitrag: 16.04.01, 22:58