From 9a64bcfac7b167cbc8342ccb4581f0d9738c417d Mon Sep 17 00:00:00 2001 From: Tnze Date: Sat, 4 Feb 2023 00:44:12 +0800 Subject: [PATCH] fix blockCount bug --- level/block/utilfuncs.go | 6 +++++- level/chunk.go | 28 ++++++++++++++++++---------- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/level/block/utilfuncs.go b/level/block/utilfuncs.go index 915dc55..71773f8 100644 --- a/level/block/utilfuncs.go +++ b/level/block/utilfuncs.go @@ -1,7 +1,11 @@ package block func IsAir(s StateID) bool { - switch StateList[s].(type) { + return IsAirBlock(StateList[s]) +} + +func IsAirBlock(b Block) bool { + switch b.(type) { case Air, CaveAir, VoidAir: return true default: diff --git a/level/chunk.go b/level/chunk.go index 6f22984..4dc249d 100644 --- a/level/chunk.go +++ b/level/chunk.go @@ -75,10 +75,11 @@ func ChunkFromSave(c *save.Chunk) (*Chunk, error) { return nil, fmt.Errorf("section Y value %d out of bounds", v.Y) } var err error - sections[i].BlockCount, sections[i].States, err = readStatesPalette(v.BlockStates.Palette, v.BlockStates.Data) + sections[i].States, err = readStatesPalette(v.BlockStates.Palette, v.BlockStates.Data) if err != nil { return nil, err } + sections[i].BlockCount = countNoneAirBlocks(§ions[i]) sections[i].Biomes, err = readBiomesPalette(v.Biomes.Palette, v.Biomes.Data) if err != nil { return nil, err @@ -125,24 +126,21 @@ func ChunkFromSave(c *save.Chunk) (*Chunk, error) { }, nil } -func readStatesPalette(palette []save.BlockState, data []uint64) (blockCount int16, paletteData *PaletteContainer[BlocksState], err error) { +func readStatesPalette(palette []save.BlockState, data []uint64) (paletteData *PaletteContainer[BlocksState], err error) { statePalette := make([]BlocksState, len(palette)) for i, v := range palette { b, ok := block.FromID[v.Name] if !ok { - return 0, nil, fmt.Errorf("unknown block id: %v", v.Name) + return nil, fmt.Errorf("unknown block id: %v", v.Name) } if v.Properties.Data != nil { if err := v.Properties.Unmarshal(&b); err != nil { - return 0, nil, fmt.Errorf("unmarshal block properties fail: %v", err) + return nil, fmt.Errorf("unmarshal block properties fail: %v", err) } } s, ok := block.ToStateID[b] if !ok { - return 0, nil, fmt.Errorf("unknown block: %v", b) - } - if !block.IsAir(s) { - blockCount++ + return nil, fmt.Errorf("unknown block: %v", b) } statePalette[i] = s } @@ -162,6 +160,16 @@ func readBiomesPalette(palette []string, data []uint64) (*PaletteContainer[Biome return NewBiomesPaletteContainerWithData(4*4*4, data, biomesRawPalette), nil } +func countNoneAirBlocks(sec *Section) (blockCount int16) { + for i := 0; i < 16*16*16; i++ { + b := sec.GetBlock(i) + if !block.IsAir(b) { + blockCount++ + } + } + return +} + // ChunkToSave convert level.Chunk to save.Chunk func ChunkToSave(c *Chunk, dst *save.Chunk) (err error) { secs := len(c.Sections) @@ -364,10 +372,10 @@ func (s *Section) GetBlock(i int) BlocksState { } func (s *Section) SetBlock(i int, v BlocksState) { - if block.IsAir(s.States.Get(i)) { + if !block.IsAir(s.States.Get(i)) { s.BlockCount-- } - if v != 0 { + if !block.IsAir(v) { s.BlockCount++ } s.States.Set(i, v)