NBT-Format

  • Also du willst deinen Server in die Servers.dat von dem Minecraft-Client schreiben?

    Da es hier doch einige falsch machen:

    Zitat von einem User dieses Forums

    Die Standard-Standart eines Flamingos ist einbeinig. ;)

  • Die servers.dat hat irgendwie eine komische Kodierung oder sowas... Ich versuch da mal was drüber rauszufinden, wie man das am besten bearbeiten kann.

    Da es hier doch einige falsch machen:

    Zitat von einem User dieses Forums

    Die Standard-Standart eines Flamingos ist einbeinig. ;)

  • Ich versuch da mal was drüber rauszufinden, wie man das am besten bearbeiten kann.


    Das herauszufinden ist ja nicht sonderlich schwer. Hier findet man das Dateiformat, hier den Aufbau der servers.dat. (Das hat Kijan aber auch schon so ähnlich gepostet.)

    Gibt es da schon eine UDF oder Leute die damit schon mal was gemacht haben?


    Laut Google gibt es weder hier bei uns noch im englischen Forum eine UDF (oder überhaupt irgendeinen Post) zu diesem Thema, d.h. du wirst wohl selbst eine schreiben müssen... Wenigstens ist die servers.dat nicht komprimiert, das macht es einfacher.

  • Ich hab es zwar noch nicht zu 100% verstanden, mit dem Verschachteln, aber ich hab etwas Brauchbares zusammengeschustert, womit andere vllt weitermachen können ;)
    mir reicht es erst mal

    Spoiler anzeigen
    [autoit]


    readServer()

    [/autoit] [autoit][/autoit] [autoit]

    addServer("test", "test.de")

    [/autoit] [autoit][/autoit] [autoit]

    readServer()
    Func addServer($servername, $serverip, $serverhide = 0, $serveraccept = 0)

    [/autoit] [autoit][/autoit] [autoit]

    $serverhide = "0" & $serverhide
    $start = "0A0000090007736572766572730A000000"
    $ende = "00"

    [/autoit] [autoit][/autoit] [autoit]

    $datei = FileOpen(@AppDataDir & "\.minecraft\servers.dat", 16)
    If $datei = -1 Then
    MsgBox(0, "Error", "Konnte servers.dat nicht öffnen.")
    Exit
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $File = StringTrimLeft(FileRead($datei), 2) ; 0x abschneiden
    FileClose($datei)
    $serverlist = StringTrimRight(StringTrimLeft($File, StringLen($start)), StringLen($ende))
    $anzahlServer = Hex(Dec(StringLeft($serverlist, 2))+1, 2)
    $serverlist = StringTrimLeft($serverlist, 2)

    [/autoit] [autoit][/autoit] [autoit]

    $serverstring = "01000B6869646541646472657373" & $serverhide & "0800046e616d6500"

    [/autoit] [autoit][/autoit] [autoit]

    If $serveraccept Then $serverstring &= "01000E616363657074546578747572657301"

    [/autoit] [autoit][/autoit] [autoit]

    $serverstring &= Hex(StringLen($servername),2) & _StringToHex($servername) & "080002697000" & Hex(StringLen($serverip),2) & _StringToHex($serverip)

    [/autoit] [autoit][/autoit] [autoit]

    $datei = FileOpen(@AppDataDir & "\.minecraft\servers.dat", 18)
    If $datei = -1 Then
    MsgBox(0, "Error", "Konnte servers.dat nicht öffnen.")
    Exit
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    FileWrite($datei,_HexToString($start & $anzahlServer & $serverlist & $serverstring & "0000"))

    [/autoit] [autoit][/autoit] [autoit]

    FileClose($datei)
    EndFunc

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    Func readServer()
    $datei = FileOpen(@AppDataDir & "\.minecraft\servers.dat", 16)

    [/autoit] [autoit][/autoit] [autoit]

    If $datei = -1 Then
    MsgBox(0, "Error", "Konnte servers.dat nicht öffnen.")
    Exit
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    $File = StringTrimLeft(FileRead($datei), 2)

    [/autoit] [autoit][/autoit] [autoit]

    $start = "0A0000090007736572766572730A000000"
    $ende = "00"

    [/autoit] [autoit][/autoit] [autoit]

    $serverlist = StringTrimRight(StringTrimLeft($File, StringLen($start)), StringLen($ende))
    $anzahlServer = Dec(StringLeft($serverlist, 2))

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $array = StringSplit(StringTrimLeft($serverlist, 6), "000100", 1)
    $temp = "Serverliste: " & $anzahlServer & " Server" & @CRLF
    For $i = 1 To $array[0]

    [/autoit] [autoit][/autoit] [autoit]

    $array[$i] = "0100" & $array[$i]
    $test = ""
    For $u = 1 To StringLen($array[$i]) Step 2
    $byte = StringMid($array[$i], $u, 4)
    If $byte = "0100" Then
    $zeichen = Dec(StringMid($array[$i], $u + 4, 2)) * 2
    $test &= _HexToString(StringMid($array[$i], $u + 6, $zeichen)) & " = "
    $u += 6 + $zeichen
    $test &= StringMid($array[$i], $u, 2) & @CRLF
    EndIf
    If $byte = "0800" Then
    $zeichen = Dec(StringMid($array[$i], $u + 4, 2)) * 2
    $test &= _HexToString(StringMid($array[$i], $u + 6, $zeichen)) & " = "
    $u += 6 + $zeichen
    $zeichen = Dec(StringMid($array[$i], $u + 2, 2)) * 2
    $test &= _HexToString(StringMid($array[$i], $u + 4, $zeichen)) & @CRLF
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Next

    [/autoit] [autoit][/autoit] [autoit]

    $temp &= $test & @CRLF

    [/autoit] [autoit][/autoit] [autoit]

    Next

    [/autoit] [autoit][/autoit] [autoit]

    MsgBox(0, "", $temp)

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    FileClose($datei)

    [/autoit] [autoit][/autoit] [autoit]

    EndFunc ;==>readServer

    [/autoit]