Only handly the packet type (KeepAlive/Transaction) our ping strategy cares about

This commit is contained in:
Axionize committed 2024-12-16 16:46:17 -05:00
1 parent 664d3899d7
commit 01188bc79f
4 files changed
+37 -28

No files matched your search

@@ -8,6 +8,7 @@ import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientPo
import com.github.retrooper.packetevents.wrapper.play.client.WrapperPlayClientWindowConfirmation;
import me.caseload.knockbacksync.Base;
import me.caseload.knockbacksync.manager.PlayerDataManager;
import me.caseload.knockbacksync.player.PingStrategy;
import me.caseload.knockbacksync.player.PlayerData;
import me.caseload.knockbacksync.util.data.Pair;
@@ -25,28 +26,21 @@ public class PingReceiveListener extends PacketListenerAbstract {
// And then receive a response we have to ensure that if the packet was sent by us we cancel it
// otherwise the server will likely kick the player
PacketTypeCommon packetType = event.getPacketType();
if (packetType == PacketType.Play.Client.KEEP_ALIVE) {
PlayerData playerData = PlayerDataManager.getPlayerData(event.getUser().getUUID());
if (playerData == null) return;
if (playerData.pingStrategy == PingStrategy.KEEPALIVE && packetType == PacketType.Play.Client.KEEP_ALIVE) {
WrapperPlayClientKeepAlive keepAlive = new WrapperPlayClientKeepAlive(event);
PlayerData playerData = PlayerDataManager.getPlayerData(event.getUser().getUUID());
if (playerData == null) return;
long receivedId = keepAlive.getId();
handlePingCalculationPackets(event, playerData, receivedId, playerData.keepaliveMap);
} else if (packetType == PacketType.Play.Client.PONG) {
} else if (playerData.pingStrategy == PingStrategy.TRANSACTION && packetType == PacketType.Play.Client.PONG) {
WrapperPlayClientPong pong = new WrapperPlayClientPong(event);
PlayerData playerData = PlayerDataManager.getPlayerData(event.getUser().getUUID());
if (playerData == null) return;
int id = pong.getId();
handlePingCalculationPackets(event, playerData, id, playerData.transactionsSent);
} else if (packetType == PacketType.Play.Client.WINDOW_CONFIRMATION) {
} else if (playerData.pingStrategy == PingStrategy.TRANSACTION && packetType == PacketType.Play.Client.WINDOW_CONFIRMATION) {
WrapperPlayClientWindowConfirmation windowConfirmation = new WrapperPlayClientWindowConfirmation(event);
PlayerData playerData = PlayerDataManager.getPlayerData(event.getUser().getUUID());
if (playerData == null) return;
int id = windowConfirmation.getActionId();
handlePingCalculationPackets(event, playerData, id, playerData.transactionsSent);
@@ -11,6 +11,7 @@ import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerPi
import com.github.retrooper.packetevents.wrapper.play.server.WrapperPlayServerWindowConfirmation;
import me.caseload.knockbacksync.Base;
import me.caseload.knockbacksync.manager.PlayerDataManager;
import me.caseload.knockbacksync.player.PingStrategy;
import me.caseload.knockbacksync.player.PlayerData;
import me.caseload.knockbacksync.util.data.Pair;
@@ -29,29 +30,23 @@ public class PingSendListener extends PacketListenerAbstract {
if (event.isCancelled()) return;
PacketTypeCommon packetType = event.getPacketType();
if (packetType.equals(PacketType.Play.Server.KEEP_ALIVE)) {
PlayerData playerData = PlayerDataManager.getPlayerData(event.getUser().getUUID());
if (playerData == null) return;
if (playerData.pingStrategy == PingStrategy.KEEPALIVE && packetType.equals(PacketType.Play.Server.KEEP_ALIVE)) {
WrapperPlayServerKeepAlive keepAlive = new WrapperPlayServerKeepAlive(event);
long id = keepAlive.getId();
PlayerData playerData = PlayerDataManager.getPlayerData(event.getUser().getUUID());
if (playerData == null) return;
playerData.keepaliveMap.add(new Pair<>(id, System.nanoTime()));
} else if (packetType.equals(PacketType.Play.Server.PING)) {
} else if (playerData.pingStrategy == PingStrategy.TRANSACTION && packetType.equals(PacketType.Play.Server.PING)) {
WrapperPlayServerPing ping = new WrapperPlayServerPing(event);
int id = ping.getId();
PlayerData playerData = PlayerDataManager.getPlayerData(event.getUser().getUUID());
if (playerData == null) return;
playerData.transactionsSent.add(new Pair<>(id, System.nanoTime()));
} else if (packetType.equals(PacketType.Play.Server.WINDOW_CONFIRMATION)) {
} else if (playerData.pingStrategy == PingStrategy.TRANSACTION && packetType.equals(PacketType.Play.Server.WINDOW_CONFIRMATION)) {
WrapperPlayServerWindowConfirmation confirmation = new WrapperPlayServerWindowConfirmation(event);
int id = confirmation.getActionId();
PlayerData playerData = PlayerDataManager.getPlayerData(event.getUser().getUUID());
if (playerData == null) return;
playerData.transactionsSent.add(new Pair<>(id, System.nanoTime()));
}
}
@@ -0,0 +1,6 @@
package me.caseload.knockbacksync.player;
public enum PingStrategy {
KEEPALIVE,
TRANSACTION
}
@@ -18,6 +18,7 @@ import lombok.Setter;
import me.caseload.knockbacksync.Base;
import me.caseload.knockbacksync.command.subcommand.ToggleOffGroundSubcommand;
import me.caseload.knockbacksync.event.KBSyncEventHandler;
import me.caseload.knockbacksync.event.events.ConfigReloadEvent;
import me.caseload.knockbacksync.event.events.ToggleOnOffEvent;
import me.caseload.knockbacksync.manager.CombatManager;
import me.caseload.knockbacksync.scheduler.AbstractTaskHandle;
@@ -80,6 +81,7 @@ public class PlayerData {
@Nullable @Setter private Integer lastDamageTicks;
@Setter private double gravityAttribute = 0.08;
@Setter private double knockbackResistanceAttribute = 0.0;
public PingStrategy pingStrategy; // this is currently shared between all instances, but can be made per-player later
public PlayerData(PlatformPlayer platformPlayer) {
this.uuid = platformPlayer.getUUID();
@@ -140,9 +142,8 @@ public class PlayerData {
public void sendPing(boolean async) {
if (user == null || user.getEncoderState() != ConnectionState.PLAY) return;
String pingStrategy = Base.INSTANCE.getConfigManager().getConfigWrapper().getString("ping_strategy", "KEEPALIVE");
switch (pingStrategy) {
case "KEEPALIVE":
case KEEPALIVE:
long keepAliveID = async ? NETTY_THREAD_TRANSACTION_ID : MAIN_THREAD_TRANSACTION_ID;
if (async) {
ChannelHelper.runInEventLoop(user.getChannel(), () -> {
@@ -155,8 +156,7 @@ public class PlayerData {
user.sendPacket(new WrapperPlayServerKeepAlive(keepAliveID));
}
break;
case "PING":
case "TRANSACTION":
case TRANSACTION:
PacketWrapper<?> packet;
short pingTransactionID = async ? NETTY_THREAD_TRANSACTION_ID : MAIN_THREAD_TRANSACTION_ID;
if (PacketEvents.getAPI().getServerManager().getVersion().isNewerThanOrEquals(ServerVersion.V_1_17)) {
@@ -340,4 +340,18 @@ public class PlayerData {
keepaliveMap.clear();
}
}
@KBSyncEventHandler
public void onConfigReloadEvent(ConfigReloadEvent event) {
String pingStrategy = event.getConfigManager().getConfigWrapper().getString("ping_strategy", "KEEPALIVE");
switch (pingStrategy) {
case "KEEPALIVE":
this.pingStrategy = PingStrategy.KEEPALIVE;
break;
case "PING":
case "TRANSACTION":
this.pingStrategy = PingStrategy.TRANSACTION;
break;
}
}
}