5252import java .util .Map ;
5353import java .util .UUID ;
5454import java .util .concurrent .ThreadLocalRandom ;
55+
56+ import com .viaversion .viaversion .util .Copyable ;
5557import org .checkerframework .checker .nullness .qual .Nullable ;
5658
5759public final class EntityPacketRewriter1_21_9 extends EntityRewriter <ClientboundPacket1_21_9 , Protocol1_21_9To1_21_7 > {
@@ -100,18 +102,17 @@ public void registerPackets() {
100102
101103 final float pitch = wrapper .get (Types .BYTE , 0 ) * 256.0F / 360.0F ;
102104 final float yaw = wrapper .get (Types .BYTE , 1 ) * 256.0F / 360.0F ;
105+ final float headYaw = wrapper .get (Types .BYTE , 2 ) * 256.0F / 360.0F ;
103106
104107 final String name = randomHackyEmptyName ();
105108 final MannequinData mannequinData = new MannequinData (uuid , name );
106109 final TrackedEntity trackedEntity = tracker (wrapper .user ()).entity (entityId );
107- if (trackedEntity == null ) {
108- return ;
109- }
110110
111111 trackedEntity .data ().put (mannequinData );
112112
113113 mannequinData .setPosition (x , y , z );
114114 mannequinData .setRotation (yaw , pitch );
115+ mannequinData .setHeadYaw (headYaw );
115116
116117 wrapper .cancel ();
117118 }
@@ -125,25 +126,20 @@ public void registerPackets() {
125126 final double y = wrapper .passthrough (Types .DOUBLE ); // Y
126127 final double z = wrapper .passthrough (Types .DOUBLE ); // Z
127128
128- // Unused...
129- wrapper .write (Types .DOUBLE , 0D ); // Delta movement X
130- wrapper .write (Types .DOUBLE , 0D ); // Delta movement Y
131- wrapper .write (Types .DOUBLE , 0D ); // Delta movement Z
129+ wrapper .passthrough (Types .DOUBLE ); // Delta movement X
130+ wrapper .passthrough (Types .DOUBLE ); // Delta movement Y
131+ wrapper .passthrough (Types .DOUBLE ); // Delta movement Z
132132
133133 final float yaw = wrapper .passthrough (Types .FLOAT );
134134 final float pitch = wrapper .passthrough (Types .FLOAT );
135135
136136 final EntityTracker1_21_9 tracker = tracker (wrapper .user ());
137137 final TrackedEntity trackedEntity = tracker .entity (entityId );
138- if (trackedEntity == null ) {
138+ if (trackedEntity == null || ! trackedEntity . hasData () ) {
139139 return ;
140140 }
141141
142142 final MannequinData mannequinData = trackedEntity .data ().get (MannequinData .class );
143- if (mannequinData == null ) {
144- return ;
145- }
146-
147143 mannequinData .setPosition (x , y , z );
148144 mannequinData .setRotation (yaw , pitch );
149145 });
@@ -156,7 +152,6 @@ public void registerPackets() {
156152 final double y = wrapper .passthrough (Types .DOUBLE ); // Y
157153 final double z = wrapper .passthrough (Types .DOUBLE ); // Z
158154
159- // Unused...
160155 wrapper .passthrough (Types .DOUBLE ); // Delta movement X
161156 wrapper .passthrough (Types .DOUBLE ); // Delta movement Y
162157 wrapper .passthrough (Types .DOUBLE ); // Delta movement Z
@@ -166,14 +161,15 @@ public void registerPackets() {
166161
167162 final EntityTracker1_21_9 tracker = tracker (wrapper .user ());
168163 final TrackedEntity trackedEntity = tracker .entity (entityId );
169- if (trackedEntity == null ) {
164+ if (trackedEntity == null || ! trackedEntity . hasData () ) {
170165 return ;
171166 }
172167
173168 final MannequinData mannequinData = trackedEntity .data ().get (MannequinData .class );
174169 if (mannequinData == null ) {
175170 return ;
176171 }
172+
177173 mannequinData .setPosition (x , y , z );
178174 mannequinData .setRotation (yaw , pitch );
179175 });
@@ -190,14 +186,27 @@ public void registerPackets() {
190186
191187 final EntityTracker1_21_9 tracker = tracker (wrapper .user ());
192188 final TrackedEntity trackedEntity = tracker .entity (vehicleId );
193- if (trackedEntity != null ) {
189+ if (trackedEntity != null && trackedEntity . hasData () ) {
194190 MannequinData data = trackedEntity .data ().get (MannequinData .class );;
195191 if (data != null ) {
196192 data .setPassengers (passengerIds );
197193 }
198194 }
199195 });
200196
197+ // Track head yaw
198+ protocol .registerClientbound (ClientboundPackets1_21_9 .ROTATE_HEAD , wrapper -> {
199+ final int vehicleId = wrapper .passthrough (Types .VAR_INT );
200+ final byte headRotation = wrapper .passthrough (Types .BYTE );
201+
202+ final EntityTracker1_21_9 tracker = tracker (wrapper .user ());
203+ final TrackedEntity trackedEntity = tracker .entity (vehicleId );
204+ if (trackedEntity != null && trackedEntity .hasData ()) {
205+ MannequinData data = trackedEntity .data ().get (MannequinData .class );
206+ data .setHeadYaw (headRotation );
207+ }
208+ });
209+
201210 // Track items
202211 protocol .registerClientbound (ClientboundPackets1_21_9 .SET_EQUIPMENT , wrapper -> {
203212 final int entityId = wrapper .passthrough (Types .VAR_INT );
@@ -210,8 +219,8 @@ public void registerPackets() {
210219 do {
211220 slot = wrapper .passthrough (Types .BYTE );
212221
213- final Item item = protocol .getItemRewriter ().handleItemToClient (wrapper .user (), wrapper .read (protocol .getItemRewriter ().itemType ()));
214- wrapper .write (protocol .getItemRewriter ().itemType (), item );
222+ final Item item = protocol .getItemRewriter ().handleItemToClient (wrapper .user (), wrapper .read (protocol .getItemRewriter ().mappedItemType ()));
223+ wrapper .write (protocol .getItemRewriter ().mappedItemType (), item );
215224 if (mannequinData != null ) {
216225 mannequinData .setEquipment (slot , item );
217226 }
@@ -263,12 +272,10 @@ public void registerPackets() {
263272 private void storeMovementMannequinData (final PacketWrapper wrapper , final boolean position , final boolean rotation ) {
264273 final int entityId = wrapper .passthrough (Types .VAR_INT ); // Entity id
265274
266- final EntityTracker1_21_9 tracker = tracker (wrapper .user ());
267275 final TrackedEntity trackedEntity = tracker (wrapper .user ()).entity (entityId );
268- if (trackedEntity == null ) {
276+ if (trackedEntity == null || ! trackedEntity . hasData () ) {
269277 return ;
270278 }
271-
272279 final MannequinData mannequinData = trackedEntity .data ().get (MannequinData .class );
273280 if (mannequinData == null ) {
274281 return ;
@@ -470,7 +477,7 @@ protected void registerRewrites() {
470477 spawnEntityPacket .write (Types .DOUBLE , entity .z ()); // Z
471478 spawnEntityPacket .write (Types .BYTE , (byte ) Math .floor (entity .pitch () * 256.0F / 360.0F )); // Pitch
472479 spawnEntityPacket .write (Types .BYTE , (byte ) Math .floor (entity .yaw () * 256.0F / 360.0F )); // Yaw
473- spawnEntityPacket .write (Types .BYTE , (byte ) Math .floor (entity .yaw () * 256.0F / 360.0F )); // Head yaw
480+ spawnEntityPacket .write (Types .BYTE , (byte ) Math .floor (entity .getHeadYaw () * 256.0F / 360.0F )); // Head yaw
474481 spawnEntityPacket .write (Types .VAR_INT , 0 ); // Data
475482 spawnEntityPacket .write (Types .SHORT , (short ) 0 ); // Velocity X
476483 spawnEntityPacket .write (Types .SHORT , (short ) 0 ); // Velocity Y
@@ -535,11 +542,8 @@ public void handleEntityData(final int entityId, final List<EntityData> dataList
535542 entityData .removeIf (first -> dataList .stream ().anyMatch (second -> first .id () == second .id ()));
536543 for (final EntityData data : dataList ) {
537544 final Object value = data .value ();
538- if (value instanceof Item item ) {
539- entityData .add (new EntityData (data .id (), data .dataType (), item .copy ()));
540- } else {
541- entityData .add (new EntityData (data .id (), data .dataType (), value ));
542- }
545+
546+ entityData .add (new EntityData (data .id (), data .dataType (), Copyable .copy (value )));
543547 }
544548 }
545549
0 commit comments