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