summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorElias Fleckenstein <eliasfleckenstein@web.de>2022-07-16 17:53:42 +0200
committerElias Fleckenstein <eliasfleckenstein@web.de>2022-07-16 17:53:42 +0200
commite7bfa8b8c451e1f4038447bd6eb160d8586ede61 (patch)
treefea3a87702e2a647a4c806389fe3433b2c88aa8a
parent29baaa00789ea4b01040f7fe54bc0ed5c560137d (diff)
downloadmtmap-e7bfa8b8c451e1f4038447bd6eb160d8586ede61.tar.xz
Add serialization
-rw-r--r--deserialize.go39
-rw-r--r--serialize.go176
-rw-r--r--types.go36
3 files changed, 222 insertions, 29 deletions
diff --git a/deserialize.go b/deserialize.go
index a6bc965..7e52eff 100644
--- a/deserialize.go
+++ b/deserialize.go
@@ -9,39 +9,16 @@ import (
"io"
)
-type MapBlk struct {
- mt.MapBlk
- Flags MapBlkFlags
- LightingComplete uint16
- StaticObjs []StaticObj
- Timestamp uint32
-}
-
-type MapBlkFlags uint8
-
-const (
- IsUnderground MapBlkFlags = 1 << iota
- DayNightDiffers
- NotGenerated = 1 << 4
-)
-
-var SerializeVer uint8 = 28
-
var (
ErrInvalidSerializeVer = errors.New("invalid serialize version")
ErrInvalidContentWidth = errors.New("invalid content width")
ErrInvalidParamsWidth = errors.New("invalid params width")
ErrInvalidNodeMetaVer = errors.New("invalid node meta version")
ErrInvalidNameIdMapVer = errors.New("invalid name id mapping version")
+ ErrInvalidStaticObjVer = errors.New("invalid static object version")
ErrInvalidNode = errors.New("invalid node")
)
-type StaticObj struct {
- Type uint8
- Pos [3]float32
- Data string
-}
-
func Deserialize(data []byte, idNameMap map[string]mt.Content) (blk *MapBlk, err error) {
r := bytes.NewReader(data)
blk = &MapBlk{}
@@ -68,7 +45,7 @@ func Deserialize(data []byte, idNameMap map[string]mt.Content) (blk *MapBlk, err
return nil, err
}
- if contentWidth != 2 {
+ if contentWidth != ContentWidth {
return nil, ErrInvalidContentWidth
}
@@ -77,7 +54,7 @@ func Deserialize(data []byte, idNameMap map[string]mt.Content) (blk *MapBlk, err
return nil, err
}
- if paramsWidth != 2 {
+ if paramsWidth != ParamsWidth {
return nil, ErrInvalidParamsWidth
}
@@ -112,7 +89,7 @@ func Deserialize(data []byte, idNameMap map[string]mt.Content) (blk *MapBlk, err
return nil, err
}
- if version != 2 {
+ if version != NodeMetaVer {
return nil, ErrInvalidNodeMetaVer
}
@@ -187,6 +164,10 @@ func Deserialize(data []byte, idNameMap map[string]mt.Content) (blk *MapBlk, err
return nil, err
}
+ if staticObjVer != StaticObjVer {
+ return nil, ErrInvalidStaticObjVer
+ }
+
var staticObjCount uint16
if err := binary.Read(r, binary.BigEndian, &staticObjCount); err != nil {
return nil, err
@@ -235,7 +216,7 @@ func Deserialize(data []byte, idNameMap map[string]mt.Content) (blk *MapBlk, err
return nil, err
}
- if nameIdMapVer != 0 {
+ if nameIdMapVer != NameIdMapVer {
return nil, ErrInvalidNameIdMapVer
}
@@ -252,7 +233,7 @@ func Deserialize(data []byte, idNameMap map[string]mt.Content) (blk *MapBlk, err
return nil, err
}
- var nameLen mt.Content
+ var nameLen uint16
if err := binary.Read(r, binary.BigEndian, &nameLen); err != nil {
return nil, err
}
diff --git a/serialize.go b/serialize.go
new file mode 100644
index 0000000..6fdf68d
--- /dev/null
+++ b/serialize.go
@@ -0,0 +1,176 @@
+package mtmap
+
+import (
+ "bytes"
+ "compress/zlib"
+ "encoding/binary"
+ "github.com/anon55555/mt"
+ "io"
+)
+
+func Serialize(blk *MapBlk, w io.Writer, idNameMap map[string]mt.Content) error {
+ if err := binary.Write(w, binary.BigEndian, &SerializeVer); err != nil {
+ return err
+ }
+
+ if err := binary.Write(w, binary.BigEndian, &blk.Flags); err != nil {
+ return err
+ }
+
+ if err := binary.Write(w, binary.BigEndian, &blk.LightingComplete); err != nil {
+ return err
+ }
+
+ if err := binary.Write(w, binary.BigEndian, &ContentWidth); err != nil {
+ return err
+ }
+
+ if err := binary.Write(w, binary.BigEndian, &ParamsWidth); err != nil {
+ return err
+ }
+
+ {
+ var buf bytes.Buffer
+ zw := zlib.NewWriter(&buf)
+
+ if err := binary.Write(zw, binary.BigEndian, &blk.Param0); err != nil {
+ return err
+ }
+
+ if err := zw.Close(); err != nil {
+ return err
+ }
+
+ if _, err := buf.WriteTo(w); err != nil {
+ return err
+ }
+ }
+
+ {
+ var buf bytes.Buffer
+ zw := zlib.NewWriter(&buf)
+
+ if err := binary.Write(zw, binary.BigEndian, &NodeMetaVer); err != nil {
+ return err
+ }
+
+ var count = uint16(len(blk.NodeMetas))
+ if err := binary.Write(zw, binary.BigEndian, &count); err != nil {
+ return err
+ }
+
+ for pos, data := range blk.NodeMetas {
+ if err := binary.Write(zw, binary.BigEndian, &pos); err != nil {
+ return err
+ }
+
+ var num = uint32(len(data.Fields))
+ if err := binary.Write(zw, binary.BigEndian, &num); err != nil {
+ return err
+ }
+
+ for _, field := range data.Fields {
+ var lenName = uint16(len(field.Name))
+ if err := binary.Write(zw, binary.BigEndian, &lenName); err != nil {
+ return err
+ }
+
+ var name = []byte(field.Name)
+ if err := binary.Write(zw, binary.BigEndian, &name); err != nil {
+ return err
+ }
+
+ var lenValue = uint32(len(field.Value))
+ if err := binary.Write(zw, binary.BigEndian, &lenValue); err != nil {
+ return err
+ }
+
+ var value = []byte(field.Value)
+ if err := binary.Write(zw, binary.BigEndian, &value); err != nil {
+ return err
+ }
+
+ if err := binary.Write(zw, binary.BigEndian, &field.Private); err != nil {
+ return err
+ }
+ }
+
+ if err := data.Inv.Serialize(zw); err != nil {
+ return err
+ }
+ }
+
+ if err := zw.Close(); err != nil {
+ return err
+ }
+
+ if _, err := buf.WriteTo(w); err != nil {
+ return err
+ }
+ }
+
+ if err := binary.Write(w, binary.BigEndian, &StaticObjVer); err != nil {
+ return err
+ }
+
+ var staticObjCount = uint16(len(blk.StaticObjs))
+ if err := binary.Write(w, binary.BigEndian, &staticObjCount); err != nil {
+ return err
+ }
+
+ for _, obj := range blk.StaticObjs {
+ if err := binary.Write(w, binary.BigEndian, &obj.Type); err != nil {
+ return err
+ }
+
+ var pos = [3]int32{
+ int32(obj.Pos[0] * 1000.0),
+ int32(obj.Pos[1] * 1000.0),
+ int32(obj.Pos[2] * 1000.0),
+ }
+ if err := binary.Write(w, binary.BigEndian, &pos); err != nil {
+ return err
+ }
+
+ var dataLen = uint16(len(obj.Data))
+ if err := binary.Write(w, binary.BigEndian, &dataLen); err != nil {
+ return err
+ }
+
+ var data = []byte(obj.Data)
+ if err := binary.Write(w, binary.BigEndian, &data); err != nil {
+ return err
+ }
+ }
+
+ if err := binary.Write(w, binary.BigEndian, &blk.Timestamp); err != nil {
+ return err
+ }
+
+ if err := binary.Write(w, binary.BigEndian, &NameIdMapVer); err != nil {
+ return err
+ }
+
+ var nameIdMapCount = uint16(len(idNameMap))
+ if err := binary.Write(w, binary.BigEndian, &nameIdMapCount); err != nil {
+ return err
+ }
+
+ for name, id := range idNameMap {
+ if err := binary.Write(w, binary.BigEndian, &id); err != nil {
+ return err
+ }
+
+ var nameLen = uint16(len(name))
+ if err := binary.Write(w, binary.BigEndian, &nameLen); err != nil {
+ return err
+ }
+
+ var name = []byte(name)
+ if err := binary.Write(w, binary.BigEndian, &name); err != nil {
+ return err
+ }
+ }
+
+ return nil
+}
diff --git a/types.go b/types.go
new file mode 100644
index 0000000..abb02e2
--- /dev/null
+++ b/types.go
@@ -0,0 +1,36 @@
+package mtmap
+
+import (
+ "github.com/anon55555/mt"
+)
+
+type MapBlk struct {
+ mt.MapBlk
+ Flags MapBlkFlags
+ LightingComplete uint16
+ StaticObjs []StaticObj
+ Timestamp uint32
+}
+
+type MapBlkFlags uint8
+
+const (
+ IsUnderground MapBlkFlags = 1 << iota
+ DayNightDiffers
+ NotGenerated = 1 << 4
+)
+
+var (
+ SerializeVer uint8 = 28
+ ContentWidth uint8 = 2
+ ParamsWidth uint8 = 2
+ NodeMetaVer uint8 = 2
+ StaticObjVer uint8 = 0
+ NameIdMapVer uint8 = 0
+)
+
+type StaticObj struct {
+ Type uint8
+ Pos [3]float32
+ Data string
+}