8 "github.com/anon55555/mt"
13 ErrInvalidSerializeVer = errors.New("invalid serialize version")
14 ErrInvalidContentWidth = errors.New("invalid content width")
15 ErrInvalidParamsWidth = errors.New("invalid params width")
16 ErrInvalidNodeMetaVer = errors.New("invalid node meta version")
17 ErrInvalidNameIdMapVer = errors.New("invalid name id mapping version")
18 ErrInvalidStaticObjVer = errors.New("invalid static object version")
19 ErrInvalidNode = errors.New("invalid node")
22 func Deserialize(data []byte, idNameMap map[string]mt.Content) (blk *MapBlk, err error) {
23 r := bytes.NewReader(data)
27 if err := binary.Read(r, binary.BigEndian, &ver); err != nil {
31 if ver != SerializeVer {
32 return nil, ErrInvalidSerializeVer
35 if err := binary.Read(r, binary.BigEndian, &blk.Flags); err != nil {
39 if err := binary.Read(r, binary.BigEndian, &blk.LightingComplete); err != nil {
43 var contentWidth uint8
44 if err := binary.Read(r, binary.BigEndian, &contentWidth); err != nil {
48 if contentWidth != ContentWidth {
49 return nil, ErrInvalidContentWidth
53 if err := binary.Read(r, binary.BigEndian, ¶msWidth); err != nil {
57 if paramsWidth != ParamsWidth {
58 return nil, ErrInvalidParamsWidth
62 r, err := zlib.NewReader(r)
67 if err := binary.Read(r, binary.BigEndian, &blk.Param0); err != nil {
71 if _, err := io.Copy(io.Discard, r); err != nil {
75 if err := r.Close(); err != nil {
80 blk.NodeMetas = make(map[uint16]*mt.NodeMeta)
82 r, err := zlib.NewReader(r)
88 if err := binary.Read(r, binary.BigEndian, &version); err != nil {
92 if version != NodeMetaVer {
93 return nil, ErrInvalidNodeMetaVer
97 if err := binary.Read(r, binary.BigEndian, &count); err != nil {
101 for i := uint16(0); i < count; i++ {
103 if err := binary.Read(r, binary.BigEndian, &pos); err != nil {
108 if err := binary.Read(r, binary.BigEndian, &num); err != nil {
112 var data = &mt.NodeMeta{}
113 data.Fields = make([]mt.NodeMetaField, 0)
114 for j := uint32(0); j < num; j++ {
115 var field mt.NodeMetaField
118 if err := binary.Read(r, binary.BigEndian, &lenName); err != nil {
122 var name = make([]byte, lenName)
123 if err := binary.Read(r, binary.BigEndian, &name); err != nil {
126 field.Name = string(name)
129 if err := binary.Read(r, binary.BigEndian, &lenValue); err != nil {
133 var value = make([]byte, lenValue)
134 if err := binary.Read(r, binary.BigEndian, &value); err != nil {
137 field.Value = string(value)
139 if err := binary.Read(r, binary.BigEndian, &field.Private); err != nil {
143 data.Fields = append(data.Fields, field)
146 if err := data.Inv.Deserialize(r); err != nil {
150 blk.NodeMetas[pos] = data
153 if _, err := io.Copy(io.Discard, r); err != nil {
157 if err := r.Close(); err != nil {
162 var staticObjVer uint8
163 if err := binary.Read(r, binary.BigEndian, &staticObjVer); err != nil {
167 if staticObjVer != StaticObjVer {
168 return nil, ErrInvalidStaticObjVer
171 var staticObjCount uint16
172 if err := binary.Read(r, binary.BigEndian, &staticObjCount); err != nil {
176 blk.StaticObjs = make([]StaticObj, 0)
177 for i := uint16(0); i < staticObjCount; i++ {
180 if err := binary.Read(r, binary.BigEndian, &obj.Type); err != nil {
185 if err := binary.Read(r, binary.BigEndian, &pos); err != nil {
189 obj.Pos = [3]float32{
190 float32(pos[0]) / 1000.0,
191 float32(pos[1]) / 1000.0,
192 float32(pos[2]) / 1000.0,
196 if err := binary.Read(r, binary.BigEndian, &dataLen); err != nil {
200 var data = make([]byte, dataLen)
201 if err := binary.Read(r, binary.BigEndian, &data); err != nil {
205 obj.Data = string(data)
207 blk.StaticObjs = append(blk.StaticObjs, obj)
210 if err := binary.Read(r, binary.BigEndian, &blk.Timestamp); err != nil {
214 var nameIdMapVer uint8
215 if err := binary.Read(r, binary.BigEndian, &nameIdMapVer); err != nil {
219 if nameIdMapVer != NameIdMapVer {
220 return nil, ErrInvalidNameIdMapVer
223 var nameIdMapCount uint16
224 if err := binary.Read(r, binary.BigEndian, &nameIdMapCount); err != nil {
228 nameIdMap := make(map[mt.Content]string)
230 for i := uint16(0); i < nameIdMapCount; i++ {
232 if err := binary.Read(r, binary.BigEndian, &id); err != nil {
237 if err := binary.Read(r, binary.BigEndian, &nameLen); err != nil {
241 var name = make([]byte, nameLen)
242 if err := binary.Read(r, binary.BigEndian, &name); err != nil {
246 nameIdMap[mt.Content(id)] = string(name)
249 for i := 0; i < 4096; i++ {
250 name, ok := nameIdMap[blk.Param0[i]]
252 return nil, ErrInvalidNode
255 id, ok := idNameMap[name]
257 return nil, ErrInvalidNode