diff --git a/chat/message.go b/chat/message.go index 85f0253f..183a0d7f 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"` + 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/chat/nbtmessage_test.go b/chat/nbtmessage_test.go new file mode 100644 index 00000000..d90b2774 --- /dev/null +++ b/chat/nbtmessage_test.go @@ -0,0 +1,21 @@ +package chat + +import ( + "github.com/Tnze/go-mc/nbt" + "os" + "testing" +) + +func TestNbtExtraText(t *testing.T) { + //SNBT: {extra: [{extra: [{color: "dark_gray",text: "> "},{: "test"}],text: ""}],text: ""} + f, _ := os.Open("testdata/chat.nbt") + d := nbt.NewDecoder(f) + var m Message + if _, err := d.Decode(&m); err != nil { + t.Fatal(err) + } + + if m.ClearString() != "> test" { + t.Fatalf("gets %q, wants %q", m.ClearString(), "> test") + } +} diff --git a/chat/testdata/chat.nbt b/chat/testdata/chat.nbt new file mode 100644 index 00000000..19f100d4 Binary files /dev/null and b/chat/testdata/chat.nbt differ diff --git a/nbt/decode.go b/nbt/decode.go index e5589ddc..4ddefe25 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 5cc96383..bac6293e 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, }