7 "github.com/anon55555/mt"
12 ErrInvalidSerializeVer = errors.New("invalid serialize version")
13 ErrInvalidContentWidth = errors.New("invalid content width")
14 ErrInvalidParamsWidth = errors.New("invalid params width")
15 ErrInvalidNodeMetaVer = errors.New("invalid node meta version")
16 ErrInvalidNameIdMapVer = errors.New("invalid name id mapping version")
17 ErrInvalidStaticObjVer = errors.New("invalid static object version")
20 func Deserialize(r io.Reader, idNameMap map[string]mt.Content) *MapBlk {
24 if err := binary.Read(r, binary.BigEndian, &ver); err != nil {
28 if ver != SerializeVer {
29 panic(ErrInvalidSerializeVer)
32 if err := binary.Read(r, binary.BigEndian, &blk.Flags); err != nil {
36 if err := binary.Read(r, binary.BigEndian, &blk.LightingComplete); err != nil {
40 var contentWidth uint8
41 if err := binary.Read(r, binary.BigEndian, &contentWidth); err != nil {
45 if contentWidth != ContentWidth {
46 panic(ErrInvalidContentWidth)
50 if err := binary.Read(r, binary.BigEndian, ¶msWidth); err != nil {
54 if paramsWidth != ParamsWidth {
55 panic(ErrInvalidParamsWidth)
59 r, err := zlib.NewReader(r)
64 if err := binary.Read(r, binary.BigEndian, &blk.Param0); err != nil {
68 if _, err := io.Copy(io.Discard, r); err != nil {
72 if err := r.Close(); err != nil {
77 blk.NodeMetas = make(map[uint16]*mt.NodeMeta)
79 r, err := zlib.NewReader(r)
85 if err := binary.Read(r, binary.BigEndian, &version); err != nil {
89 if version != NodeMetaVer {
90 panic(ErrInvalidNodeMetaVer)
94 if err := binary.Read(r, binary.BigEndian, &count); err != nil {
98 for i := uint16(0); i < count; i++ {
100 if err := binary.Read(r, binary.BigEndian, &pos); err != nil {
105 if err := binary.Read(r, binary.BigEndian, &num); err != nil {
109 var data = &mt.NodeMeta{}
110 data.Fields = make([]mt.NodeMetaField, 0)
111 for j := uint32(0); j < num; j++ {
112 var field mt.NodeMetaField
115 if err := binary.Read(r, binary.BigEndian, &lenName); err != nil {
119 var name = make([]byte, lenName)
120 if err := binary.Read(r, binary.BigEndian, &name); err != nil {
123 field.Name = string(name)
126 if err := binary.Read(r, binary.BigEndian, &lenValue); err != nil {
130 var value = make([]byte, lenValue)
131 if err := binary.Read(r, binary.BigEndian, &value); err != nil {
134 field.Value = string(value)
136 if err := binary.Read(r, binary.BigEndian, &field.Private); err != nil {
140 data.Fields = append(data.Fields, field)
143 if err := data.Inv.Deserialize(r); err != nil {
147 blk.NodeMetas[pos] = data
150 if _, err := io.Copy(io.Discard, r); err != nil {
154 if err := r.Close(); err != nil {
159 var staticObjVer uint8
160 if err := binary.Read(r, binary.BigEndian, &staticObjVer); err != nil {
164 if staticObjVer != StaticObjVer {
165 panic(ErrInvalidStaticObjVer)
168 var staticObjCount uint16
169 if err := binary.Read(r, binary.BigEndian, &staticObjCount); err != nil {
173 blk.StaticObjs = make([]StaticObj, 0)
174 for i := uint16(0); i < staticObjCount; i++ {
177 if err := binary.Read(r, binary.BigEndian, &obj.Type); err != nil {
182 if err := binary.Read(r, binary.BigEndian, &pos); err != nil {
186 obj.Pos = [3]float32{
187 float32(pos[0]) / 1000.0,
188 float32(pos[1]) / 1000.0,
189 float32(pos[2]) / 1000.0,
193 if err := binary.Read(r, binary.BigEndian, &dataLen); err != nil {
197 var data = make([]byte, dataLen)
198 if err := binary.Read(r, binary.BigEndian, &data); err != nil {
202 obj.Data = string(data)
204 blk.StaticObjs = append(blk.StaticObjs, obj)
207 if err := binary.Read(r, binary.BigEndian, &blk.Timestamp); err != nil {
211 var nameIdMapVer uint8
212 if err := binary.Read(r, binary.BigEndian, &nameIdMapVer); err != nil {
216 if nameIdMapVer != NameIdMapVer {
217 panic(ErrInvalidNameIdMapVer)
220 var nameIdMapCount uint16
221 if err := binary.Read(r, binary.BigEndian, &nameIdMapCount); err != nil {
225 var nameIdMap = make(map[mt.Content]string)
227 for i := uint16(0); i < nameIdMapCount; i++ {
229 if err := binary.Read(r, binary.BigEndian, &id); err != nil {
234 if err := binary.Read(r, binary.BigEndian, &nameLen); err != nil {
238 var name = make([]byte, nameLen)
239 if err := binary.Read(r, binary.BigEndian, &name); err != nil {
243 nameIdMap[id] = string(name)
246 for i := 0; i < 4096; i++ {
252 name, ok := nameIdMap[id]
254 panic(ErrInvalidNodeId{id})
257 blk.Param0[i], ok = idNameMap[name]
259 panic(ErrInvalidNodeName{name})