From c20e017f0de2b6a51666586f9b3733f8238fe94a Mon Sep 17 00:00:00 2001 From: olebeck <31539311+olebeck@users.noreply.github.com> Date: Fri, 7 Apr 2023 17:40:29 +0200 Subject: [PATCH] fix packs with same names causing issues --- handlers/worlds/world.go | 66 ++++++++++++++++++++++++---------------- utils/resourcepack.go | 7 ++--- 2 files changed, 43 insertions(+), 30 deletions(-) diff --git a/handlers/worlds/world.go b/handlers/worlds/world.go index e22fa7c..8b57b2c 100644 --- a/handlers/worlds/world.go +++ b/handlers/worlds/world.go @@ -17,6 +17,7 @@ import ( "github.com/bedrock-tool/bedrocktool/ui/messages" "github.com/bedrock-tool/bedrocktool/utils" "github.com/bedrock-tool/bedrocktool/utils/behaviourpack" + "github.com/flytam/filenamify" "github.com/df-mc/dragonfly/server/block/cube" "github.com/df-mc/dragonfly/server/world" @@ -424,6 +425,26 @@ func (w *worldsHandler) SaveAndReset() { w.serverState.worldCounter += 1 + if w.settings.SaveImage { + f, _ := os.Create(folder + ".png") + png.Encode(f, w.mapUI.ToImage()) + f.Close() + } + + w.AddPacks(folder) + + // zip it + filename := folder + ".mcworld" + if err := utils.ZipFolder(filename, folder); err != nil { + logrus.Error(err) + } + logrus.Info(locale.Loc("saved", locale.Strmap{"Name": filename})) + //os.RemoveAll(folder) + w.Reset(w.CurrentName()) + w.gui.Message(messages.SetUIState(messages.UIStateMain)) +} + +func (w *worldsHandler) AddPacks(folder string) { type dep struct { PackID string `json:"pack_id"` Version [3]int `json:"version"` @@ -470,22 +491,31 @@ func (w *worldsHandler) SaveAndReset() { if err != nil { logrus.Error(err) } else { + packNames := make(map[string]int) + for _, pack := range packs { + packNames[pack.Name()] += 1 + } + var rdeps []dep - for k, p := range packs { - if p.Encrypted() && !p.CanDecrypt() { - logrus.Warnf("Cant add %s, it is encrypted", p.Name()) + for _, pack := range packs { + if pack.Encrypted() && !pack.CanDecrypt() { + logrus.Warnf("Cant add %s, it is encrypted", pack.Name()) continue } - logrus.Infof(locale.Loc("adding_pack", locale.Strmap{"Name": k})) - name := p.Name() - name = strings.ReplaceAll(name, ":", "_") - packFolder := path.Join(folder, "resource_packs", name) + logrus.Infof(locale.Loc("adding_pack", locale.Strmap{"Name": pack.Name()})) + + packName := pack.Name() + if packNames[packName] > 1 { + packName += "_" + pack.UUID() + } + packName, _ = filenamify.FilenamifyV2(packName) + packFolder := path.Join(folder, "resource_packs", packName) os.MkdirAll(packFolder, 0o755) - utils.UnpackZip(p, int64(p.Len()), packFolder) + utils.UnpackZip(pack, int64(pack.Len()), packFolder) rdeps = append(rdeps, dep{ - PackID: p.Manifest().Header.UUID, - Version: p.Manifest().Header.Version, + PackID: pack.Manifest().Header.UUID, + Version: pack.Manifest().Header.Version, }) } if len(rdeps) > 0 { @@ -493,22 +523,6 @@ func (w *worldsHandler) SaveAndReset() { } } } - - if w.settings.SaveImage { - f, _ := os.Create(folder + ".png") - png.Encode(f, w.mapUI.ToImage()) - f.Close() - } - - // zip it - filename := folder + ".mcworld" - if err := utils.ZipFolder(filename, folder); err != nil { - logrus.Error(err) - } - logrus.Info(locale.Loc("saved", locale.Strmap{"Name": filename})) - //os.RemoveAll(folder) - w.Reset(w.CurrentName()) - w.gui.Message(messages.SetUIState(messages.UIStateMain)) } func (w *worldsHandler) OnConnect(err error) bool { diff --git a/utils/resourcepack.go b/utils/resourcepack.go index 98f1101..5028b62 100644 --- a/utils/resourcepack.go +++ b/utils/resourcepack.go @@ -60,8 +60,7 @@ var PackFromBase = func(pack *resource.Pack) Pack { return b } -func GetPacks(server *minecraft.Conn) (packs map[string]Pack, err error) { - packs = make(map[string]Pack) +func GetPacks(server *minecraft.Conn) (packs []Pack, err error) { for _, pack := range server.ResourcePacks() { pack := PackFromBase(pack) if pack.Encrypted() && pack.CanDecrypt() { @@ -73,9 +72,9 @@ func GetPacks(server *minecraft.Conn) (packs map[string]Pack, err error) { if err != nil { return nil, err } - packs[pack.Name()] = &Packb{pack2} + packs = append(packs, &Packb{pack2}) } else { - packs[pack.Name()] = pack + packs = append(packs, pack) } } return