Apply "network nbt" format for net/packet.

examples and tests are updated
This commit is contained in:
Tnze
2023-11-19 02:01:17 +08:00
parent 7d6e65f554
commit 61916db07a
4 changed files with 24 additions and 22 deletions

View File

@ -469,16 +469,15 @@ func (d *Double) ReadFrom(r io.Reader) (n int64, err error) {
//
// When using as [FieldDecoder], unknown fields are not allowed by default.
// For allow unknown fields, using [NBTField] instead.
func NBT(v any, optionalTagName ...string) Field {
if len(optionalTagName) > 0 {
return NBTField{V: v, TagName: optionalTagName[0]}
}
func NBT(v any) Field {
return NBTField{V: v}
}
// NBTField is a NBT warpper for convert any type into a Field, allowing to be pack or unpack with network packets.
//
// After v1.20.2, the "network format" is used. The root tag nolonger have a tag name anymore.
type NBTField struct {
TagName string
V any
V any
AllowUnknownFields bool
}
@ -491,25 +490,27 @@ func (n NBTField) WriteTo(w io.Writer) (int64, error) {
// nbt Encode method does not count written bytes,
// so we warp the writer to count it.
cw := countingWriter{w: w}
err := nbt.NewEncoder(&cw).Encode(n.V, n.TagName)
enc := nbt.NewEncoder(&cw)
enc.NetworkFormat(true)
err := enc.Encode(n.V, "")
return cw.n, err
}
func (n NBTField) ReadFrom(r io.Reader) (int64, error) {
// LimitReader is used to count reader length
cr := countingReader{r: r}
decoder := nbt.NewDecoder(&cr)
dec := nbt.NewDecoder(&cr)
dec.NetworkFormat(true)
if !n.AllowUnknownFields {
decoder.DisallowUnknownFields()
dec.DisallowUnknownFields()
}
tagName, err := decoder.Decode(n.V)
_, err := dec.Decode(n.V)
if err != nil {
if !errors.Is(err, nbt.ErrEND) {
return cr.n, err
}
err = nil
}
n.TagName = tagName
return cr.n, nil
}