Gameserver-Class

racepat
Hallo zusammen,

bin dran, auf unserer HP eine Serveranzeige zu installieren. Hab mal eure versucht, doch ich komm nicht weiter. Hab folgende Meldung:

Code einblendenCode angehängt. Klicke hier zum Ein-/Ausblenden

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
Warning: usort(): The argument should be an array in /home/www/web8/html/wbb2/serverbox/codview/gameserver_class.php on line 91
Game: 	  	Call of Duty 1.5
IP: 	  	80.86.187.215:28960
Map: 	  	mp_brecourt
Gametype: 	  	Teamdeathmatch
Player: 	  	0 / 20
Punkbuster: 	  	no
Mod: 	  	kein Mod vorhanden
Password: 	  	mit Passwort
Screenshot: 	  	Screenshot der Map
  	  	 
Spielerdaten: 	 



was mach ich in dieser Line91 falsch? Hat mir jemand einen Tip? verwirrt
Gargamel
404 - DEPUBLIZIERT

Dieser Beitrag wurde auf Wunsch des Urhebers ohne Anerkennung einer Rechtspflicht gelöscht

Bitte nicht die Google Cache Funktion benutzen. Augenzwinkern
racepat
unten hab ich mal die ganze Datei angehängt. verwirrt
bei Zeile 91 ist etwas krumm:


Code einblendenCode angehängt. Klicke hier zum Ein-/Ausblenden

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:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
<?
/*
  	Dateiname:    		gameserver_class.php
  	Version:			0.5 (beta)
  	Erstellt:     		20.11.2005 07:50 GMT
  	Letzte Änderung:   	20.11.2005 12:20 GMT
  	Autor:      		Nighthawk <nighthawk@opferlamm-clan.de>
  	Support:			www.opferlamm-clan.de
  	
  	------------------------------------------------------------
  	
  	Beschreibung:
  	------------- 
  	Dieses Script liest "Call of Duty", "Call of Duty United Offensive" und
	"Call od Duty 2" Gameserver aus.

  	Bildet einfach eine neue Instanz pro Server. Beispiel:
	$ausgabe = new serverstatusquery();
	$ergebnis = $ausgabe->serverstatus("213.202.211.44","28960");
	print_r($ergebnis);
	
  	Es wäre schön, wenn du den Headder hier stehen lässt, damit man nachvollziehen kann 
  	woher das Teil kommt. Nicht weil mein Nick oben steht, aber das Script wird 
  	weiterentwickelt und sobald es neue Versionen gibt erfahrt ihr es auf der oben 
  	angegebenen Webseite. Und wenn einer das hier als sein Script weiter geben möchte,
  	nehmt bitte den Headder raus, dann leistet auch bitteschön Support :-) 
  	So, das wars von mir. 
	  	
  	Greetz Nighthawk
  	
  	
*/

//error_reporting(E_ALL);
//ini_set('display_errors', '1');

class serverstatusquery {
    
	var $x;
	var $ip = "";
	var $port = "";
	var $serverdata = "";
	var $serverdatalen = "";
	
	function vergleichen($a, $b) {
		return $comp = ($a < $b) ? 1:0;
	}

	function serverstatus($ip,$port) {
		$erg = array();
		$command = "\xFF\xFF\xFF\xFFgetstatus\n";
		$verbindung=fsockopen("udp://".$ip."",$port,$errnr) or die($error."(".$errno.")") ;
				
		fwrite($verbindung,$command,strlen($command));    
	
		do {
			$this->serverdata .=fgetc($verbindung);
			$this->serverdatalen++;
			$socketstatus=socket_get_status($verbindung);
		} while ($socketstatus["unread_bytes"] );
				
		fclose($verbindung);
	
				
		$this->serverdata = substr($this->serverdata,strpos($this->serverdata,"\n")+1);
				
				
		$kette =  strtok($this->serverdata,"\\");
		while($kette) {
			$this->x++;
			$array_name = $kette;
			$kette = strtok("\\");
			$erg["".$array_name.""] = "".$kette."";
			$kette = strtok("\\");
		}
			
				
		$players=substr($this->serverdata,strpos($this->serverdata,"\n")+1);
		$two = $players;
		$players = substr($players,0,strlen($players)-1);
		$playercount=0;
		if (strlen($players) > 0) {
			$playercollection=explode("\n",$players);
			while (list($key,$data) = each ($playercollection)) {
				eregi("^([-0-9]+) ([-0-9]+) \"(.*)\"",$data,$player);
				$ol_playerinfo[$key]=array("pkt"=>$player[1],"ping"=>$player[2],"name"=>$player[3]);
				$playercount++;
			}
		}
		$erg["current_player"] = $playercount;
		usort($ol_playerinfo, array("serverstatusquery","vergleichen"));
		$erg["playerdata"] = $ol_playerinfo;
		$erg["ip"] = $ip;
		$erg["port"] = $port;
		return $erg;
	}
}
?>


Kelli

Zitat:

Original von racepat
unten hab ich mal die ganze Datei angehängt. verwirrt
bei Zeile 91 ist etwas krumm:

Das ist nicht schlimm, nur eine Warnung das die Variable eigentlich ein Array sein sollte. Das passiert weil du keine Spieler auf dem Server hast, und deshalb $ol_playerinfo leer ist. Wenn ein Spieler drauf ist ist es weg.
unelegante Lösung:

Code einblendenCode angehängt. Klicke hier zum Ein-/Ausblenden

code:
1:
2:
3:
4:
//error_reporting(E_ALL);
//ini_set('display_errors', '1');


Kommentar weg und ändern in
error_reporting(E_ERROR);
ini_set('display_errors', '0');
Damit ist die Variable zwar immernoch undefiniert, aber die Warnung wird nichtmehr angezeigt.

elegante Lösung:

Code einblendenCode angehängt. Klicke hier zum Ein-/Ausblenden

code:
1:
2:
3:
4:
    				
$ol_playerinfo = array();



oder

Code einblendenCode angehängt. Klicke hier zum Ein-/Ausblenden

code:
1:
2:
3:
4:
5:
if $playercount > 1 {
		usort($ol_playerinfo, array("serverstatusquery","vergleichen"));
}


edit "> 1" reicht auch, bei einem Spieler gibt es nichts zu sortieren.
racepat
wo genau muss ich das einfügen?
Kelli
Bei der eleganten Methode:
Vorher:

Code einblendenCode angehängt. Klicke hier zum Ein-/Ausblenden

code:
1:
2:
3:
4:
5:
90		$erg["current_player"] = $playercount;
91		usort($ol_playerinfo, array("serverstatusquery","vergleichen"));
92		$erg["playerdata"] = $ol_playerinfo;



Nacher

Code einblendenCode angehängt. Klicke hier zum Ein-/Ausblenden

code:
1:
2:
3:
4:
5:
6:
7:
90		$erg["current_player"] = $playercount;
91		if $playercount > 1 {
92		usort($ol_playerinfo, array("serverstatusquery","vergleichen"));
93		}
94		$erg["playerdata"] = $ol_playerinfo;

racepat
Hab ich gemacht. Geht nicht, es kommt folgende Meldung:

Code einblendenCode angehängt. Klicke hier zum Ein-/Ausblenden

code:
1:
Parse error: parse error, unexpected T_VARIABLE, expecting '(' in /home/www/web8/html/wbb2/serverbox/codview/gameserver_class.php on line 91

Kelli
Da fehlt eine Klammer oder du hast in einer Zeile irgendwo vorher ein Semikolon vergessen. Schau nochmal drüber oder poste die komplette nochmal mit deinen Änderungen.
racepat
vielen Dank für deine schnelle Hilfe!!!!!! grosses Grinsen

Code einblendenCode angehängt. Klicke hier zum Ein-/Ausblenden

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:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
<?
/*
  	Dateiname:    		gameserver_class.php
  	Version:			0.5 (beta)
  	Erstellt:     		20.11.2005 07:50 GMT
  	Letzte Änderung:   	20.11.2005 12:20 GMT
  	Autor:      		Nighthawk <nighthawk@opferlamm-clan.de>
  	Support:			www.opferlamm-clan.de
  	
  	------------------------------------------------------------
  	
  	Beschreibung:
  	------------- 
  	Dieses Script liest "Call of Duty", "Call of Duty United Offensive" und
	"Call od Duty 2" Gameserver aus.

  	Bildet einfach eine neue Instanz pro Server. Beispiel:
	$ausgabe = new serverstatusquery();
	$ergebnis = $ausgabe->serverstatus("213.202.211.44","28960");
	print_r($ergebnis);
	
  	Es wäre schön, wenn du den Headder hier stehen lässt, damit man nachvollziehen kann 
  	woher das Teil kommt. Nicht weil mein Nick oben steht, aber das Script wird 
  	weiterentwickelt und sobald es neue Versionen gibt erfahrt ihr es auf der oben 
  	angegebenen Webseite. Und wenn einer das hier als sein Script weiter geben möchte,
  	nehmt bitte den Headder raus, dann leistet auch bitteschön Support :-) 
  	So, das wars von mir. 
	  	
  	Greetz Nighthawk
  	
  	
*/

//error_reporting(E_ALL);
//ini_set('display_errors', '1');

class serverstatusquery {
    
	var $x;
	var $ip = "";
	var $port = "";
	var $serverdata = "";
	var $serverdatalen = "";
	
	function vergleichen($a, $b) {
		return $comp = ($a < $b) ? 1:0;
	}

	function serverstatus($ip,$port) {
		$erg = array();
		$command = "\xFF\xFF\xFF\xFFgetstatus\n";
		$verbindung=fsockopen("udp://".$ip."",$port,$errnr) or die($error."(".$errno.")") ;
				
		fwrite($verbindung,$command,strlen($command));    
	
		do {
			$this->serverdata .=fgetc($verbindung);
			$this->serverdatalen++;
			$socketstatus=socket_get_status($verbindung);
		} while ($socketstatus["unread_bytes"] );
				
		fclose($verbindung);
	
				
		$this->serverdata = substr($this->serverdata,strpos($this->serverdata,"\n")+1);
				
				
		$kette =  strtok($this->serverdata,"\\");
		while($kette) {
			$this->x++;
			$array_name = $kette;
			$kette = strtok("\\");
			$erg["".$array_name.""] = "".$kette."";
			$kette = strtok("\\");
		}
			
				
		$players=substr($this->serverdata,strpos($this->serverdata,"\n")+1);
		$two = $players;
		$players = substr($players,0,strlen($players)-1);
		$playercount=0;
		if (strlen($players) > 0) {
			$playercollection=explode("\n",$players);
			while (list($key,$data) = each ($playercollection)) {
				eregi("^([-0-9]+) ([-0-9]+) \"(.*)\"",$data,$player);
				$ol_playerinfo[$key]=array("pkt"=>$player[1],"ping"=>$player[2],"name"=>$player[3]);
				$playercount++;
			}
		}
		$erg["current_player"] = $playercount;
		if $playercount > 1 {
		usort($ol_playerinfo, array("serverstatusquery","vergleichen"));
		}
		$erg["playerdata"] = $ol_playerinfo;		
		$erg["ip"] = $ip;
		$erg["port"] = $port;
		return $erg;
	}
}
?>


Kelli
upps, damn, mein Fehler

Zitat:

if $playercount > 1 {

muss heissen

Zitat:

if ($playercount > 1) {


spätestens hier:

Zitat:

Da fehlt eine Klammer oder du hast in einer Zeile irgendwo vorher ein Semikolon vergessen.

hätte ich das aber auch merken können. Asche auf mein, naja du weißt schon...
Bin doof... Ich brauch Kaffee!
racepat
ach was, wer solche Codes beherrscht ist alles andere als doof!!!!! Auch Respekt!

Danke, muss noch irgendwie nen Style machen, das die Anzeige gut aussieht.
Kennste den Code von Netskin ?
Kelli

Zitat:

Original von racepat
ach was, wer solche Codes beherrscht

beherrschen ist was anderes. Ich kann php gerade so lesen und nachvollziehen was wo gemacht wird. Aber auf einem weißen Blatt Papier eine Serverabfrage zusammenschreiben - das würde ich nicht hinbekommen.

Zitat:

Original von racepat
Kennste den Code von Netskin ?

Nein, bis jetzt nicht.
racepat
hab's mit der Formatierung der Anzeige einigermassen hinbekommen.
Nur mit der Punkte, Ping und Spieleranzeige krieg ichs nicht auf die Reihe.
Haste mir nen Tip, wie ich da die Schriftart ändern kann? verwirrt