]> git.lizzy.rs Git - mtmap.git/blobdiff - deserialize.go
Merge pull request #2 from ev2-1/master
[mtmap.git] / deserialize.go
index 7e3ffb68c5a9d2e9e007e9b7070666588db69596..73406aa0c16b91f33c1ea4774ef34a5aa7ea6a47 100644 (file)
@@ -4,7 +4,6 @@ import (
        "compress/zlib"
        "encoding/binary"
        "errors"
-       "fmt"
        "github.com/anon55555/mt"
        "io"
 )
@@ -18,22 +17,6 @@ var (
        ErrInvalidStaticObjVer = errors.New("invalid static object version")
 )
 
-type ErrInvalidNodeName struct {
-       Name string
-}
-
-func (e ErrInvalidNodeName) Error() string {
-       return fmt.Sprintf("invalid node %v", e.Name)
-}
-
-type ErrInvalidNodeId struct {
-       Id mt.Content
-}
-
-func (e ErrInvalidNodeId) Error() string {
-       return fmt.Sprintf("invalid node %v", e.Id)
-}
-
 func Deserialize(r io.Reader, idNameMap map[string]mt.Content) *MapBlk {
        var blk = &MapBlk{}
 
@@ -82,7 +65,11 @@ func Deserialize(r io.Reader, idNameMap map[string]mt.Content) *MapBlk {
                        panic(err)
                }
 
-               if _, err := io.Copy(io.Discard, r); err != nil {
+               if err := binary.Read(r, binary.BigEndian, &blk.Param1); err != nil {
+                       panic(err)
+               }
+
+               if err := binary.Read(r, binary.BigEndian, &blk.Param2); err != nil {
                        panic(err)
                }
 
@@ -103,69 +90,67 @@ func Deserialize(r io.Reader, idNameMap map[string]mt.Content) *MapBlk {
                        panic(err)
                }
 
-               if version != NodeMetaVer {
-                       panic(ErrInvalidNodeMetaVer)
-               }
-
-               var count uint16
-               if err := binary.Read(r, binary.BigEndian, &count); err != nil {
-                       panic(err)
-               }
-
-               for i := uint16(0); i < count; i++ {
-                       var pos uint16
-                       if err := binary.Read(r, binary.BigEndian, &pos); err != nil {
-                               panic(err)
+               if version != 0 {
+                       if version != NodeMetaVer {
+                               panic(ErrInvalidNodeMetaVer)
                        }
 
-                       var num uint32
-                       if err := binary.Read(r, binary.BigEndian, &num); err != nil {
+                       var count uint16
+                       if err := binary.Read(r, binary.BigEndian, &count); err != nil {
                                panic(err)
                        }
 
-                       var data = &mt.NodeMeta{}
-                       data.Fields = make([]mt.NodeMetaField, 0)
-                       for j := uint32(0); j < num; j++ {
-                               var field mt.NodeMetaField
-
-                               var lenName uint16
-                               if err := binary.Read(r, binary.BigEndian, &lenName); err != nil {
-                                       panic(err)
-                               }
-
-                               var name = make([]byte, lenName)
-                               if err := binary.Read(r, binary.BigEndian, &name); err != nil {
+                       for i := uint16(0); i < count; i++ {
+                               var pos uint16
+                               if err := binary.Read(r, binary.BigEndian, &pos); err != nil {
                                        panic(err)
                                }
-                               field.Name = string(name)
 
-                               var lenValue uint32
-                               if err := binary.Read(r, binary.BigEndian, &lenValue); err != nil {
+                               var num uint32
+                               if err := binary.Read(r, binary.BigEndian, &num); err != nil {
                                        panic(err)
                                }
 
-                               var value = make([]byte, lenValue)
-                               if err := binary.Read(r, binary.BigEndian, &value); err != nil {
-                                       panic(err)
+                               var data = &mt.NodeMeta{}
+                               data.Fields = make([]mt.NodeMetaField, 0)
+                               for j := uint32(0); j < num; j++ {
+                                       var field mt.NodeMetaField
+
+                                       var lenName uint16
+                                       if err := binary.Read(r, binary.BigEndian, &lenName); err != nil {
+                                               panic(err)
+                                       }
+
+                                       var name = make([]byte, lenName)
+                                       if err := binary.Read(r, binary.BigEndian, &name); err != nil {
+                                               panic(err)
+                                       }
+                                       field.Name = string(name)
+
+                                       var lenValue uint32
+                                       if err := binary.Read(r, binary.BigEndian, &lenValue); err != nil {
+                                               panic(err)
+                                       }
+
+                                       var value = make([]byte, lenValue)
+                                       if err := binary.Read(r, binary.BigEndian, &value); err != nil {
+                                               panic(err)
+                                       }
+                                       field.Value = string(value)
+
+                                       if err := binary.Read(r, binary.BigEndian, &field.Private); err != nil {
+                                               panic(err)
+                                       }
+
+                                       data.Fields = append(data.Fields, field)
                                }
-                               field.Value = string(value)
 
-                               if err := binary.Read(r, binary.BigEndian, &field.Private); err != nil {
+                               if err := data.Inv.Deserialize(r); err != nil {
                                        panic(err)
                                }
 
-                               data.Fields = append(data.Fields, field)
-                       }
-
-                       if err := data.Inv.Deserialize(r); err != nil {
-                               panic(err)
+                               blk.NodeMetas[pos] = data
                        }
-
-                       blk.NodeMetas[pos] = data
-               }
-
-               if _, err := io.Copy(io.Discard, r); err != nil {
-                       panic(err)
                }
 
                if err := r.Close(); err != nil {
@@ -261,14 +246,25 @@ func Deserialize(r io.Reader, idNameMap map[string]mt.Content) *MapBlk {
        }
 
        for i := 0; i < 4096; i++ {
-               name, ok := nameIdMap[blk.Param0[i]]
+               id := blk.Param0[i]
+
+               name, ok := nameIdMap[id]
                if !ok {
-                       panic(ErrInvalidNodeId{blk.Param0[i]})
+                       name = "unknown"
                }
 
-               id, ok := idNameMap[name]
-               if !ok {
-                       panic(ErrInvalidNodeName{name})
+               switch name {
+               case "unknown":
+                       id = mt.Unknown
+               case "air":
+                       id = mt.Air
+               case "ignore":
+                       id = mt.Ignore
+               default:
+                       id, ok = idNameMap[name]
+                       if !ok {
+                               id = mt.Unknown
+                       }
                }
 
                blk.Param0[i] = id