Thema: Delphi Query an Gameserver

Einzelnen Beitrag anzeigen

Flodding

Registriert seit: 26. Dez 2007
Ort: Kiel
121 Beitrge
 
Turbo Delphi fr Win32
 
#1

Query an Gameserver

  Alt 18. Feb 2015, 11:17
Hallo guten Morgen

Ich bastel seit ein paar Tagen an einem Launcher/Joiner fr meinen Gameserver (Arma2 - Dayz).
Dieser kann erkennen ob die richtigen Mods in der richtigern Version vorliegen und kann bei bedarf auch korrupte oder neue Dateien anfordern und Downloaden.

Jetzt mchte ich im Launcher auch noch gerne anzeigen Lassen wie viele Spieler sich aktuell auf dem Server befinden. Eventuell auch die Spielernamen; ist aber nicht so wichtig.
Aktuell regel ich das ber ein PHP-Query-Script, da ich dies als fertige Lsung gefunden habe.

Quelle: https://github.com/xPaw/PHP-Source-Query-Class

Hier ein Link zum bereits konfigurierten Script:
http://last-templers.de/a2epoch/query/query.php

Jedoch mchte ich mit meinem Launcher nicht erst Text aus einer von PHP erstellten Seite auslesen und ihn dann anzeigen. Das kann ja auch direkt geschehen.

Zum Thema Delphi & Query an Source Server habe ich schon einiges gefunden, jedoch stoe ich an einem Punkt an meine Grenzen.
Es gibt ein Beispielprojekt, welches aufzeigt, wie ein Query an einen Source Server gesendet wird und empfangene Daten ausliest.

Quelle: http://www.planet-source-code.com/vb...=2022&lngWId=7

Dies Funktioniert auch ganz gut wenn man den Server und Port angibt.
In meinem Fall wre das IP:5.45.97.44 Port:2301

Wer sich das Projekt nicht erst laden mchte ums selber auszuprobieren... hier die Ausgabe:

Code:
I[L-T-S] Epoch Origins (1.0.5.1/125548)Taviarma2arrowpcDayZ Epoch Origins&#352;&#8222;dw1.63.125548   `7'X@bt,r163,n125548,s7,i1,mf,lf,vf,dt,tcoop,g65545,c2147483647-2147483647,pw,&#352;&#8222;&#382;P&#8230;Nb~PP30#f/D0&#382;B0jCz'P3&#8222;#f/D&#8222;&#382;B&#8222;jCz',جq!8x7P7wqbju<&#8211;q'&#402;Hbu0u&#8222;4kukua~'&#402; &#8221;&#381;/}u&#8364;Uv' &#8221;&#381;`uhtu'; )sP' &#8221;&#381;)soY.Dz'z'JAY<Ba<B;&DX0wh&#8364;
&#338;@"A$Z<+w
&#339;0w$W-w<+wȹw6&#338;P&#338;z'|P&#338;t&#338;muP&#338;(
pP&#732;&#376;Y&#732;&#376;&#338;&#352;0wh&#8364;&#338;P`(&#338;0wЪ8+w&#8220;ɹw&#338;&#338;P&#732;&#376;P3'P&#338;&#338;P&#338;(jC5w&#338;(&#352;5w&#732;&#376;&#8364;&#338;&#338;P&#338;&#8222;(qeW0W3wh45w&#338;&#338;*w&#338;&#338;*wx5w8&#338;&#8221;5wɹw&#338;
Das ist auch erstmal ganz okay dass das so ausgegeben wird. Jedoch kann ich keine Ausgabe der aktuellen Anzahl der Spieler bzw. das Maximum der Spieler erkennen. Und ja, der Server war nicht Spielerlos.

Weiterfhrende Informationen sollte ich hier bekommen:

Quelle: https://developer.valvesoftware.com/wiki/Server_queries

Das einzige was ich noch verstehe ist, dass der Header & das Paket von A2S_Info im Delphi Quellcode angegeben wurde. Laut der Informationen auf der Valve Seite sollte doch auch die Anzahl der Spieler mit ausgegeben werden.

Nun gut. ich poste nochmal den Code der das Paket senden und Empfngt:

Delphi-Quellcode:
procedure TForm4.Button1Click(Sender: TObject);
var
x: array[0..25] of byte;
y: array[0..1248] of byte;
i,ctr,r,p: integer;
servername:string;
currentmap:string;
begin
memo1.Clear;
udp1.RemotePort:= edit2.Text;
udp1.RemoteHost:= edit1.Text;
udp1.Active:= true;

// The following bytes represent the query 'TSource Engine Query'
// This can be applicable to HL1 too.

x[0]:= $FF;
x[1]:= $FF;
x[2]:= $FF;
x[3]:= $FF;
x[4]:= $54;
x[5]:= $53;
x[6]:= $6F;
x[7]:= $75;
x[8]:= $72;
x[9]:= $63;
x[10]:= $65;
x[11]:= $20;
x[12]:= $45;
x[13]:= $6E;
x[14]:= $67;
x[15]:= $69;
x[16]:= $6E;
x[17]:= $65;
x[18]:= $20;
x[19]:= $51;
x[20]:= $75;
x[21]:= $65;
x[22]:= $72;
x[23]:= $79;
x[24]:= $00;

udp1.SendBuf(x,sizeof(x));

i:= 0;
ctr:= 0;
r:= 0;
udp1.ReceiveBuf(y,sizeof(y));
  repeat
    begin
      if y[i] = $00 then
        begin
          inc(ctr);
            if ctr = 1 then r:= i;
              if ctr = 2 then
                begin
                  p:= i;
                    servername:= copy(memo1.Text,r+1,(i-r)-1);
                    lblservername.Caption:= servername;
                end;
              if ctr = 3 then
                begin
                    currentmap:= copy(memo1.Text,p,(i-p)-1);
                    lblcurrentmap.Caption:= currentmap;
                end;
        end;
      memo1.Text:= memo1.Text + chr(y[i]);
      inc(i);
    end;
  until i = 1248;
end;
Beim Kompilieren kommt bei mir die Meldung:
Die Methode udp1Receive, auf die udp1.OnReceive verweist, enthlt eine inkompatible Parameterliste. Soll der Verweis entfernt werden?

Dort kann NEIN geklickt werden und das Programm tut, was es soll.

Andere Quellen verwiesen auch auf die INDY9/10 Komponenten die man verwenden kann.

Ich bin verwirrt wie ich weiter machen kann und wrde mich sehr freuen wenn sich ein kundiger der Materie hier melden wrde um mir zu helfen.

Danke im Voraus.

Florian
Flo

Gendert von Flodding (18. Feb 2015 um 11:28 Uhr)
  Mit Zitat antworten Zitat