Skip to content

Commit c887ab7

Browse files
committed
Improve 1.12 keep_alive handling
Fixes handling of batches of keep alives and the technically possible collisions
1 parent 63afb2d commit c887ab7

2 files changed

Lines changed: 22 additions & 33 deletions

File tree

common/src/main/java/com/viaversion/viabackwards/protocol/v1_12_2to1_12_1/Protocol1_12_2To1_12_1.java

Lines changed: 11 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
import com.viaversion.viabackwards.api.BackwardsProtocol;
2222
import com.viaversion.viabackwards.protocol.v1_12_2to1_12_1.storage.KeepAliveTracker;
2323
import com.viaversion.viaversion.api.connection.UserConnection;
24-
import com.viaversion.viaversion.api.protocol.remapper.PacketHandlers;
2524
import com.viaversion.viaversion.api.type.Types;
2625
import com.viaversion.viaversion.protocols.v1_12to1_12_1.packet.ClientboundPackets1_12_1;
2726
import com.viaversion.viaversion.protocols.v1_12to1_12_1.packet.ServerboundPackets1_12_1;
@@ -34,32 +33,20 @@ public Protocol1_12_2To1_12_1() {
3433

3534
@Override
3635
protected void registerPackets() {
37-
registerClientbound(ClientboundPackets1_12_1.KEEP_ALIVE, new PacketHandlers() {
38-
@Override
39-
public void register() {
40-
handler(packetWrapper -> {
41-
Long keepAlive = packetWrapper.read(Types.LONG);
42-
packetWrapper.user().get(KeepAliveTracker.class).setKeepAlive(keepAlive);
43-
packetWrapper.write(Types.VAR_INT, keepAlive.hashCode());
44-
});
45-
}
36+
registerClientbound(ClientboundPackets1_12_1.KEEP_ALIVE, wrapper -> {
37+
long keepAlive = wrapper.read(Types.LONG);
38+
int id = wrapper.user().get(KeepAliveTracker.class).track(keepAlive);
39+
wrapper.write(Types.VAR_INT, id);
4640
});
4741

48-
registerServerbound(ServerboundPackets1_12_1.KEEP_ALIVE, new PacketHandlers() {
49-
@Override
50-
public void register() {
51-
handler(packetWrapper -> {
52-
int keepAlive = packetWrapper.read(Types.VAR_INT);
53-
long realKeepAlive = packetWrapper.user().get(KeepAliveTracker.class).getKeepAlive();
54-
if (keepAlive != Long.hashCode(realKeepAlive)) {
55-
packetWrapper.cancel(); // Wrong data, cancel packet
56-
return;
57-
}
58-
packetWrapper.write(Types.LONG, realKeepAlive);
59-
// Reset KeepAliveTracker (to prevent sending same valid value in a row causing a timeout)
60-
packetWrapper.user().get(KeepAliveTracker.class).setKeepAlive(Integer.MAX_VALUE);
61-
});
42+
registerServerbound(ServerboundPackets1_12_1.KEEP_ALIVE, wrapper -> {
43+
int keepAlive = wrapper.read(Types.VAR_INT);
44+
Long realKeepAlive = wrapper.user().get(KeepAliveTracker.class).consume(keepAlive);
45+
if (realKeepAlive == null) {
46+
wrapper.cancel(); // stale/bad
47+
return;
6248
}
49+
wrapper.write(Types.LONG, realKeepAlive);
6350
});
6451
}
6552

common/src/main/java/com/viaversion/viabackwards/protocol/v1_12_2to1_12_1/storage/KeepAliveTracker.java

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,20 +19,22 @@
1919
package com.viaversion.viabackwards.protocol.v1_12_2to1_12_1.storage;
2020

2121
import com.viaversion.viaversion.api.connection.StorableObject;
22+
import java.util.HashMap;
23+
import java.util.Map;
24+
import org.checkerframework.checker.nullness.qual.Nullable;
2225

2326
public class KeepAliveTracker implements StorableObject {
24-
private long keepAlive = Integer.MAX_VALUE;
2527

26-
public long getKeepAlive() {
27-
return keepAlive;
28-
}
28+
private final Map<Integer, Long> pending = new HashMap<>();
29+
private int nextId;
2930

30-
public void setKeepAlive(long keepAlive) {
31-
this.keepAlive = keepAlive;
31+
public int track(long original) {
32+
int id = nextId++;
33+
pending.put(id, original);
34+
return id;
3235
}
3336

34-
@Override
35-
public String toString() {
36-
return "KeepAliveTracker{" + "keepAlive=" + keepAlive + '}';
37+
public @Nullable Long consume(int id) {
38+
return pending.remove(id);
3739
}
3840
}

0 commit comments

Comments
 (0)