Skip to content

Commit f08a412

Browse files
Drop idle packets where only horizontal collision changed in 1.21->1.21.2 (ViaVersion#4220)
1 parent dcf050a commit f08a412

File tree

3 files changed

+66
-6
lines changed

3 files changed

+66
-6
lines changed

common/src/main/java/com/viaversion/viaversion/protocols/v1_21to1_21_2/Protocol1_21To1_21_2.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
import com.viaversion.viaversion.protocols.v1_21to1_21_2.storage.BundleStateTracker;
5050
import com.viaversion.viaversion.protocols.v1_21to1_21_2.storage.ChunkLoadTracker;
5151
import com.viaversion.viaversion.protocols.v1_21to1_21_2.storage.EntityTracker1_21_2;
52+
import com.viaversion.viaversion.protocols.v1_21to1_21_2.storage.GroundFlagTracker;
5253
import com.viaversion.viaversion.protocols.v1_21to1_21_2.storage.PlayerPositionStorage;
5354
import com.viaversion.viaversion.rewriter.AttributeRewriter;
5455
import com.viaversion.viaversion.rewriter.SoundRewriter;
@@ -234,6 +235,7 @@ public void init(final UserConnection connection) {
234235
connection.put(new BundleStateTracker());
235236
connection.put(new PlayerPositionStorage());
236237
connection.put(new ChunkLoadTracker());
238+
connection.put(new GroundFlagTracker());
237239
}
238240

239241
@Override

common/src/main/java/com/viaversion/viaversion/protocols/v1_21to1_21_2/rewriter/EntityPacketRewriter1_21_2.java

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@
4040
import com.viaversion.viaversion.protocols.v1_21to1_21_2.storage.ChunkLoadTracker;
4141
import com.viaversion.viaversion.protocols.v1_21to1_21_2.storage.ClientVehicleStorage;
4242
import com.viaversion.viaversion.protocols.v1_21to1_21_2.storage.EntityTracker1_21_2;
43+
import com.viaversion.viaversion.protocols.v1_21to1_21_2.storage.GroundFlagTracker;
4344
import com.viaversion.viaversion.protocols.v1_21to1_21_2.storage.PlayerPositionStorage;
4445
import com.viaversion.viaversion.rewriter.EntityRewriter;
4546
import com.viaversion.viaversion.rewriter.RegistryDataRewriter;
@@ -163,6 +164,7 @@ public void register() {
163164

164165
trackWorldDataByKey1_20_5(wrapper.user(), dimensionId, world);
165166

167+
wrapper.user().put(new GroundFlagTracker());
166168
wrapper.user().remove(ClientVehicleStorage.class);
167169
});
168170

@@ -314,15 +316,15 @@ public void register() {
314316
wrapper.passthrough(Types.DOUBLE); // X
315317
wrapper.passthrough(Types.DOUBLE); // Y
316318
wrapper.passthrough(Types.DOUBLE); // Z
317-
readOnGround(wrapper);
319+
handleOnGround(wrapper);
318320
});
319321
protocol.registerServerbound(ServerboundPackets1_21_2.MOVE_PLAYER_POS_ROT, wrapper -> {
320322
final double x = wrapper.passthrough(Types.DOUBLE); // X
321323
final double y = wrapper.passthrough(Types.DOUBLE); // Y
322324
final double z = wrapper.passthrough(Types.DOUBLE); // Z
323325
final float yaw = wrapper.passthrough(Types.FLOAT); // Yaw
324326
final float pitch = wrapper.passthrough(Types.FLOAT); // Pitch
325-
readOnGround(wrapper);
327+
handleOnGround(wrapper);
326328

327329
final PlayerPositionStorage playerPositionStorage = wrapper.user().get(PlayerPositionStorage.class);
328330
if (playerPositionStorage.checkCaptureNextPlayerPositionPacket()) {
@@ -335,9 +337,19 @@ public void register() {
335337
protocol.registerServerbound(ServerboundPackets1_21_2.MOVE_PLAYER_ROT, wrapper -> {
336338
wrapper.passthrough(Types.FLOAT); // Yaw
337339
wrapper.passthrough(Types.FLOAT); // Pitch
338-
readOnGround(wrapper);
340+
handleOnGround(wrapper);
341+
});
342+
protocol.registerServerbound(ServerboundPackets1_21_2.MOVE_PLAYER_STATUS_ONLY, wrapper -> {
343+
final GroundFlagTracker tracker = wrapper.user().get(GroundFlagTracker.class);
344+
final boolean prevOnGround = tracker.onGround();
345+
final boolean prevHorizontalCollision = tracker.horizontalCollision();
346+
347+
handleOnGround(wrapper);
348+
if (prevOnGround == tracker.onGround() && prevHorizontalCollision != tracker.horizontalCollision()) {
349+
// Newer clients will send idle packets even though the on ground state didn't change, ignore them
350+
wrapper.cancel();
351+
}
339352
});
340-
protocol.registerServerbound(ServerboundPackets1_21_2.MOVE_PLAYER_STATUS_ONLY, this::readOnGround);
341353
protocol.registerServerbound(ServerboundPackets1_21_2.ACCEPT_TELEPORTATION, wrapper -> {
342354
final PlayerPositionStorage playerPositionStorage = wrapper.user().get(PlayerPositionStorage.class);
343355
if (playerPositionStorage.checkHasPlayerPosition()) {
@@ -370,9 +382,12 @@ private RegistryDataRewriter registryDataRewriter() {
370382
return registryDataRewriter;
371383
}
372384

373-
private void readOnGround(final PacketWrapper wrapper) {
385+
private void handleOnGround(final PacketWrapper wrapper) {
386+
final GroundFlagTracker tracker = wrapper.user().get(GroundFlagTracker.class);
387+
374388
final short data = wrapper.read(Types.UNSIGNED_BYTE);
375-
wrapper.write(Types.BOOLEAN, (data & 1) != 0); // On ground, ignoring horizontal collision data
389+
wrapper.write(Types.BOOLEAN, tracker.setOnGround((data & 1) != 0)); // Ignoring horizontal collision data
390+
tracker.setHorizontalCollision((data & 2) != 0);
376391
}
377392

378393
private void storeEntityPositionRotation(final PacketWrapper wrapper, final boolean position, final boolean rotation) {
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
/*
2+
* This file is part of ViaVersion - https://github.com/ViaVersion/ViaVersion
3+
* Copyright (C) 2016-2024 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.viaversion.protocols.v1_21to1_21_2.storage;
19+
20+
import com.viaversion.viaversion.api.connection.StorableObject;
21+
22+
public final class GroundFlagTracker implements StorableObject {
23+
24+
private boolean onGround;
25+
private boolean horizontalCollision;
26+
27+
public boolean onGround() {
28+
return this.onGround;
29+
}
30+
31+
public boolean setOnGround(boolean onGround) {
32+
return this.onGround = onGround;
33+
}
34+
35+
public boolean horizontalCollision() {
36+
return this.horizontalCollision;
37+
}
38+
39+
public void setHorizontalCollision(boolean horizontalCollision) {
40+
this.horizontalCollision = horizontalCollision;
41+
}
42+
43+
}

0 commit comments

Comments
 (0)