Re: Wie Java-Float lesen?
Verfasst: 19.06.2013 14:34
Unter Doubles verstehe ich Floatvariablen mit höhere Genauigkeit bzw. grosse Zahlen verbunden mit Genauigkeit im Nachkommastellenbereich. Da ist doch soweit richtig, oder? Jedenfalls möchte ich in Minecraft die Spielerposition aus der Player.dat auslesen. Laut Minecraft-Wiki wird die Position mit Doubles im BigEndian Format gespeichert. Wenn ich die Position des Spielers in Minecraft mit meinen ausgelelesen Werten vergleiche so stimmen sie auch, bis auf die Nachkommastellen, überein. Hier ist der Code dazu, das macht es einfacher:
Hier die Spielerpositon im Spiel:

Code+Player.dat
https://dl.dropboxusercontent.com/u/791 ... xport1.zip
Wie gesagt sind die Spielerdaten laut Minecraft-Wiki http://de.minecraftwiki.net/wiki/Player.dat_Format als Doubles gespeichert, vielleicht handelt es sich aber doch nur um normale Floats. Muss ich gleich mal testen.
Darie
Code: Alles auswählen
; Procedure BSWAP32(value.l)
; !mov eax, dword [p.v_value]
; !bswap eax
; ProcedureReturn
; EndProcedure
;
; Procedure BSWAP64(value.i)
; !mov rax, qword [p.v_value]
; !bswap rax
; ProcedureReturn
; EndProcedure
Procedure BSWAP_Double(value.q)
Zahl.q = value.q
Zahl = ((Zahl&$FF)<<56)+((Zahl&$FF00)<<40)+((Zahl&$FF0000)<<24)+((Zahl&$FF000000)<<8)+((Zahl&$FF00000000)>>8)+((Zahl&$FF0000000000)>>24)+((Zahl&$FF000000000000)>>40)+((Zahl>>56)&$FF)
Double.d = PeekD(@Zahl)
ProcedureReturn Double.d
EndProcedure
EnableExplicit
Global World.s = "Alexander"
Global MCPath.s = GetHomeDirectory() + "AppData\Roaming\.minecraft\saves\" + World
Define tagId.b, tagLen.w, tagStr.s
Define PTag.s = "Pos"
Define *Mem1,*Mem2,*Offset
Define PlayerPosX.d
Define PlayerPosY.d
Define PlayerPosZ.d
Define PTag_Length = StringByteLength(PTag)
Define i
Debug ptag_length
ReadFile(0, GetCurrentDirectory()+"player_gunzipped.dat")
Define Lof = Lof(0) : *Mem1 = AllocateMemory(Lof) : ReadData(0,*Mem1,Lof)
CloseFile(0)
For i = 0 To Lof
If PeekS(*Mem1+i,3,#PB_UTF8) = PTag : *Offset = *Mem1+i : Break : EndIf
Next i
Debug PeekS(*Offset,3,#PB_UTF8)
Debug PeekB(*Offset+PTag_Length)
Debug PeekB(*Offset+PTag_Length+4)
PlayerPosX = BSWAP_Double(PeekQ(*Offset+PTag_Length+5))
PlayerPosY = BSWAP_Double(PeekQ(*Offset+PTag_Length+13))
PlayerPosZ = BSWAP_Double(PeekQ(*Offset+PTag_Length+21))
Debug PlayerPosX
Debug PlayerPosY
Debug PlayerPosZ

Code+Player.dat
https://dl.dropboxusercontent.com/u/791 ... xport1.zip
Wie gesagt sind die Spielerdaten laut Minecraft-Wiki http://de.minecraftwiki.net/wiki/Player.dat_Format als Doubles gespeichert, vielleicht handelt es sich aber doch nur um normale Floats. Muss ich gleich mal testen.
Darie