8 "github.com/anon55555/mt"
15 LightingComplete uint16
16 StaticObjs []StaticObj
20 type MapBlkFlags uint8
23 IsUnderground MapBlkFlags = 1 << iota
28 var SerializeVer uint8 = 28
31 ErrInvalidSerializeVer = errors.New("invalid serialize version")
32 ErrInvalidContentWidth = errors.New("invalid content width")
33 ErrInvalidParamsWidth = errors.New("invalid params width")
34 ErrInvalidNodeMetaVer = errors.New("invalid node meta version")
35 ErrInvalidNameIdMapVer = errors.New("invalid name id mapping version")
36 ErrInvalidNode = errors.New("invalid node")
39 type StaticObj struct {
45 func Deserialize(data []byte, idNameMap map[string]mt.Content) (blk *MapBlk, err error) {
46 r := bytes.NewReader(data)
50 if err := binary.Read(r, binary.BigEndian, &ver); err != nil {
54 if ver != SerializeVer {
55 return nil, ErrInvalidSerializeVer
58 if err := binary.Read(r, binary.BigEndian, &blk.Flags); err != nil {
62 if err := binary.Read(r, binary.BigEndian, &blk.LightingComplete); err != nil {
66 var contentWidth uint8
67 if err := binary.Read(r, binary.BigEndian, &contentWidth); err != nil {
71 if contentWidth != 2 {
72 return nil, ErrInvalidContentWidth
76 if err := binary.Read(r, binary.BigEndian, ¶msWidth); err != nil {
81 return nil, ErrInvalidParamsWidth
85 r, err := zlib.NewReader(r)
90 if err := binary.Read(r, binary.BigEndian, &blk.Param0); err != nil {
94 if _, err := io.Copy(io.Discard, r); err != nil {
98 if err := r.Close(); err != nil {
103 blk.NodeMetas = make(map[uint16]*mt.NodeMeta)
105 r, err := zlib.NewReader(r)
111 if err := binary.Read(r, binary.BigEndian, &version); err != nil {
116 return nil, ErrInvalidNodeMetaVer
120 if err := binary.Read(r, binary.BigEndian, &count); err != nil {
124 for i := uint16(0); i < count; i++ {
126 if err := binary.Read(r, binary.BigEndian, &pos); err != nil {
131 if err := binary.Read(r, binary.BigEndian, &num); err != nil {
135 var data = &mt.NodeMeta{}
136 data.Fields = make([]mt.NodeMetaField, 0)
137 for j := uint32(0); j < num; j++ {
138 var field mt.NodeMetaField
141 if err := binary.Read(r, binary.BigEndian, &lenName); err != nil {
145 var name = make([]byte, lenName)
146 if err := binary.Read(r, binary.BigEndian, &name); err != nil {
149 field.Name = string(name)
152 if err := binary.Read(r, binary.BigEndian, &lenValue); err != nil {
156 var value = make([]byte, lenValue)
157 if err := binary.Read(r, binary.BigEndian, &value); err != nil {
160 field.Value = string(value)
162 if err := binary.Read(r, binary.BigEndian, &field.Private); err != nil {
166 data.Fields = append(data.Fields, field)
169 if err := data.Inv.Deserialize(r); err != nil {
173 blk.NodeMetas[pos] = data
176 if _, err := io.Copy(io.Discard, r); err != nil {
180 if err := r.Close(); err != nil {
185 var staticObjVer uint8
186 if err := binary.Read(r, binary.BigEndian, &staticObjVer); err != nil {
190 var staticObjCount uint16
191 if err := binary.Read(r, binary.BigEndian, &staticObjCount); err != nil {
195 blk.StaticObjs = make([]StaticObj, 0)
196 for i := uint16(0); i < staticObjCount; i++ {
199 if err := binary.Read(r, binary.BigEndian, &obj.Type); err != nil {
204 if err := binary.Read(r, binary.BigEndian, &pos); err != nil {
208 obj.Pos = [3]float32{
209 float32(pos[0]) / 1000.0,
210 float32(pos[1]) / 1000.0,
211 float32(pos[2]) / 1000.0,
215 if err := binary.Read(r, binary.BigEndian, &dataLen); err != nil {
219 var data = make([]byte, dataLen)
220 if err := binary.Read(r, binary.BigEndian, &data); err != nil {
224 obj.Data = string(data)
226 blk.StaticObjs = append(blk.StaticObjs, obj)
229 if err := binary.Read(r, binary.BigEndian, &blk.Timestamp); err != nil {
233 var nameIdMapVer uint8
234 if err := binary.Read(r, binary.BigEndian, &nameIdMapVer); err != nil {
238 if nameIdMapVer != 0 {
239 return nil, ErrInvalidNameIdMapVer
242 var nameIdMapCount uint16
243 if err := binary.Read(r, binary.BigEndian, &nameIdMapCount); err != nil {
247 nameIdMap := make(map[mt.Content]string)
249 for i := uint16(0); i < nameIdMapCount; i++ {
251 if err := binary.Read(r, binary.BigEndian, &id); err != nil {
255 var nameLen mt.Content
256 if err := binary.Read(r, binary.BigEndian, &nameLen); err != nil {
260 var name = make([]byte, nameLen)
261 if err := binary.Read(r, binary.BigEndian, &name); err != nil {
265 nameIdMap[mt.Content(id)] = string(name)
268 for i := 0; i < 4096; i++ {
269 name, ok := nameIdMap[blk.Param0[i]]
271 return nil, ErrInvalidNode
274 id, ok := idNameMap[name]
276 return nil, ErrInvalidNode