84 lines
1.8 KiB
Go
84 lines
1.8 KiB
Go
package commands
|
|
|
|
import (
|
|
"bytes"
|
|
"compress/zlib"
|
|
"encoding/binary"
|
|
"fmt"
|
|
"io"
|
|
)
|
|
|
|
type NodeDefinition struct {
|
|
ID uint16
|
|
}
|
|
|
|
func (def *NodeDefinition) Parse(data []byte) error {
|
|
//TODO: more fields
|
|
return nil
|
|
}
|
|
|
|
func (def *NodeDefinition) String() string {
|
|
return fmt.Sprintf("{NodeDefinition ID=%d}", def.ID)
|
|
}
|
|
|
|
type ServerNodeDefinitions struct {
|
|
Version uint8
|
|
Count uint16
|
|
Definitions []*NodeDefinition
|
|
}
|
|
|
|
func (p *ServerNodeDefinitions) GetCommandId() uint16 {
|
|
return ServerCommandNodeDefinitions
|
|
}
|
|
|
|
func (p *ServerNodeDefinitions) MarshalPacket() ([]byte, error) {
|
|
return nil, nil
|
|
}
|
|
|
|
func (p *ServerNodeDefinitions) UnmarshalPacket(payload []byte) error {
|
|
p.Definitions = make([]*NodeDefinition, 0)
|
|
r, err := zlib.NewReader(bytes.NewReader(payload[4:]))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
buf := bytes.NewBuffer([]byte{})
|
|
_, err = io.Copy(buf, r)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
raw_nodes := buf.Bytes()
|
|
p.Version = raw_nodes[0]
|
|
p.Count = binary.BigEndian.Uint16(raw_nodes[1:])
|
|
|
|
//fmt.Printf("Nodedefs: version=%d, count=%d\n", p.Version, p.Count)
|
|
|
|
nodedefs_size := binary.BigEndian.Uint32(raw_nodes[3:])
|
|
nodedefs_raw := raw_nodes[7 : 7+nodedefs_size]
|
|
|
|
offset := 0
|
|
for i := 0; i < int(p.Count); i++ {
|
|
//fmt.Println(fmt.Sprint(nodedefs_raw[offset : offset+10]))
|
|
nodeid := binary.BigEndian.Uint16(nodedefs_raw[offset:])
|
|
offset += 2
|
|
//fmt.Println(nodeid)
|
|
|
|
nodedef_size := binary.BigEndian.Uint16(nodedefs_raw[offset:])
|
|
offset += 2
|
|
nodedef_raw := nodedefs_raw[offset : offset+int(nodedef_size)]
|
|
nodedef := &NodeDefinition{ID: nodeid}
|
|
nodedef.Parse(nodedef_raw)
|
|
|
|
p.Definitions = append(p.Definitions, nodedef)
|
|
|
|
offset += int(nodedef_size)
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (p *ServerNodeDefinitions) String() string {
|
|
return fmt.Sprintf("{ServerNodeDefinitions Version=%d, Count=%d, Definitions=%s}", p.Version, p.Count, p.Definitions)
|
|
}
|