diff --git a/loading/load_region.go b/loading/load_region.go new file mode 100644 index 0000000..203faea --- /dev/null +++ b/loading/load_region.go @@ -0,0 +1,71 @@ +package loading + +import ( + "encoding/json" + "fmt" + "log" + "os" + "path/filepath" + + "git.nicholasnovak.io/nnovak/spatial-db/world" + "github.com/Tnze/go-mc/save" + "github.com/Tnze/go-mc/save/region" + "github.com/spf13/cobra" +) + +type SectorPos struct { + x, y int +} + +var outputDir string + +func init() { + LoadRegionFileCommand.Flags().StringVar(&outputDir, "output", ".", "The output directory for the files") +} + +var LoadRegionFileCommand = &cobra.Command{ + Use: "load", + RunE: func(cmd *cobra.Command, args []string) error { + regionFile, err := region.Open(args[0]) + if err != nil { + return err + } + defer regionFile.Close() + + validSectors := []SectorPos{} + + for i := 0; i < 32; i++ { + for j := 0; j < 32; j++ { + if regionFile.ExistSector(i, j) { + validSectors = append(validSectors, SectorPos{i, j}) + } + } + } + + for _, sectorPos := range validSectors { + data, err := regionFile.ReadSector(sectorPos.x, sectorPos.y) + if err != nil { + return err + } + + var chunk save.Chunk + if err := chunk.Load(data); err != nil { + return err + } + + var chunkData world.ChunkData + chunkData.FromMCAChunk(chunk) + + outfile, err := os.OpenFile(filepath.Join(outputDir, fmt.Sprintf("p.%d.%d.chunk", chunkData.Pos.X, chunkData.Pos.Z)), os.O_WRONLY|os.O_CREATE, 0644) + if err != nil { + log.Fatal(err) + } + if err := json.NewEncoder(outfile).Encode(chunkData); err != nil { + log.Fatal(err) + } + outfile.Close() + } + + return nil + }, +}