Skip to content

Commit fe890fa

Browse files
FlorianMichaelkennytv
authored andcommitted
Handle relative player rotations
1 parent 9806afe commit fe890fa

File tree

3 files changed

+75
-8
lines changed

3 files changed

+75
-8
lines changed

common/src/main/java/com/viaversion/viabackwards/protocol/v1_21_9to1_21_7/Protocol1_21_9To1_21_7.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import com.viaversion.viabackwards.protocol.v1_21_9to1_21_7.rewriter.ComponentRewriter1_21_9;
2727
import com.viaversion.viabackwards.protocol.v1_21_9to1_21_7.rewriter.EntityPacketRewriter1_21_9;
2828
import com.viaversion.viabackwards.protocol.v1_21_9to1_21_7.rewriter.ParticleRewriter1_21_9;
29+
import com.viaversion.viabackwards.protocol.v1_21_9to1_21_7.storage.PlayerRotationStorage;
2930
import com.viaversion.viabackwards.protocol.v1_21_9to1_21_7.tracker.EntityTracker1_21_9;
3031
import com.viaversion.viaversion.api.connection.UserConnection;
3132
import com.viaversion.viaversion.api.minecraft.data.version.StructuredDataKeys1_21_5;
@@ -39,7 +40,6 @@
3940
import com.viaversion.viaversion.api.type.types.version.Types1_20_5;
4041
import com.viaversion.viaversion.api.type.types.version.VersionedTypes;
4142
import com.viaversion.viaversion.api.type.types.version.VersionedTypesHolder;
42-
import com.viaversion.viaversion.data.entity.EntityTrackerBase;
4343
import com.viaversion.viaversion.data.item.ItemHasherBase;
4444
import com.viaversion.viaversion.protocols.v1_21_5to1_21_6.packet.ClientboundConfigurationPackets1_21_6;
4545
import com.viaversion.viaversion.protocols.v1_21_5to1_21_6.packet.ClientboundPacket1_21_6;
@@ -56,7 +56,6 @@
5656
import com.viaversion.viaversion.rewriter.ParticleRewriter;
5757
import com.viaversion.viaversion.rewriter.StatisticsRewriter;
5858
import com.viaversion.viaversion.rewriter.TagRewriter;
59-
import com.viaversion.viaversion.util.SerializerVersion;
6059

6160
import static com.viaversion.viaversion.util.ProtocolUtil.packetTypeMap;
6261

@@ -192,7 +191,8 @@ protected void registerPackets() {
192191
@Override
193192
public void init(final UserConnection connection) {
194193
addEntityTracker(connection, new EntityTracker1_21_9(connection, EntityTypes1_21_9.PLAYER));
195-
addItemHasher(connection, new ItemHasherBase(this, connection, SerializerVersion.V1_21_6, SerializerVersion.V1_21_6));
194+
addItemHasher(connection, new ItemHasherBase(this, connection));
195+
connection.put(new PlayerRotationStorage());
196196
}
197197

198198
@Override

common/src/main/java/com/viaversion/viabackwards/protocol/v1_21_9to1_21_7/rewriter/EntityPacketRewriter1_21_9.java

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import com.viaversion.viabackwards.api.rewriters.EntityRewriter;
2525
import com.viaversion.viabackwards.protocol.v1_21_9to1_21_7.Protocol1_21_9To1_21_7;
2626
import com.viaversion.viabackwards.protocol.v1_21_9to1_21_7.storage.MannequinData;
27+
import com.viaversion.viabackwards.protocol.v1_21_9to1_21_7.storage.PlayerRotationStorage;
2728
import com.viaversion.viaversion.api.connection.UserConnection;
2829
import com.viaversion.viaversion.api.minecraft.BlockPosition;
2930
import com.viaversion.viaversion.api.minecraft.GameProfile;
@@ -38,6 +39,7 @@
3839
import com.viaversion.viaversion.api.type.Types;
3940
import com.viaversion.viaversion.api.type.types.version.VersionedTypes;
4041
import 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;
4143
import com.viaversion.viaversion.protocols.v1_21_7to1_21_9.packet.ClientboundConfigurationPackets1_21_9;
4244
import com.viaversion.viaversion.protocols.v1_21_7to1_21_9.packet.ClientboundPacket1_21_9;
4345
import 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();
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/*
2+
* This file is part of ViaBackwards - https://github.com/ViaVersion/ViaBackwards
3+
* Copyright (C) 2016-2025 ViaVersion and contributors
4+
*
5+
* This program is free software: you can redistribute it and/or modify
6+
* it under the terms of the GNU General Public License as published by
7+
* the Free Software Foundation, either version 3 of the License, or
8+
* (at your option) any later version.
9+
*
10+
* This program is distributed in the hope that it will be useful,
11+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
12+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13+
* GNU General Public License for more details.
14+
*
15+
* You should have received a copy of the GNU General Public License
16+
* along with this program. If not, see <http://www.gnu.org/licenses/>.
17+
*/
18+
package com.viaversion.viabackwards.protocol.v1_21_9to1_21_7.storage;
19+
20+
import com.viaversion.viaversion.api.connection.StorableObject;
21+
22+
public final class PlayerRotationStorage implements StorableObject {
23+
24+
private float yaw, pitch;
25+
26+
public void setRotation(final float yaw, final float pitch) {
27+
this.yaw = yaw;
28+
this.pitch = pitch;
29+
}
30+
31+
public float yaw() {
32+
return yaw;
33+
}
34+
35+
public float pitch() {
36+
return pitch;
37+
}
38+
}

0 commit comments

Comments
 (0)