]> git.lizzy.rs Git - mtmap.git/blob - serialize.go
Merge branch 'master' of github.com:EliasFleckenstein03/mtmap
[mtmap.git] / serialize.go
1 package mtmap
2
3 import (
4         "bytes"
5         "compress/zlib"
6         "encoding/binary"
7         "github.com/anon55555/mt"
8         "io"
9 )
10
11 func Serialize(blk *MapBlk, w io.Writer, idNameMap map[string]mt.Content) error {
12         if err := binary.Write(w, binary.BigEndian, &SerializeVer); err != nil {
13                 return err
14         }
15
16         if err := binary.Write(w, binary.BigEndian, &blk.Flags); err != nil {
17                 return err
18         }
19
20         if err := binary.Write(w, binary.BigEndian, &blk.LightingComplete); err != nil {
21                 return err
22         }
23
24         if err := binary.Write(w, binary.BigEndian, &ContentWidth); err != nil {
25                 return err
26         }
27
28         if err := binary.Write(w, binary.BigEndian, &ParamsWidth); err != nil {
29                 return err
30         }
31
32         {
33                 var buf bytes.Buffer
34                 zw := zlib.NewWriter(&buf)
35
36                 if err := binary.Write(zw, binary.BigEndian, &blk.Param0); err != nil {
37                         return err
38                 }
39
40                 if err := zw.Close(); err != nil {
41                         return err
42                 }
43
44                 if _, err := buf.WriteTo(w); err != nil {
45                         return err
46                 }
47         }
48
49         {
50                 var buf bytes.Buffer
51                 zw := zlib.NewWriter(&buf)
52
53                 if err := binary.Write(zw, binary.BigEndian, &NodeMetaVer); err != nil {
54                         return err
55                 }
56
57                 var count = uint16(len(blk.NodeMetas))
58                 if err := binary.Write(zw, binary.BigEndian, &count); err != nil {
59                         return err
60                 }
61
62                 for pos, data := range blk.NodeMetas {
63                         if err := binary.Write(zw, binary.BigEndian, &pos); err != nil {
64                                 return err
65                         }
66
67                         var num = uint32(len(data.Fields))
68                         if err := binary.Write(zw, binary.BigEndian, &num); err != nil {
69                                 return err
70                         }
71
72                         for _, field := range data.Fields {
73                                 var lenName = uint16(len(field.Name))
74                                 if err := binary.Write(zw, binary.BigEndian, &lenName); err != nil {
75                                         return err
76                                 }
77
78                                 var name = []byte(field.Name)
79                                 if err := binary.Write(zw, binary.BigEndian, &name); err != nil {
80                                         return err
81                                 }
82
83                                 var lenValue = uint32(len(field.Value))
84                                 if err := binary.Write(zw, binary.BigEndian, &lenValue); err != nil {
85                                         return err
86                                 }
87
88                                 var value = []byte(field.Value)
89                                 if err := binary.Write(zw, binary.BigEndian, &value); err != nil {
90                                         return err
91                                 }
92
93                                 if err := binary.Write(zw, binary.BigEndian, &field.Private); err != nil {
94                                         return err
95                                 }
96                         }
97
98                         if err := data.Inv.Serialize(zw); err != nil {
99                                 return err
100                         }
101                 }
102
103                 if err := zw.Close(); err != nil {
104                         return err
105                 }
106
107                 if _, err := buf.WriteTo(w); err != nil {
108                         return err
109                 }
110         }
111
112         if err := binary.Write(w, binary.BigEndian, &StaticObjVer); err != nil {
113                 return err
114         }
115
116         var staticObjCount = uint16(len(blk.StaticObjs))
117         if err := binary.Write(w, binary.BigEndian, &staticObjCount); err != nil {
118                 return err
119         }
120
121         for _, obj := range blk.StaticObjs {
122                 if err := binary.Write(w, binary.BigEndian, &obj.Type); err != nil {
123                         return err
124                 }
125
126                 var pos = [3]int32{
127                         int32(obj.Pos[0] * 1000.0),
128                         int32(obj.Pos[1] * 1000.0),
129                         int32(obj.Pos[2] * 1000.0),
130                 }
131                 if err := binary.Write(w, binary.BigEndian, &pos); err != nil {
132                         return err
133                 }
134
135                 var dataLen = uint16(len(obj.Data))
136                 if err := binary.Write(w, binary.BigEndian, &dataLen); err != nil {
137                         return err
138                 }
139
140                 var data = []byte(obj.Data)
141                 if err := binary.Write(w, binary.BigEndian, &data); err != nil {
142                         return err
143                 }
144         }
145
146         if err := binary.Write(w, binary.BigEndian, &blk.Timestamp); err != nil {
147                 return err
148         }
149
150         if err := binary.Write(w, binary.BigEndian, &NameIdMapVer); err != nil {
151                 return err
152         }
153
154         var nameIdMapCount = uint16(len(idNameMap))
155         if err := binary.Write(w, binary.BigEndian, &nameIdMapCount); err != nil {
156                 return err
157         }
158
159         for name, id := range idNameMap {
160                 if err := binary.Write(w, binary.BigEndian, &id); err != nil {
161                         return err
162                 }
163
164                 var nameLen = uint16(len(name))
165                 if err := binary.Write(w, binary.BigEndian, &nameLen); err != nil {
166                         return err
167                 }
168
169                 var name = []byte(name)
170                 if err := binary.Write(w, binary.BigEndian, &name); err != nil {
171                         return err
172                 }
173         }
174
175         return nil
176 }