fix blockCount bug
This commit is contained in:
@ -1,7 +1,11 @@
|
|||||||
package block
|
package block
|
||||||
|
|
||||||
func IsAir(s StateID) bool {
|
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:
|
case Air, CaveAir, VoidAir:
|
||||||
return true
|
return true
|
||||||
default:
|
default:
|
||||||
|
@ -75,10 +75,11 @@ func ChunkFromSave(c *save.Chunk) (*Chunk, error) {
|
|||||||
return nil, fmt.Errorf("section Y value %d out of bounds", v.Y)
|
return nil, fmt.Errorf("section Y value %d out of bounds", v.Y)
|
||||||
}
|
}
|
||||||
var err error
|
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 {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
sections[i].BlockCount = countNoneAirBlocks(§ions[i])
|
||||||
sections[i].Biomes, err = readBiomesPalette(v.Biomes.Palette, v.Biomes.Data)
|
sections[i].Biomes, err = readBiomesPalette(v.Biomes.Palette, v.Biomes.Data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -125,24 +126,21 @@ func ChunkFromSave(c *save.Chunk) (*Chunk, error) {
|
|||||||
}, nil
|
}, 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))
|
statePalette := make([]BlocksState, len(palette))
|
||||||
for i, v := range palette {
|
for i, v := range palette {
|
||||||
b, ok := block.FromID[v.Name]
|
b, ok := block.FromID[v.Name]
|
||||||
if !ok {
|
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 v.Properties.Data != nil {
|
||||||
if err := v.Properties.Unmarshal(&b); err != 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]
|
s, ok := block.ToStateID[b]
|
||||||
if !ok {
|
if !ok {
|
||||||
return 0, nil, fmt.Errorf("unknown block: %v", b)
|
return nil, fmt.Errorf("unknown block: %v", b)
|
||||||
}
|
|
||||||
if !block.IsAir(s) {
|
|
||||||
blockCount++
|
|
||||||
}
|
}
|
||||||
statePalette[i] = s
|
statePalette[i] = s
|
||||||
}
|
}
|
||||||
@ -162,6 +160,16 @@ func readBiomesPalette(palette []string, data []uint64) (*PaletteContainer[Biome
|
|||||||
return NewBiomesPaletteContainerWithData(4*4*4, data, biomesRawPalette), nil
|
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
|
// ChunkToSave convert level.Chunk to save.Chunk
|
||||||
func ChunkToSave(c *Chunk, dst *save.Chunk) (err error) {
|
func ChunkToSave(c *Chunk, dst *save.Chunk) (err error) {
|
||||||
secs := len(c.Sections)
|
secs := len(c.Sections)
|
||||||
@ -364,10 +372,10 @@ func (s *Section) GetBlock(i int) BlocksState {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (s *Section) SetBlock(i int, v 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--
|
s.BlockCount--
|
||||||
}
|
}
|
||||||
if v != 0 {
|
if !block.IsAir(v) {
|
||||||
s.BlockCount++
|
s.BlockCount++
|
||||||
}
|
}
|
||||||
s.States.Set(i, v)
|
s.States.Set(i, v)
|
||||||
|
Reference in New Issue
Block a user