improve chunk palette handling and logging; fix biome format and storage comparison logic

This commit is contained in:
adman
2026-05-04 00:27:00 +02:00
parent 3b1b436ecf
commit e5231dfdb6
4 changed files with 41 additions and 5 deletions
+1 -1
View File
@@ -50,7 +50,7 @@ func (c Chunk) ToStorage(version string) (toChunk *level.Chunk, err error) {
toChunk.Sections[i].BlockCount = int16(f.Len) toChunk.Sections[i].BlockCount = int16(f.Len)
} }
} }
f = level.MakeBiomeFormat(version)
for i, s := range c.Sections { for i, s := range c.Sections {
pallete := make([]int32, len(s.Biomes.Palette)) pallete := make([]int32, len(s.Biomes.Palette))
for j, p := range s.Biomes.Palette { for j, p := range s.Biomes.Palette {
+25
View File
@@ -4,6 +4,7 @@ import (
"bytes" "bytes"
"encoding/json" "encoding/json"
"fmt" "fmt"
"log/slog"
"os" "os"
"testing" "testing"
@@ -48,7 +49,14 @@ func TestRegionFile(t *testing.T) {
fmt.Println("Chunk loaded successfully") 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) { func TestConverToPacket(t *testing.T) {
slog.SetLogLoggerLevel(slog.LevelDebug)
f, err := os.Open("./testdata/r.0.0.mca") f, err := os.Open("./testdata/r.0.0.mca")
if err != nil { if err != nil {
t.Errorf("Failed to open file: %v", err) 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)) 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))
}
} }
+13 -2
View File
@@ -4,6 +4,7 @@ import (
"encoding/binary" "encoding/binary"
"errors" "errors"
"io" "io"
"log/slog"
"math" "math"
"github.com/admin-else/strom/data" "github.com/admin-else/strom/data"
@@ -43,7 +44,7 @@ func MakeBlockFormat(version string) StorageFormat {
return StorageFormat{ return StorageFormat{
AvailableBpes: []uint8{0, 4, 5, 6, 7, 8, directBpe}, AvailableBpes: []uint8{0, 4, 5, 6, 7, 8, directBpe},
BiggestDirect: true, BiggestDirect: true,
Len: BiomesPerChunkSection, Len: BlocksPerChunkSection,
} }
} }
@@ -69,7 +70,7 @@ func ReadSectionStorage(r io.Reader, format StorageFormat) (s *Storage, err erro
if err != nil { if err != nil {
return return
} }
if paletteLen <= 0 { if paletteLen < 0 {
err = BadPaletteLenErr err = BadPaletteLenErr
return return
} }
@@ -79,6 +80,16 @@ func ReadSectionStorage(r io.Reader, format StorageFormat) (s *Storage, err erro
if err != nil { if err != nil {
return 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) pallette = append(pallette, v)
} }
} }
+2 -2
View File
@@ -36,8 +36,8 @@ func (r StorageFormat) Import(data []uint64, bpe uint8, palette []int32) (s *Sto
if !slices.Contains(r.AvailableBpes, bpe) { if !slices.Contains(r.AvailableBpes, bpe) {
var newBpe uint8 var newBpe uint8
for _, newBpe = range r.AvailableBpes { for _, newBpe = range r.AvailableBpes {
if bpe < newBpe { if bpe <= newBpe {
continue break
} }
} }
var tmps *Storage var tmps *Storage