From f32ad4cef8f341b1705ebf1dfb1affdcb1221204 Mon Sep 17 00:00:00 2001 From: AkmalFairuz Date: Thu, 11 Dec 2025 12:24:48 +0700 Subject: [PATCH] Fix ClientMovementPredictionSync packet --- .../client_movement_prediction_sync.go | 14 +------------- legacyver/proto/entity_metadata.go | 17 +++++++++++++++++ legacyver/protocol.go | 7 ++----- 3 files changed, 20 insertions(+), 18 deletions(-) create mode 100644 legacyver/proto/entity_metadata.go diff --git a/legacyver/legacypacket/client_movement_prediction_sync.go b/legacyver/legacypacket/client_movement_prediction_sync.go index 8dd311a..551cc03 100644 --- a/legacyver/legacypacket/client_movement_prediction_sync.go +++ b/legacyver/legacypacket/client_movement_prediction_sync.go @@ -48,19 +48,7 @@ func (*ClientMovementPredictionSync) ID() uint32 { } func (pk *ClientMovementPredictionSync) Marshal(io protocol.IO) { - var bitsetSize int - if proto.IsProtoGTE(io, proto.ID898) { - bitsetSize = 127 - } else if proto.IsProtoGTE(io, proto.ID844) { - bitsetSize = 126 - } else if proto.IsProtoGTE(io, proto.ID818) { - bitsetSize = 125 - } else if proto.IsProtoGTE(io, proto.ID786) { - bitsetSize = 123 - } else { - bitsetSize = 120 - } - io.Bitset(&pk.ActorFlags, bitsetSize) + io.Bitset(&pk.ActorFlags, proto.EntityDataFlagsLength(proto.FetchProtoID(io))) io.Float32(&pk.BoundingBoxScale) io.Float32(&pk.BoundingBoxWidth) io.Float32(&pk.BoundingBoxHeight) diff --git a/legacyver/proto/entity_metadata.go b/legacyver/proto/entity_metadata.go new file mode 100644 index 0000000..2697c8e --- /dev/null +++ b/legacyver/proto/entity_metadata.go @@ -0,0 +1,17 @@ +package proto + +func EntityDataFlagsLength(protoID int32) int { + if protoID >= ID898 { + return 127 + } + if protoID >= ID844 { + return 126 + } + if protoID >= ID818 { + return 125 + } + if protoID >= ID786 { + return 123 + } + return 120 +} diff --git a/legacyver/protocol.go b/legacyver/protocol.go index cf348ca..a563ec9 100644 --- a/legacyver/protocol.go +++ b/legacyver/protocol.go @@ -702,10 +702,7 @@ func (p *Protocol) downgradePackets(pks []packet.Packet, conn *minecraft.Conn) [ case *packet.PlayerSkin: pk.Skin.GeometryDataEngineVersion = []byte(p.Ver()) case *packet.ClientMovementPredictionSync: - actorFlags := pk.ActorFlags - if p.ID() < proto.ID786 { - actorFlags = fitBitset(actorFlags, 120) - } + actorFlags := fitBitset(pk.ActorFlags, proto.EntityDataFlagsLength(p.ID())) pks[pkIndex] = &legacypacket.ClientMovementPredictionSync{ ActorFlags: actorFlags, BoundingBoxScale: pk.BoundingBoxScale, @@ -1308,7 +1305,7 @@ func (p *Protocol) upgradePackets(pks []packet.Packet, conn *minecraft.Conn) []p pks[pkIndex] = &packet.UpdateAbilities{AbilityData: pk.AbilityData.ToLatest()} case *legacypacket.ClientMovementPredictionSync: pks[pkIndex] = &packet.ClientMovementPredictionSync{ - ActorFlags: fitBitset(pk.ActorFlags, protocol.EntityDataFlagCount), + ActorFlags: fitBitset(pk.ActorFlags, proto.EntityDataFlagsLength(p.ID())), BoundingBoxScale: pk.BoundingBoxScale, BoundingBoxWidth: pk.BoundingBoxWidth, BoundingBoxHeight: pk.BoundingBoxHeight,