From 680d399c2dddff2fea116afe8bf961161ec59083 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=92=9F=E8=92=BB?= Date: Sat, 23 Aug 2025 18:55:44 +0800 Subject: [PATCH] update protocol codecs: refine type definitions, fix inconsistent naming, and enhance component handling --- pkg/protocol/component/codecs.go | 96 +++--- .../packet/configuration/client/codecs.go | 96 +++--- pkg/protocol/packet/game/client/codecs.go | 292 +++++++++--------- .../packet/game/client/recipe_book_add.go | 2 +- pkg/protocol/packet/game/server/codecs.go | 96 +++--- pkg/protocol/slot/display/slot/codecs.go | 8 +- .../slot/display/slot/slot_display.go | 17 +- pkg/protocol/slot/item_stack.go | 3 +- 8 files changed, 311 insertions(+), 299 deletions(-) diff --git a/pkg/protocol/component/codecs.go b/pkg/protocol/component/codecs.go index 4272e95..71a3ea6 100644 --- a/pkg/protocol/component/codecs.go +++ b/pkg/protocol/component/codecs.go @@ -3698,6 +3698,54 @@ func (a *Int32PrefixedArrayVarIntArray) ReadFrom(r io.Reader) (n int64, err erro return n, err } +// Float32VarIntArray a utility type for encoding/decoding packet.Float -> float32[packet.VarInt] slice. +type Float32VarIntArray []float32 + +func (a Float32VarIntArray) WriteTo(w io.Writer) (n int64, err error) { + size := len(a) + nn, err := packet.VarInt(size).WriteTo(w) + if err != nil { + return n, err + } + n += nn + for i := 0; i < size; i++ { + nn, err := packet.Float(a[i]).WriteTo(w) + n += nn + if err != nil { + return n, err + } + } + return n, nil +} + +func (a *Float32VarIntArray) ReadFrom(r io.Reader) (n int64, err error) { + var size packet.VarInt + nn, err := size.ReadFrom(r) + n += nn + if err != nil { + return n, err + } + if size < 0 { + return n, errors.New("array length less than zero") + } + + if cap(*a) >= int(size) { + *a = (*a)[:int(size)] + } else { + *a = make(Float32VarIntArray, int(size)) + } + + for i := 0; i < int(size); i++ { + nn, err = (*packet.Float)(&(*a)[i]).ReadFrom(r) + n += nn + if err != nil { + return n, err + } + } + + return n, err +} + // BoolVarIntArray a utility type for encoding/decoding packet.Boolean -> bool[packet.VarInt] slice. type BoolVarIntArray []bool @@ -3841,51 +3889,3 @@ func (a *Int32VarIntVarIntArray) ReadFrom(r io.Reader) (n int64, err error) { return n, err } - -// Float32VarIntArray a utility type for encoding/decoding packet.Float -> float32[packet.VarInt] slice. -type Float32VarIntArray []float32 - -func (a Float32VarIntArray) WriteTo(w io.Writer) (n int64, err error) { - size := len(a) - nn, err := packet.VarInt(size).WriteTo(w) - if err != nil { - return n, err - } - n += nn - for i := 0; i < size; i++ { - nn, err := packet.Float(a[i]).WriteTo(w) - n += nn - if err != nil { - return n, err - } - } - return n, nil -} - -func (a *Float32VarIntArray) ReadFrom(r io.Reader) (n int64, err error) { - var size packet.VarInt - nn, err := size.ReadFrom(r) - n += nn - if err != nil { - return n, err - } - if size < 0 { - return n, errors.New("array length less than zero") - } - - if cap(*a) >= int(size) { - *a = (*a)[:int(size)] - } else { - *a = make(Float32VarIntArray, int(size)) - } - - for i := 0; i < int(size); i++ { - nn, err = (*packet.Float)(&(*a)[i]).ReadFrom(r) - n += nn - if err != nil { - return n, err - } - } - - return n, err -} diff --git a/pkg/protocol/packet/configuration/client/codecs.go b/pkg/protocol/packet/configuration/client/codecs.go index 6088480..20b6882 100644 --- a/pkg/protocol/packet/configuration/client/codecs.go +++ b/pkg/protocol/packet/configuration/client/codecs.go @@ -343,54 +343,6 @@ func (c ConfigUpdateEnabledFeatures) WriteTo(w io.Writer) (n int64, err error) { return n, err } -// Int8VarIntArray a utility type for encoding/decoding packet.Byte -> int8[packet.VarInt] slice. -type Int8VarIntArray []int8 - -func (a Int8VarIntArray) WriteTo(w io.Writer) (n int64, err error) { - size := len(a) - nn, err := packet.VarInt(size).WriteTo(w) - if err != nil { - return n, err - } - n += nn - for i := 0; i < size; i++ { - nn, err := packet.Byte(a[i]).WriteTo(w) - n += nn - if err != nil { - return n, err - } - } - return n, nil -} - -func (a *Int8VarIntArray) ReadFrom(r io.Reader) (n int64, err error) { - var size packet.VarInt - nn, err := size.ReadFrom(r) - n += nn - if err != nil { - return n, err - } - if size < 0 { - return n, errors.New("array length less than zero") - } - - if cap(*a) >= int(size) { - *a = (*a)[:int(size)] - } else { - *a = make(Int8VarIntArray, int(size)) - } - - for i := 0; i < int(size); i++ { - nn, err = (*packet.Byte)(&(*a)[i]).ReadFrom(r) - n += nn - if err != nil { - return n, err - } - } - - return n, err -} - // StringIdentifierVarIntArray a utility type for encoding/decoding packet.Identifier -> string[packet.VarInt] slice. type StringIdentifierVarIntArray []string @@ -438,3 +390,51 @@ func (a *StringIdentifierVarIntArray) ReadFrom(r io.Reader) (n int64, err error) return n, err } + +// Int8VarIntArray a utility type for encoding/decoding packet.Byte -> int8[packet.VarInt] slice. +type Int8VarIntArray []int8 + +func (a Int8VarIntArray) WriteTo(w io.Writer) (n int64, err error) { + size := len(a) + nn, err := packet.VarInt(size).WriteTo(w) + if err != nil { + return n, err + } + n += nn + for i := 0; i < size; i++ { + nn, err := packet.Byte(a[i]).WriteTo(w) + n += nn + if err != nil { + return n, err + } + } + return n, nil +} + +func (a *Int8VarIntArray) ReadFrom(r io.Reader) (n int64, err error) { + var size packet.VarInt + nn, err := size.ReadFrom(r) + n += nn + if err != nil { + return n, err + } + if size < 0 { + return n, errors.New("array length less than zero") + } + + if cap(*a) >= int(size) { + *a = (*a)[:int(size)] + } else { + *a = make(Int8VarIntArray, int(size)) + } + + for i := 0; i < int(size); i++ { + nn, err = (*packet.Byte)(&(*a)[i]).ReadFrom(r) + n += nn + if err != nil { + return n, err + } + } + + return n, err +} diff --git a/pkg/protocol/packet/game/client/codecs.go b/pkg/protocol/packet/game/client/codecs.go index a077b25..630b10b 100644 --- a/pkg/protocol/packet/game/client/codecs.go +++ b/pkg/protocol/packet/game/client/codecs.go @@ -3623,7 +3623,7 @@ func (c *Recipe) ReadFrom(r io.Reader) (n int64, err error) { return n, err } if c.HasIngredients { - temp, err = (&c.Ingredients).ReadFrom(r) + temp, err = packet.Array(&c.Ingredients).ReadFrom(r) n += temp if err != nil { return n, err @@ -3665,7 +3665,7 @@ func (c Recipe) WriteTo(w io.Writer) (n int64, err error) { return n, err } if c.HasIngredients { - temp, err = (&c.Ingredients).WriteTo(w) + temp, err = packet.Array(&c.Ingredients).WriteTo(w) n += temp if err != nil { return n, err @@ -7067,102 +7067,6 @@ func (c Waypoint) WriteTo(w io.Writer) (n int64, err error) { return n, err } -// Int64VarLongVarIntArray a utility type for encoding/decoding packet.VarLong -> int64[packet.VarInt] slice. -type Int64VarLongVarIntArray []int64 - -func (a Int64VarLongVarIntArray) WriteTo(w io.Writer) (n int64, err error) { - size := len(a) - nn, err := packet.VarInt(size).WriteTo(w) - if err != nil { - return n, err - } - n += nn - for i := 0; i < size; i++ { - nn, err := packet.VarLong(a[i]).WriteTo(w) - n += nn - if err != nil { - return n, err - } - } - return n, nil -} - -func (a *Int64VarLongVarIntArray) ReadFrom(r io.Reader) (n int64, err error) { - var size packet.VarInt - nn, err := size.ReadFrom(r) - n += nn - if err != nil { - return n, err - } - if size < 0 { - return n, errors.New("array length less than zero") - } - - if cap(*a) >= int(size) { - *a = (*a)[:int(size)] - } else { - *a = make(Int64VarLongVarIntArray, int(size)) - } - - for i := 0; i < int(size); i++ { - nn, err = (*packet.VarLong)(&(*a)[i]).ReadFrom(r) - n += nn - if err != nil { - return n, err - } - } - - return n, err -} - -// Int8ByteVarIntArray a utility type for encoding/decoding packet.Byte -> int8[packet.VarInt] slice. -type Int8ByteVarIntArray []int8 - -func (a Int8ByteVarIntArray) WriteTo(w io.Writer) (n int64, err error) { - size := len(a) - nn, err := packet.VarInt(size).WriteTo(w) - if err != nil { - return n, err - } - n += nn - for i := 0; i < size; i++ { - nn, err := packet.Byte(a[i]).WriteTo(w) - n += nn - if err != nil { - return n, err - } - } - return n, nil -} - -func (a *Int8ByteVarIntArray) ReadFrom(r io.Reader) (n int64, err error) { - var size packet.VarInt - nn, err := size.ReadFrom(r) - n += nn - if err != nil { - return n, err - } - if size < 0 { - return n, errors.New("array length less than zero") - } - - if cap(*a) >= int(size) { - *a = (*a)[:int(size)] - } else { - *a = make(Int8ByteVarIntArray, int(size)) - } - - for i := 0; i < int(size); i++ { - nn, err = (*packet.Byte)(&(*a)[i]).ReadFrom(r) - n += nn - if err != nil { - return n, err - } - } - - return n, err -} - // Int8VarIntArray a utility type for encoding/decoding packet.Byte -> int8[packet.VarInt] slice. type Int8VarIntArray []int8 @@ -7307,54 +7211,6 @@ func (a *StringIdentifierVarIntArray) ReadFrom(r io.Reader) (n int64, err error) return n, err } -// UuidUUIDUUIDVarIntArray a utility type for encoding/decoding packet.UUID -> uuid.UUID[packet.VarInt] slice. -type UuidUUIDUUIDVarIntArray []uuid.UUID - -func (a UuidUUIDUUIDVarIntArray) WriteTo(w io.Writer) (n int64, err error) { - size := len(a) - nn, err := packet.VarInt(size).WriteTo(w) - if err != nil { - return n, err - } - n += nn - for i := 0; i < size; i++ { - nn, err := packet.UUID(a[i]).WriteTo(w) - n += nn - if err != nil { - return n, err - } - } - return n, nil -} - -func (a *UuidUUIDUUIDVarIntArray) ReadFrom(r io.Reader) (n int64, err error) { - var size packet.VarInt - nn, err := size.ReadFrom(r) - n += nn - if err != nil { - return n, err - } - if size < 0 { - return n, errors.New("array length less than zero") - } - - if cap(*a) >= int(size) { - *a = (*a)[:int(size)] - } else { - *a = make(UuidUUIDUUIDVarIntArray, int(size)) - } - - for i := 0; i < int(size); i++ { - nn, err = (*packet.UUID)(&(*a)[i]).ReadFrom(r) - n += nn - if err != nil { - return n, err - } - } - - return n, err -} - // Int32VarIntVarIntArray a utility type for encoding/decoding packet.VarInt -> int32[packet.VarInt] slice. type Int32VarIntVarIntArray []int32 @@ -7403,6 +7259,54 @@ func (a *Int32VarIntVarIntArray) ReadFrom(r io.Reader) (n int64, err error) { return n, err } +// Int64VarLongVarIntArray a utility type for encoding/decoding packet.VarLong -> int64[packet.VarInt] slice. +type Int64VarLongVarIntArray []int64 + +func (a Int64VarLongVarIntArray) WriteTo(w io.Writer) (n int64, err error) { + size := len(a) + nn, err := packet.VarInt(size).WriteTo(w) + if err != nil { + return n, err + } + n += nn + for i := 0; i < size; i++ { + nn, err := packet.VarLong(a[i]).WriteTo(w) + n += nn + if err != nil { + return n, err + } + } + return n, nil +} + +func (a *Int64VarLongVarIntArray) ReadFrom(r io.Reader) (n int64, err error) { + var size packet.VarInt + nn, err := size.ReadFrom(r) + n += nn + if err != nil { + return n, err + } + if size < 0 { + return n, errors.New("array length less than zero") + } + + if cap(*a) >= int(size) { + *a = (*a)[:int(size)] + } else { + *a = make(Int64VarLongVarIntArray, int(size)) + } + + for i := 0; i < int(size); i++ { + nn, err = (*packet.VarLong)(&(*a)[i]).ReadFrom(r) + n += nn + if err != nil { + return n, err + } + } + + return n, err +} + // StringStringVarIntArray a utility type for encoding/decoding packet.String -> string[packet.VarInt] slice. type StringStringVarIntArray []string @@ -7498,3 +7402,99 @@ func (a *StringVarIntArray) ReadFrom(r io.Reader) (n int64, err error) { return n, err } + +// UuidUUIDUUIDVarIntArray a utility type for encoding/decoding packet.UUID -> uuid.UUID[packet.VarInt] slice. +type UuidUUIDUUIDVarIntArray []uuid.UUID + +func (a UuidUUIDUUIDVarIntArray) WriteTo(w io.Writer) (n int64, err error) { + size := len(a) + nn, err := packet.VarInt(size).WriteTo(w) + if err != nil { + return n, err + } + n += nn + for i := 0; i < size; i++ { + nn, err := packet.UUID(a[i]).WriteTo(w) + n += nn + if err != nil { + return n, err + } + } + return n, nil +} + +func (a *UuidUUIDUUIDVarIntArray) ReadFrom(r io.Reader) (n int64, err error) { + var size packet.VarInt + nn, err := size.ReadFrom(r) + n += nn + if err != nil { + return n, err + } + if size < 0 { + return n, errors.New("array length less than zero") + } + + if cap(*a) >= int(size) { + *a = (*a)[:int(size)] + } else { + *a = make(UuidUUIDUUIDVarIntArray, int(size)) + } + + for i := 0; i < int(size); i++ { + nn, err = (*packet.UUID)(&(*a)[i]).ReadFrom(r) + n += nn + if err != nil { + return n, err + } + } + + return n, err +} + +// Int8ByteVarIntArray a utility type for encoding/decoding packet.Byte -> int8[packet.VarInt] slice. +type Int8ByteVarIntArray []int8 + +func (a Int8ByteVarIntArray) WriteTo(w io.Writer) (n int64, err error) { + size := len(a) + nn, err := packet.VarInt(size).WriteTo(w) + if err != nil { + return n, err + } + n += nn + for i := 0; i < size; i++ { + nn, err := packet.Byte(a[i]).WriteTo(w) + n += nn + if err != nil { + return n, err + } + } + return n, nil +} + +func (a *Int8ByteVarIntArray) ReadFrom(r io.Reader) (n int64, err error) { + var size packet.VarInt + nn, err := size.ReadFrom(r) + n += nn + if err != nil { + return n, err + } + if size < 0 { + return n, errors.New("array length less than zero") + } + + if cap(*a) >= int(size) { + *a = (*a)[:int(size)] + } else { + *a = make(Int8ByteVarIntArray, int(size)) + } + + for i := 0; i < int(size); i++ { + nn, err = (*packet.Byte)(&(*a)[i]).ReadFrom(r) + n += nn + if err != nil { + return n, err + } + } + + return n, err +} diff --git a/pkg/protocol/packet/game/client/recipe_book_add.go b/pkg/protocol/packet/game/client/recipe_book_add.go index 5a190fd..a6af0ca 100644 --- a/pkg/protocol/packet/game/client/recipe_book_add.go +++ b/pkg/protocol/packet/game/client/recipe_book_add.go @@ -18,7 +18,7 @@ type Recipe struct { CategoryID int32 `mc:"VarInt"` HasIngredients bool //opt:optional:HasIngredients - Ingredients RecipeIngredients + Ingredients []pk.IDSet Flags int8 } diff --git a/pkg/protocol/packet/game/server/codecs.go b/pkg/protocol/packet/game/server/codecs.go index 4b072fd..e9f3ae5 100644 --- a/pkg/protocol/packet/game/server/codecs.go +++ b/pkg/protocol/packet/game/server/codecs.go @@ -2728,54 +2728,6 @@ func (c UseItemOn) WriteTo(w io.Writer) (n int64, err error) { return n, err } -// Int8ByteVarIntArray a utility type for encoding/decoding packet.Byte -> int8[packet.VarInt] slice. -type Int8ByteVarIntArray []int8 - -func (a Int8ByteVarIntArray) WriteTo(w io.Writer) (n int64, err error) { - size := len(a) - nn, err := packet.VarInt(size).WriteTo(w) - if err != nil { - return n, err - } - n += nn - for i := 0; i < size; i++ { - nn, err := packet.Byte(a[i]).WriteTo(w) - n += nn - if err != nil { - return n, err - } - } - return n, nil -} - -func (a *Int8ByteVarIntArray) ReadFrom(r io.Reader) (n int64, err error) { - var size packet.VarInt - nn, err := size.ReadFrom(r) - n += nn - if err != nil { - return n, err - } - if size < 0 { - return n, errors.New("array length less than zero") - } - - if cap(*a) >= int(size) { - *a = (*a)[:int(size)] - } else { - *a = make(Int8ByteVarIntArray, int(size)) - } - - for i := 0; i < int(size); i++ { - nn, err = (*packet.Byte)(&(*a)[i]).ReadFrom(r) - n += nn - if err != nil { - return n, err - } - } - - return n, err -} - // StringVarIntArray a utility type for encoding/decoding packet.String -> string[packet.VarInt] slice. type StringVarIntArray []string @@ -2823,3 +2775,51 @@ func (a *StringVarIntArray) ReadFrom(r io.Reader) (n int64, err error) { return n, err } + +// Int8ByteVarIntArray a utility type for encoding/decoding packet.Byte -> int8[packet.VarInt] slice. +type Int8ByteVarIntArray []int8 + +func (a Int8ByteVarIntArray) WriteTo(w io.Writer) (n int64, err error) { + size := len(a) + nn, err := packet.VarInt(size).WriteTo(w) + if err != nil { + return n, err + } + n += nn + for i := 0; i < size; i++ { + nn, err := packet.Byte(a[i]).WriteTo(w) + n += nn + if err != nil { + return n, err + } + } + return n, nil +} + +func (a *Int8ByteVarIntArray) ReadFrom(r io.Reader) (n int64, err error) { + var size packet.VarInt + nn, err := size.ReadFrom(r) + n += nn + if err != nil { + return n, err + } + if size < 0 { + return n, errors.New("array length less than zero") + } + + if cap(*a) >= int(size) { + *a = (*a)[:int(size)] + } else { + *a = make(Int8ByteVarIntArray, int(size)) + } + + for i := 0; i < int(size); i++ { + nn, err = (*packet.Byte)(&(*a)[i]).ReadFrom(r) + n += nn + if err != nil { + return n, err + } + } + + return n, err +} diff --git a/pkg/protocol/slot/display/slot/codecs.go b/pkg/protocol/slot/display/slot/codecs.go index e8d99c2..3fc04dd 100644 --- a/pkg/protocol/slot/display/slot/codecs.go +++ b/pkg/protocol/slot/display/slot/codecs.go @@ -72,12 +72,12 @@ func (c *SmithingTrim) ReadFrom(r io.Reader) (n int64, err error) { if err != nil { return n, err } - temp, err = (&c.Trim).ReadFrom(r) + temp, err = (&c.Material).ReadFrom(r) n += temp if err != nil { return n, err } - temp, err = (&c.Remainder).ReadFrom(r) + temp, err = (*packet.VarInt)(&c.Pattern).ReadFrom(r) n += temp if err != nil { return n, err @@ -92,12 +92,12 @@ func (c SmithingTrim) WriteTo(w io.Writer) (n int64, err error) { if err != nil { return n, err } - temp, err = (&c.Trim).WriteTo(w) + temp, err = (&c.Material).WriteTo(w) n += temp if err != nil { return n, err } - temp, err = (&c.Remainder).WriteTo(w) + temp, err = (*packet.VarInt)(&c.Pattern).WriteTo(w) n += temp if err != nil { return n, err diff --git a/pkg/protocol/slot/display/slot/slot_display.go b/pkg/protocol/slot/display/slot/slot_display.go index 82f10b5..b9ea80b 100644 --- a/pkg/protocol/slot/display/slot/slot_display.go +++ b/pkg/protocol/slot/display/slot/slot_display.go @@ -1,6 +1,7 @@ package slot import ( + "fmt" "io" "git.konjactw.dev/patyhank/minego/pkg/protocol/slot" @@ -11,6 +12,7 @@ type DisplayType int32 const ( DisplayEmpty DisplayType = iota + DisplayAnyFuel DisplayItem DisplayItemStack DisplayTag @@ -38,37 +40,46 @@ func (s *Display) ReadFrom(r io.Reader) (n int64, err error) { switch displayType { case DisplayEmpty: return + case DisplayAnyFuel: + return case DisplayItem: var item Item if _, err = item.ReadFrom(r); err != nil { return } + s.SlotDisplay = &item case DisplayItemStack: var itemStack ItemStack if _, err = itemStack.ReadFrom(r); err != nil { return } + s.SlotDisplay = &itemStack case DisplayTag: var tag Tag if _, err = tag.ReadFrom(r); err != nil { return } + s.SlotDisplay = &tag case DisplaySmithingTrim: var trim SmithingTrim if _, err = trim.ReadFrom(r); err != nil { return } + s.SlotDisplay = &trim case DisplayWithRemainder: var remainder WithRemainder if _, err = remainder.ReadFrom(r); err != nil { return } + s.SlotDisplay = &remainder case DisplayComposite: var composite Composite if _, err = composite.ReadFrom(r); err != nil { return } + s.SlotDisplay = &composite } + fmt.Println(s.SlotDisplay) return } @@ -106,9 +117,9 @@ func (i Tag) SlotDisplayType() DisplayType { //codec:gen type SmithingTrim struct { - Base Display - Trim Display - Remainder Display + Base Display + Material Display + Pattern int32 `mc:"VarInt"` } func (i SmithingTrim) SlotDisplayType() DisplayType { diff --git a/pkg/protocol/slot/item_stack.go b/pkg/protocol/slot/item_stack.go index e0e04e8..8c3431a 100644 --- a/pkg/protocol/slot/item_stack.go +++ b/pkg/protocol/slot/item_stack.go @@ -103,6 +103,7 @@ func (s *Slot) ReadFrom(r io.Reader) (n int64, err error) { if err != nil { return temp, err } + s.AddComponent = append(s.AddComponent, c) } for i := int32(0); i < removeLens; i++ { @@ -111,7 +112,7 @@ func (s *Slot) ReadFrom(r io.Reader) (n int64, err error) { if err != nil { return temp, err } + s.RemoveComponent = append(s.RemoveComponent, ComponentID(id)) } - return n, nil }