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")
18 ErrInvalidNode = errors.New("invalid node")
21 func Deserialize(r io.Reader, idNameMap map[string]mt.Content) *MapBlk {
25 if err := binary.Read(r, binary.BigEndian, &ver); err != nil {
29 if ver != SerializeVer {
30 panic(ErrInvalidSerializeVer)
33 if err := binary.Read(r, binary.BigEndian, &blk.Flags); err != nil {
37 if err := binary.Read(r, binary.BigEndian, &blk.LightingComplete); err != nil {
41 var contentWidth uint8
42 if err := binary.Read(r, binary.BigEndian, &contentWidth); err != nil {
46 if contentWidth != ContentWidth {
47 panic(ErrInvalidContentWidth)
51 if err := binary.Read(r, binary.BigEndian, ¶msWidth); err != nil {
55 if paramsWidth != ParamsWidth {
56 panic(ErrInvalidParamsWidth)
60 r, err := zlib.NewReader(r)
65 if err := binary.Read(r, binary.BigEndian, &blk.Param0); err != nil {
69 if _, err := io.Copy(io.Discard, r); err != nil {
73 if err := r.Close(); err != nil {
78 blk.NodeMetas = make(map[uint16]*mt.NodeMeta)
80 r, err := zlib.NewReader(r)
86 if err := binary.Read(r, binary.BigEndian, &version); err != nil {
90 if version != NodeMetaVer {
91 panic(ErrInvalidNodeMetaVer)
95 if err := binary.Read(r, binary.BigEndian, &count); err != nil {
99 for i := uint16(0); i < count; i++ {
101 if err := binary.Read(r, binary.BigEndian, &pos); err != nil {
106 if err := binary.Read(r, binary.BigEndian, &num); err != nil {
110 var data = &mt.NodeMeta{}
111 data.Fields = make([]mt.NodeMetaField, 0)
112 for j := uint32(0); j < num; j++ {
113 var field mt.NodeMetaField
116 if err := binary.Read(r, binary.BigEndian, &lenName); err != nil {
120 var name = make([]byte, lenName)
121 if err := binary.Read(r, binary.BigEndian, &name); err != nil {
124 field.Name = string(name)
127 if err := binary.Read(r, binary.BigEndian, &lenValue); err != nil {
131 var value = make([]byte, lenValue)
132 if err := binary.Read(r, binary.BigEndian, &value); err != nil {
135 field.Value = string(value)
137 if err := binary.Read(r, binary.BigEndian, &field.Private); err != nil {
141 data.Fields = append(data.Fields, field)
144 if err := data.Inv.Deserialize(r); err != nil {
148 blk.NodeMetas[pos] = data
151 if _, err := io.Copy(io.Discard, r); err != nil {
155 if err := r.Close(); err != nil {
160 var staticObjVer uint8
161 if err := binary.Read(r, binary.BigEndian, &staticObjVer); err != nil {
165 if staticObjVer != StaticObjVer {
166 panic(ErrInvalidStaticObjVer)
169 var staticObjCount uint16
170 if err := binary.Read(r, binary.BigEndian, &staticObjCount); err != nil {
174 blk.StaticObjs = make([]StaticObj, 0)
175 for i := uint16(0); i < staticObjCount; i++ {
178 if err := binary.Read(r, binary.BigEndian, &obj.Type); err != nil {
183 if err := binary.Read(r, binary.BigEndian, &pos); err != nil {
187 obj.Pos = [3]float32{
188 float32(pos[0]) / 1000.0,
189 float32(pos[1]) / 1000.0,
190 float32(pos[2]) / 1000.0,
194 if err := binary.Read(r, binary.BigEndian, &dataLen); err != nil {
198 var data = make([]byte, dataLen)
199 if err := binary.Read(r, binary.BigEndian, &data); err != nil {
203 obj.Data = string(data)
205 blk.StaticObjs = append(blk.StaticObjs, obj)
208 if err := binary.Read(r, binary.BigEndian, &blk.Timestamp); err != nil {
212 var nameIdMapVer uint8
213 if err := binary.Read(r, binary.BigEndian, &nameIdMapVer); err != nil {
217 if nameIdMapVer != NameIdMapVer {
218 panic(ErrInvalidNameIdMapVer)
221 var nameIdMapCount uint16
222 if err := binary.Read(r, binary.BigEndian, &nameIdMapCount); err != nil {
226 nameIdMap := make(map[mt.Content]string)
228 for i := uint16(0); i < nameIdMapCount; i++ {
230 if err := binary.Read(r, binary.BigEndian, &id); err != nil {
235 if err := binary.Read(r, binary.BigEndian, &nameLen); err != nil {
239 var name = make([]byte, nameLen)
240 if err := binary.Read(r, binary.BigEndian, &name); err != nil {
244 nameIdMap[id] = string(name)
247 for i := 0; i < 4096; i++ {
248 name, ok := nameIdMap[blk.Param0[i]]
250 panic(ErrInvalidNode)
253 id, ok := idNameMap[name]
255 panic(ErrInvalidNode)