add bounds checking for ChunkAt and add TimeAt function to ChunkHeader

This commit is contained in:
adman
2026-05-03 16:28:50 +02:00
parent da0c3c6f14
commit ab03b36b4f
2 changed files with 57 additions and 1 deletions
+52
View File
@@ -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
}
+5 -1
View File
@@ -10,6 +10,7 @@ import (
"slices" "slices"
"github.com/admin-else/strom/cmd/strom/api" "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/offline_uuid"
"github.com/admin-else/strom/cmd/strom/packet_inspector" "github.com/admin-else/strom/cmd/strom/packet_inspector"
"github.com/admin-else/strom/cmd/strom/print_nbt" "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, "packet-spy": packet_inspector.Run,
"api": api.Run, "api": api.Run,
"version": Version, "version": Version,
"extract-mca": extract_mca.Run,
} }
func Help(args []string) (err error) { 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 return
} }