From d694e147fc65cca9b76694e0dfb9a7fa42eb081c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=92=9F=E8=92=BB?= Date: Thu, 28 Aug 2025 16:25:35 +0800 Subject: [PATCH] player info updated and fixes codecs --- pkg/client/client.go | 3 +- pkg/protocol/component/codecs.go | 120 +++--- .../packet/configuration/client/codecs.go | 104 +++--- pkg/protocol/packet/game/client/codecs.go | 342 ++++++++++-------- .../packet/game/client/player_info_update.go | 223 ++++++------ pkg/protocol/packet/game/server/codecs.go | 104 +++--- pkg/protocol/slot/codecs.go | 4 + 7 files changed, 490 insertions(+), 410 deletions(-) diff --git a/pkg/client/client.go b/pkg/client/client.go index adad1ca..0b353f2 100644 --- a/pkg/client/client.go +++ b/pkg/client/client.go @@ -4,6 +4,7 @@ import ( "bytes" "context" "errors" + "fmt" "net" "strconv" @@ -184,7 +185,7 @@ func (b *botClient) handlePackets(ctx context.Context) error { pkt := creator() _, err := pkt.ReadFrom(bytes.NewReader(p.Data)) if err != nil { - // fmt.Printf("Decoding: 0x%x %s %s\n", p.ID, pktID.String(), err.Error()) + fmt.Printf("Decoding: 0x%x %s %s\n", p.ID, pktID.String(), err.Error()) continue } b.packetHandler.HandlePacket(ctx, pkt) diff --git a/pkg/protocol/component/codecs.go b/pkg/protocol/component/codecs.go index b7cf048..306990a 100644 --- a/pkg/protocol/component/codecs.go +++ b/pkg/protocol/component/codecs.go @@ -3633,6 +3633,10 @@ func (a *Int32VarIntArray) ReadFrom(r io.Reader) (n int64, err error) { return n, errors.New("array length less than zero") } + if size > 32767 { + return n, errors.New("array length greater than 32767") + } + if cap(*a) >= int(size) { *a = (*a)[:int(size)] } else { @@ -3681,6 +3685,10 @@ func (a *Int32PrefixedArrayVarIntArray) ReadFrom(r io.Reader) (n int64, err erro return n, errors.New("array length less than zero") } + if size > 32767 { + return n, errors.New("array length greater than 32767") + } + if cap(*a) >= int(size) { *a = (*a)[:int(size)] } else { @@ -3698,6 +3706,58 @@ func (a *Int32PrefixedArrayVarIntArray) ReadFrom(r io.Reader) (n int64, err erro return n, err } +// Int32VarIntVarIntArray a utility type for encoding/decoding packet.VarInt -> int32[packet.VarInt] slice. +type Int32VarIntVarIntArray []int32 + +func (a Int32VarIntVarIntArray) 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.VarInt(a[i]).WriteTo(w) + n += nn + if err != nil { + return n, err + } + } + return n, nil +} + +func (a *Int32VarIntVarIntArray) 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 size > 32767 { + return n, errors.New("array length greater than 32767") + } + + if cap(*a) >= int(size) { + *a = (*a)[:int(size)] + } else { + *a = make(Int32VarIntVarIntArray, int(size)) + } + + for i := 0; i < int(size); i++ { + nn, err = (*packet.VarInt)(&(*a)[i]).ReadFrom(r) + n += nn + if err != nil { + return n, err + } + } + + return n, err +} + // Float32VarIntArray a utility type for encoding/decoding packet.Float -> float32[packet.VarInt] slice. type Float32VarIntArray []float32 @@ -3729,6 +3789,10 @@ func (a *Float32VarIntArray) ReadFrom(r io.Reader) (n int64, err error) { return n, errors.New("array length less than zero") } + if size > 32767 { + return n, errors.New("array length greater than 32767") + } + if cap(*a) >= int(size) { *a = (*a)[:int(size)] } else { @@ -3777,6 +3841,10 @@ func (a *BoolVarIntArray) ReadFrom(r io.Reader) (n int64, err error) { return n, errors.New("array length less than zero") } + if size > 32767 { + return n, errors.New("array length greater than 32767") + } + if cap(*a) >= int(size) { *a = (*a)[:int(size)] } else { @@ -3825,6 +3893,10 @@ func (a *StringVarIntArray) ReadFrom(r io.Reader) (n int64, err error) { return n, errors.New("array length less than zero") } + if size > 32767 { + return n, errors.New("array length greater than 32767") + } + if cap(*a) >= int(size) { *a = (*a)[:int(size)] } else { @@ -3841,51 +3913,3 @@ func (a *StringVarIntArray) ReadFrom(r io.Reader) (n int64, err error) { return n, err } - -// Int32VarIntVarIntArray a utility type for encoding/decoding packet.VarInt -> int32[packet.VarInt] slice. -type Int32VarIntVarIntArray []int32 - -func (a Int32VarIntVarIntArray) 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.VarInt(a[i]).WriteTo(w) - n += nn - if err != nil { - return n, err - } - } - return n, nil -} - -func (a *Int32VarIntVarIntArray) 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(Int32VarIntVarIntArray, int(size)) - } - - for i := 0; i < int(size); i++ { - nn, err = (*packet.VarInt)(&(*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 d4f2e00..4a66838 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 } -// StringIdentifierVarIntArray a utility type for encoding/decoding packet.Identifier -> string[packet.VarInt] slice. -type StringIdentifierVarIntArray []string - -func (a StringIdentifierVarIntArray) 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.Identifier(a[i]).WriteTo(w) - n += nn - if err != nil { - return n, err - } - } - return n, nil -} - -func (a *StringIdentifierVarIntArray) 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(StringIdentifierVarIntArray, int(size)) - } - - for i := 0; i < int(size); i++ { - nn, err = (*packet.Identifier)(&(*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 @@ -422,6 +374,10 @@ func (a *Int8VarIntArray) ReadFrom(r io.Reader) (n int64, err error) { return n, errors.New("array length less than zero") } + if size > 32767 { + return n, errors.New("array length greater than 32767") + } + if cap(*a) >= int(size) { *a = (*a)[:int(size)] } else { @@ -438,3 +394,55 @@ func (a *Int8VarIntArray) ReadFrom(r io.Reader) (n int64, err error) { return n, err } + +// StringIdentifierVarIntArray a utility type for encoding/decoding packet.Identifier -> string[packet.VarInt] slice. +type StringIdentifierVarIntArray []string + +func (a StringIdentifierVarIntArray) 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.Identifier(a[i]).WriteTo(w) + n += nn + if err != nil { + return n, err + } + } + return n, nil +} + +func (a *StringIdentifierVarIntArray) 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 size > 32767 { + return n, errors.New("array length greater than 32767") + } + + if cap(*a) >= int(size) { + *a = (*a)[:int(size)] + } else { + *a = make(StringIdentifierVarIntArray, int(size)) + } + + for i := 0; i < int(size); i++ { + nn, err = (*packet.Identifier)(&(*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 a3908b4..6ab0614 100644 --- a/pkg/protocol/packet/game/client/codecs.go +++ b/pkg/protocol/packet/game/client/codecs.go @@ -6,11 +6,9 @@ import ( "errors" "io" - "github.com/google/uuid" - "git.konjactw.dev/falloutBot/go-mc/net/packet" - "git.konjactw.dev/patyhank/minego/pkg/protocol/component" + "github.com/google/uuid" ) func (c *AddEntity) ReadFrom(r io.Reader) (n int64, err error) { @@ -7100,6 +7098,10 @@ func (a *Int8VarIntArray) ReadFrom(r io.Reader) (n int64, err error) { return n, errors.New("array length less than zero") } + if size > 32767 { + return n, errors.New("array length greater than 32767") + } + if cap(*a) >= int(size) { *a = (*a)[:int(size)] } else { @@ -7117,10 +7119,10 @@ func (a *Int8VarIntArray) ReadFrom(r io.Reader) (n int64, err error) { return n, err } -// Int64VarIntArray a utility type for encoding/decoding packet.Long -> int64[packet.VarInt] slice. -type Int64VarIntArray []int64 +// StringVarIntArray a utility type for encoding/decoding packet.String -> string[packet.VarInt] slice. +type StringVarIntArray []string -func (a Int64VarIntArray) WriteTo(w io.Writer) (n int64, err error) { +func (a StringVarIntArray) WriteTo(w io.Writer) (n int64, err error) { size := len(a) nn, err := packet.VarInt(size).WriteTo(w) if err != nil { @@ -7128,7 +7130,7 @@ func (a Int64VarIntArray) WriteTo(w io.Writer) (n int64, err error) { } n += nn for i := 0; i < size; i++ { - nn, err := packet.Long(a[i]).WriteTo(w) + nn, err := packet.String(a[i]).WriteTo(w) n += nn if err != nil { return n, err @@ -7137,7 +7139,7 @@ func (a Int64VarIntArray) WriteTo(w io.Writer) (n int64, err error) { return n, nil } -func (a *Int64VarIntArray) ReadFrom(r io.Reader) (n int64, err error) { +func (a *StringVarIntArray) ReadFrom(r io.Reader) (n int64, err error) { var size packet.VarInt nn, err := size.ReadFrom(r) n += nn @@ -7148,14 +7150,18 @@ func (a *Int64VarIntArray) ReadFrom(r io.Reader) (n int64, err error) { return n, errors.New("array length less than zero") } + if size > 32767 { + return n, errors.New("array length greater than 32767") + } + if cap(*a) >= int(size) { *a = (*a)[:int(size)] } else { - *a = make(Int64VarIntArray, int(size)) + *a = make(StringVarIntArray, int(size)) } for i := 0; i < int(size); i++ { - nn, err = (*packet.Long)(&(*a)[i]).ReadFrom(r) + nn, err = (*packet.String)(&(*a)[i]).ReadFrom(r) n += nn if err != nil { return n, err @@ -7196,6 +7202,10 @@ func (a *StringIdentifierVarIntArray) ReadFrom(r io.Reader) (n int64, err error) return n, errors.New("array length less than zero") } + if size > 32767 { + return n, errors.New("array length greater than 32767") + } + if cap(*a) >= int(size) { *a = (*a)[:int(size)] } else { @@ -7213,6 +7223,58 @@ 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 size > 32767 { + return n, errors.New("array length greater than 32767") + } + + 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 @@ -7244,6 +7306,10 @@ func (a *Int32VarIntVarIntArray) ReadFrom(r io.Reader) (n int64, err error) { return n, errors.New("array length less than zero") } + if size > 32767 { + return n, errors.New("array length greater than 32767") + } + if cap(*a) >= int(size) { *a = (*a)[:int(size)] } else { @@ -7292,6 +7358,10 @@ func (a *Int64VarLongVarIntArray) ReadFrom(r io.Reader) (n int64, err error) { return n, errors.New("array length less than zero") } + if size > 32767 { + return n, errors.New("array length greater than 32767") + } + if cap(*a) >= int(size) { *a = (*a)[:int(size)] } else { @@ -7309,150 +7379,6 @@ func (a *Int64VarLongVarIntArray) ReadFrom(r io.Reader) (n int64, err error) { return n, err } -// StringStringVarIntArray a utility type for encoding/decoding packet.String -> string[packet.VarInt] slice. -type StringStringVarIntArray []string - -func (a StringStringVarIntArray) 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.String(a[i]).WriteTo(w) - n += nn - if err != nil { - return n, err - } - } - return n, nil -} - -func (a *StringStringVarIntArray) 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(StringStringVarIntArray, int(size)) - } - - for i := 0; i < int(size); i++ { - nn, err = (*packet.String)(&(*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 - -func (a StringVarIntArray) 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.String(a[i]).WriteTo(w) - n += nn - if err != nil { - return n, err - } - } - return n, nil -} - -func (a *StringVarIntArray) 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(StringVarIntArray, int(size)) - } - - for i := 0; i < int(size); i++ { - nn, err = (*packet.String)(&(*a)[i]).ReadFrom(r) - n += nn - if err != nil { - return n, err - } - } - - 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 @@ -7484,6 +7410,10 @@ func (a *Int8ByteVarIntArray) ReadFrom(r io.Reader) (n int64, err error) { return n, errors.New("array length less than zero") } + if size > 32767 { + return n, errors.New("array length greater than 32767") + } + if cap(*a) >= int(size) { *a = (*a)[:int(size)] } else { @@ -7500,3 +7430,107 @@ func (a *Int8ByteVarIntArray) ReadFrom(r io.Reader) (n int64, err error) { return n, err } + +// StringStringVarIntArray a utility type for encoding/decoding packet.String -> string[packet.VarInt] slice. +type StringStringVarIntArray []string + +func (a StringStringVarIntArray) 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.String(a[i]).WriteTo(w) + n += nn + if err != nil { + return n, err + } + } + return n, nil +} + +func (a *StringStringVarIntArray) 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 size > 32767 { + return n, errors.New("array length greater than 32767") + } + + if cap(*a) >= int(size) { + *a = (*a)[:int(size)] + } else { + *a = make(StringStringVarIntArray, int(size)) + } + + for i := 0; i < int(size); i++ { + nn, err = (*packet.String)(&(*a)[i]).ReadFrom(r) + n += nn + if err != nil { + return n, err + } + } + + return n, err +} + +// Int64VarIntArray a utility type for encoding/decoding packet.Long -> int64[packet.VarInt] slice. +type Int64VarIntArray []int64 + +func (a Int64VarIntArray) 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.Long(a[i]).WriteTo(w) + n += nn + if err != nil { + return n, err + } + } + return n, nil +} + +func (a *Int64VarIntArray) 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 size > 32767 { + return n, errors.New("array length greater than 32767") + } + + if cap(*a) >= int(size) { + *a = (*a)[:int(size)] + } else { + *a = make(Int64VarIntArray, int(size)) + } + + for i := 0; i < int(size); i++ { + nn, err = (*packet.Long)(&(*a)[i]).ReadFrom(r) + n += nn + if err != nil { + return n, err + } + } + + return n, err +} diff --git a/pkg/protocol/packet/game/client/player_info_update.go b/pkg/protocol/packet/game/client/player_info_update.go index 0439b95..de72e86 100644 --- a/pkg/protocol/packet/game/client/player_info_update.go +++ b/pkg/protocol/packet/game/client/player_info_update.go @@ -21,120 +21,121 @@ type PlayerInfoUpdate struct { } func (p PlayerInfoUpdate) WriteTo(w io.Writer) (n int64, err error) { - bitset := pk.NewFixedBitSet(8) - for _, infos := range p.Players { - for _, info := range infos { - bitset.Set(info.playerInfoBitMask(), true) - } - } - n1, err := bitset.WriteTo(w) - if err != nil { - return n1, err - } - n += n1 - n2, err := pk.VarInt(len(p.Players)).WriteTo(w) - if err != nil { - return n1 + n2, err - } - n += n2 - for playerUUID, infos := range p.Players { - n3, err := (*pk.UUID)(&playerUUID).WriteTo(w) - if err != nil { - return n1 + n2 + n3, err - } - n += n3 - for _, info := range infos { - n4, err := info.WriteTo(w) - if err != nil { - return n1 + n2 + n3 + n4, err - } - n += n4 - } - } - return + //bitset := pk.NewFixedBitSet(8) + //for _, infos := range p.Players { + // for _, info := range infos { + // bitset.Set(info.playerInfoBitMask(), true) + // } + //} + //n1, err := bitset.WriteTo(w) + //if err != nil { + // return n1, err + //} + //n += n1 + //n2, err := pk.VarInt(len(p.Players)).WriteTo(w) + //if err != nil { + // return n1 + n2, err + //} + //n += n2 + //for playerUUID, infos := range p.Players { + // n3, err := (*pk.UUID)(&playerUUID).WriteTo(w) + // if err != nil { + // return n1 + n2 + n3, err + // } + // n += n3 + // for _, info := range infos { + // n4, err := info.WriteTo(w) + // if err != nil { + // return n1 + n2 + n3 + n4, err + // } + // n += n4 + // } + //} + return 0, nil } func (p *PlayerInfoUpdate) ReadFrom(r io.Reader) (n int64, err error) { - bitset := pk.NewFixedBitSet(256) - n1, err := bitset.ReadFrom(r) - if err != nil { - return n1, err - } - m := make(map[uuid.UUID][]PlayerInfo) - - var playerLens pk.VarInt - n2, err := playerLens.ReadFrom(r) - if err != nil { - return n1 + n2, err - } - for i := 0; i < int(playerLens); i++ { - var playerUUID uuid.UUID - n3, err := (*pk.UUID)(&playerUUID).ReadFrom(r) - if err != nil { - return n1 + n2 + n3, err - } - var temp int64 - var infos []PlayerInfo - if bitset.Get(0x01) { - n4, err := playerInfoRead(&infos, &PlayerInfoAddPlayer{}, r) - if err != nil { - return n1 + n2 + n3 + n4, err - } - temp += n4 - } - if bitset.Get(0x02) { - n4, err := playerInfoRead(&infos, &PlayerInfoInitializeChat{}, r) - if err != nil { - return n1 + n2 + n3 + n4, err - } - temp += n4 - } - if bitset.Get(0x04) { - n4, err := playerInfoRead(&infos, &PlayerInfoUpdateGameMode{}, r) - if err != nil { - return n1 + n2 + n3 + n4, err - } - temp += n4 - } - if bitset.Get(0x08) { - n4, err := playerInfoRead(&infos, &PlayerInfoUpdateListed{}, r) - if err != nil { - return n1 + n2 + n3 + n4, err - } - temp += n4 - } - if bitset.Get(0x10) { - n4, err := playerInfoRead(&infos, &PlayerInfoUpdateLatency{}, r) - if err != nil { - return n1 + n2 + n3 + n4, err - } - temp += n4 - } - if bitset.Get(0x20) { - n4, err := playerInfoRead(&infos, &PlayerInfoUpdateDisplayName{}, r) - if err != nil { - return n1 + n2 + n3 + n4, err - } - temp += n4 - } - if bitset.Get(0x40) { - n4, err := playerInfoRead(&infos, &PlayerInfoUpdateListPriority{}, r) - if err != nil { - return n1 + n2 + n3 + n4, err - } - temp += n4 - } - if bitset.Get(0x80) { - n4, err := playerInfoRead(&infos, &PlayerInfoUpdateHat{}, r) - if err != nil { - return n1 + n2 + n3 + n4, err - } - temp += n4 - } - - m[playerUUID] = infos - } - return + //bitset := pk.NewFixedBitSet(256) + //n1, err := bitset.ReadFrom(r) + //if err != nil { + // return n1, err + //} + //m := make(map[uuid.UUID][]PlayerInfo) + // + //var playerLens pk.VarInt + //n2, err := playerLens.ReadFrom(r) + //if err != nil { + // return n1 + n2, err + //} + //for i := 0; i < int(playerLens); i++ { + // var playerUUID uuid.UUID + // n3, err := (*pk.UUID)(&playerUUID).ReadFrom(r) + // if err != nil { + // return n1 + n2 + n3, err + // } + // var temp int64 + // var infos []PlayerInfo + // if bitset.Get(0x01) { + // n4, err := playerInfoRead(&infos, &PlayerInfoAddPlayer{}, r) + // if err != nil { + // return n1 + n2 + n3 + n4, err + // } + // temp += n4 + // } + // if bitset.Get(0x02) { + // n4, err := playerInfoRead(&infos, &PlayerInfoInitializeChat{}, r) + // if err != nil { + // return n1 + n2 + n3 + n4, err + // } + // temp += n4 + // } + // if bitset.Get(0x04) { + // n4, err := playerInfoRead(&infos, &PlayerInfoUpdateGameMode{}, r) + // if err != nil { + // return n1 + n2 + n3 + n4, err + // } + // temp += n4 + // } + // if bitset.Get(0x08) { + // n4, err := playerInfoRead(&infos, &PlayerInfoUpdateListed{}, r) + // if err != nil { + // return n1 + n2 + n3 + n4, err + // } + // temp += n4 + // } + // if bitset.Get(0x10) { + // n4, err := playerInfoRead(&infos, &PlayerInfoUpdateLatency{}, r) + // if err != nil { + // return n1 + n2 + n3 + n4, err + // } + // temp += n4 + // } + // if bitset.Get(0x20) { + // n4, err := playerInfoRead(&infos, &PlayerInfoUpdateDisplayName{}, r) + // if err != nil { + // return n1 + n2 + n3 + n4, err + // } + // temp += n4 + // } + // if bitset.Get(0x40) { + // n4, err := playerInfoRead(&infos, &PlayerInfoUpdateListPriority{}, r) + // if err != nil { + // return n1 + n2 + n3 + n4, err + // } + // temp += n4 + // } + // if bitset.Get(0x80) { + // n4, err := playerInfoRead(&infos, &PlayerInfoUpdateHat{}, r) + // if err != nil { + // return n1 + n2 + n3 + n4, err + // } + // temp += n4 + // } + // + // m[playerUUID] = infos + //} + //return + return 0, nil } func playerInfoRead(infos *[]PlayerInfo, info PlayerInfo, r io.Reader) (int64, error) { diff --git a/pkg/protocol/packet/game/server/codecs.go b/pkg/protocol/packet/game/server/codecs.go index 31dd79d..87c03b5 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 } -// StringVarIntArray a utility type for encoding/decoding packet.String -> string[packet.VarInt] slice. -type StringVarIntArray []string - -func (a StringVarIntArray) 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.String(a[i]).WriteTo(w) - n += nn - if err != nil { - return n, err - } - } - return n, nil -} - -func (a *StringVarIntArray) 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(StringVarIntArray, int(size)) - } - - for i := 0; i < int(size); i++ { - nn, err = (*packet.String)(&(*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 @@ -2807,6 +2759,10 @@ func (a *Int8ByteVarIntArray) ReadFrom(r io.Reader) (n int64, err error) { return n, errors.New("array length less than zero") } + if size > 32767 { + return n, errors.New("array length greater than 32767") + } + if cap(*a) >= int(size) { *a = (*a)[:int(size)] } else { @@ -2823,3 +2779,55 @@ func (a *Int8ByteVarIntArray) ReadFrom(r io.Reader) (n int64, err error) { return n, err } + +// StringVarIntArray a utility type for encoding/decoding packet.String -> string[packet.VarInt] slice. +type StringVarIntArray []string + +func (a StringVarIntArray) 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.String(a[i]).WriteTo(w) + n += nn + if err != nil { + return n, err + } + } + return n, nil +} + +func (a *StringVarIntArray) 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 size > 32767 { + return n, errors.New("array length greater than 32767") + } + + if cap(*a) >= int(size) { + *a = (*a)[:int(size)] + } else { + *a = make(StringVarIntArray, int(size)) + } + + for i := 0; i < int(size); i++ { + nn, err = (*packet.String)(&(*a)[i]).ReadFrom(r) + n += nn + if err != nil { + return n, err + } + } + + return n, err +} diff --git a/pkg/protocol/slot/codecs.go b/pkg/protocol/slot/codecs.go index cb78e92..ae1ec53 100644 --- a/pkg/protocol/slot/codecs.go +++ b/pkg/protocol/slot/codecs.go @@ -145,6 +145,10 @@ func (a *Int32VarIntVarIntArray) ReadFrom(r io.Reader) (n int64, err error) { return n, errors.New("array length less than zero") } + if size > 32767 { + return n, errors.New("array length greater than 32767") + } + if cap(*a) >= int(size) { *a = (*a)[:int(size)] } else {