2424import com .viaversion .viabackwards .api .rewriters .EntityRewriter ;
2525import com .viaversion .viabackwards .protocol .v1_21_9to1_21_7 .Protocol1_21_9To1_21_7 ;
2626import com .viaversion .viabackwards .protocol .v1_21_9to1_21_7 .storage .MannequinData ;
27+ import com .viaversion .viabackwards .protocol .v1_21_9to1_21_7 .storage .PlayerRotationStorage ;
2728import com .viaversion .viaversion .api .connection .UserConnection ;
2829import com .viaversion .viaversion .api .minecraft .BlockPosition ;
2930import com .viaversion .viaversion .api .minecraft .GameProfile ;
3839import com .viaversion .viaversion .api .type .Types ;
3940import com .viaversion .viaversion .api .type .types .version .VersionedTypes ;
4041import com .viaversion .viaversion .protocols .v1_21_5to1_21_6 .packet .ClientboundPackets1_21_6 ;
42+ import com .viaversion .viaversion .protocols .v1_21_5to1_21_6 .packet .ServerboundPackets1_21_6 ;
4143import com .viaversion .viaversion .protocols .v1_21_7to1_21_9 .packet .ClientboundConfigurationPackets1_21_9 ;
4244import com .viaversion .viaversion .protocols .v1_21_7to1_21_9 .packet .ClientboundPacket1_21_9 ;
4345import com .viaversion .viaversion .protocols .v1_21_7to1_21_9 .packet .ClientboundPackets1_21_9 ;
@@ -101,11 +103,21 @@ public void registerPackets() {
101103 });
102104
103105 protocol .registerClientbound (ClientboundPackets1_21_9 .PLAYER_ROTATION , wrapper -> {
104- // TODO track
105- wrapper .passthrough (Types .FLOAT ); // Y rotation
106- final boolean relativeY = wrapper .read (Types .BOOLEAN );
107- wrapper .passthrough (Types .FLOAT ); // X rotation
108- final boolean relativeX = wrapper .read (Types .BOOLEAN );
106+ final PlayerRotationStorage storage = wrapper .user ().get (PlayerRotationStorage .class );
107+
108+ float yRot = wrapper .read (Types .FLOAT );
109+ if (wrapper .read (Types .BOOLEAN )) {
110+ yRot = storage .yaw () + yRot ;
111+ }
112+
113+ float xRot = wrapper .read (Types .FLOAT );
114+ if (wrapper .read (Types .BOOLEAN )) {
115+ xRot = storage .pitch () + xRot ;
116+ }
117+
118+ wrapper .write (Types .FLOAT , yRot );
119+ wrapper .write (Types .FLOAT , xRot );
120+ storage .setRotation (yRot , xRot ); // Update after having used its previous data
109121 });
110122
111123 protocol .registerClientbound (ClientboundPackets1_21_9 .SET_DEFAULT_SPAWN_POSITION , wrapper -> {
@@ -117,6 +129,16 @@ public void registerPackets() {
117129
118130 final RegistryDataRewriter registryDataRewriter = new BackwardsRegistryRewriter (protocol );
119131 protocol .registerClientbound (ClientboundConfigurationPackets1_21_9 .REGISTRY_DATA , registryDataRewriter ::handle );
132+
133+ protocol .registerServerbound (ServerboundPackets1_21_6 .MOVE_PLAYER_POS_ROT , wrapper -> {
134+ wrapper .passthrough (Types .DOUBLE ); // X
135+ wrapper .passthrough (Types .DOUBLE ); // Y
136+ wrapper .passthrough (Types .DOUBLE ); // Z
137+
138+ storePlayerRotation (wrapper );
139+ });
140+
141+ protocol .registerServerbound (ServerboundPackets1_21_6 .MOVE_PLAYER_ROT , this ::storePlayerRotation );
120142 }
121143
122144 private void sendInitialPlayerInfoUpdate (final PacketWrapper wrapper , final MannequinData mannequinData ) {
@@ -204,6 +226,13 @@ private void writeMovementShorts(final PacketWrapper wrapper, final Vector3d mov
204226 wrapper .write (Types .SHORT , (short ) (movement .z () * 8000 ));
205227 }
206228
229+ private void storePlayerRotation (final PacketWrapper wrapper ) {
230+ final float yaw = wrapper .passthrough (Types .FLOAT );
231+ final float pitch = wrapper .passthrough (Types .FLOAT );
232+
233+ wrapper .user ().get (PlayerRotationStorage .class ).setRotation (yaw , pitch );
234+ }
235+
207236 @ Override
208237 protected void registerRewrites () {
209238 final EntityDataTypes1_21_5 entityDataTypes = protocol .mappedTypes ().entityDataTypes ();
0 commit comments