From 56ac765b1dd126f2b7f598ce17d50b02f00970fb Mon Sep 17 00:00:00 2001 From: olebeck <31539311+olebeck@users.noreply.github.com> Date: Tue, 24 Jan 2023 12:50:27 +0100 Subject: [PATCH] fixing behavior pack textures --- .gitattributes | 2 +- Makefile | 5 +-- overlay.json | 2 +- subcommands/world/world.go | 68 +++++++++++++++++++------------ utils/behaviourpack/bp.go | 21 +++++++--- utils/dummy | 1 + utils/proxy.go | 11 ++--- utils/resourcepack-ace.go | Bin 0 -> 6218 bytes utils/resourcepack-ace.go.ignore | Bin 6900 -> 0 bytes utils/resourcepack.go | 65 ++++++++++++++++++++++++++++- 10 files changed, 134 insertions(+), 41 deletions(-) create mode 100644 utils/dummy create mode 100644 utils/resourcepack-ace.go delete mode 100644 utils/resourcepack-ace.go.ignore diff --git a/.gitattributes b/.gitattributes index 891d241..4754b74 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1 +1 @@ -utils/resourcepack-ace.go.ignore filter=git-crypt diff=git-crypt \ No newline at end of file +utils/resourcepack-ace.go filter=git-crypt diff=git-crypt \ No newline at end of file diff --git a/Makefile b/Makefile index 3c2b3fa..2ed334a 100644 --- a/Makefile +++ b/Makefile @@ -8,12 +8,12 @@ GC = go build -ldflags "-s -w -X github.com/bedrock-tool/bedrocktool/utils.Versi # check if packs are supported HAVE_PACKS = false -ifeq ($(shell head -c 7 ./utils/resourcepack-ace.go.ignore),package) +ifeq ($(shell head -c 7 ./utils/resourcepack-ace.go),package) HAVE_PACKS = true endif $(info pack support: ${HAVE_PACKS}) -ifeq ($(HAVE_PACKS),true) +ifneq ($(HAVE_PACKS),true) GC += -overlay overlay.json endif @@ -46,7 +46,6 @@ $(DISTS): dist builds $(SRCS) GOOS=$(OS) GOARCH=$(ARCH) $(GC) -o $(BUILD) ./cmd/bedrocktool cp $(BUILD) $@ - UPDATES=$(BUILDS) $(UPDATES): OS = $(word 1,$(subst _, ,$@)) $(UPDATES): ARCH = $(word 1,$(subst ., ,$(word 2,$(subst _, ,$@)))) diff --git a/overlay.json b/overlay.json index 059ff91..c139207 100644 --- a/overlay.json +++ b/overlay.json @@ -1,5 +1,5 @@ { "Replace": { - "utils/resourcepack.go": "utils/resourcepack-ace.go.ignore" + "utils/resourcepack-ace.go": "utils/dummy" } } \ No newline at end of file diff --git a/subcommands/world/world.go b/subcommands/world/world.go index 8eac5c6..2ec1232 100644 --- a/subcommands/world/world.go +++ b/subcommands/world/world.go @@ -161,6 +161,7 @@ func (c *WorldCMD) Execute(ctx context.Context, f *flag.FlagSet, _ ...interface{ w.ctx = ctx proxy := utils.NewProxy() + proxy.AlwaysGetPacks = true proxy.ConnectCB = w.OnConnect proxy.PacketCB = func(pk packet.Packet, proxy *utils.ProxyContext, toServer bool) (packet.Packet, error) { var forward bool @@ -442,38 +443,55 @@ func (w *WorldState) SaveAndReset() { provider.Close() w.worldCounter += 1 - for k, p := range w.packs { - logrus.Infof(locale.Loc("adding_pack", locale.Strmap{"Name": k})) - pack_folder := path.Join(folder, "resource_packs", k) - os.MkdirAll(pack_folder, 0o755) - data := make([]byte, p.Len()) - p.ReadAt(data, 0) - utils.UnpackZip(bytes.NewReader(data), int64(len(data)), pack_folder) + type dep struct { + PackId string `json:"pack_id"` + Version [3]int `json:"version"` + } + add_packs_json := func(name string, deps []dep) { + f, err := os.Create(path.Join(folder, name)) + if err != nil { + logrus.Error(err) + return + } + defer f.Close() + if err := json.NewEncoder(f).Encode(deps); err != nil { + logrus.Error(err) + return + } + } + + { + var rdeps []dep + for k, p := range w.packs { + logrus.Infof(locale.Loc("adding_pack", locale.Strmap{"Name": k})) + pack_folder := path.Join(folder, "resource_packs", k) + os.MkdirAll(pack_folder, 0o755) + data := make([]byte, p.Len()) + p.ReadAt(data, 0) + utils.UnpackZip(bytes.NewReader(data), int64(len(data)), pack_folder) + rdeps = append(rdeps, dep{ + PackId: p.Manifest().Header.Name, + Version: p.Manifest().Header.Version, + }) + } + add_packs_json("world_resource_packs.json", rdeps) } if w.bp != nil { name := w.ServerName + "_blocks" pack_folder := path.Join(folder, "behavior_packs", name) os.MkdirAll(pack_folder, 0o755) - w.bp.Save(pack_folder) - { // save file saying to load the behavior pack - f, err := os.Create(path.Join(folder, "world_behavior_packs.json")) - if err != nil { - logrus.Error(err) - } else { - defer f.Close() - type dep struct { - PackId string `json:"pack_id"` - Version [3]int `json:"version"` - } - if err := json.NewEncoder(f).Encode([]dep{{ - PackId: w.bp.Manifest.Header.UUID, - Version: w.bp.Manifest.Header.Version, - }}); err != nil { - logrus.Error(err) - } - } + + for _, p := range w.proxy.Server.ResourcePacks() { + p := utils.PackFromBase(p) + w.bp.CheckAddLink(p) } + + w.bp.Save(pack_folder) + add_packs_json("world_behavior_packs.json", []dep{{ + PackId: w.bp.Manifest.Header.UUID, + Version: w.bp.Manifest.Header.Version, + }}) } if w.saveImage { diff --git a/utils/behaviourpack/bp.go b/utils/behaviourpack/bp.go index 36f619c..1774152 100644 --- a/utils/behaviourpack/bp.go +++ b/utils/behaviourpack/bp.go @@ -1,6 +1,7 @@ package behaviourpack import ( + "archive/zip" "bytes" "crypto/sha256" "encoding/json" @@ -8,6 +9,7 @@ import ( "path" "strings" + "github.com/bedrock-tool/bedrocktool/utils" "github.com/google/uuid" "github.com/sandertv/gophertunnel/minecraft/protocol" "github.com/sandertv/gophertunnel/minecraft/resource" @@ -157,11 +159,7 @@ func (bp *BehaviourPack) AddBlock(block protocol.BlockEntry) { } // fix missing * instance if k == "minecraft:material_instances" { - if mats, ok := v["materials"].(map[string]any); ok { - if _, has_star := mats["*"]; !has_star { - mats["*"] = mats["east"] - } - } + comps[k] = v["materials"].(map[string]any) } } } @@ -184,6 +182,19 @@ func (bp *BehaviourPack) AddBlock(block protocol.BlockEntry) { bp.blocks = append(bp.blocks, entry) } +func (bp *BehaviourPack) CheckAddLink(pack utils.Pack) { + z, err := zip.NewReader(pack, int64(pack.Len())) + if err != nil { + logrus.Error(err) + } + _, err = z.Open("blocks.json") + if err != nil { + return + } + h := pack.Manifest().Header + bp.AddDependency(h.UUID, h.Version) +} + func (bp *BehaviourPack) Save(fpath string) error { { // write manifest w, err := os.Create(path.Join(fpath, "manifest.json")) diff --git a/utils/dummy b/utils/dummy new file mode 100644 index 0000000..5b55d23 --- /dev/null +++ b/utils/dummy @@ -0,0 +1 @@ +package utils \ No newline at end of file diff --git a/utils/proxy.go b/utils/proxy.go index 4ee59b3..c89bcb9 100644 --- a/utils/proxy.go +++ b/utils/proxy.go @@ -35,10 +35,11 @@ func (p dummyProto) ConvertFromLatest(pk packet.Packet, _ *minecraft.Conn) []pac } type ProxyContext struct { - Server *minecraft.Conn - Client *minecraft.Conn - Listener *minecraft.Listener - commands map[string]IngameCommand + Server *minecraft.Conn + Client *minecraft.Conn + Listener *minecraft.Listener + commands map[string]IngameCommand + AlwaysGetPacks bool // called for every packet PacketFunc PacketFunc @@ -197,7 +198,7 @@ func (p *ProxyContext) Run(ctx context.Context, server_address string) (err erro p.Client = c.(*minecraft.Conn) cd := p.Client.ClientData() - p.Server, err = ConnectServer(ctx, server_address, &cd, false, p.PacketFunc) + p.Server, err = ConnectServer(ctx, server_address, &cd, p.AlwaysGetPacks, p.PacketFunc) if err != nil { err = fmt.Errorf(locale.Loc("failed_to_connect", locale.Strmap{"Address": server_address, "Err": err})) return diff --git a/utils/resourcepack-ace.go b/utils/resourcepack-ace.go new file mode 100644 index 0000000000000000000000000000000000000000..7030c8ef0f3550db1f5fdacb4c9c5035a8aba52a GIT binary patch literal 6218 zcmV-Q7`5jBM@dveQdv+`0R8Z{f?j=<*J;gwYkiIUy(as}#4`io0Gb#bNB+RZ9`D0y zGczk}!+;km!J)?1@Yekii&308WX#X{}hr=5*}cceo_S< zw#Dg~E;TS-Ha+8Y1(&o=avJA3S7`^P`3I8`%q)6quKA8&!vrxGWMd-bP6+m;An`y1 zunC+@XGxaRaLb&~ov%ToT;Cy6G2%snJinCuxt$9x{SKHm}Vw1nztsfVbq-zuH+^0Q?UH?0hI}p)iD*|)D_P~70 zy2^?3a0oVmY2pKJBQ_~>U)^N`{>)y;*#C9IM_FQVk1|Zfqqz-_2|=0v)944*z~H)G zWbOjp{bRgJEp`e$YZ>d_wr2|fxERPeFLV1 z{8Aq_b0f3Mb4>qGKvF_Amv=BCrZ}1J9yf#_U8yN%#Y@Y_--A>bpZ0w?I76}vb}C-x zi#gN!wOPwn=HmoF>Mba%CV_o}{pIhWh$xD_uOX;Mf(H>)b+*Zl*z07~Z~^)NT(rDj z3)=3%TTNSjI1=}p{{XjqAcvXn0dJdVk4k=n9G3%(XI+r5%y;#0!*JNNRqSPpw5xwS z0@c=iFNS0P^d5n(r5e)jq{g(9lns?Vy7WpV)6;TiH41{1f2_NGqk-pvB0RslERP<` zFj?x7^j$iF+>Lif$NoE6Z$XQ~l$f?ZK5Gz~co-%X!@dIK(;QYNlcM1a(DD!^q3p{Z zA!94I5|duHrzkT$zf5*G#Olj>{nMM3{%uU6tkx=IGZ%=sI@L6<32um+~%HX28`YD#((^%cQcKZN4rTNf<#+}|hIL;sFD35;j#PBfw z7h*jhDu=V4wtUlV) z=w4j}qT>qVyFj7)dpmlP(ASNxDsF^gFWM)z0&Z`y=vNj6W^xKz3ROP#3Uzr|v&5u` zB6hyC{UC>^gl$TnkJR!9bROOgJ?%?ZR%((fFF0hq{`eK4jj#n6pLlV(r?Jh)=hMV1 zv)L@uw#1M^T67x|+|(*5u6p5eCi>6W^^8nz0Jz%4z~^SQsw=I~(%Oa&QK8QnAl0R8 zdBhpz*fLSW4CG+7zDe9g&1OMnWMnHH{yDMsRh7r3e_6u{h4&*_S(Zt&bzinVglkOi zYA^H64@CuFuWLwstO@d>lgYhIAH#UVx=s=##OnRu384xbh1rK~CnaFV8b7US5e81$ z)|R>fr@>@b-_ikj%Q`-Ed^%ko@xH`E42a0AunJCP+y2eXXsXH1Jc84z&giEhuq~^D zoo(i!Dx_5ubEYE9ze9P1|9;S8F^g#TNRrvk^WBW!DP2BAN`ls-bYNfnx_||c6hL^M zf%MWK`wFeD2MFTCVj0mEJ(qUN=Q#mQteG;zj9K~4-JX3UZJJAK(P%H_{Zp2fCz>kSkrr#7@$mRP_38T`<;^ZfTM7W1N z3g9ls!CfQIiT`YGx03CAGc03r-;*Vhmk-GVFGRyJH-WNQ%W+Vt^4ewVBC)s@f>`EZ zYaxNF47NGjmSBBb2_sTN_2fHr{Md9gcIRLivRGh>tQ)iXX9F9|6i~2hf-)KAE@YlK zpHW@wGD_4}p;bu-52F6}j)unT4Q+P1rp2)ylV8&vvLOTEJo}{KvJ9bBO*s#26rVko zCVYQl-~QnqrEB0-&MXn4f|3N;OM+4{1Mm8Jf}o4pyFiI4b_IhC_razO8Yhi9ZQk+? zbMkazDJp|0mP`uXn#M}6ra^I7-G13f8bDlOJ%3M#lm;XfQgX_s&}wLOUg@Dkf!Sd7 z(>(VY4zNw=ZT9Y!mrb+rI7{#AlQ#GHuJ9Tu;k-bdrrGl(>9Z#+`s=+06OHZkP}i(0 zvA)a7*=MWQ`S2VBMxCzD9l{Dvbr&(DY?!u`n9#Jt(RtgHv5+ZE3E$%A{)i(P<{La` z&qX?s1>L!U@uX|wHHuFm8|(VIqb1L0_>0Y9MwM7)LnsgSDx{m|MhQi*bEYK1$B6u^^;0{9oyL4-t1Jcb7!zoA^<* z^E72{yRXQd%L>9RQ82G@3VCu5(RH-tTSNzE)R@5GBzQSpeQ>_AUh68yya#h)CH+=L z(_(1C!o4>h+E)Ax%{>LN`q{k4#lst)a#H^HW{22z{NR4}_@{?#_SIiMq9dy!2y)1V zI{Z?QrSnagW}<7Y5tgT-&whHvN|nC}aSq7v!SlU~SDnp3A0vJZm9v;hdy64KR(8$W zTX$e4%K`7#7h6R!X;uMSd6kwQF&b%rjAHivCTuL0{GmOf^VOSW9NhDc=o696^}WjbYu#$tKVEDXH~h75q(k9ABSni4o$e z117h3U|`RQ@QujRT2f^$PNZjddIi2ZwRyeh2V{&zP9=GJ)n< z4Dh^HVuLAts6+KL$~;zp_gH_O)*=&EFuQPlmtU6$Uq-5z=5^Mk&swUVF$; zA>PDt7J|9JFl#Ix>aMOk8@{p_A8G;1FbP}{6B*f}34(^%g1vi_d9NQc0gtE;E+*?S zL~CBw-@k({(VeO63K79acpLGF{lvoE)MjxK|3DuL3I$VvP$S+eq!lIS6zg27Fby(< zJ#TJ*#}qu``|m5Rw_ct^&ZMCmID#@-T6?ijoDQ>~z%DaEEy)n35edpnNk1>9#SSta z7lTfIJKeTj!HocT6oidBit)(*1s+zD2hmqVSx6Tp^9%(H#SXixwm=#I)g(fDGoa8V zj4!O>MQzImg#m&d(w-J*TDg+^R+ErbbkX%m+7(S;w0eGrONLEKUzv5TZg9X&LCc?c z0ag9xSx#MouRW%jWwO&LoM%)h4r^8S`9{T8(*f&hjdyGUUMGXS`@{t|<`(=64(@2` zQ^kF~Q9(sMk`x*rz@EIV!K>SULgaZ0`!JcFI*v{! z*&gK}2QQa~7vuIYdUcn*3j`?VIgN+F;d@+ z$U~q5LaILOPfd}c*jWxke=(pU@A~6-c5`ni3H5gV=Uz%X(*2{15wc2bxfo5=oM#>R zc~wkXP}CQnvC`@7ar+lr_^fDK^m<|TK6WJ;PH{1T!J%hreP$&Wf&0}?y|aeVw{B9U zA$(;hZFJxx{4=nk1g z@VLHmOb}|m`J%PD%&1a_`#_l0k{)vg4|&?g^4FM)Xu@xfE(}Ck<5xWq3&Dm-bdzWV zO$J8VLwmFn6$A}q$~i0(PxPw(-hn!9rj?PDs-h0c*0d~7X!zygknB?e5#ev|q7Kt7 zVK{-`!p1j6mtyw9=TUPa4yH=$k?*Ec=2k~5KU|9rL2GR^(%rFV=9ix9jI4o|UE$*M z{X&hy6=@#3{C)_tyrI#@6cze!BQPe@8IDrMNE$C;lNRk|-2nIT zk%a{REt@jST}r5s2vJDlV(Xul>(u&dkfu}pKU^KoQ*^)4k9$gR;XLHP}KNLrdYBQtS)Vj0ETzFw31L%nYpKt<|F?VaJ4S}A_;NZ^f62l z+^1{bIKHXHhU1-H8S2##bM4mC*8k0dK;3FWK>UYITK!@;#MDKce8Hu*+~Uj7m;he*(5EYN)7F z?zYF;=`;Qoxf-F#JzZTzYgZ9JWNlRQ*54a1r&@E3v$o*;f4y zOQhoe_SO*TqBrp$YjYVnuy%2P?EZ)yVR?amKQq&pDn>zsfuXU}7n8#X8^rfuHL;Cw zU_+MI?*!B`kFWp)N#L;V%=he{DOr~Ob6?{%-|2S3!OXy%3ofh!SUBG608W;$T4UIe z-!l4oe$Up_LEYa&*bFT|rd6zT*T_92@P@zzxLEG+S4Oi$?WYcbi0WKuLqMFH(HdARD)io3p<&8$2lcIf$Y}LGGbw=YM8uoU z&(BGXsmv64rk;A!->VkmACp~Suv$E%&UHUtX$(L)UsKC4VPgp$pIfsPXyoFc$D`o> zU;A=%dao~WMOb+M#xErtmaVrsWP5xx3L~U)udau;4}**LHDoW90aNXs={v2;uhYF| znqgNsJQKu}B$3K}7V&!Viq`yzM*lZJUfEemMz~`2+4PJ44Y#$w^XzoN8Ya3g3N+Vk zVXsta(9K2ylttNI{spA4I)isb&Tr48+oPR+X+jCtz|$ni#BIgc{snc?ers%w8?rfZ zZS!=qD-u1oP*viX$dcWrpRC^PMkrM(;8kds&NFGWUmM&pKVRyNz*T1XRTG1CPnO|` zY?@X^m!2HtwaAP>cF)ry2hgl2`2Y?|d#fro7iJl3E9QsQ+dsm#<`yyXZh;d0Ui)RS^1@q9jv3NdIJEiOu}&av z#O({p@S&}=G-D>tPaN44N(CBn>SpMs{rb}CHSNDW!cw_A#-%T)8lr9Kp{JZgt^Y{D z#s@c)`Ks(f>~098-o~dhL7ppZ8K^2Mv~b9RFDpjdyOMKmCCwEX_f#Y-W>e&L6h`&7 z;yN=1Cpxsr1RG-%dOjv$YL z(};gg8AJjw@UT$^I;b zTq%#l@)wuw`jNjhXX5ue`d=QR^EAvaCRsle98dzbb#=;y$Ynw5ELOB5%P#92qlB{7 z8pxvfkCw#r;|VjN2wdC2mb3hF6`{9pJ-8Vd8H+iNZ-M31G?dTe)s7WbaAja7RS!jC zh$-?>b!c1XfHc8-Dg3R^0@fvO<@+RFSK618-hMX$_Fo1D?GM&)d|=X-9w%&n_z3rh zl-mF_B7TeHhIYB&-?J-rn5LnlEc&3x<{eZGo#1o!%mO6i{oD*}zE_M%Z4*4Oq$afv zxM!^Se<0ls=={jdSQp-E>>or?)qH9^?bO(TV%ctx_(0g+$}Pjr1b?d1(KRSP4~70d zb!6xC#MKjE3en?<>$f~fM7oEvRT+fjh8gl=(jRGH8&C12H-BVcK#4uH;@l@$X@ti+z9T04Ql)(HMtEec>x=Sy zw`ntx!aK?y%8HwG7cI0=sY*D5uDxF?eQdQIFq%yw=P{zLJ(j@-oCpo#=W|qi-i>eu z3KR6Ay}Vi!&Wl;Rrh6wOX3-VG-S$Z=i#4cWc{oC%ch>lgpRP{qRApANFq)80rbDoS4iFw zJsaM$MRjO;HiMs#`76DxGoaquer4AS*CJ{t+Sy$1KarWZ$S|P-Q$X}sM^g7ktAQ-wLaOJV#1A+7>ZQ3_b261(1rZ{tO5A!x-Q63=a7?~h zjC$#0PV0G79NA{whe+pbZ< zTvneG002^Z>WHDB0eCWDhGn@gM2yLG+Z}XR34k`-h$y&q{IoF%1ND5ViyQE4A?L!X zlzvXAU-kfae}FDDxuc1MCH7v}aXwlq5L^>?rM6|Qpeu3ixb@}m{gDYve)Zu zpMWtncW}Fzn}DJyV)`q$7k>gb@80z2k$hR7Zk=zHA$bl;^8chtkc)p?jt5tQ6qDe| zJ0#x)j7olyRM=}8ZqrFb0F@_ZBYgxy=)8$W#r$;EvK1o$gWBhmwV`~M+~qdK$5p{uFH^cPDY oon!212Vu4yC_$g|X9@k`?}sk*t)=43zc^pWcSdmlgy=`NyYUzm&j0`b literal 0 HcmV?d00001 diff --git a/utils/resourcepack-ace.go.ignore b/utils/resourcepack-ace.go.ignore deleted file mode 100644 index b0e6165299b37d416342a898d48c78f012b73365..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6900 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 diff --git a/utils/resourcepack.go b/utils/resourcepack.go index 0a54a7a..bae1b06 100644 --- a/utils/resourcepack.go +++ b/utils/resourcepack.go @@ -1,14 +1,77 @@ package utils import ( + "errors" + "io" + "github.com/sandertv/gophertunnel/minecraft" "github.com/sandertv/gophertunnel/minecraft/resource" ) +type Pack interface { + io.ReaderAt + ReadAll() ([]byte, error) + Decrypt() ([]byte, error) + Encrypted() bool + UUID() string + Name() string + Version() string + ContentKey() string + Len() int + Manifest() resource.Manifest + Base() *resource.Pack +} + +type Packb struct { + *resource.Pack +} + +func (p *Packb) ReadAll() ([]byte, error) { + buf := make([]byte, p.Len()) + off := 0 + for { + n, err := p.ReadAt(buf[off:], int64(off)) + if err != nil { + if err == io.EOF { + break + } + return nil, err + } + off += n + } + return buf, nil +} + +func (p *Packb) Decrypt() ([]byte, error) { + return nil, errors.New("no_decrypt") +} + +func (p *Packb) Base() *resource.Pack { + return p.Pack +} + +var PackFromBase = func(pack *resource.Pack) Pack { + b := &Packb{pack} + return b +} + func GetPacks(server *minecraft.Conn) (packs map[string]*resource.Pack, err error) { packs = make(map[string]*resource.Pack) for _, pack := range server.ResourcePacks() { - packs[pack.Name()] = pack + pack := PackFromBase(pack) + if pack.Encrypted() { + data, err := pack.Decrypt() + if err != nil { + return nil, err + } + pack2, err := resource.FromBytes(data) + if err != nil { + return nil, err + } + packs[pack.Name()] = pack2 + } else { + packs[pack.Name()] = pack.Base() + } } return }