Ich habe es jetzt gelöst bekommen, dass alles ausgelesen wird, auch wenn noch keine Map geladen ist oder keine Spieler vorhanden sind. Problem war ja dass dann "00" ausgegeben wird und sich das Array dann verschiebt. Sicherlich ist es unschön, aber es funktioniert. Für Verbesserungsvorschläge bin ich gerne offen.
Einziges Problem ist jetzt folgendes:
Der Server startet 4 Mal am Tag neu. um 06:00, 12:00, 18:00 und 00:00 Uhr.
Wenn man zu diesen Zeitpunkten den
Query ausführt, hängt sich das Programm auf.
Hier der Code:
Delphi-Quellcode:
procedure TForm4.Button1Click(Sender: TObject);
var
A: TStringList;
udp: TUdpSocket;
x: array[0..25] of byte;
y: array[0..1400] of byte;
i: integer;
buff_delemitted: string;
startbit: integer;
endbitbit: integer;
stringcounter: integer;
begin
memo1.Clear;
udp := TUdpSocket.Create(Self);
udp.RemoteHost:= edit1.Text;
udp.RemotePort:= edit2.Text;
udp.Active:= true;
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;
udp.SendBuf(x,sizeof(x));
udp.ReceiveBuf(y,sizeof(y));
udp.Active := false;
for i := 4 to sizeof(y) - 1 do begin
// Header Lesen
if (i = 3) then
begin
if IntToHex(y[0], 2) + IntToHex(y[0], 1) + IntToHex(y[2], 2) + IntToHex(y[3], 2) = 'FFFFFFFF' then
begin
buff_delemitted := buff_delemitted + 'FFFFFFFF;';
end;
if IntToHex(y[0], 2) + IntToHex(y[0], 1) + IntToHex(y[2], 2) + IntToHex(y[3], 2) = 'FFFFFFFE' then
begin
buff_delemitted := buff_delemitted + 'FFFFFFFE;';
end;
end
// Antwort
else
if (IntToHex(y[i], 2) = '49') then
begin
buff_delemitted := buff_delemitted + IntToHex(y[i], 2) + ';'
end
// Protokoll
else
if i = 5 then
begin
buff_delemitted := buff_delemitted + IntToHex(y[i], 2) + ';'
end
// Strings aufteilen nach 00
else
if (IntToHex(y[i], 2) = '00') then
begin
stringcounter := stringcounter +1;
// Erste 4 Strings aufteilen
if stringcounter < 5 then buff_delemitted := buff_delemitted + IntToHex(y[i], 2) + ';';
// Game ID Player und Max Player -> 0 Player keine Ausgabe "00" und würde Array verschieben
if stringcounter = 5 then
begin
if IntToHex(y[i+2], 2) = '00' then
buff_delemitted := buff_delemitted + IntToHex(y[i], 2)
else
buff_delemitted := buff_delemitted + IntToHex(y[i], 2) + ';';
end;
// Restliche Strings werden korrekt getrennt
if stringcounter > 5 then buff_delemitted := buff_delemitted + IntToHex(y[i], 2) + ';';
end
else
begin
buff_delemitted := buff_delemitted + IntToHex(y[i], 2)
end;
Application.ProcessMessages;
end;
// HEX in Memo anzeigen zur Kontrolle
Memo1.Text := buff_delemitted;
A := TStringList.Create;
try
Split(';', buff_delemitted, A) ;
server_header := HexStrToString(a[0]);
server_protocol := inttostr(hextoint(a[1]));
server_protocol := IntToStr(HexToInt(a[1]));
server_name := HexStrToString(a[2]);
server_map := HexStrToString(a[3]);
server_folder := HexStrToString(a[4]);
server_game := HexStrToString(a[5]);
server_ID := inttostr(hextoint(a[6][3] + a[6][4] + a[6][1] + a[6][2]));
server_players := inttostr(hextoint(a[6][5] + a[6][6]));
server_max_players := inttostr(hextoint(a[6][7] + a[6][8]));
server_bots := inttostr(hextoint(a[6][9] + a[6][10]));
server_type := HexStrToString(a[7][1] + a[7][2]);
server_environment := HexStrToString(a[7][3] + a[7][4]);
server_visibility := inttostr(hextoint(a[7][5] + a[7][6]));
server_VAC := inttostr(hextoint(a[8]));
server_version := inttostr(hextoint(a[11][3] + a[6][4] + a[6][1] + a[6][2]));
server_ExtraDataFlag := '';
server_EDF_port := '';
server_EDF_steamID := '';
server_EDF_keywords := '';
server_EDF_gameID := '';
lblServerHeader.Caption := server_header;
lblServerProtocol.Caption := server_protocol;
lblServerName.Caption := server_name;
lblServerMap.Caption := server_map;
lblServerFolder.Caption := server_folder;
lblServerGame.Caption := server_game;
lblServerID.Caption := server_id;
lblServerPlayers.Caption := server_players;
lblServerMaxPlayers.Caption := server_max_players;
lblServerBots.Caption := server_bots;
lblServerType.Caption := server_type;
lblServerEnvironment.Caption := server_environment;
lblServerVisibility.Caption := server_visibility;
lblServerVAC.Caption := server_VAC;
lblServerVersion.Caption := server_version;
finally
A.Free;
end;
end;
Danke nochmal für die Hilfe bisher an alle die geholfen haben.