Refactor: Remove VarInt type, replace with int32, and consolidate encoding/decoding logic

This commit is contained in:
adman
2025-12-24 00:29:43 +01:00
parent 2f81976fe8
commit dd41115ca2
10 changed files with 41 additions and 32 deletions
+2 -2
View File
@@ -52,10 +52,10 @@ func (s *LoginClient) OnStart(_ event.OnStart) (err error) {
return return
} }
err = s.Send(v1_21_8.HandshakingToServerPacketSetProtocol{ err = s.Send(v1_21_8.HandshakingToServerPacketSetProtocol{
ProtocolVersion: proto_base.VarInt(versionData.Version), ProtocolVersion: int32(versionData.Version),
ServerHost: host, ServerHost: host,
ServerPort: uint16(port), ServerPort: uint16(port),
NextState: proto_base.VarInt(proto_base.Login), NextState: int32(proto_base.Login),
}) })
if err != nil { if err != nil {
return return
+2 -2
View File
@@ -34,10 +34,10 @@ func (s *StatusClient) OnStart(_ event.OnStart) (err error) {
return return
} }
err = s.Send(v1_21_8.HandshakingToServerPacketSetProtocol{ err = s.Send(v1_21_8.HandshakingToServerPacketSetProtocol{
ProtocolVersion: proto_base.VarInt(versionData.Version), ProtocolVersion: int32(versionData.Version),
ServerHost: parts[0], ServerHost: parts[0],
ServerPort: uint16(port), ServerPort: uint16(port),
NextState: proto_base.VarInt(proto_base.Status), NextState: int32(proto_base.Status),
}) })
if err != nil { if err != nil {
return return
+4 -6
View File
@@ -16,19 +16,17 @@ const (
) )
func UnpackArrayPalette(r io.Reader, bitsPerEntry uint8, numberOfEntries int) (data []int32, err error) { func UnpackArrayPalette(r io.Reader, bitsPerEntry uint8, numberOfEntries int) (data []int32, err error) {
var palletLen proto_base.VarInt palletLen, err := proto_base.DecodeVarInt(r)
palletLen, err = palletLen.Decode(r)
if err != nil { if err != nil {
return return
} }
var pallet []int32 // remember we can't use make because this is user-controlled data var pallet []int32 // remember we can't use make because this is user-controlled data
for range palletLen { for range palletLen {
var entry proto_base.VarInt entry, err := proto_base.DecodeVarInt(r)
entry, err = proto_base.VarInt(0).Decode(r)
if err != nil { if err != nil {
return return
} }
pallet = append(pallet, int32(entry)) pallet = append(pallet, entry)
} }
data, err = UnpackLongData(r, bitsPerEntry, numberOfEntries) data, err = UnpackLongData(r, bitsPerEntry, numberOfEntries)
for i, b := range data { 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) { 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 { if err != nil {
return return
} }
+6 -7
View File
@@ -53,7 +53,7 @@ func (c *Conn) Send(packet any) (err error) {
if c.CompressionThreshold > 0 { if c.CompressionThreshold > 0 {
packetBuffer := bytes.NewBuffer(nil) packetBuffer := bytes.NewBuffer(nil)
if int32(len(packetBytes)) >= c.CompressionThreshold { 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 { if err != nil {
return return
} }
@@ -62,7 +62,7 @@ func (c *Conn) Send(packet any) (err error) {
return return
} }
} else { } else {
err = proto_base.VarInt(0).Encode(packetBuffer) err = proto_base.EncodeVarInt(packetBuffer, 0)
if err != nil { if err != nil {
return return
} }
@@ -75,7 +75,7 @@ func (c *Conn) Send(packet any) (err error) {
} else { } else {
packetBytes = rawPacketBytes packetBytes = rawPacketBytes
} }
err = proto_base.VarInt(len(packetBytes)).Encode(c.W) err = proto_base.EncodeVarInt(c.W, int32(len(packetBytes)))
if err != nil { if err != nil {
return return
} }
@@ -84,8 +84,7 @@ func (c *Conn) Send(packet any) (err error) {
} }
func (c *Conn) Receive() (packet any, err error) { func (c *Conn) Receive() (packet any, err error) {
var rawPacketLen proto_base.VarInt rawPacketLen, err := proto_base.DecodeVarInt(c.R)
rawPacketLen, err = rawPacketLen.Decode(c.R)
if err != nil { if err != nil {
return return
} }
@@ -96,8 +95,8 @@ func (c *Conn) Receive() (packet any, err error) {
rawPacketBuffer := bytes.NewBuffer(rawPacketBytes) rawPacketBuffer := bytes.NewBuffer(rawPacketBytes)
var packetBytes []byte var packetBytes []byte
if c.CompressionThreshold > 0 { if c.CompressionThreshold > 0 {
var packetLen proto_base.VarInt var packetLen int32
packetLen, err = packetLen.Decode(rawPacketBuffer) packetLen, err = proto_base.DecodeVarInt(rawPacketBuffer)
if err != nil { if err != nil {
return return
} }
+2 -2
View File
@@ -25,9 +25,9 @@ var nanIgnorer64 = cmp.Comparer(func(x, y float64) bool {
func TestChat(t *testing.T) { 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.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 { 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{} 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) b := bytes.NewBuffer(nil)
err := p.Encode(b) err := p.Encode(b)
if err != nil { if err != nil {
+5 -7
View File
@@ -74,7 +74,6 @@ type PacketIdentifier struct {
} }
type ( type (
VarInt int32
ToDo struct{} ToDo struct{}
Void struct{} Void struct{}
RestBuffer []byte 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) { func EncodeString(w io.Writer, s string) (err error) {
err = VarInt(len(s)).Encode(w) err = EncodeVarInt(w, int32(len(s)))
if err != nil { if err != nil {
return return
} }
@@ -112,8 +111,7 @@ func EncodeString(w io.Writer, s string) (err error) {
} }
func DecodeString(r io.Reader) (ret string, err error) { func DecodeString(r io.Reader) (ret string, err error) {
var l VarInt l, err := DecodeVarInt(r)
l, err = l.Decode(r)
if err != nil { if err != nil {
return return
} }
@@ -138,7 +136,7 @@ func (t ToDo) Decode(_ io.Reader) (ret ToDo, err error) {
return return
} }
func (v VarInt) Encode(w io.Writer) (err error) { func EncodeVarInt(w io.Writer, v int32) (err error) {
uv := uint32(v) uv := uint32(v)
for { for {
b := uint8(uv & 0x7F) b := uint8(uv & 0x7F)
@@ -157,14 +155,14 @@ func (v VarInt) Encode(w io.Writer) (err error) {
return nil 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 for i := range 5 { // 32/7
var b uint8 = 0 var b uint8 = 0
err = binary.Read(r, binary.BigEndian, &b) err = binary.Read(r, binary.BigEndian, &b)
if err != nil { if err != nil {
return return
} }
ret |= VarInt(uint32(b&0x7F) << (7 * uint32(i))) ret |= int32(uint32(b&0x7F) << (7 * uint32(i)))
if b&0x80 == 0 { if b&0x80 == 0 {
return return
} }
+11 -2
View File
@@ -468,7 +468,11 @@ func RegistryEntryHolderDecoder(g *Generator, varToSet ast.Expr, dataRaw any, na
return return
} }
idName := name + "Id" 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) idDecodeStatements, err := g.VisitDecoder(Ident(idName), "varint", name)
if err != nil { if err != nil {
return return
@@ -498,6 +502,11 @@ func RegistryEntryHolderDecoder(g *Generator, varToSet ast.Expr, dataRaw any, na
return 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() { func (g *Generator) RegisterDecoderNatives() {
g.DecoderNatives = map[string]FunctionGeneratorFunc{ g.DecoderNatives = map[string]FunctionGeneratorFunc{
"container": ContainerDecoder, "container": ContainerDecoder,
@@ -511,7 +520,7 @@ func (g *Generator) RegisterDecoderNatives() {
"string": StringDecoder, "string": StringDecoder,
"void": DefaultDecoder, "void": DefaultDecoder,
"varint": DefaultDecoder, "varint": VarIntDecoder,
"anonymousNbt": DefaultDecoder, "anonymousNbt": DefaultDecoder,
"anonOptionalNbt": DefaultDecoder, // I have no idea what the difference is between these two "anonOptionalNbt": DefaultDecoder, // I have no idea what the difference is between these two
"UUID": UUIDDecoder, "UUID": UUIDDecoder,
+6 -1
View File
@@ -315,6 +315,11 @@ func RegistryEntryHolderEncoder(g *Generator, varToSet ast.Expr, dataRaw any, na
return 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() { func (g *Generator) RegisterEncoderNatives() {
g.EncoderNatives = map[string]FunctionGeneratorFunc{ g.EncoderNatives = map[string]FunctionGeneratorFunc{
"container": ContainerEncoder, "container": ContainerEncoder,
@@ -327,7 +332,7 @@ func (g *Generator) RegisterEncoderNatives() {
"bitfield": BitFieldEncoder, "bitfield": BitFieldEncoder,
"void": DefaultEncoder, "void": DefaultEncoder,
"varint": DefaultEncoder, "varint": VarIntEncoder,
"anonymousNbt": DefaultEncoder, "anonymousNbt": DefaultEncoder,
"anonOptionalNbt": DefaultEncoder, // I have no idea what the difference is between these two "anonOptionalNbt": DefaultEncoder, // I have no idea what the difference is between these two
"UUID": UUIDEncoder, "UUID": UUIDEncoder,
+1 -1
View File
@@ -157,7 +157,7 @@ func (g *Generator) RegisterNatives() {
g.Natives = map[string]ExprGeneratorFunc{ g.Natives = map[string]ExprGeneratorFunc{
"container": VisitContainerType, "container": VisitContainerType,
"buffer": VisitBufferType, "buffer": VisitBufferType,
"varint": MakeSelectorVisitor("proto_base", "VarInt"), "varint": MakeIdentVisitor("int32"),
"array": VisitArrayTypeVisitorType, "array": VisitArrayTypeVisitorType,
"mapper": MakeIdentVisitor("string"), "mapper": MakeIdentVisitor("string"),
"native": VisitDontGenerateType, "native": VisitDontGenerateType,
+2 -2
View File
@@ -36,7 +36,7 @@ type LoginServer struct {
func (l *LoginServer) OnHandshake(packet v1_21_8.HandshakingToServerPacketSetProtocol) (err error) { func (l *LoginServer) OnHandshake(packet v1_21_8.HandshakingToServerPacketSetProtocol) (err error) {
l.State = proto_base.State(packet.NextState) 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)} err = UnexpectedNextStateError{proto_base.State(packet.NextState)}
return return
} }
@@ -44,7 +44,7 @@ func (l *LoginServer) OnHandshake(packet v1_21_8.HandshakingToServerPacketSetPro
} }
func (l *LoginServer) SetCompressionThreshold(threshold int32) (err error) { 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 { if err != nil {
return return
} }