package mtmap
import (
- "bytes"
"compress/zlib"
"encoding/binary"
"errors"
"io"
)
-type MapBlk struct {
- mt.MapBlk
- Flags MapBlkFlags
- LightingComplete uint16
- StaticObjs []StaticObj
- Timestamp uint32
-}
-
-type MapBlkFlags uint8
-
-const (
- IsUnderground MapBlkFlags = 1 << iota
- DayNightDiffers
- NotGenerated = 1 << 4
-)
-
-var SerializeVer uint8 = 28
-
var (
ErrInvalidSerializeVer = errors.New("invalid serialize version")
ErrInvalidContentWidth = errors.New("invalid content width")
ErrInvalidParamsWidth = errors.New("invalid params width")
ErrInvalidNodeMetaVer = errors.New("invalid node meta version")
ErrInvalidNameIdMapVer = errors.New("invalid name id mapping version")
- ErrInvalidNode = errors.New("invalid node")
+ ErrInvalidStaticObjVer = errors.New("invalid static object version")
)
-type StaticObj struct {
- Type uint8
- Pos [3]float32
- Data string
-}
-
-func Deserialize(data []byte, idNameMap map[string]mt.Content) (blk *MapBlk, err error) {
- r := bytes.NewReader(data)
- blk = &MapBlk{}
+func Deserialize(r io.Reader, idNameMap map[string]mt.Content) *MapBlk {
+ var blk = &MapBlk{}
var ver uint8
if err := binary.Read(r, binary.BigEndian, &ver); err != nil {
- return nil, err
+ panic(err)
}
if ver != SerializeVer {
- return nil, ErrInvalidSerializeVer
+ panic(ErrInvalidSerializeVer)
}
if err := binary.Read(r, binary.BigEndian, &blk.Flags); err != nil {
- return nil, err
+ panic(err)
}
if err := binary.Read(r, binary.BigEndian, &blk.LightingComplete); err != nil {
- return nil, err
+ panic(err)
}
var contentWidth uint8
if err := binary.Read(r, binary.BigEndian, &contentWidth); err != nil {
- return nil, err
+ panic(err)
}
- if contentWidth != 2 {
- return nil, ErrInvalidContentWidth
+ if contentWidth != ContentWidth {
+ panic(ErrInvalidContentWidth)
}
var paramsWidth uint8
if err := binary.Read(r, binary.BigEndian, ¶msWidth); err != nil {
- return nil, err
+ panic(err)
}
- if paramsWidth != 2 {
- return nil, ErrInvalidParamsWidth
+ if paramsWidth != ParamsWidth {
+ panic(ErrInvalidParamsWidth)
}
{
r, err := zlib.NewReader(r)
if err != nil {
- return nil, err
+ panic(err)
}
if err := binary.Read(r, binary.BigEndian, &blk.Param0); err != nil {
- return nil, err
+ panic(err)
}
if _, err := io.Copy(io.Discard, r); err != nil {
- return nil, err
+ panic(err)
}
if err := r.Close(); err != nil {
- return nil, err
+ panic(err)
}
}
{
r, err := zlib.NewReader(r)
if err != nil {
- return nil, err
+ panic(err)
}
var version uint8
if err := binary.Read(r, binary.BigEndian, &version); err != nil {
- return nil, err
- }
-
- if version != 2 {
- return nil, ErrInvalidNodeMetaVer
- }
-
- var count uint16
- if err := binary.Read(r, binary.BigEndian, &count); err != nil {
- return nil, err
+ panic(err)
}
- for i := uint16(0); i < count; i++ {
- var pos uint16
- if err := binary.Read(r, binary.BigEndian, &pos); err != nil {
- return nil, err
+ if version != 0 {
+ if version != NodeMetaVer {
+ panic(ErrInvalidNodeMetaVer)
}
- var num uint32
- if err := binary.Read(r, binary.BigEndian, &num); err != nil {
- return nil, err
+ var count uint16
+ if err := binary.Read(r, binary.BigEndian, &count); err != nil {
+ panic(err)
}
- var data = &mt.NodeMeta{}
- data.Fields = make([]mt.NodeMetaField, 0)
- for j := uint32(0); j < num; j++ {
- var field mt.NodeMetaField
-
- var lenName uint16
- if err := binary.Read(r, binary.BigEndian, &lenName); err != nil {
- return nil, err
- }
-
- var name = make([]byte, lenName)
- if err := binary.Read(r, binary.BigEndian, &name); err != nil {
- return nil, err
+ for i := uint16(0); i < count; i++ {
+ var pos uint16
+ if err := binary.Read(r, binary.BigEndian, &pos); err != nil {
+ panic(err)
}
- field.Name = string(name)
- var lenValue uint32
- if err := binary.Read(r, binary.BigEndian, &lenValue); err != nil {
- return nil, err
+ var num uint32
+ if err := binary.Read(r, binary.BigEndian, &num); err != nil {
+ panic(err)
}
- var value = make([]byte, lenValue)
- if err := binary.Read(r, binary.BigEndian, &value); err != nil {
- return nil, err
+ var data = &mt.NodeMeta{}
+ data.Fields = make([]mt.NodeMetaField, 0)
+ for j := uint32(0); j < num; j++ {
+ var field mt.NodeMetaField
+
+ var lenName uint16
+ if err := binary.Read(r, binary.BigEndian, &lenName); err != nil {
+ panic(err)
+ }
+
+ var name = make([]byte, lenName)
+ if err := binary.Read(r, binary.BigEndian, &name); err != nil {
+ panic(err)
+ }
+ field.Name = string(name)
+
+ var lenValue uint32
+ if err := binary.Read(r, binary.BigEndian, &lenValue); err != nil {
+ panic(err)
+ }
+
+ var value = make([]byte, lenValue)
+ if err := binary.Read(r, binary.BigEndian, &value); err != nil {
+ panic(err)
+ }
+ field.Value = string(value)
+
+ if err := binary.Read(r, binary.BigEndian, &field.Private); err != nil {
+ panic(err)
+ }
+
+ data.Fields = append(data.Fields, field)
}
- field.Value = string(value)
- if err := binary.Read(r, binary.BigEndian, &field.Private); err != nil {
- return nil, err
+ if err := data.Inv.Deserialize(r); err != nil {
+ panic(err)
}
- data.Fields = append(data.Fields, field)
+ blk.NodeMetas[pos] = data
}
-
- if err := data.Inv.Deserialize(r); err != nil {
- return nil, err
- }
-
- blk.NodeMetas[pos] = data
}
if _, err := io.Copy(io.Discard, r); err != nil {
- return nil, err
+ panic(err)
}
if err := r.Close(); err != nil {
- return nil, err
+ panic(err)
}
}
var staticObjVer uint8
if err := binary.Read(r, binary.BigEndian, &staticObjVer); err != nil {
- return nil, err
+ panic(err)
+ }
+
+ if staticObjVer != StaticObjVer {
+ panic(ErrInvalidStaticObjVer)
}
var staticObjCount uint16
if err := binary.Read(r, binary.BigEndian, &staticObjCount); err != nil {
- return nil, err
+ panic(err)
}
blk.StaticObjs = make([]StaticObj, 0)
var obj StaticObj
if err := binary.Read(r, binary.BigEndian, &obj.Type); err != nil {
- return nil, err
+ panic(err)
}
var pos [3]int32
if err := binary.Read(r, binary.BigEndian, &pos); err != nil {
- return nil, err
+ panic(err)
}
obj.Pos = [3]float32{
var dataLen uint16
if err := binary.Read(r, binary.BigEndian, &dataLen); err != nil {
- return nil, err
+ panic(err)
}
var data = make([]byte, dataLen)
if err := binary.Read(r, binary.BigEndian, &data); err != nil {
- return nil, err
+ panic(err)
}
obj.Data = string(data)
}
if err := binary.Read(r, binary.BigEndian, &blk.Timestamp); err != nil {
- return nil, err
+ panic(err)
}
var nameIdMapVer uint8
if err := binary.Read(r, binary.BigEndian, &nameIdMapVer); err != nil {
- return nil, err
+ panic(err)
}
- if nameIdMapVer != 0 {
- return nil, ErrInvalidNameIdMapVer
+ if nameIdMapVer != NameIdMapVer {
+ panic(ErrInvalidNameIdMapVer)
}
var nameIdMapCount uint16
if err := binary.Read(r, binary.BigEndian, &nameIdMapCount); err != nil {
- return nil, err
+ panic(err)
}
- nameIdMap := make(map[mt.Content]string)
+ var nameIdMap = make(map[mt.Content]string)
for i := uint16(0); i < nameIdMapCount; i++ {
- var id uint16
+ var id mt.Content
if err := binary.Read(r, binary.BigEndian, &id); err != nil {
- return nil, err
+ panic(err)
}
- var nameLen mt.Content
+ var nameLen uint16
if err := binary.Read(r, binary.BigEndian, &nameLen); err != nil {
- return nil, err
+ panic(err)
}
var name = make([]byte, nameLen)
if err := binary.Read(r, binary.BigEndian, &name); err != nil {
- return nil, err
+ panic(err)
}
- nameIdMap[mt.Content(id)] = string(name)
+ nameIdMap[id] = string(name)
}
for i := 0; i < 4096; i++ {
- name, ok := nameIdMap[blk.Param0[i]]
+ id := blk.Param0[i]
+
+ name, ok := nameIdMap[id]
if !ok {
- return nil, ErrInvalidNode
+ panic(ErrInvalidNodeId{id})
}
- id, ok := idNameMap[name]
- if !ok {
- return nil, ErrInvalidNode
+ switch name {
+ case "unknown":
+ id = mt.Unknown
+ case "air":
+ id = mt.Air
+ case "ignore":
+ id = mt.Ignore
+ default:
+ id, ok = idNameMap[name]
+ if !ok {
+ panic(ErrInvalidNodeName{name})
+ }
}
blk.Param0[i] = id
}
- return
+ return blk
}