Seite 1 von 1

CoD Statistik - Anzeige Server ist Offline

Verfasst: Fr 15.Feb, 2008 07:55
von Dungeonwatcher
Moin! :cool:

Nachdem ich meine CoD Statistik so gut wie fertig habe, fehlt noch eine einzige Funktion, nämlich die Anzeige das der Gameserver gerade offline ist. Aktuell sieht meine PHP Datei so aus:

Code: Alles auswählen

[...]

$server_ip = "udp://" . $server_ip;
$serverip = substr($server_ip, 6);
$connect = fsockopen($server_ip, $server_port, $errno, $errstr, 30);

if ($connect)
	$template->assign_block_vars('server_online', array());
	{
		socket_set_timeout ($connect, 1, 000000);
		$send = "ÿÿÿÿ" . chr (0x02) . "getstatus";
		$debug1 = fputs($connect, $send);
		$debug2 = fwrite ($connect, $send);
		$output = fread ($connect, 1);
		if (! empty ($output))
			{
				do
					{
						$status_pre = socket_get_status ($connect);
						$output = $output . fread ($connect, 1);
						$status_post = socket_get_status ($connect);
					}
					while ($status_pre['unread_bytes'] != $status_post['unread_bytes']);
			};
		fclose($connect);

		$output = explode ("\\", $output);
		$max_index = array_search ("sv_maxclients", $output);$max_clients = $output[$max_index+1];
		$max_index = array_search ("sv_privateClients", $output);$privat = $output[$max_index+1];

[...]

			}
		@usort($playerlist, "cmp");
		$players = count($playerlist) - 1;
	}

	for ($i = 0; $i != (count($playerlist) -1); $i++)
		{
			$template->assign_block_vars('spieler', array(
				'PLAYER'		=> farben(str_replace("\"", "", $playerlist[$i]['player'])),
				'PLAYER_SCORE'	=> $playerlist[$i]['score'],
				'PLAYER_PING'	=> $playerlist[$i]['ping']));
		}

$template->assign_vars(array(
	'SERVER_IP'				=> $serverip,
	'SERVER_PORT'			=> $server_port,
	[...]
	'ALAG'					=> ($alag == 1 ? "<img src='./templates/fiblack/images/cod/al_an.jpg' alt='mit Antilag' title='mit Antilag' border='0' />" : "<img src='./templates/fiblack/images/cod/al_aus.jpg' alt='ohne Antilag' title='ohne Antilag' border='0' />"),
	'VOICE'					=> ($voice == 1 ? "<img src='./templates/fiblack/images/cod/gv_an.jpg' alt='mit GameVoice' title='mit Gamevoice' border='0' />" : "<img src='./templates/fiblack/images/cod/gv_aus.jpg' alt='ohne GameVoice' title='ohne Gamevoice' border='0' />"),
	'PUNKBUSTER'			=> ($punkbuster == 1 ? "<img src='./templates/fiblack/images/cod/pb_an.jpg' alt='mit PunkBuster' title='mit Punkbuster' border='0' />" : "<img src='./templates/fiblack/images/cod/pb_aus.jpg' alt='ohne Punkbuster' title='ohne Punkbuster' border='0' />")
	)
);

$template->pparse('body');
Damit wird im Template der Bereich zwischen <!-- BEGIN server_online --> und <!-- END server_online --> bestens agezeigt. Im Original wird folgender Code zur Anzeige benutzt, wenn der Gameserver Offline ist:

Code: Alles auswählen

// Server offline:
if (!$max_clients) {
?>

<table align="center" >
<tr>
    <td><font size="2"><font color="#DADADA"><center><br><br> IP : <?=$serverip?> : <?=$server_port?> <br></font></font><br>
    <img src="<?=$img_offline?>" border="0"><br><br><font color="#DADADA">Der Server ist OffLine <br>Es werden keine Daten vom Server empfangen.<br>Bitte überprüfen Sie die richtige Eingabe der IP-Adresse und des Serverports<br>Der Server wird in 60 Sek. neu abgefragt.</font></center></td>
</tr>

</table>
<?
exit;
}
//Ausgabe:
?>
Dieser Bereich folgt direkt hinter diesem Code:

Code: Alles auswählen

			}
		@usort($playerlist, "cmp");
		$players = count($playerlist) - 1;
	}

	for ($i = 0; $i != (count($playerlist) -1); $i++)
		{
			$template->assign_block_vars('spieler', array(
				'PLAYER'		=> farben(str_replace("\"", "", $playerlist[$i]['player'])),
				'PLAYER_SCORE'	=> $playerlist[$i]['score'],
				'PLAYER_PING'	=> $playerlist[$i]['ping']));
		}
Also dachte ich es dem gleich zu tun und folgenden Code:

Code: Alles auswählen

// Server nicht erreichbar :
if (!$max_clients)
	{
		$template->assign_block_vars('server_offline', array());
			{
				$template->assign_block_vars('offline', array(
					'SERVER_IP'		=> $serverip,
					'SERVER_PORT'	=> $server_port,
					'L_OFFLINE'		=> $lang["offline"],
					'IMG_OFFLINE'	=> $img_offline
				));
			}
	}
hiervor zu setzen:

[/code]$template->pparse('body');[/code]

Das funktioniert jedoch nicht. Es gibt diese PHP Fehlermeldungen:
[15-Feb-2008 07:42:46] PHP Fatal error: Allowed memory size of 314572800 bytes exhausted (tried to allocate 312 bytes) in ...\call_of_duty_stat.php on line 191
Das ist dies hier Zeile 4 und ganz oben die Zeile 39:

Code: Alles auswählen

	for ($i = 0; $i != (count($playerlist) -1); $i++)
		{
			$template->assign_block_vars('spieler', array(
				'PLAYER'		=> farben(str_replace("\"", "", $playerlist[$i]['player'])),
				'PLAYER_SCORE'	=> $playerlist[$i]['score'],
				'PLAYER_PING'	=> $playerlist[$i]['ping']));
		}
Was läuft da nun wieder falsch?

Anbei mal das vollständige Script.

Verfasst: Fr 15.Feb, 2008 14:44
von oxpus
:eek: :eek: :eek: :eek: :eek: :eek: :eek:

Du hast 300 MB an PHP-Speicher und das reicht hierfür nicht aus?????????

Das muss ich mir mal später anschauen.....

Verfasst: Fr 15.Feb, 2008 15:08
von cback
Ich hab ne vermutung beim kurz drübergucken:

Code: Alles auswählen

	for ($i = 0; $i != (count($playerlist) -1); $i++)
		{
			$template->assign_block_vars('spieler', array(
				'PLAYER'		=> farben(str_replace("\"", "", $playerlist[$i]['player'])),
				'PLAYER_SCORE'	=> $playerlist[$i]['score'],
				'PLAYER_PING'	=> $playerlist[$i]['ping']));
		}
ersetze mal probeweise mit

Code: Alles auswählen

	for ($i = 0; $i < count($playerlist); ++$i)
		{
			$template->assign_block_vars('spieler', array(
				'PLAYER'		=> farben(str_replace("\"", "", $playerlist[$i]['player'])),
				'PLAYER_SCORE'	=> $playerlist[$i]['score'],
				'PLAYER_PING'	=> $playerlist[$i]['ping']));
		}
weil Zeile 191 ist ja nur die Templateausgabe, da kann ich mir kaum vorstellen, dass hier das Problem damit auftaucht. Muss also in dem Block davor auftreten und das ist die for Schleife. Ich denke mit Deiner Methode ergibt das bei keinem Spieler online -1 und damit ne fette Endlosschleife.

Gruß,
Chris

Verfasst: Fr 15.Feb, 2008 15:29
von oxpus
Ah, ich Blinze! :wall:
Klar: $i != (count($playerlist) -1); würde die Schleife solange ausführen, wie $i ungleich der Anzahl Werte im Array $playerlist haben. Also theoretisch unendlich und damit falsch.

Die Lösung von Cback ist hier das einzigst richtige, denn dann wird wirklich geprüft, ob eben $i < der Anzahl User ist und dann wird abgebrochen.

Wie kann man auch nur auf eine solche Definition kommen????? Gerade in einer Schleife?


Jedenfalls Danke Cback, ich hätte jetzt vermutlich das gar nicht gesehen. Blind eben. :(

Verfasst: Fr 15.Feb, 2008 17:30
von Dungeonwatcher
Hi! :cool:

[quote="cback";p="84837"]Ich hab ne vermutung beim kurz drübergucken:[/quote]

Jupp, das tut es bestens. THNX

Nur funktioniert leider mein Konstrukt mit <!-- BEGIN server_online --> und <!-- END server_online --> bzw. <!-- BEGIN server_offline --> und <!-- END server_offline --> doch nicht so richtig. Es wird nun beides angezeigt... <grrr> ^6

Verfasst: Fr 15.Feb, 2008 19:54
von cback
Np,

mit dem Switch. Was steht in $max_clients für nen Wert drin? Ne Zahl vermute ich oder? Hab jetzt grad nich nachgeschaut. Dann würde ich empfehlen da nen > < vergleich zu machen.

Verfasst: Sa 16.Feb, 2008 15:31
von Dungeonwatcher
Hi! :cool:

[quote="cback";p="84841"]mit dem Switch. Was steht in $max_clients für nen Wert drin? Ne Zahl vermute ich oder?[/quote]

Jupp, da steht nun eine -1.
Dann würde ich empfehlen da nen > < vergleich zu machen.
Hmmm, das will mir mal wieder nicht in die Birne. :wall:

Folgender Code gibt mir immer nur Server ist online aus:

Code: Alles auswählen

$max_clients=0;
switch ($max_clients) {
		case 0: echo "Der Server ist online";
//			$template->assign_block_vars('server_online', array());
//			$template->pparse('body');
			break;
		case -1: echo "Der Server ist offline";
//			$template->assign_block_vars('server_offline', array());
//			$template->pparse('body');
			break;
	}
Ebenso diese Variante:

Code: Alles auswählen

switch(true) {
		case ($max_clients >= 0): echo "Der Server ist online";
//			$template->assign_block_vars('server_online', array());
//			$template->pparse('body');
			break;
		case ($max_clients < 0): echo "Der Server ist offline";
//			$template->assign_block_vars('server_offline', array());
//			$template->pparse('body');
			break;
	}
Wo ist mal wieder mein Denkfehler?

Nachtrag:

Ich hab's hinbekommen. Ich bin halt von der falschen Variable ausgegangen. Das ganze sieht nun so aus:

Code: Alles auswählen

if ($players >= 0)
	{
		$template->assign_block_vars('server_online', array());
		$template->pparse('body');
	}
if ($players < 0)
	{
		$template->assign_block_vars('server_offline', array());
		$template->pparse('body');
	}
Das ist sicher nicht die eleganteste Art, aber es tut was es soll. :)

Verfasst: Sa 16.Feb, 2008 18:28
von cback
Du schießt manchmal mit Kanonen auf Spatzen. :D

Beim ersten das nicht ging geht es z.B. nicht, weil Du die Variable direkt vor dem Switch auf 0 initialisierst. Das heißt sie wird nachfolgend immer null sein und damit geht natürlich der Switch auch immer in case:0;

Und switch ( true ) ähm... naja das lässt einem die Fußnägel spontan nach oben schnerren ;)
In so einem Fall am besten mit if ... else if ... else arbeiten, das ist für einen solchen fall dann besser geeignet, schneller und sieht auch viel seriöser aus. ;) Das nur am Rande als Tipp. :)


Wenns nun mit der Players Methode läuft ist gut. Nur weiß ich noch nicht ganz warum bei $players == 0 der Server schon online ist. Sollte nicht $players > 0 => online und $players <= 0 => Offline (-1 Player wundert mich jetzt auch etwas).


Verwirrt mich jetzt etwas von der Logik her.



Übrigens warum das mit dem !$max_clients undso nicht funktioniert hat: Wenn da kein Boolean, sprich true / false drinsteht, dann sind solche Operationen nicht zuverlässig. Andere Zahlen würden hier immer in false resultieren. Also wie ich sagte in dem Fall ein > >= < <= == != Vergleich wäre wesentlich besser. :)


"Never mix up Vartypes"

Verfasst: Sa 16.Feb, 2008 19:51
von Dungeonwatcher
[quote="cback";p="84853"]Du schießt manchmal mit Kanonen auf Spatzen. :D[/quote]

So bin ich halt... :)
Beim ersten das nicht ging geht es z.B. nicht, weil Du die Variable direkt vor dem Switch auf 0 initialisierst. Das heißt sie wird nachfolgend immer null sein und damit geht natürlich der Switch auch immer in case:0;
Jou, das leuchtet ein.
Und switch ( true ) ähm... naja das lässt einem die Fußnägel spontan nach oben schnerren ;) In so einem Fall am besten mit if ... else if ... else arbeiten, das ist für einen solchen fall dann besser geeignet, schneller und sieht auch viel seriöser aus. ;) Das nur am Rande als Tipp. :)
Nunja, mir fiel einfach nichts besseres ein.
Wenns nun mit der Players Methode läuft ist gut. Nur weiß ich noch nicht ganz warum bei $players == 0 der Server schon online ist. Sollte nicht $players > 0 => online und $players <= 0 => Offline (-1 Player wundert mich jetzt auch etwas).

Verwirrt mich jetzt etwas von der Logik her.
Wenn kein Player eingeloggt ist, dann sind halt >= 0 Player online, denn der Server ist ja online. -1 Player dürfte hierher kommen:

Code: Alles auswählen

@usort($playerlist, "cmp");
$players = count($playerlist) - 1;
Übrigens warum das mit dem !$max_clients undso nicht funktioniert hat: Wenn da kein Boolean, sprich true / false drinsteht, dann sind solche Operationen nicht zuverlässig. Andere Zahlen würden hier immer in false resultieren.
Ahja.
Also wie ich sagte in dem Fall ein > >= < <= == != Vergleich wäre wesentlich besser. :)
Ehrlich gesagt, ich habe nicht die geringste Ahnung was du mir damit sagen willst. :( ¢¦

Verfasst: Sa 16.Feb, 2008 21:15
von cback
[quote="Dungeonwatcher";p="84859"]
Wenn kein Player eingeloggt ist, dann sind halt >= 0 Player online, denn der Server ist ja online. -1 Player dürfte hierher kommen:

Code: Alles auswählen

@usort($playerlist, "cmp");
$players = count($playerlist) - 1;
[/quote]

Achso, ok, da ziehst Du es ab verstehe. :)


[quote="Dungeonwatcher";p="84859"]
Ehrlich gesagt, ich habe nicht die geringste Ahnung was du mir damit sagen willst. :( ¢¦[/quote]

Ich meinte damit die Größenvergleichsoperatoren von PHP:

> größer
< kleiner
>= größer gleich
<= kleiner gleich
== gleich (nicht typenabhängig)
=== gleich (typenvergleich inclusive)
!= ungleich (nicht typenabhängig)
!== ungleich (typenabhängig)


im Falle von Zahlenprüfungen sind die definitiv die bessere Wahl. :)

Verfasst: Sa 16.Feb, 2008 21:30
von oxpus
Also mit "typenabhängig" meint Cback folgende Beispiele:

"true" also eintreffend sind folgende Bedingungen (gegen seien hierzu die Variablen $zahl mit dem Inhalt 2 und $zahl_string mit dem Inhalt '2'):

Code: Alles auswählen

$zahl == 2 -> true
$zahl_string == 2 -> true

$zahl == '2' -> true
$zahl_string == '2' -> true
Da hierbei jeweils der Inhalt und die Bedingung auf eben den Inhalt reduziert werden, sind alle 4 Bedingungen wahr.
Andert schaut es so aus:

Code: Alles auswählen

$zahl === 2 -> true
$zahl_string === 2 -> false

$zahl === '2' -> false
$zahl_string === '2' -> true
Ich denke, so kann man es immer noch am ehesten verstehen.
===, bzw. !== vergleicht eben nicht nur den Inhalt, sondern auch, ob Zahl = Zahl oder String = String ist und gibt dann logischerweise beim Vergleich Zahl zu String ein false zurück, da bereits die vorliegenden Datentypen nicht passen; auch wenn '2' = 2 inhaltlich zunächst das Gleiche sind.

Verfasst: Mo 25.Feb, 2008 14:21
von Dungeonwatcher
Moin große Meister! :cool:

Die letzten Tage hatte mich mein Dienstherr etwas in Beschlag genommen, daher erst jetzt meine Reaktion.

Um ehrlich zu sein ich habe echt Null Plan was ihr mir versucht zu erklären. :wall:

Mit dieser Holzhammermethode:

Code: Alles auswählen

if ($players >= 0)
	{
		$template->assign_block_vars('server_online', array());
		$template->pparse('body');
	}
if ($players < 0)
	{
		$template->assign_block_vars('server_offline', array());
		$template->pparse('body');
	}
tut es ja funktionieren. Andererseits würde ich schon gerne saubereren Code fabrizieren.

Aktuell steht genau dieses Problem der Online <-> Offline Anzeige wieder an, nämlich im Portal. Da funktioniert diese Holzhammermethode nämlich nicht. ^6

Nachtrag:

Was haltet ihr hiervon:

Code: Alles auswählen

if ($players >= 0)
	{
		$template->assign_block_vars('server_online', array());
	}
if ($players < 0)
	{
		$template->assign_block_vars('server_offline', array());
	}
Das funktioniert auch im Portal.

Verfasst: Mo 25.Feb, 2008 18:21
von oxpus
Sieht doch sauber aus...

Verfasst: Mo 25.Feb, 2008 21:57
von Dungeonwatcher
Hi! :cool:

Wenn du das sagst, wird es stimmen. :)

Mittels

Code: Alles auswählen

if ($players >= 0)
	{
		$template->assign_block_vars('server_online', array());
		$template->assign_block_vars('server_online.spieler', array());
	}
if ( $userdata['session_logged_in'] )
	{
		$template->assign_block_vars('server_online.switch_user_logged_in', array());
	}
if ($players < 0)
	{
		$template->assign_block_vars('server_offline', array());
	}
funktioniert auch das verschachteln von:

<!-- BEGIN server_online -->
<!-- BEGIN switch_user_logged_in -->
<!-- END server_online -->
<!-- BEGIN spieler -->
<!-- END spieler -->
<!-- END switch_user_logged_in -->

Allerdings wird hierdurch der Switch <!-- BEGIN spieler --><!-- END spieler --> beeinträchtigt:

Code: Alles auswählen

	for ($i = 0; $i < count($playerlist); ++$i)
		{
		$template->assign_block_vars('spieler', array(
			'PLAYER'		=> farben(str_replace("\"", "", $playerlist[$i]['player'])),
			'PLAYER_SCORE'	=> $playerlist[$i]['score'],
			'PLAYER_PING'	=> $playerlist[$i]['ping']
			));
		}
Es wird nun nur noch der zuerst eingeloggte Spieler angezeigt? ^6

Verfasst: Di 26.Feb, 2008 11:04
von oxpus
Wenn Du einen Switsch erstellst, muss im Template-File für jeden Wert dieser Switch auch angegeben werden.
Also z. B. {spieler.PLAYER}, sonst bleibt das Feld leer.
Auch bei verschachtelten Switches muss man beide Switche im Platzhalter nennen, also z. B. {spieler.test.PLAYER}, wie auch im PHP-Script halt dann angegeben.

Mehr dazu findest Du hier: http://www.oxpus.de/viewtopic.php?t=2642

Verfasst: Di 26.Feb, 2008 20:31
von Dungeonwatcher
'n Abend! :cool:

Ich hab's hinbekommen, auch wenn ich's nicht wirklich verstanden habe. :cool:

THNX

Verfasst: Mi 27.Feb, 2008 12:07
von oxpus
Öhm, freut mich zwar, aber sooo schwer ist es eigentlich nicht.

Du musst Dir die Switche (eigentlich sind es ja Blöcke) hierarchisch vorstellen.

Also

Switch-Klammer
Unterswitch1
Unter-Unterschwitch1
Unterswitch2

Klar jeweils mit BEGIN und END eben.

Das zur grauen Theorie.

Wenn Du nun Daten in diese Switche packen willst, weil man damit eben in 99,9% der Fälle Daten in Tabellenform darstellen will, muss man die in phpBB (PHP selber kennt auch noch andere Wege, sind aber schwieriger zu handhaben!) ineinander verschachteln, also wie die darzustellenden Ebenen halt aufgebaut werden.

Sprich:

Code: Alles auswählen

$template->assign_block_vars('Switch-Klammer', array(...));
Hier kommt alles rein, was eben in der ersten Ebene stehen soll.

Code: Alles auswählen

$template->assign_block_vars('Switch-Klammer.Unterswitch1', array(...));
Hier kommt alles rein, was eben in der zweiten Ebene für den ersten Part stehen soll.

Code: Alles auswählen

$template->assign_block_vars('Switch-Klammer.Unterswitch1.Unter-Unterswitch1', array(...));
Hier kommt alles rein, was eben in der dritten Ebene für den ersten Part stehen soll.

Also im PHP-Script müssen die Switchnamen hintereinander gekettet (durch Punkte getrennt) angegeben werden, sonst kann das Template-System die nicht korrekt zuordnen.

Im Template-File selber wird aber die o. g. Hierarchy auch genau so angeben, wie im Beispiel gezeigt.
In diesem Fall so:

Code: Alles auswählen

<!-- BEGIN Switch-Klammer -->
	<!-- BEGIN Unterswitch1 -->
		<!-- BEGIN Unter-Unterschwitch1 -->
		<!-- END Unter-Unterschwitch1 -->
	<!-- END Unterswitch1 -->
	<!-- BEGIN Unterswitch2 -->
	<!-- END Unterswitch2 -->
<!-- END Switch-Klammer -->
Soweit sind die Switche dann definiert.
Wenn nun in den einzelnen Bereichen dann nun die Platzhalter angegeben werden, so müssen die im Template wieder mit dem vollständigen Switchnamen eingetragen werden. Beispiel für die 3. Ebene:

Code: Alles auswählen

{Switch-Klammer.Unterswitch1.Unter-Unterschwitch1.PLATZHALTER}
Vielleicht ist es so nun etwas deutlicher geworden...

Verfasst: Mi 27.Feb, 2008 14:52
von Dungeonwatcher
Hi großer Meister der PHP Kunst! :cool:

So habe es sogar ich begriffen, gleich ausgedruckt und als Ergänzung in dein PHPBB Buch gepackt. :anbet

Bye

Verfasst: Mi 27.Feb, 2008 15:43
von oxpus
Na wer sagts denn.
Irgendwann kapiert es dann jeder und alles wird gut ;)