Files
go-mc/level/block/block.go
2022-03-09 16:12:47 +08:00

63 lines
1.1 KiB
Go

package block
import (
"bytes"
"compress/zlib"
_ "embed"
"fmt"
"github.com/Tnze/go-mc/nbt"
)
type Block interface {
ID() string
}
// This file stores all possible block states into a TAG_List with zlib compressed.
//go:embed block_states.nbt
var blockStates []byte
var toStateID = make(map[Block]int)
var fromStateID []Block
func init() {
regState := func(s Block) {
if _, ok := toStateID[s]; ok {
panic(fmt.Errorf("state %#v already exist", s))
}
toStateID[s] = len(fromStateID)
fromStateID = append(fromStateID, s)
}
var states []struct {
Name string
Properties nbt.RawMessage
}
// decompress
z, err := zlib.NewReader(bytes.NewReader(blockStates))
if err != nil {
panic(err)
}
// decode all states
if _, err = nbt.NewDecoder(z).Decode(&states); err != nil {
panic(err)
}
for _, state := range states {
block := fromID[state.Name]
if state.Properties.Type != nbt.TagEnd {
err := state.Properties.Unmarshal(&block)
if err != nil {
panic(err)
}
}
regState(block)
}
}
func FromStateID(stateID int) Block {
return fromStateID[stateID]
}
func ToStateID(b Block) int {
return toStateID[b]
}