Files
go-mc/chat/nbtmessage.go
2024-04-27 22:54:37 +08:00

55 lines
1.3 KiB
Go

package chat
import (
"bytes"
"errors"
"io"
"strconv"
"github.com/Tnze/go-mc/nbt"
pk "github.com/Tnze/go-mc/net/packet"
)
// ReadFrom decode Message in a Text component
func (m *Message) ReadFrom(r io.Reader) (int64, error) {
return pk.NBT(m).ReadFrom(r)
}
// WriteTo encode Message into a Text component
func (m Message) WriteTo(w io.Writer) (int64, error) {
return pk.NBT(&m).WriteTo(w)
}
func (m Message) TagType() byte {
return nbt.TagCompound
}
func (m Message) MarshalNBT(w io.Writer) error {
if m.Translate != "" {
return nbt.NewEncoder(w).Encode(translateMsg(m), "")
} else {
return nbt.NewEncoder(w).Encode(rawMsgStruct(m), "")
}
}
func (m *Message) UnmarshalNBT(tagType byte, r nbt.DecoderReader) error {
// Re-combine the tagType into the reader, and create a nbt decoder
tagReader := bytes.NewReader([]byte{tagType})
decoder := nbt.NewDecoder(io.MultiReader(tagReader, r))
decoder.NetworkFormat(true) // TagType directlly followed the body
switch tagType {
case nbt.TagString:
_, err := decoder.Decode(&m.Text)
return err
case nbt.TagCompound:
_, err := decoder.Decode((*rawMsgStruct)(m))
return err
case nbt.TagList:
_, err := decoder.Decode(&m.Extra)
return err
default:
return errors.New("unknown chat message type: '" + strconv.FormatUint(uint64(tagType), 16) + "'")
}
}