Seite 1 von 1

HL-Server Informationen abfragen

Verfasst: 05.05.2005 12:46
von Lukaso
Hallo,

ich habe nen paar Funktionen für das Abfragen von Informationen eines HL1-Servers gemacht, die für 125ers IRC-Bot programmiert habe. Villeicht kann der eine oder andere es dennoch gebrauchen. Achtung ist nicht für HL2-Server (CSS). Ihr könnt nur HL1 Server damit abfragen incl. Mods. Für HL2-Server werde ich allerdings auch was proggen.

Code: Alles auswählen

; #######################################################################################################################
; #                                                                                                                     #
; #  Author: Lukas 'Lukaso' Niewalda                                                                                    #
; #  Kommentar: Ihr benötigt UDPNetwork Libary von 'PureFan'                                                            #
; #             http://www.purearea.net/pb/download/userlibs/Udpnetwork.zip                                             #
; #                                                                                                                     #                                                                                                                   #
; #######################################################################################################################

Procedure HLServer_Connect(Server.s, Port.l)
  Global HLServer.UDPConnect
  If UDPInitNetwork()
    If UDPConnectServer(Port, Server, HLServer.UDPConnect)
      ProcedureReturn #True
    Else
      ProcedureReturn #False
    EndIf
  Else
    ProcedureReturn #False
  EndIf
EndProcedure

Procedure HLServer_Disconnect()
  UDPCloseConnection(HLServer)
EndProcedure

Procedure HLServer_GetDetails()
  Structure Details
    Address.s
    Name.s
    Map.s
    Directory.s
    Description.s
    Players.b
    Maxplayers.b
    Protocol.b
    Type.s
    OS.s
    Password.b
    Modded.b
    Modwebsite.s
    Moddownload.s
    Modversion.l
    Modsize.l
    Modserverside.b
    Modcustomdll.b
    Secure.b
  EndStructure
  
  Global HLServer_Details.Details
  Command.s = Chr($FF) + Chr($FF) + Chr($FF) + Chr($FF) + "details" + Chr($0)
  UDPSend(HLServer.UDPConnect, @Command, Len(Command))
  *Buffer = AllocateMemory(4096)
  
  UDPWaitUntilReceive(HLServer.UDPConnect, *Buffer, 4096)
  HLServer_Details\Address = PeekS(*Buffer + 5 + Len) : Len + Len(HLServer_Details\Address)
  HLServer_Details\Name = PeekS(*Buffer + 6 + Len) : Len + Len(HLServer_Details\Name)
  HLServer_Details\Map = PeekS(*Buffer + 7 + Len) : Len + Len(HLServer_Details\Map)
  HLServer_Details\Directory = PeekS(*Buffer + 8 + Len) : Len + Len(HLServer_Details\Directory) 
  HLServer_Details\Description = PeekS(*Buffer + 9 + Len) : Len + Len(HLServer_Details\Description)
  HLServer_Details\Players = PeekB(*Buffer + 10 + Len)
  HLServer_Details\Maxplayers = PeekB(*Buffer + 11 + Len)
  HLServer_Details\Protocol = PeekB(*Buffer + 12 + Len)
  HLServer_Details\Type = Chr(PeekB(*Buffer + 13 + Len))
  HLServer_Details\OS = Chr(PeekB(*Buffer + 14 + Len))
  HLServer_Details\Password = PeekB(*Buffer + 15 + Len)
  HLServer_Details\Modded = PeekB(*Buffer + 16 + Len)
  
  If HLServer_Details\Modded = #True
    HLServer_Details\Modwebsite = PeekS(*Buffer + 17 + Len) : Len + Len(HLServer_Details\Modwebsite)
    HLServer_Details\Moddownload = PeekS(*Buffer + 18 + Len) : Len + Len(HLServer_Details\Moddownload)
    HLServer_Details\Modversion = PeekL(*Buffer + 20 + Len) : Len + 4
    HLServer_Details\Modsize = PeekL(*Buffer + 21 + Len) : Len + 4
    HLServer_Details\Modserverside = PeekB(*Buffer + 22 + Len)
    HLServer_Details\Modcustomdll = PeekB(*Buffer + 23 + Len)
    HLServer_Details\Secure = PeekB(*Buffer + 24 + Len)
  Else
    HLServer_Details\Secure = PeekB(*Buffer + 17 + Len)
  EndIf
EndProcedure

Procedure HLServer_GetPlayers() 
  Structure Players
    Id.b
    Name.s
    Score.l
    Time.l
  EndStructure
  
  Global HLServer_Players_Count
  
  Command.s = Chr($FF) + Chr($FF) + Chr($FF) + Chr($FF) + "players" + Chr($0)
  UDPSend(HLServer.UDPConnect, @Command, Len(Command))
  *Buffer = AllocateMemory(10240)
  UDPWaitUntilReceive(HLServer.UDPConnect, *Buffer, 10240)
  
  HLServer_Players_Count = PeekB(*Buffer + 5 + Len)
  Dim HLServer_Players.Players(HLServer_Players_Count - 1)
  
  For Player = 0 To HLServer_Players_Count - 1 
    HLServer_Players(Player)\Id = PeekB(*Buffer + 6 + Len + Player)
    HLServer_Players(Player)\Name = PeekS(*Buffer + 7 + Len + Player) : Len + Len(HLServer_Players(Player)\Name)
    HLServer_Players(Player)\Score = PeekL(*Buffer + 8 + Len + Player) : Len + 4
    HLServer_Players(Player)\Time = Round(PeekF(*Buffer + 8 + Len + Player), 1) : Len + 4
    Len + 1
  Next
EndProcedure

If HLServer_Connect("80.190.246.150", 27016) ;HLServer_Connect("213.202.198.168", 27015) ; Connected zum Server
  HLServer_GetDetails() ; Fragt den Server nach den 'Details' und schreibt diese in 'HLServer_Details'
  HLServer_GetPlayers() ; Speichert Alle Spieler in das 'HLServer_Players' Array
  HLServer_Disconnect() ; Beendet die Verbindung zum Server

  Debug HLServer_Details\Address ; IP-Adresse des Servers
  Debug HLServer_Details\Name ; Name des Servers
  Debug HLServer_Details\Map ; Map die auf dem Server läuft
  Debug HLServer_Details\Directory ; Pfad des Spieles (bei Counter-Strike = cstrike)
  Debug HLServer_Details\Description ; Name des Spieles z.b. Counter-Strike
  Debug HLServer_Details\Players ; Spieler auf dem Server
  Debug HLServer_Details\Maxplayers ; Maximale Anzahl Spieler
  Debug HLServer_Details\Protocol ; Protocol Version
  Debug HLServer_Details\Type ; Typ des Servers (d = Dedicated, l = Listen)
  Debug HLServer_Details\OS ; Betriebssystem (w = Windows, l = Linux)
  Debug HLServer_Details\Password ; Ist der Server Passwortgeschützt?
  Debug HLServer_Details\Modded ; Läuft ein MOD?
  If HLServer_Details\Modded = #True
    Debug HLServer_Details\Modwebsite ; Seite des MODs
    Debug HLServer_Details\Moddownload ; Downloadmöglichkeit des MODs
    Debug HLServer_Details\Modversion ; Die Version des MODs
    Debug HLServer_Details\Modsize ; Größe des MODs
    Debug HLServer_Details\Modserverside ; Serverseitiger MOD
    Debug HLServer_Details\Modcustomdll ; Eigene DLL?
  EndIf
  Debug HLServer_Details\Secure ; Ist der Server im Secure Modus? (Funtzt glaub ich nicht)
  
  SortStructuredArray(HLServer_Players(), 1, OffsetOf(Players\Score), #PB_Sort_Long) ; Sortiert die Liste nach Punkten
  
  For Player = 0 To HLServer_Players_Count - 1 ; Gibt alles aus der Liste aus (HLServer_Players_Count = Global)
    Debug "-------------------------------------"
    Debug HLServer_Players(Player)\Id ; ID des Spielers
    Debug HLServer_Players(Player)\Name ; Nick des Spielers
    Debug HLServer_Players(Player)\Score ; Frags (Punkte) des Spielers
    Debug HLServer_Players(Player)\Time ; Zeit die der Spieler auf dem Server verbracht hat
  Next
EndIf
Viel Spaß :allright:

MFG Lukaso

Verfasst: 05.05.2005 15:11
von SoS
:allright: ich spiele zwar weder HL1 noch HL2 aber gebrauchen kann ich das trotzdem.
Woher bekommt man überhaupt die Infos zum Aufbau der Structuren ?

Verfasst: 05.05.2005 16:41
von Lukaso
SoS hat geschrieben::allright: ich spiele zwar weder HL1 noch HL2 aber gebrauchen kann ich das trotzdem.
Woher bekommt man überhaupt die Infos zum Aufbau der Structuren ?
Die Structure hat damit nix zu tun, die hab ich selba gemacht. Wie das Protocol aufgebaut ist, steht in der HL-SDK.

Auszug:
"players"
Server responds with the following packet:
(int32) -1
(byte) ASCII 'D' (players response, S2A_PLAYER)
(byte) active client count

for each active client
(byte) client number / index
(string) player name
(int32) client's frag total
(float32) client's total time in-game

"details"
(int32) -1
(byte) ASCII 'm' ( S2A_INFO_DETAILED )
(string) net address of server
(string) name of the host / server
(string) name of the map
(string) game directory (i.e. valve/)
(string) Game description (e.g. "half-life multiplay")
(byte) active client count
(byte) maximum clients allowed
(byte) protocol version
(byte) type of server == 'l' for listen or 'd' for dedicated
(byte) os of server == 'w' for win32 or 'l' for linux
(byte) password on server == 1 or yes, 0, for no
(byte) is server running a mod? == 1 for yes, 0 for no

IFF the server is running mod byte was 1:

(string) URL for mod's "info" website
(string) URL for mod's download ftp server
(string) Empty string, unused (used to be HL version)
(int32) mod version #
(int32) mod download size ( in bytes, approx. )
(byte) is the mod a server side only mod? 1 == yes, 0 == no
(byte) does this server require you to have a custom client side .dll ( client.dll )? 1 == yes, 0 == no.

Protocol extension (SDK 2.3), sent whether or not the mod byte is 0 or 1
(byte) server is a secure server == 1 for yes, 0 for no
MFG Lukaso

Verfasst: 12.02.2006 20:40
von Lukaso
Hier nen Update da mich da einige Leute danach fragten:
Nach einem Update wurde das Query Protokoll dem SourceQuery Protokoll angepasst. Jetzt könnt ihr auch Source Server abfragen.

Code: Alles auswählen

; ############################################################################
; #  Author:    Lukas 'Lukaso' Niewalda                                      #
; #  Kommentar: Ihr benötigt UDPNetwork Libary von 'PureFan'                 #
; #             http://www.purearea.net/pb/download/userlibs/Udpnetwork.zip  #
; #  Kontakt:   lukaso@gpfclan.de                                            #
; #             www.gpfclan.de                                               #
; #  Datum:     24. November 2005                                            #
; ############################################################################

;{ Structures

Structure Ping
  Ping.l
  Avarge.l
  Total.l
  Count.l
EndStructure

Structure Details
  IsSource.b
  Address.s
  Name.s
  Map.s
  Directory.s
  Description.s
  Players.b
  Maxplayers.b
  Protocol.b
  Type.s
  OS.s
  Password.b
  Modded.b
  Modwebsite.s
  Moddownload.s
  Modversion.l
  Modsize.l
  Modserverside.b
  Modcustomdll.b
  Secure.b
EndStructure

Structure Players
  Id.b
  Name.s
  Score.l
  Time.l
EndStructure

Structure Rules
  Key.s
  Value.s
EndStructure

;}

;{ Globals

Global HL2Server.UDPConnect

Global HL2Server_IPAddress.s

Global HL2Server_Details.Details

Global HL2Server_Ping.Ping

Global HL2Server_Players_Count.b

Global HL2Server_Rules_Count.w

;}

;{ Procedures

Procedure.b LoByte(Value.b)
  
  ProcedureReturn Value & $F
  
EndProcedure

Procedure.b HiByte(Value.b)
  
  ProcedureReturn (Value >> 4) & $F
  
EndProcedure

Procedure.s LongToBytes(Long.l)
  
  *Memory = AllocateMemory(4)
  PokeL(*Memory, Long)
  
  For Num = 0 To 4
    
    Output$ + PeekS(*Memory + Num, 1)
    
  Next
  
  FreeMemory(*Memory)
  
  ProcedureReturn Output$
  
EndProcedure

Procedure.b HL2Server_InitNetwork()
  
  If UDPInitNetwork()
    
    RetVal = #True
    
  EndIf
  
  ProcedureReturn RetVal
  
EndProcedure

Procedure.b HL2Server_Connect(Server.s, Port.l)
  
  If UDPIsAvailable() <> #False
    
    HL2Server_IPAddress = Server + ":" + Str(Port)
    
    If UDPConnectServer(Port, Server, HL2Server.UDPConnect)
      
      UDPStartCaptureEvents(HL2Server.UDPConnect)
      
      RetVal = #True
    
    EndIf  
      
  EndIf
  
  ProcedureReturn RetVal
  
EndProcedure

Procedure.l HL2Server_Receive()

  Repeat
    
    *PreBuffer = AllocateMemory(1400)
    
    If *PreBuffer
      
      If Start = 0
      
        Start = ElapsedMilliseconds()
      
      EndIf
        
      Repeat
        
        BytesReceived = UDPReceive(HL2Server.UDPConnect, *PreBuffer, 1400)
        Delay(1)
        
      Until BytesReceived > 0 Or (ElapsedMilliseconds() - Start) > 1000
      
      If BytesReceived > 0
        
        Type = PeekL(*PreBuffer)
        
        If Type = -1
         
          FreeMemory(*FinalBuffer)
         
          ProcedureReturn *PreBuffer
        
        ElseIf Type = -2
          
          PacketId = PeekL(*PreBuffer + 4)
          Packet = HiByte(PeekL(*PreBuffer + 8))
          Packets = LoByte(PeekL(*PreBuffer + 8))
          
          If Sucsessful = 0
            
            *FinalBuffer = AllocateMemory(1391 * Packets)
            
          EndIf
          
          CopyMemory(*PreBuffer + 9, *FinalBuffer + (Packet * 1391), 1391) : Sucsessful + 1
          
          FreeMemory(*PreBuffer)
          
          If Sucsessful = Packets
  
            ProcedureReturn *FinalBuffer
          
          Else
            
            Start = ElapsedMilliseconds()
            
          EndIf
          
        EndIf
        
      EndIf
      
      FreeMemory(*PreBuffer)
    
    EndIf  
      
  Until (ElapsedMilliseconds() - Start) > 2000
  
  If *FinalBuffer
    
    FreeMemory(*FinalBuffer)
    
  EndIf
  
  ProcedureReturn #False
  
EndProcedure

Procedure.b HL2Server_Disconnect()
  
  If UDPIsAvailable() <> #False
    
    UDPEndCaptureEvents(HL2Server.UDPConnect)
    UDPCloseConnection(HL2Server)
    
    RetVal = #True
    
  EndIf
  
  ProcedureReturn RetVal
  
EndProcedure

Procedure.l HL2Server_GetChallange()
  
  If UDPIsAvailable() <> #False
    
    Command.s = Chr($FF) + Chr($FF) + Chr($FF) + Chr($FF) + Chr($57) + Chr($0)
    
    Start = ElapsedMilliseconds()
    
    UDPSend(HL2Server.UDPConnect, @Command, Len(Command))
    
    *Buffer = HL2Server_Receive()
    
    If *Buffer
      
      HL2Server_Ping\Ping = ElapsedMilliseconds() - Start
      
      HL2Server_Ping\Total + HL2Server_Ping\Ping
      
      HL2Server_Ping\Count + 1
      
      HL2Server_Ping\Avarge = HL2Server_Ping\Total / HL2Server_Ping\Count
      
      Len + 4
      
      Type = PeekB(*Buffer + Len) : Len + 1
      
      If Type = $41
      
        Challenge = PeekL(*Buffer + Len)
      
      EndIf
    
    EndIf
    
    FreeMemory(*Buffer)
    
  EndIf
  
  ProcedureReturn Challenge
  
EndProcedure

Procedure.b HL2Server_ResetPing()

  HL2Server_Ping\Ping = 0
  
  HL2Server_Ping\Total = 0
  
  HL2Server_Ping\Count = 0
  
  HL2Server_Ping\Avarge = 0
  
  ProcedureReturn #True
  
EndProcedure

Procedure.b HL2Server_GetDetails()
  
  If UDPIsAvailable() <> #False
     
    Command.s = Chr($FF) + Chr($FF) + Chr($FF) + Chr($FF) + Chr($54) + "Source Engine Query" + Chr($0)

    UDPSend(HL2Server.UDPConnect, @Command, Len(Command))
    
    *Buffer = HL2Server_Receive()
    
    If *Buffer
      
      Len + 4
      
      Type = PeekB(*Buffer + Len) : Len + 1
      
      If Type = $6D
        
        HL2Server_Details\IsSource = #False
        
        HL2Server_Details\Address = PeekS(*Buffer + Len) : Len + Len(HL2Server_Details\Address) + 1
        
        If HL2Server_Details\Address <> HL2Server_IPAddress : HL2Server_Details\Address = HL2Server_IPAddress : EndIf
        
        HL2Server_Details\Name = PeekS(*Buffer + Len) : Len + Len(HL2Server_Details\Name) + 1
        HL2Server_Details\Map = PeekS(*Buffer + Len) : Len + Len(HL2Server_Details\Map) + 1
        HL2Server_Details\Directory = PeekS(*Buffer + Len) : Len + Len(HL2Server_Details\Directory) + 1
        HL2Server_Details\Description = PeekS(*Buffer + Len) : Len + Len(HL2Server_Details\Description) + 1
        HL2Server_Details\Players = PeekB(*Buffer + Len) : Len + 1
        HL2Server_Details\Maxplayers = PeekB(*Buffer + Len) : Len + 1
        HL2Server_Details\Protocol = PeekB(*Buffer + Len) : Len + 1
        HL2Server_Details\Type = Chr(PeekB(*Buffer + Len)) : Len + 1
        HL2Server_Details\OS = Chr(PeekB(*Buffer + Len)) : Len + 1
        HL2Server_Details\Password = PeekB(*Buffer + Len) : Len + 1
        HL2Server_Details\Modded = PeekB(*Buffer + Len) : Len + 1
        
        If HL2Server_Details\Modded = #True
          
          HL2Server_Details\Modwebsite = PeekS(*Buffer + Len) : Len + Len(HL2Server_Details\Modwebsite) + 1
          HL2Server_Details\Moddownload = PeekS(*Buffer + Len) : Len + Len(HL2Server_Details\Moddownload) + 1
          
          Unused$  = PeekS(*Buffer + Len) : Len + Len(Unused$) + 1
          
          HL2Server_Details\Modversion = PeekL(*Buffer + Len) : Len + 4
          HL2Server_Details\Modsize = PeekL(*Buffer + Len) : Len + 4
          HL2Server_Details\Modserverside = PeekB(*Buffer + Len) : Len + 1
          HL2Server_Details\Modcustomdll = PeekB(*Buffer + Len) : Len + 1
          
        EndIf
        
        HL2Server_Details\Secure = PeekB(*Buffer + Len)
        
        RetVal = #True
      
      ElseIf Type = $49
        
        HL2Server_Details\IsSource = #True
        
        HL2Server_Details\Address = HL2Server_IPAddress
        
        HL2Server_Details\Protocol = PeekB(*Buffer + Len) : Len + 1
        
        HL2Server_Details\Name = PeekS(*Buffer + Len) : Len + Len(HL2Server_Details\Name) + 1
        HL2Server_Details\Map = PeekS(*Buffer + Len) : Len + Len(HL2Server_Details\Map) + 1
        HL2Server_Details\Directory = PeekS(*Buffer + Len) : Len + Len(HL2Server_Details\Directory) + 1
        HL2Server_Details\Description = PeekS(*Buffer + Len) : Len + Len(HL2Server_Details\Description) + 1
        
        PeekW(*Buffer + Len) : Len + 2 ; Steam Application number (currently always set to 0)
        
        HL2Server_Details\Players = PeekB(*Buffer + Len) : Len + 1
        HL2Server_Details\Maxplayers = PeekB(*Buffer + Len) : Len + 1
        
        PeekB(*Buffer + Len) : Len + 1 ; Number of bot players currently on the server
        
        If PeekB(*Buffer + Len) : Len + 1
          
          HL2Server_Details\Type = "d"
          
        Else
          
          HL2Server_Details\Type = "l"
          
        EndIf

        HL2Server_Details\OS = Chr(PeekB(*Buffer + Len)) : Len + 1
        HL2Server_Details\Password = PeekB(*Buffer + Len) : Len + 1
        HL2Server_Details\Secure = PeekB(*Buffer + Len) : Len + 1
        
        PeekS(*Buffer + Len) : Len + Len(HL2Server_Details\Address) + 1 ; The version of the game
        
        RetVal = #True
        
      EndIf
      
    EndIf
    
    FreeMemory(*Buffer)
    
  EndIf
  
  ProcedureReturn RetVal
  
EndProcedure

Procedure.b HL2Server_GetPlayers(Challange.l)
  
  If UDPIsAvailable() <> #False

    Command.s = Chr($FF) + Chr($FF) + Chr($FF) + Chr($FF) + Chr($55) + LongToBytes(Challange) + Chr($0)
    UDPSend(HL2Server.UDPConnect, @Command, Len(Command))
    
    *Buffer = HL2Server_Receive()
    
    If *Buffer
      
      Len + 4
      
      Type = PeekB(*Buffer + Len) : Len + 1
      
      If Type = $44
      
        HL2Server_Players_Count = PeekB(*Buffer + Len) : Len + 1
      
        If HL2Server_Players_Count > 0
          
          Dim HL2Server_Players.Players(HL2Server_Players_Count - 1)
          
          For Player = 0 To HL2Server_Players_Count - 1

            HL2Server_Players(Player)\Id = PeekB(*Buffer + Len) : Len + 1
            HL2Server_Players(Player)\Name = PeekS(*Buffer + Len) : Len + Len(HL2Server_Players(Player)\Name) + 1
            HL2Server_Players(Player)\Score = PeekL(*Buffer + Len) : Len + 4
            HL2Server_Players(Player)\Time = Round(PeekF(*Buffer + Len), 1) : Len + 4
            
          Next
          
          RetVal = #True
          
        EndIf
      
      EndIf
      
    EndIf
    
    FreeMemory(*Buffer)
    
  EndIf
  
  ProcedureReturn RetVal
  
EndProcedure

Procedure.b HL2Server_GetRules(Challange.l)
  
  If UDPIsAvailable() <> #False
    
    Command.s = Chr($FF) + Chr($FF) + Chr($FF) + Chr($FF) + Chr($56) + LongToBytes(Challange) + Chr($0)
    
    UDPSend(HL2Server.UDPConnect, @Command, Len(Command))

    *Buffer = HL2Server_Receive()
    
    If *Buffer
      
      Len + 4
      
      Type = PeekB(*Buffer + Len) : Len + 1
      
      If Type = $45
        
        HL2Server_Rules_Count = PeekW(*Buffer + Len) : Len + 2
        
        If HL2Server_Rules_Count > 0
          
          Dim HL2Server_Rules.Rules(HL2Server_Rules_Count - 1)
          
          For Rule = 0 To HL2Server_Rules_Count - 1
            
            HL2Server_Rules(Rule)\Key = PeekS(*Buffer + Len) : Len + Len(HL2Server_Rules(Rule)\Key) + 1
            HL2Server_Rules(Rule)\Value = PeekS(*Buffer + Len) : Len + Len(HL2Server_Rules(Rule)\Value) + 1
            
          Next
          
          RetVal = #True
          
        EndIf
    
      EndIf
      
    EndIf
  
    FreeMemory(*Buffer)
    
  EndIf
  
  ProcedureReturn RetVal
  
EndProcedure

Procedure.s HL2Server_GetVariable(Variable.s)
  
  If HL2Server_Rules_Count > 0
  
    For Rule = 0 To HL2Server_Rules_Count - 1
      
      If HL2Server_Rules(Rule)\Key = Variable
        
        ProcedureReturn HL2Server_Rules(Rule)\Value
        
      EndIf
      
    Next
    
    ProcedureReturn ""
    
  Else
    
    ProcedureReturn ""
    
  EndIf  
  
EndProcedure

;}

;{ Testexample

If HL2Server_InitNetwork() AND HL2Server_Connect("gpfclan.de", 27015) ; Connected zum Server
   
  Challange = HL2Server_GetChallange() ; Fragt den Challengewert ab, wird für GetPlayers und GetRules gebraucht
  HL2Server_GetDetails() ; Fragt den Server nach den 'Details' und schreibt diese in 'HL2Server_Details'
  HL2Server_GetPlayers(Challange) ; Speichert Alle Spieler in das 'HL2Server_Players' Array
  HL2Server_GetRules(Challange) ; Speichert Alle Regeln in das 'HL2Server_Rules' Array
  HL2Server_Disconnect() ; Beendet die Verbindung zum Server
  
  Debug HL2Server_Ping\Ping ; Ping zum Server
  Debug HL2Server_Details\IsSource ; Ist Source Server?
  Debug HL2Server_Details\Address ; IP-Adresse des Servers
  Debug HL2Server_Details\Name ; Name des Servers
  Debug HL2Server_Details\Map ; Map die auf dem Server läuft
  Debug HL2Server_Details\Directory ; Pfad des Spieles (bei Counter-Strike = cstrike)
  Debug HL2Server_Details\Description ; Name des Spieles z.b. Counter-Strike
  Debug HL2Server_Details\Players ; Spieler auf dem Server
  Debug HL2Server_Details\Maxplayers ; Maximale Anzahl Spieler
  Debug HL2Server_Details\Protocol ; Protocol Version
  Debug HL2Server_Details\Type ; Typ des Servers (d = Dedicated, l = Listen)
  Debug HL2Server_Details\OS ; Betriebssystem (w = Windows, l = Linux)
  Debug HL2Server_Details\Password ; Ist der Server Passwortgeschützt?
  Debug HL2Server_Details\Modded ; Läuft ein MOD?
  
  If HL2Server_Details\Modded = #True
    
    Debug HL2Server_Details\Modwebsite ; Seite des MODs
    Debug HL2Server_Details\Moddownload ; Downloadmöglichkeit des MODs
    Debug HL2Server_Details\Modversion ; Die Version des MODs
    Debug HL2Server_Details\Modsize ; Größe des MODs
    Debug HL2Server_Details\Modserverside ; Serverseitiger MOD
    Debug HL2Server_Details\Modcustomdll ; Eigene DLL?
    
  EndIf
  
  Debug HL2Server_Details\Secure ; Ist der Server im Secure Modus?
  
  SortStructuredArray(HL2Server_Players(), 1, OffsetOf(Players\Score), #PB_Sort_Long) ; Sortiert die Liste nach Frags
  
  For Player = 0 To HL2Server_Players_Count - 1 ; Gibt alles aus der Liste aus (HL2Server_Players_Count = Global)
    
    Debug "-------------------------------------"
    Debug HL2Server_Players(Player)\Id ; ID des Spielers
    Debug HL2Server_Players(Player)\Name ; Nick des Spielers
    Debug HL2Server_Players(Player)\Score ; Frags (Punkte) des Spielers
    Debug HL2Server_Players(Player)\Time ; Zeit die der Spieler auf dem Server verbracht hat
    
  Next
   
  For Rule = 0 To HL2Server_Rules_Count - 1 ; Gibt alles aus der Liste aus (HL2Server_Rules_Count = Global)
    
    Debug "-------------------------------------"
    Debug HL2Server_Rules(Rule)\Key ; Name der Server Variable
    Debug HL2Server_Rules(Rule)\Value ; Wert der Server Variable
    
  Next
  
EndIf

;}
MFG Lukas