diff --git a/go.mod b/go.mod index df6b863..490cd7d 100644 --- a/go.mod +++ b/go.mod @@ -32,6 +32,7 @@ require ( github.com/golang/protobuf v1.5.2 // indirect github.com/golang/snappy v0.0.4 // indirect github.com/gorilla/websocket v1.4.0 // indirect + github.com/jinzhu/copier v0.3.5 // indirect github.com/klauspost/compress v1.15.9 // indirect github.com/muhammadmuzzammil1998/jsonc v1.0.0 // indirect github.com/sandertv/go-raknet v1.11.1 // indirect diff --git a/go.sum b/go.sum index fdcc5fc..cd9a9ea 100644 --- a/go.sum +++ b/go.sum @@ -33,6 +33,8 @@ github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/jinzhu/copier v0.3.5 h1:GlvfUwHk62RokgqVNvYsku0TATCF7bAHVwEXoBh3iJg= +github.com/jinzhu/copier v0.3.5/go.mod h1:DfbEm0FYsaqBcKcFuvmOZb218JkPGtvSHsKg8S8hyyg= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/compress v1.15.9 h1:wKRjX6JRtDdrE9qwa4b/Cip7ACOshUI4smpCQanqjSY= github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU= diff --git a/merge.go b/merge.go index 065fca4..0e6e5d0 100644 --- a/merge.go +++ b/merge.go @@ -6,10 +6,12 @@ import ( "flag" "fmt" "os" + "time" "github.com/df-mc/dragonfly/server/world/mcdb" "github.com/df-mc/goleveldb/leveldb/opt" "github.com/google/subcommands" + "github.com/jinzhu/copier" ) type MergeCMD struct { @@ -41,6 +43,7 @@ func (c *MergeCMD) Execute(ctx context.Context, f *flag.FlagSet, _ ...interface{ } for i, world_name := range c.worlds { + first := i == 0 fmt.Printf("Adding %s\n", world_name) s, err := os.Stat(world_name) if errors.Is(err, os.ErrNotExist) { @@ -51,11 +54,27 @@ func (c *MergeCMD) Execute(ctx context.Context, f *flag.FlagSet, _ ...interface{ world_name += "_unpack" unpack_zip(f, s.Size(), world_name) } - err = c.merge_worlds(prov_out, world_name, i == 0) + err = c.merge_worlds(prov_out, world_name, first) if err != nil { fmt.Fprintf(os.Stderr, "%s %s\n", world_name, err) } + if !s.IsDir() { + os.RemoveAll(world_name) + } } + + if err = prov_out.Close(); err != nil { + fmt.Fprintln(os.Stderr, err) + return 1 + } + time.Sleep(1 * time.Second) + + if err := zip_folder(out_name+".mcworld", out_name); err != nil { + fmt.Fprintf(os.Stderr, "zipping: %s\n", err) + return 1 + } + + //os.RemoveAll(out_name) return 0 } @@ -96,13 +115,16 @@ func (c *MergeCMD) merge_worlds(prov_out *mcdb.Provider, folder string, first bo if err := prov_out.SaveEntities(i.P, entities, i.D); err != nil { return err } - - if first { - prov_out.SaveSettings(prov_in.Settings()) - } count += 1 } } + + if first { + fmt.Print("Applying Settings, level.dat\n\n") + prov_out.SaveSettings(prov_in.Settings()) + out_ld := prov_out.LevelDat() + copier.Copy(out_ld, prov_in.LevelDat()) + } fmt.Printf("Added: %d\n", count) return nil } diff --git a/utils.go b/utils.go index 76bb406..b5ad778 100644 --- a/utils.go +++ b/utils.go @@ -10,10 +10,12 @@ import ( "encoding/json" "fmt" "io" + "io/fs" "log" "net" "os" "path" + "path/filepath" "regexp" "strings" "time" @@ -333,3 +335,26 @@ func unpack_zip(r io.ReaderAt, size int64, unpack_folder string) { } } } + +func zip_folder(filename, folder string) error { + f, err := os.Create(filename) + if err != nil { + log.Fatal(err) + } + zw := zip.NewWriter(f) + err = filepath.WalkDir(folder, func(path string, d fs.DirEntry, err error) error { + if !d.Type().IsDir() { + rel := path[len(folder)+1:] + zwf, _ := zw.Create(rel) + data, err := os.ReadFile(path) + if err != nil { + fmt.Println(err) + } + zwf.Write(data) + } + return nil + }) + zw.Close() + f.Close() + return err +} diff --git a/world.go b/world.go index b4f22cc..041c0bd 100644 --- a/world.go +++ b/world.go @@ -1,7 +1,6 @@ package main import ( - "archive/zip" "bytes" "context" "errors" @@ -10,11 +9,9 @@ import ( "hash/crc32" "image" "image/draw" - "io/fs" "log" "os" "path" - "path/filepath" "strconv" "strings" "time" @@ -416,28 +413,10 @@ func (w *WorldState) SaveAndReset() { // zip it filename := folder + ".mcworld" - f, err := os.Create(filename) - if err != nil { - log.Fatal(err) - } - zw := zip.NewWriter(f) - err = filepath.WalkDir(folder, func(path string, d fs.DirEntry, err error) error { - if d.Type().IsRegular() { - rel := path[len(folder)+1:] - zwf, _ := zw.Create(rel) - data, err := os.ReadFile(path) - if err != nil { - fmt.Println(err) - } - zwf.Write(data) - } - return nil - }) - if err != nil { + + if err := zip_folder(filename, folder); err != nil { fmt.Println(err) } - zw.Close() - f.Close() fmt.Printf("Saved: %s\n", filename) os.RemoveAll(folder) w.Reset()