minetest_client/commands/server_node_definitions.go
2021-10-11 11:09:00 +02:00

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)
}