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")
21 type ErrInvalidNodeName struct {
25 func (e ErrInvalidNodeName) Error() string {
26 return fmt.Sprintf("invalid node \"%v\"", e.Name)
29 type ErrInvalidNodeId struct {
33 func (e ErrInvalidNodeId) Error() string {
34 return fmt.Sprintf("invalid node %v", e.Id)
37 func Deserialize(r io.Reader, idNameMap map[string]mt.Content) *MapBlk {
41 if err := binary.Read(r, binary.BigEndian, &ver); err != nil {
45 if ver != SerializeVer {
46 panic(ErrInvalidSerializeVer)
49 if err := binary.Read(r, binary.BigEndian, &blk.Flags); err != nil {
53 if err := binary.Read(r, binary.BigEndian, &blk.LightingComplete); err != nil {
57 var contentWidth uint8
58 if err := binary.Read(r, binary.BigEndian, &contentWidth); err != nil {
62 if contentWidth != ContentWidth {
63 panic(ErrInvalidContentWidth)
67 if err := binary.Read(r, binary.BigEndian, ¶msWidth); err != nil {
71 if paramsWidth != ParamsWidth {
72 panic(ErrInvalidParamsWidth)
76 r, err := zlib.NewReader(r)
81 if err := binary.Read(r, binary.BigEndian, &blk.Param0); err != nil {
85 if _, err := io.Copy(io.Discard, r); err != nil {
89 if err := r.Close(); err != nil {
94 blk.NodeMetas = make(map[uint16]*mt.NodeMeta)
96 r, err := zlib.NewReader(r)
102 if err := binary.Read(r, binary.BigEndian, &version); err != nil {
106 if version != NodeMetaVer {
107 panic(ErrInvalidNodeMetaVer)
111 if err := binary.Read(r, binary.BigEndian, &count); err != nil {
115 for i := uint16(0); i < count; i++ {
117 if err := binary.Read(r, binary.BigEndian, &pos); err != nil {
122 if err := binary.Read(r, binary.BigEndian, &num); err != nil {
126 var data = &mt.NodeMeta{}
127 data.Fields = make([]mt.NodeMetaField, 0)
128 for j := uint32(0); j < num; j++ {
129 var field mt.NodeMetaField
132 if err := binary.Read(r, binary.BigEndian, &lenName); err != nil {
136 var name = make([]byte, lenName)
137 if err := binary.Read(r, binary.BigEndian, &name); err != nil {
140 field.Name = string(name)
143 if err := binary.Read(r, binary.BigEndian, &lenValue); err != nil {
147 var value = make([]byte, lenValue)
148 if err := binary.Read(r, binary.BigEndian, &value); err != nil {
151 field.Value = string(value)
153 if err := binary.Read(r, binary.BigEndian, &field.Private); err != nil {
157 data.Fields = append(data.Fields, field)
160 if err := data.Inv.Deserialize(r); err != nil {
164 blk.NodeMetas[pos] = data
167 if _, err := io.Copy(io.Discard, r); err != nil {
171 if err := r.Close(); err != nil {
176 var staticObjVer uint8
177 if err := binary.Read(r, binary.BigEndian, &staticObjVer); err != nil {
181 if staticObjVer != StaticObjVer {
182 panic(ErrInvalidStaticObjVer)
185 var staticObjCount uint16
186 if err := binary.Read(r, binary.BigEndian, &staticObjCount); err != nil {
190 blk.StaticObjs = make([]StaticObj, 0)
191 for i := uint16(0); i < staticObjCount; i++ {
194 if err := binary.Read(r, binary.BigEndian, &obj.Type); err != nil {
199 if err := binary.Read(r, binary.BigEndian, &pos); err != nil {
203 obj.Pos = [3]float32{
204 float32(pos[0]) / 1000.0,
205 float32(pos[1]) / 1000.0,
206 float32(pos[2]) / 1000.0,
210 if err := binary.Read(r, binary.BigEndian, &dataLen); err != nil {
214 var data = make([]byte, dataLen)
215 if err := binary.Read(r, binary.BigEndian, &data); err != nil {
219 obj.Data = string(data)
221 blk.StaticObjs = append(blk.StaticObjs, obj)
224 if err := binary.Read(r, binary.BigEndian, &blk.Timestamp); err != nil {
228 var nameIdMapVer uint8
229 if err := binary.Read(r, binary.BigEndian, &nameIdMapVer); err != nil {
233 if nameIdMapVer != NameIdMapVer {
234 panic(ErrInvalidNameIdMapVer)
237 var nameIdMapCount uint16
238 if err := binary.Read(r, binary.BigEndian, &nameIdMapCount); err != nil {
242 var nameIdMap = make(map[mt.Content]string)
244 for i := uint16(0); i < nameIdMapCount; i++ {
246 if err := binary.Read(r, binary.BigEndian, &id); err != nil {
251 if err := binary.Read(r, binary.BigEndian, &nameLen); err != nil {
255 var name = make([]byte, nameLen)
256 if err := binary.Read(r, binary.BigEndian, &name); err != nil {
260 nameIdMap[id] = string(name)
263 for i := 0; i < 4096; i++ {
264 name, ok := nameIdMap[blk.Param0[i]]
266 panic(ErrInvalidNodeId{blk.Param0[i]})
269 id, ok := idNameMap[name]
271 panic(ErrInvalidNodeName{name})