Half-Life 2 Server Qry Script

  • Hi, ich habe neulich das Half-Life Server Qry Script von Sn0opy entdeckt und ich würde gerne das Programm von Half Life 1 auf Half Life 2 umstellen. Ich habe schon einmal probiert mit dem Script die Informationen über einen Left4Dead Server zu bekommen und das hat soweit auch funktioniert, nur das eben die Werte vertauscht wahren und macnhe fehlten. Das heißt ich kann mit dem Script arbeiten, doch ich verstehe irgendwie nicht richtig, wo genau der String ankommt und wie dann die Informationen rausgelesen werden.

    Z.B. immer dieses

    [autoit]

    Do
    $ServerName = $ServerName & StringLeft($Data, 1)
    $Data = StringTrimLeft($Data, 1)
    Until StringLeft($Data, 1) = Chr(0)
    $Data = StringTrimLeft($Data, 1)

    [/autoit]

    Ich hoffe ihr könnt mir helfen, dürfte eig. nicht so schwer sein.
    MfG Oger-Lord

  • Hallo,

    da "wir" nicht wissen welche Daten ankommen, können wir dir auch nicht helfen den String zu zerlegen.

    Wir müssen also 1. wissen - welche Daten ankommen und 2. wie du sie aufbereiten möchtest :!:

    Zudem ist die Anzahl der "Gamer" und den damit verbundenem Interesse hier im Forum sehr gering ...

    Soll heissen, dass die Leute sich hier kein HL2 installieren werden um das Ganze für dich zu testen und umzuschreiben :wacko:

    Zitat

    Laughing Man

    "I thought, what I'd do was, I'd pretend I was one of those deaf-mutes"

  • @oger-lord

    ich habe sowas auch mal für einen hl1 server geschrieben ich werds bei zeiten mal rauskramen

    ctec

    was da ankommt ist ein ganz normaler hex code den man zerlegen muss, man braucht sich das spiel nicht zu installieren denn der server gibt die informationen freiwillig heraus. Man öffnet einfach ein UDP socket und "fragt" ihn nach informationen diese bekommt man als komplettpaket und muss sie erst aufschlüsseln

    Irgendwo gibts ne wiki seite wo man sehen kann welche informationen in welcher reihenfolge kommen.

    Normalerweise war das dort (beim hl1 server) einfach durch ein chr(0) getrennt, also einfach mal versuchen so wie du es dort stehen hast :D

    MFG FireFlyer

    *Paradox ist, wenn man sich im Handumdrehen den Fuss bricht* :D

  • So, hab jetzt eine Funktion geschrieben:

    Spoiler anzeigen

    ;===============================================================================
    ;
    ; Function Name: _getserverinfos()
    ; Description: Get information about a HL2 Server
    ; Parameter(s): $ip - The server IP
    ; $port - The game port
    ; Requirement(s):
    ; Return Value(s): On Success - Array:
    ; $info[0]= Server Name
    ; $info[1]= Map
    ; $info[2]= Game (for example "left4dead")
    ; $info[3]= Difficult
    ; $info[4]= empty/full
    ; $info[5]= Game Version (for example 1.0.0.7)
    ; $info[6]= Ping
    ; On Failure - 0 and sets @ERROR
    ; Author(s): Sn0opy/Oger-Lord
    ;
    ;===============================================================================

    func _getserverinfos($ip,$port)
    Dim $A2S_INFO = _HexToString("FFFFFFFF") & "TSource Engine Query" & _HexToString("00")
    dim $infos[7]
    UDPStartup()
    $socket = UDPOpen($ip,$port)
    UDPSend($socket,$A2S_INFO)
    $incoming = UDPRecv($socket,99999)
    $data = BinaryToString($incoming)


    If $incoming > 0 Then

    If stringleft($data,4) == _HexToString("FFFFFFFF") Then
    $data = StringTrimLeft($data, 6)

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;NAME;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    $infos[0]=""
    Do
    $infos[0] = $infos[0] & StringLeft($Data, 1)
    $Data = StringTrimLeft($Data, 1)
    Until StringLeft($Data, 1) = Chr(0)
    $Data = StringTrimLeft($Data, 1)


    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAP;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    $infos[1]=""
    Do
    $infos[1] = $infos[1] & StringLeft($Data, 1)
    $Data = StringTrimLeft($Data, 1)
    Until StringLeft($Data, 1) = Chr(0)
    $Data = StringTrimLeft($Data, 1)


    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAME;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    $infos[2]=""
    Do
    $infos[2] = $infos[2] & StringLeft($Data, 1)
    $Data = StringTrimLeft($Data, 1)
    Until StringLeft($Data, 1) = Chr(0)
    $Data = StringTrimLeft($Data, 1)
    ;

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;Difficult/Other;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    $infos[3]=""
    Do
    $infos[3] = $infos[3] & StringLeft($Data, 1)
    $Data = StringTrimLeft($Data, 1)
    Until StringLeft($Data, 1) = Chr(0)
    $Data = StringTrimLeft($Data, 1)

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;MÜLL;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    $Name=""
    Do
    $Name = $Name & StringLeft($Data, 1)
    $Data = StringTrimLeft($Data, 1)
    Until StringLeft($Data, 1) = Chr(0)
    $Data = StringTrimLeft($Data, 1)
    ;msgbox(0,"WOMP",$Name)

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;MÜLL;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    $Name=""
    Do
    $Name = $Name & StringLeft($Data, 1)
    $Data = StringTrimLeft($Data, 1)
    Until StringLeft($Data, 1) = Chr(0)
    $Data = StringTrimLeft($Data, 1)
    ;msgbox(0,"WOMP",$Name)


    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;L4D Version;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    $infos[4]=""
    Do
    $infos[4] = $infos[4] & StringLeft($Data, 1)
    $Data = StringTrimLeft($Data, 1)
    Until StringLeft($Data, 1) = Chr(0)
    $Data = StringTrimLeft($Data, 1)

    $infos[4] = StringTrimLeft($infos[4], 1)

    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;Empty/Alltalk;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    $infos[5]=""
    Do
    $infos[5] = $infos[5] & StringLeft($Data, 1)
    $Data = StringTrimLeft($Data, 1)
    Until StringLeft($Data, 1) = Chr(0)
    $Data = StringTrimLeft($Data, 1)

    $infos[5] = StringTrimLeft($infos[5], 3)

    if stringinstr($infos[5],"empty") <> 0 Then
    $infos[5]="empty"
    Else
    $infos[5]="full"
    endif

    ; Server anpingen

    If Ping($ip) <> 0 Then
    $infos[6] = Ping($ip)
    Else
    $infos[6] = "Time out"
    EndIf


    return $infos

    Else
    SetError(-1)
    Return 0
    EndIf

    Else
    SetError(-1)
    Return 0
    EndIf
    EndFunc

    Wenn wer Verbesserungen hat immer her damit. Außerdem gibt es das Problem, das eine kleine Chance besteht das ein Error zurück gegeben wird, obowhl der Server existiert, vieleicht sollte ich noch eine kleine Schleife einbauen die es mehrmals probiert.

    Edit: Eine gute Sache währe es auch noch, wenn man die genaue Spielerzahl ermitteln könnte und nicht einfach nur voll oder leer.

    MfG

    Einmal editiert, zuletzt von Oger-Lord (8. Januar 2009 um 20:01)

  • Ich habe es immer noch nicht geschaft, die Spieleranzahl auszulesen. :/
    Bei dem jetzigen Script wird an keiner Stelle die Spieleranzahl empfangen und ich wüsste auch nicht, wonach ich googlen sollte, um mehr Informationen zu bekommen. Ich denke es währe wohl das wichtigste am ganzen Script endlich zu wissen, wie viele Leute auf einem Server spielen. -.-
    (Ob ein Server voll ist oder nicht funktioniert übrigens auch nicht, das war ein irrtum von mir.)