From ab03b36b4f0c4b605009393cf97ce98c18fa5654 Mon Sep 17 00:00:00 2001 From: adman Date: Sun, 3 May 2026 16:28:50 +0200 Subject: [PATCH] add bounds checking for ChunkAt and add TimeAt function to ChunkHeader --- cmd/strom/extract_mca/main.go | 52 +++++++++++++++++++++++++++++++++++ cmd/strom/main.go | 6 +++- 2 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 cmd/strom/extract_mca/main.go diff --git a/cmd/strom/extract_mca/main.go b/cmd/strom/extract_mca/main.go new file mode 100644 index 0000000..b7aa82a --- /dev/null +++ b/cmd/strom/extract_mca/main.go @@ -0,0 +1,52 @@ +package extract_mca + +import ( + "flag" + "fmt" + "log/slog" + "os" + + "github.com/admin-else/strom/level/anvil" + "github.com/admin-else/strom/nbt" +) + +var ( + cmd = flag.NewFlagSet("print-nbt", flag.ContinueOnError) + FileFlag = cmd.String("file", "", "The MCA file to extract") + IndexXFlag = cmd.Int("x", 0, "The x chunk coordinate") + IndexZFlag = cmd.Int("z", 0, "The z chunk coordinate") + ToFlag = cmd.String("to", "mca-chunk.nbt", "The output file") +) + +func Run(args []string) (err error) { + err = cmd.Parse(args) + if err != nil { + return + } + if *FileFlag == "" { + return fmt.Errorf("no file specified") + } + f, err := os.Open(*FileFlag) + if err != nil { + return + } + defer f.Close() + mca, err := anvil.ReadChunkHeader(f) + if err != nil { + return + } + t, err := mca.TimeAt(f, int32(*IndexXFlag), int32(*IndexZFlag)) + if err != nil { + return + } + slog.Info("Chunk last written", "time", t) + n, err := mca.ChunkAt(f, int32(*IndexXFlag), int32(*IndexZFlag)) + if err != nil { + return + } + err = nbt.WriteUnstructuredFilePath(*ToFlag, n) + if err != nil { + return + } + return +} diff --git a/cmd/strom/main.go b/cmd/strom/main.go index 2cb73d3..6f9ae38 100644 --- a/cmd/strom/main.go +++ b/cmd/strom/main.go @@ -10,6 +10,7 @@ import ( "slices" "github.com/admin-else/strom/cmd/strom/api" + "github.com/admin-else/strom/cmd/strom/extract_mca" "github.com/admin-else/strom/cmd/strom/offline_uuid" "github.com/admin-else/strom/cmd/strom/packet_inspector" "github.com/admin-else/strom/cmd/strom/print_nbt" @@ -39,10 +40,13 @@ var subcommands = map[string]func(args []string) error{ "packet-spy": packet_inspector.Run, "api": api.Run, "version": Version, + "extract-mca": extract_mca.Run, } func Help(args []string) (err error) { - fmt.Println("Available subcommands", slices.Collect(maps.Keys(subcommands))) + subcommandNames := slices.Collect(maps.Keys(subcommands)) + slices.Sort(subcommandNames) + fmt.Println("Available subcommands", subcommandNames) return }