diff --git a/client/modules/login.go b/client/modules/login.go index 41f7789..f2b0961 100644 --- a/client/modules/login.go +++ b/client/modules/login.go @@ -52,10 +52,10 @@ func (s *LoginClient) OnStart(_ event.OnStart) (err error) { return } err = s.Send(v1_21_8.HandshakingToServerPacketSetProtocol{ - ProtocolVersion: proto_base.VarInt(versionData.Version), + ProtocolVersion: int32(versionData.Version), ServerHost: host, ServerPort: uint16(port), - NextState: proto_base.VarInt(proto_base.Login), + NextState: int32(proto_base.Login), }) if err != nil { return diff --git a/client/modules/status.go b/client/modules/status.go index 90f2426..3f4c034 100644 --- a/client/modules/status.go +++ b/client/modules/status.go @@ -34,10 +34,10 @@ func (s *StatusClient) OnStart(_ event.OnStart) (err error) { return } err = s.Send(v1_21_8.HandshakingToServerPacketSetProtocol{ - ProtocolVersion: proto_base.VarInt(versionData.Version), + ProtocolVersion: int32(versionData.Version), ServerHost: parts[0], ServerPort: uint16(port), - NextState: proto_base.VarInt(proto_base.Status), + NextState: int32(proto_base.Status), }) if err != nil { return diff --git a/level/packet.go b/level/packet.go index 0a2ad06..5c8f5f1 100644 --- a/level/packet.go +++ b/level/packet.go @@ -16,19 +16,17 @@ const ( ) func UnpackArrayPalette(r io.Reader, bitsPerEntry uint8, numberOfEntries int) (data []int32, err error) { - var palletLen proto_base.VarInt - palletLen, err = palletLen.Decode(r) + palletLen, err := proto_base.DecodeVarInt(r) if err != nil { return } var pallet []int32 // remember we can't use make because this is user-controlled data for range palletLen { - var entry proto_base.VarInt - entry, err = proto_base.VarInt(0).Decode(r) + entry, err := proto_base.DecodeVarInt(r) if err != nil { return } - pallet = append(pallet, int32(entry)) + pallet = append(pallet, entry) } data, err = UnpackLongData(r, bitsPerEntry, numberOfEntries) for i, b := range data { @@ -56,7 +54,7 @@ func UnpackLongData(r io.Reader, bitsPerEntry uint8, numberOfEntries int) (data } func UnpackSingleValuePalette(r io.Reader, numberOfEntries int) (data []int32, err error) { - entry, err := proto_base.VarInt(0).Decode(r) + entry, err := proto_base.DecodeVarInt(r) if err != nil { return } diff --git a/proto/connection.go b/proto/connection.go index c3eb90e..1f3b38d 100644 --- a/proto/connection.go +++ b/proto/connection.go @@ -53,7 +53,7 @@ func (c *Conn) Send(packet any) (err error) { if c.CompressionThreshold > 0 { packetBuffer := bytes.NewBuffer(nil) if int32(len(packetBytes)) >= c.CompressionThreshold { - err = proto_base.VarInt(len(packetBytes)).Encode(packetBuffer) + err = proto_base.EncodeVarInt(packetBuffer, int32(len(packetBytes))) if err != nil { return } @@ -62,7 +62,7 @@ func (c *Conn) Send(packet any) (err error) { return } } else { - err = proto_base.VarInt(0).Encode(packetBuffer) + err = proto_base.EncodeVarInt(packetBuffer, 0) if err != nil { return } @@ -75,7 +75,7 @@ func (c *Conn) Send(packet any) (err error) { } else { packetBytes = rawPacketBytes } - err = proto_base.VarInt(len(packetBytes)).Encode(c.W) + err = proto_base.EncodeVarInt(c.W, int32(len(packetBytes))) if err != nil { return } @@ -84,8 +84,7 @@ func (c *Conn) Send(packet any) (err error) { } func (c *Conn) Receive() (packet any, err error) { - var rawPacketLen proto_base.VarInt - rawPacketLen, err = rawPacketLen.Decode(c.R) + rawPacketLen, err := proto_base.DecodeVarInt(c.R) if err != nil { return } @@ -96,8 +95,8 @@ func (c *Conn) Receive() (packet any, err error) { rawPacketBuffer := bytes.NewBuffer(rawPacketBytes) var packetBytes []byte if c.CompressionThreshold > 0 { - var packetLen proto_base.VarInt - packetLen, err = packetLen.Decode(rawPacketBuffer) + var packetLen int32 + packetLen, err = proto_base.DecodeVarInt(rawPacketBuffer) if err != nil { return } diff --git a/proto/packet_test.go b/proto/packet_test.go index 6f99e0d..757e841 100644 --- a/proto/packet_test.go +++ b/proto/packet_test.go @@ -25,9 +25,9 @@ var nanIgnorer64 = cmp.Comparer(func(x, y float64) bool { func TestChat(t *testing.T) { //p := v1_21_8.PlayToServerPacketChatMessage{Message: "dfs", Timestamp: 1764153707364, Salt: -5634100397920314628, Signature: (*[256]uint8)(nil), Offset: 0, Acknowledged: [3]uint8{0x0, 0x0, 0x0}, Checksum: 0x1} p := v1_21_8.PlayToClientPacketPlayerChat{GlobalIndex: 0, SenderUuid: uuid.UUID{0x1d, 0xc5, 0x57, 0x82, 0x3c, 0x0, 0x3e, 0xd4, 0xbf, 0x8b, 0x76, 0xd4, 0xc6, 0xd9, 0xcc, 0x47}, Index: 0, Signature: (*[256]uint8)(nil), PlainMessage: "csdf", Timestamp: 1764153823132, Salt: 0, PreviousMessages: v1_21_8.PreviousMessages{Val: []struct { - Id proto_base.VarInt + Id int32 Signature interface{} - }{}}, UnsignedChatContent: (*nbt.Anon)(nil), FilterType: 0, FilterTypeMask: proto_base.Void{}, Type: v1_21_8.PlayToClientChatTypesHolder{Val: proto_base.VarInt(1)}, NetworkName: nbt.Anon{Value: map[string]interface{}{"click_event": map[string]interface{}{"action": "suggest_command", "command": "/tell Player659 "}, "hover_event": map[string]interface{}{"action": "show_entity", "id": "minecraft:player", "name": "Player659", "uuid": []int32{499472258, 1006649044, -1081379116, -958804921}}, "insertion": "Player659", "text": "Player659"}}, NetworkTargetName: (*nbt.Anon)(nil)} + }{}}, UnsignedChatContent: (*nbt.Anon)(nil), FilterType: 0, FilterTypeMask: proto_base.Void{}, Type: v1_21_8.PlayToClientChatTypesHolder{Val: 1}, NetworkName: nbt.Anon{Value: map[string]interface{}{"click_event": map[string]interface{}{"action": "suggest_command", "command": "/tell Player659 "}, "hover_event": map[string]interface{}{"action": "show_entity", "id": "minecraft:player", "name": "Player659", "uuid": []int32{499472258, 1006649044, -1081379116, -958804921}}, "insertion": "Player659", "text": "Player659"}}, NetworkTargetName: (*nbt.Anon)(nil)} b := bytes.NewBuffer(nil) err := p.Encode(b) if err != nil { diff --git a/proto_base/base_types.go b/proto_base/base_types.go index 1ad176e..71341e9 100644 --- a/proto_base/base_types.go +++ b/proto_base/base_types.go @@ -74,7 +74,6 @@ type PacketIdentifier struct { } type ( - VarInt int32 ToDo struct{} Void struct{} RestBuffer []byte @@ -103,7 +102,7 @@ func (RestBuffer) Decode(r io.Reader) (ret RestBuffer, err error) { } func EncodeString(w io.Writer, s string) (err error) { - err = VarInt(len(s)).Encode(w) + err = EncodeVarInt(w, int32(len(s))) if err != nil { return } @@ -112,8 +111,7 @@ func EncodeString(w io.Writer, s string) (err error) { } func DecodeString(r io.Reader) (ret string, err error) { - var l VarInt - l, err = l.Decode(r) + l, err := DecodeVarInt(r) if err != nil { return } @@ -138,7 +136,7 @@ func (t ToDo) Decode(_ io.Reader) (ret ToDo, err error) { return } -func (v VarInt) Encode(w io.Writer) (err error) { +func EncodeVarInt(w io.Writer, v int32) (err error) { uv := uint32(v) for { b := uint8(uv & 0x7F) @@ -157,14 +155,14 @@ func (v VarInt) Encode(w io.Writer) (err error) { return nil } -func (v VarInt) Decode(r io.Reader) (ret VarInt, err error) { +func DecodeVarInt(r io.Reader) (ret int32, err error) { for i := range 5 { // 32/7 var b uint8 = 0 err = binary.Read(r, binary.BigEndian, &b) if err != nil { return } - ret |= VarInt(uint32(b&0x7F) << (7 * uint32(i))) + ret |= int32(uint32(b&0x7F) << (7 * uint32(i))) if b&0x80 == 0 { return } diff --git a/proto_generator/native_decoder.go b/proto_generator/native_decoder.go index 87f4ce6..5e74415 100644 --- a/proto_generator/native_decoder.go +++ b/proto_generator/native_decoder.go @@ -468,7 +468,11 @@ func RegistryEntryHolderDecoder(g *Generator, varToSet ast.Expr, dataRaw any, na return } idName := name + "Id" - IdVar := VarStmt(idName, Selector("proto_base", "VarInt")) + varIntType, err := g.VisitNameAndData("varint", nil) + if err != nil { + return + } + IdVar := VarStmt(idName, varIntType) idDecodeStatements, err := g.VisitDecoder(Ident(idName), "varint", name) if err != nil { return @@ -498,6 +502,11 @@ func RegistryEntryHolderDecoder(g *Generator, varToSet ast.Expr, dataRaw any, na return } +func VarIntDecoder(g *Generator, varToSet ast.Expr, dataRaw any, name string) (s []ast.Stmt, err error) { + s = Stmts(Assign(Exprs(varToSet, Ident("err")), Exprs(Call(Selector("proto_base", "DecodeVarInt"), Ident("r")))), IfErrNil()) + return +} + func (g *Generator) RegisterDecoderNatives() { g.DecoderNatives = map[string]FunctionGeneratorFunc{ "container": ContainerDecoder, @@ -511,7 +520,7 @@ func (g *Generator) RegisterDecoderNatives() { "string": StringDecoder, "void": DefaultDecoder, - "varint": DefaultDecoder, + "varint": VarIntDecoder, "anonymousNbt": DefaultDecoder, "anonOptionalNbt": DefaultDecoder, // I have no idea what the difference is between these two "UUID": UUIDDecoder, diff --git a/proto_generator/native_encoder.go b/proto_generator/native_encoder.go index 32a565c..c752121 100644 --- a/proto_generator/native_encoder.go +++ b/proto_generator/native_encoder.go @@ -315,6 +315,11 @@ func RegistryEntryHolderEncoder(g *Generator, varToSet ast.Expr, dataRaw any, na return } +func VarIntEncoder(g *Generator, varToSet ast.Expr, dataRaw any, name string) (s []ast.Stmt, err error) { + s = Stmts(Assign121(Ident("err"), Call(Selector("proto_base", "EncodeVarInt"), Ident("w"), varToSet)), IfErrNil()) + return +} + func (g *Generator) RegisterEncoderNatives() { g.EncoderNatives = map[string]FunctionGeneratorFunc{ "container": ContainerEncoder, @@ -327,7 +332,7 @@ func (g *Generator) RegisterEncoderNatives() { "bitfield": BitFieldEncoder, "void": DefaultEncoder, - "varint": DefaultEncoder, + "varint": VarIntEncoder, "anonymousNbt": DefaultEncoder, "anonOptionalNbt": DefaultEncoder, // I have no idea what the difference is between these two "UUID": UUIDEncoder, diff --git a/proto_generator/native_type.go b/proto_generator/native_type.go index 03be720..d9695dd 100644 --- a/proto_generator/native_type.go +++ b/proto_generator/native_type.go @@ -157,7 +157,7 @@ func (g *Generator) RegisterNatives() { g.Natives = map[string]ExprGeneratorFunc{ "container": VisitContainerType, "buffer": VisitBufferType, - "varint": MakeSelectorVisitor("proto_base", "VarInt"), + "varint": MakeIdentVisitor("int32"), "array": VisitArrayTypeVisitorType, "mapper": MakeIdentVisitor("string"), "native": VisitDontGenerateType, diff --git a/server/server_modules/login_server.go b/server/server_modules/login_server.go index 24e1c58..789e58e 100644 --- a/server/server_modules/login_server.go +++ b/server/server_modules/login_server.go @@ -36,7 +36,7 @@ type LoginServer struct { func (l *LoginServer) OnHandshake(packet v1_21_8.HandshakingToServerPacketSetProtocol) (err error) { l.State = proto_base.State(packet.NextState) - if packet.NextState != proto_base.VarInt(proto_base.Login) { + if packet.NextState != int32(proto_base.Login) { err = UnexpectedNextStateError{proto_base.State(packet.NextState)} return } @@ -44,7 +44,7 @@ func (l *LoginServer) OnHandshake(packet v1_21_8.HandshakingToServerPacketSetPro } func (l *LoginServer) SetCompressionThreshold(threshold int32) (err error) { - err = l.Send(v1_21_8.LoginToClientPacketCompress{Threshold: proto_base.VarInt(threshold)}) + err = l.Send(v1_21_8.LoginToClientPacketCompress{Threshold: threshold}) if err != nil { return }