diff --git a/chat/message.go b/chat/message.go index 6a4061e..cf983b1 100644 --- a/chat/message.go +++ b/chat/message.go @@ -51,7 +51,7 @@ const ( // Message is a message sent by other type Message struct { - Text string `json:"text" nbt:"text,omitempty"` + Text string `json:"text" nbt:"text,default"` Bold bool `json:"bold,omitempty" nbt:"bold,omitempty"` // 粗体 Italic bool `json:"italic,omitempty" nbt:"italic,omitempty"` // 斜体 diff --git a/nbt/decode.go b/nbt/decode.go index e5589dd..4ddefe2 100644 --- a/nbt/decode.go +++ b/nbt/decode.go @@ -387,7 +387,7 @@ func (d *Decoder) unmarshal(val reflect.Value, tagType byte) error { // Fall back to linear search. for i := range fields.list { ff := &fields.list[i] - if strings.EqualFold(ff.name, tn) { + if strings.EqualFold(ff.name, tn) || ff.asDefault && tn == "" { f = ff break } diff --git a/nbt/typeinfo.go b/nbt/typeinfo.go index 5cc9638..bac6293 100644 --- a/nbt/typeinfo.go +++ b/nbt/typeinfo.go @@ -19,6 +19,7 @@ type field struct { index []int typ reflect.Type omitEmpty bool + asDefault bool asList bool } @@ -105,7 +106,7 @@ func typeFields(t reflect.Type) (tInfo structFields) { } // parse options - var omitEmpty, asList bool + var omitEmpty, asList, asDefault bool for opts != "" { var name string name, opts, _ = strings.Cut(opts, ",") @@ -114,6 +115,8 @@ func typeFields(t reflect.Type) (tInfo structFields) { omitEmpty = true case "list": asList = true + case "default": + asDefault = true } } // Deprecated: use `nbt:",list"` instead. @@ -133,6 +136,7 @@ func typeFields(t reflect.Type) (tInfo structFields) { index: index, typ: ft, omitEmpty: omitEmpty, + asDefault: asDefault, asList: asList, }