Mittwoch, 7. Juli 2010

Gamespy Query Protokoll 3 oder 4

Im Post zuvor habe ich beschrieben wie ich darauf gekommen bin welches Protokoll Crysis, bzw. Crysis Wars verwendet, um die Serverstatistiken ab zu fragen. Da habe ich dann raus gefunden dass es etwas mit Gamespy zu tun hat. Nur Gamespy selber hat keine Dokumentation zu ihren Protokollen, und das Protokoll Version 1 und 2, die man im Internet finden, werden nicht bei Crytek verwendet. Auf der Unreal Turnament 3 Wiki-Seite stand zwar dass das Protokoll Version 4 sein soll, aber ich habe jetzt häufig genug Anhaltspunkte gefunden dies es teilweise oder sogar vollständig wiederlegen.

Einmal im LGSL-Script sind die Protokolle mit 1, 2 und 3 bezeichnet. Wobei hier die 3 das Protokoll ist, mit dem der Crysis Wars Server abgefragt wird. So würde ich eher sagen dass es sich um Version 3 handelt. Über das UT3 AdminWiki bin ich auf ein Programm namens QStat gekommen. Es wird zwar gesagt dass man zum Abfragen des UT3 Server einfach das Kürzel -gs4 beim Programmstart hinten dran hängen soll, aber wenn man sich den Quelltext etwas genauer anschaut, kommt etwas anderes zu Tage. Hier werden nämlich für die GS4 Abfragen die selben Funtkionen verwendet wie bei einer GS3 Abfrage. Und diese sieht genausp aus wie das beschriebene Protokoll auf der Wiki-Seite und dem mitgesnifften Traffic eines Crysis Wars Spiels. Somit ist für mich noch immer nicht entschieden welches Gamespy Protokoll wirklich verwendet wird und wer nur Mist verzapft. Eine Anfrage bei Gamespy könnte das Problem lösen, aber ich denke nicht dass sie ihre Protokolle der Öffentlichkeit zeigen wollen, damit diese jeder verwenden könnte.

Crysis Wars Serverstats Query mit PHP abfragen

Ich habe mich schon vor einem Jahr mal dafür interessiert die Game-Stats von einem Crysis Wars Server ab zu fragen. Dabei habe ich mich gedacht dass ich einfach mit Wireshark den Traffic anschauen müsste und diesen dann in einem PHP-Script selber senden müsste. Da ist mir dann aber aufgefallen dass ich nicht einfach kopieren kann was bein sniffen gesendet wurde. Irgendwie musste meine Anfrage auf die Antwort des Server stimmen, und dann erst würde ich die Gameliste bekommen. Ingame lief dass ja alles wunderbar, nur ich habe nicht rausgefunden was wann wohin gesendet werden muss.

Kurze Zeit später wurde ich Admin auf dem Obositii.ro Server. So hatte ich Zugang zu einem Rcon Server. Dazu gab es leicht Scripte zu finden, bzw. den Traffic mit zu schneiden und dann daraus ein PHP-Script zu basteln mit dem ich mich auf dem Server einloggen konnte und dann die Playerliste abfragen kann. Hier war nur dass Problem, dass ich meine Zugangsdaten verwenden musste. Wenn also jemand mein Script hacken konnte oder irgendwie an meine Zugangsdaten kam, hätte ich ein Problem. Darum habe ich dass gleich gelassen. Eine bessere Idee wäre es aber gewesen eine Klasse zu schreiben die andere Programmierer verwenden könnte um sich mit PHP auf einem Rcon-Server ein zu loggen. So könnte man all die normalen Serverbefehle über einen Webbrowser erreichen und jederzeit etwas ändern. Es sollte sogar fast möglich sein dass man den Chat Ingame abfängt, in eine Datenbank schreibt und dieses dann wieder auf der Website ausgibt.

Gestern habe ich mich aber doch noch mal ran gesetzt um diese einfache Statistik-Abfrage zu bewältigen. Und DA! - ich habe es geschafft. Zwar habe ich es weniger alleine geschafft, aber mit der Hilfe von anderen Scripts konnte ich verstehen wie was wann gesendet werden muss, damit ich letztendlich eine Playerliste und Serverinfo abfragen konnte.

Angefangen hat alles damit, dass ich auf ein PHP-Script namens LGSL (Live Game Server List) gestoßen bin. Insgesamt bietet diese Paket aktuell die Unterstützung für über 90 Spiele. Das ließ mich zu erst stutzig reagieren. Ich hatte dann nämlich als Idee dass dieses Script auf andere Seiten zugreift, wie Gamespy oder Gametracker, und sich von da die Infos holt. Diese sind aber nicht immer so ganz aktuell und es werden auch häufig nicht alle Server gelistet die man haben will. Aber nachdem ich zwei Stunden lang etwas tiefer gegraben habe, konnte ich dann doch rausfinden dass (auf jedenfall Crysis Wars) die einzelnden Gameserver direkt abgefragt werden. Wenn ich also dieses Script kopieren würde könnte ich mein eigenes daraus basteln und dann selber Server abfragen. Aber da mich noch mehr interessiert hat, was zum Beispiel wirklich gesendet wird, habe ich weiter Nachforschugen angestellt.

So wollte ich wissen ob irgendwo eine Dokumentation zum "Crysis Wars Gameserver Protokoll" vorliegt. Aber gefunden habe ich nicht wirklich etwas. Dann ist mir im Script aufgefallen dass dort etwas von wegen Generic Gamespy Protokoll 1 & 2 & 3 steht. Dazu kam dass das Gamespy Protokoll 3 die selbe Protokollnummer (06) bekam wie Crysis und Crysis Wars. Somit dachte ich also ich hätte mein Ziel gefunden, aber dem war leider nicht so. Über Google konnte ich überhaupt nichts dazu finden. Nur das erste und zweite Gamespy Protokoll konnte ich im Internet finden. Diese waren aber beide anders aufgebaut als das welches ich benötigte. Dann habe ich mich mal etwas doofer mit der Google-Suche angestellt und nur nach "Gamespy Protocol" gesucht. Da die ersten Ergebnisse wieder auf LGSL und diese zwei ersten Protokolle gezeigt haben, bin ich etwas weiter in der Liste runter gegangen. Und siehe da, nach ein paar Forenseiten und anderen Shootergames bin ich auf einem UT3 (Unreal Turnament 3) Wiki auf der richtigen Seite gelandet. Hier wird ein Protokoll beschrieben dass gleich dem ist, was ich im LGSL-Script gefunden habe und wo die Pakete genauso aussehen und aufgebaut sind wie das mitgesniffte von Crysis Wars. In der Beschreibung stand etwas dabei von wegen Gamespy Protokoll v4. Dies werde ich dann im nächsten Post genauer beschreiben.

Aber nach einem langen Tag Arbeit habe ich doch letztendlich mein Ziel erreicht und kann jetzt Server succsessfull querien.