add bounds checking for ChunkAt and add TimeAt function to ChunkHeader
This commit is contained in:
@@ -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
@@ -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
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user