From e5231dfdb6c7e972ebb9f0799e4f9edcc7f3811b Mon Sep 17 00:00:00 2001 From: adman Date: Mon, 4 May 2026 00:27:00 +0200 Subject: [PATCH] improve chunk palette handling and logging; fix biome format and storage comparison logic --- level/anvil/chunk.go | 2 +- level/anvil/level_test.go | 25 +++++++++++++++++++++++++ level/section.go | 15 +++++++++++++-- level/storage.go | 4 ++-- 4 files changed, 41 insertions(+), 5 deletions(-) diff --git a/level/anvil/chunk.go b/level/anvil/chunk.go index 6c171a3..d958fbe 100644 --- a/level/anvil/chunk.go +++ b/level/anvil/chunk.go @@ -50,7 +50,7 @@ func (c Chunk) ToStorage(version string) (toChunk *level.Chunk, err error) { toChunk.Sections[i].BlockCount = int16(f.Len) } } - + f = level.MakeBiomeFormat(version) for i, s := range c.Sections { pallete := make([]int32, len(s.Biomes.Palette)) for j, p := range s.Biomes.Palette { diff --git a/level/anvil/level_test.go b/level/anvil/level_test.go index dbed822..08244d0 100644 --- a/level/anvil/level_test.go +++ b/level/anvil/level_test.go @@ -4,6 +4,7 @@ import ( "bytes" "encoding/json" "fmt" + "log/slog" "os" "testing" @@ -48,7 +49,14 @@ func TestRegionFile(t *testing.T) { fmt.Println("Chunk loaded successfully") } +func loadPacketToChunk(b []byte) (chunk *level.Chunk, err error) { + buffer := bytes.NewBuffer(b) + chunk, err = level.ReadChunkFromChunkPacketData(buffer, "1.21.11", 384) + return +} + func TestConverToPacket(t *testing.T) { + slog.SetLogLoggerLevel(slog.LevelDebug) f, err := os.Open("./testdata/r.0.0.mca") if err != nil { t.Errorf("Failed to open file: %v", err) @@ -90,4 +98,21 @@ func TestConverToPacket(t *testing.T) { t.Errorf("Chunk data is different: %v", cmp.Diff(a, b)) } + aChunk, err := loadPacketToChunk(a) + if err != nil { + t.Errorf("Failed to load chunk from packet: %v", err) + return + } + + bChunk, err := loadPacketToChunk(b) + if err != nil { + t.Errorf("Failed to load chunk from file: %v", err) + return + } + if !aChunk.Equals(packetChunk) { + t.Errorf("Chunk is different: %v", cmp.Diff(aChunk, packetChunk)) + } + if !bChunk.Equals(aChunk) { + t.Errorf("Chunk is different: %v", cmp.Diff(bChunk, aChunk)) + } } diff --git a/level/section.go b/level/section.go index d4a12aa..097a66c 100644 --- a/level/section.go +++ b/level/section.go @@ -4,6 +4,7 @@ import ( "encoding/binary" "errors" "io" + "log/slog" "math" "github.com/admin-else/strom/data" @@ -43,7 +44,7 @@ func MakeBlockFormat(version string) StorageFormat { return StorageFormat{ AvailableBpes: []uint8{0, 4, 5, 6, 7, 8, directBpe}, BiggestDirect: true, - Len: BiomesPerChunkSection, + Len: BlocksPerChunkSection, } } @@ -69,7 +70,7 @@ func ReadSectionStorage(r io.Reader, format StorageFormat) (s *Storage, err erro if err != nil { return } - if paletteLen <= 0 { + if paletteLen < 0 { err = BadPaletteLenErr return } @@ -79,6 +80,16 @@ func ReadSectionStorage(r io.Reader, format StorageFormat) (s *Storage, err erro if err != nil { return } + if slog.Default().Enabled(nil, slog.LevelDebug) { + b, _ := data.LookupBlockByStateId("1.21.11", v) + if b == nil { + slog.Debug("unknown palette block in chunk packet", "id", v) + } else { + slog.Debug("palette block in chunk packet", "id", v, "name", b.Name) + } + + } + pallette = append(pallette, v) } } diff --git a/level/storage.go b/level/storage.go index a522e43..cf05b3f 100644 --- a/level/storage.go +++ b/level/storage.go @@ -36,8 +36,8 @@ func (r StorageFormat) Import(data []uint64, bpe uint8, palette []int32) (s *Sto if !slices.Contains(r.AvailableBpes, bpe) { var newBpe uint8 for _, newBpe = range r.AvailableBpes { - if bpe < newBpe { - continue + if bpe <= newBpe { + break } } var tmps *Storage