diff --git a/src/engine/net/client/ClientConnection.java b/src/engine/net/client/ClientConnection.java index fc6dcef9..75288ce7 100644 --- a/src/engine/net/client/ClientConnection.java +++ b/src/engine/net/client/ClientConnection.java @@ -44,6 +44,10 @@ public class ClientConnection extends AbstractConnection { public ReentrantLock buyLock = new ReentrantLock(); public boolean desyncDebug = false; public byte[] lastByteBuffer; + public long lastTargetSwitchTime; + public int lastTargetID; + public int targetSwitchCount; + public int fastTargetSwitchCount; protected SessionID sessionID = null; private byte cryptoInitTries = 0; diff --git a/src/engine/util/KeyCloneAudit.java b/src/engine/util/KeyCloneAudit.java index 56900a9c..a0ab7595 100644 --- a/src/engine/util/KeyCloneAudit.java +++ b/src/engine/util/KeyCloneAudit.java @@ -1,9 +1,13 @@ package engine.util; +import engine.gameManager.ChatManager; import engine.gameManager.ConfigManager; import engine.gameManager.DbManager; +import engine.gameManager.SessionManager; +import engine.net.client.ClientConnection; import engine.net.client.Protocol; import engine.net.client.msg.ClientNetMsg; +import engine.net.client.msg.TargetObjectMsg; import engine.objects.Group; import engine.objects.PlayerCharacter; import org.pmw.tinylog.Logger; @@ -30,19 +34,43 @@ public enum KeyCloneAudit { } - public static boolean auditNetMsg(ClientNetMsg msg){ + public static boolean auditNetMsg(ClientNetMsg msg) { boolean valid = true; - if(msg.getProtocolMsg().equals(Protocol.KEEPALIVESERVERCLIENT)) + if (msg.getProtocolMsg().equals(Protocol.KEEPALIVESERVERCLIENT)) return true; - Long msgDelay = System.currentTimeMillis() - msg.getOrigin().lastMsgTime; + ClientConnection origin = (ClientConnection) msg.getOrigin(); + long now = System.currentTimeMillis(); + PlayerCharacter pc = SessionManager.getSession(origin).getPlayerCharacter(); - if(msgDelay < 100) - return false; + if (msg.getProtocolMsg().equals(Protocol.SETSELECTEDOBECT)) { + TargetObjectMsg tarMsg = (TargetObjectMsg) msg; + // Calculate time since last target switch + long timeSinceLastTarget = now - origin.lastTargetSwitchTime; + origin.lastTargetSwitchTime = now; + // Check if the target has changed + if (tarMsg.getTargetID() != origin.lastTargetID) { + origin.lastTargetID = tarMsg.getTargetID(); + origin.targetSwitchCount++; + + // If switching too fast, flag as bot-like behavior + if (timeSinceLastTarget < 300) { // Adjust this threshold if needed + origin.fastTargetSwitchCount++; + } else { + origin.fastTargetSwitchCount = Math.max(0, origin.fastTargetSwitchCount - 1); + } + + if (origin.fastTargetSwitchCount > 5) { + ChatManager.chatSystemInfo(pc, "Possible bot detected: Targeting too quickly."); + valid = false; + } + } + } return valid; } + }