55 lines
1.3 KiB
Go
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) + "'")
|
|
}
|
|
}
|