From 4bd9c44f304bf4a69b443fb09a85af71f5961c08 Mon Sep 17 00:00:00 2001 From: Tnze Date: Wed, 31 Jul 2019 20:25:41 +0800 Subject: [PATCH] NBT parser can unmarshal TagCompound as map[string]interface{} now --- README.md | 2 +- nbt/read.go | 8 +++++++- save/playerdata.go | 18 ++++++++++++++++++ .../58f6356e-b30c-4811-8bfc-d72a9ee99e73.dat | Bin 728 -> 991 bytes 4 files changed, 26 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d925c84..81182f9 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ There's some library in Go support you to create your Minecraft client or server - [x] Mojang authenticate - [x] Minecraft network protocol - [x] RCON protocol -- [ ] World container / encoding +- [ ] Saves decoding /encoding bot: - [x] Swing arm diff --git a/nbt/read.go b/nbt/read.go index 9e35c54..a699605 100644 --- a/nbt/read.go +++ b/nbt/read.go @@ -290,6 +290,7 @@ func (d *Decoder) unmarshal(val reflect.Value, tagType byte, tagName string) err } case TagCompound: + var buf map[string]interface{} switch vk := val.Kind(); vk { default: return errors.New("cannot parse TagCompound as " + vk.String()) @@ -315,8 +316,13 @@ func (d *Decoder) unmarshal(val reflect.Value, tagType byte, tagName string) err } } } + case reflect.Map: + if !reflect.TypeOf(buf).AssignableTo(val.Type()) { + return errors.New("cannot parse TagCompound as " + vk.String()) + } + fallthrough case reflect.Interface: - buf := make(map[string]interface{}) + buf = make(map[string]interface{}) for { tt, tn, err := d.readTag() if err != nil { diff --git a/save/playerdata.go b/save/playerdata.go index d84fdb6..fb74103 100644 --- a/save/playerdata.go +++ b/save/playerdata.go @@ -28,6 +28,7 @@ type PlayerData struct { HurtTime int16 Health float32 HurtByTimestamp int32 + PortalCooldown int32 Invulnerable byte SeenCredits byte `nbt:"seenCredits"` @@ -35,6 +36,8 @@ type PlayerData struct { Score int32 AbsorptionAmount float32 + Inventory, EnderItems []Item + XpLevel int32 XpP float32 XpTotal int32 @@ -49,6 +52,7 @@ type PlayerData struct { Base float64 Name string } + Abilities struct { FlySpeed float32 `nbt:"flySpeed"` WalkSpeed float32 `nbt:"warkSpeed"` @@ -58,6 +62,20 @@ type PlayerData struct { MayBuild byte `nbt:"mayBuild"` MayFly byte `nbt:"mayFly"` } `nbt:"abilities"` + + RecipeBook struct { + IsFilteringCraftable byte `nbt:"isFilteringCraftable"` + IsFurnaceFilteringCraftable byte `nbt:"isFurnaceFilteringCraftable"` + IsFurnaceGUIOpen byte `nbt:"isFurnaceGuiOpen"` + IsGUIOpen byte `nbt:"isGuiOpen"` + } `nbt:"recipeBook"` +} + +type Item struct { + Count byte + Slot byte + ID string `nbt:"id"` + Tag map[string]interface{} `nbt:"tag"` } func ReadPlayerData(r io.Reader) (data PlayerData, err error) { diff --git a/save/testdata/playerdata/58f6356e-b30c-4811-8bfc-d72a9ee99e73.dat b/save/testdata/playerdata/58f6356e-b30c-4811-8bfc-d72a9ee99e73.dat index c323fed53b077c4b9fc831d8bac4d1f0574c5510..eac67ead19cca24d86d3a6719c7821500bde2f99 100644 GIT binary patch literal 991 zcmV<510eh#iwFP!000000PR*iZyZG!e%I?g-)`(+$4&$!1xPd?L`51T#NGM)B{{^( zT_P7qr@7tNccYt~SYrR`kX#;DCxG?t|q(3pd$B@i>Wr~yKV z>eg!B%`KXU-d8Iy-(Uu7??N%EF#jP-5mtIAQSI6BEDjsxM zJh+91lK>gxWX}g*-@SW$X3ym*yBcDO(zY_h#w6EZ4h6>CAE^>#546b;}Witjh(rlx!6yceLlAR1rXxo=VW}$pe}%I*rXq5{ttljWN%#q0}IR zg>qsF;~uPWv&n@e*Rr>+*?}#rhOlH+1BoURY(xPo!OH~BwPZ1F<@{!blGZ|QPA6BV zfTxgBL5EFbw(kns6@6ttYmxAuepWyFu&|%C6@}BCM6oT-)mxO6_9$~c$n*t+DAzS6 z+!~TtxuIN`E5(NK`1Z?7!S|nj^yXwf58>_GJI!5W#(whW4{zQ3<(>(kQnp3?*kx?> zK&hm~Y_6H3+r=S@+ObpX*SYrIroi8nTbgp2cs@BG@zM~`(T7mIMWWrlz;*0*pTX-5 zc=WKaQ!tfwf>x|FmV&BI&<$nm{vX%n7mM2~A^3aB6gKWRKR4BnuYFV7s}=I^-?{#< z`}-TcIhfz%8Xx@{fWM#Zl}AS#GC{p#F)glxIS=MrLRqTjIiA3)DVG?#;J=q~Ip~;v zE(WMOU3KI^u+67s17bp#I;GmfKOA^+E`yto|(Pl~Y#Bvka3C(^?%)7;7bC z6)Jm0ZqDK*@AYkG$jjJ`X}xpNzV^Jdb0zJ|r!bUppGiy1U222JA`rr*mZbzG8zstJ zYlVA{ia-nnjAgEz@)0C)4LI(M=P4GD#N{@;U%KsJg->9JTME)_Mm(L2NYoQbO z=}+Pbv|plMIYlR&rAj89jK>3Zgiq`U|HVLzkBnYSrL4Xf+H3zXtq)7Cr`wc|@t+@! NzW{4@DVjP8005R5?EL@$ literal 728 zcmV;}0w?_+iwFP!000000DV+3Zxb;Tej&LucTFLsg{8j$gqUDNBx#zqQcI&Ituip+ zTwYQuKKo?*+U7SfFn6i?A7Frqin*Qn4M+@3Oi1v2mxM;5c)5G__rCXiezpUE0KB?p zTn12zFjAVM0m#F>twh`UxWgkfmPIkpxC233AjWP|1Nacstkt}iSTq5xmx@rRGlSJ< zkd6`*Ua<&ad597<51&TtbPJiVM=(JG%p=#P$dOdxsK>(5J{nE}WQfz8m!HngE^g#J zn6ay4j8NKkjM%@e!qODYG?~2(^>7Z=QOWQ~qA@cGKjz`9Gq|;+xxpefoawDr=D{oT z;Qy*EPq88iN05W^wmeP*O|hOpii0K-qAA8)4yk8%TS{9d)|C={bs`;+2bEgSC>>j_ zWGzyOv~D^8pY^!lmby)>{03_-2gQhu2VzWr0hhG-y@ZQ?&IA91iA?W{tE=lA9T+yQ zr)!im$W(YxqQ4BZb9GH|*=cM{o0t|4G=@CJx>6$_7P7#k#&fXBO_K{tuH|rDvw=;m z`mkhG9f>9uY)l)Lfhz<~v}7S}CVVeONpn6oe}lCd;2)%Pp#26id*lwZJM_hF+{TPN z4-4J6qi8#`=x$n9Z&Ft}tEK*_y8)6P`dC@{3xckFGUY*x{y`#?8d>G7oClB4VJa5Q