Hiho
Ich arbeite an einen Updater für unseren Minecraftserver.
Dieser läuft mittlerweile auch ganz gut
Ich wollte jetzt aber noch automatisch unseren Server zur Liste der Server hinzufügen.
Minecraft benutzt das NBT-Format.
Gibt es da schon eine UDF oder Leute die damit schon mal was gemacht haben?
NBT-Format
-
- [ offen ]
-
Kijan -
13. April 2013 um 05:26 -
Geschlossen -
Erledigt
-
-
Also du willst deinen Server in die Servers.dat von dem Minecraft-Client schreiben?
-
-
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.
-
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. -
Hab ich mir alles angeschaut, aber:
[Blockierte Grafik: http://www10.pic-upload.de/13.04.13/rbdrrxewbnq2.png] -
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 malSpoiler anzeigen
[autoit]
[/autoit] [autoit][/autoit] [autoit]
readServer()addServer("test", "test.de")
[/autoit] [autoit][/autoit] [autoit]readServer()
[/autoit] [autoit][/autoit] [autoit]
Func addServer($servername, $serverip, $serverhide = 0, $serveraccept = 0)$serverhide = "0" & $serverhide
[/autoit] [autoit][/autoit] [autoit]
$start = "0A0000090007736572766572730A000000"
$ende = "00"$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$File = StringTrimLeft(FileRead($datei), 2) ; 0x abschneiden
[/autoit] [autoit][/autoit] [autoit]
FileClose($datei)
$serverlist = StringTrimRight(StringTrimLeft($File, StringLen($start)), StringLen($ende))
$anzahlServer = Hex(Dec(StringLeft($serverlist, 2))+1, 2)
$serverlist = StringTrimLeft($serverlist, 2)$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)
[/autoit] [autoit][/autoit] [autoit]
If $datei = -1 Then
MsgBox(0, "Error", "Konnte servers.dat nicht öffnen.")
Exit
EndIfFileWrite($datei,_HexToString($start & $anzahlServer & $serverlist & $serverstring & "0000"))
[/autoit] [autoit][/autoit] [autoit]FileClose($datei)
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
EndFuncFunc readServer()
[/autoit] [autoit][/autoit] [autoit]
$datei = FileOpen(@AppDataDir & "\.minecraft\servers.dat", 16)If $datei = -1 Then
[/autoit] [autoit][/autoit] [autoit]
MsgBox(0, "Error", "Konnte servers.dat nicht öffnen.")
Exit
EndIf$File = StringTrimLeft(FileRead($datei), 2)
[/autoit] [autoit][/autoit] [autoit]$start = "0A0000090007736572766572730A000000"
[/autoit] [autoit][/autoit] [autoit]
$ende = "00"$serverlist = StringTrimRight(StringTrimLeft($File, StringLen($start)), StringLen($ende))
[/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]
$anzahlServer = Dec(StringLeft($serverlist, 2))$array = StringSplit(StringTrimLeft($serverlist, 6), "000100", 1)
[/autoit] [autoit][/autoit] [autoit]
$temp = "Serverliste: " & $anzahlServer & " Server" & @CRLF
For $i = 1 To $array[0]$array[$i] = "0100" & $array[$i]
[/autoit] [autoit][/autoit] [autoit]
$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
EndIfNext
[/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]