ERLEDIGT
NEIN
NEIN
ANTWORTEN
14
14
ZUGRIFFE
3615
3615
EMPFEHLEN
-
19.06.03 17:45 #1
- 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
-
19.06.03 21:37 #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>1) usort($this->m_playerinfo,"fragsort");
return true;
}
}
?>been there, done that, lived it, left it
-
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($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?
-
22.06.03 22:56 #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
-
Socke, kannst du mir diesen Teil hier erklären?
PHP-Code: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.
-
Super, ich danke dir.
-
24.06.03 22:03 #9
- Registriert seit
- Jan 2002
- Ort
- Betelgeuse
- Beiträge
- 709
ich mag klassen.nix mit klassen
been there, done that, lived it, left it
-
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
-
25.06.03 22:05 #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
-
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ässtGeändert von socKe|bla (25.06.03 um 22:35 Uhr)
-
28.06.03 12:09 #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
-
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
-
14.10.05 18:07 #15
- 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
-
Counter-Strike:Source - Bilder Größe ?
Von Serial-Killer94 im Forum SmalltalkAntworten: 11Letzter Beitrag: 01.12.08, 15:19 -
Counter-Strike: Source Hintergrund
Von Rumpelbube im Forum Creative LoungeAntworten: 0Letzter Beitrag: 25.01.08, 19:30 -
In PHP Counter-Strike Server Hostname+IP anzeigen?
Von jackie05 im Forum ASPAntworten: 0Letzter Beitrag: 09.12.07, 23:18 -
Character Studio + Counter-Strike
Von escape im Forum 3D Studio MaxAntworten: 3Letzter Beitrag: 30.04.04, 23:40 -
Counter-Strike Models in 3D Max
Von kab00m im Forum 3D Studio MaxAntworten: 1Letzter Beitrag: 16.04.01, 22:58





Zitieren
Login






[PHP][Snippet] Array zu XML konvertieren