Prevent packet spam

This commit is contained in:
Melledy
2023-12-03 02:32:28 -08:00
parent d07b98f5e3
commit 2dc2cd8df3
3 changed files with 16 additions and 10 deletions

View File

@@ -5,10 +5,7 @@ import java.util.Set;
import org.reflections.Reflections;
import emu.lunarcore.LunarCore;
import emu.lunarcore.server.packet.CmdId;
import emu.lunarcore.server.packet.Opcodes;
import emu.lunarcore.server.packet.PacketHandler;
import emu.lunarcore.server.packet.SessionState;
import emu.lunarcore.server.packet.*;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
@@ -51,6 +48,15 @@ public class GameServerPacketHandler {
PacketHandler handler = this.handlers.get(cmdId);
if (handler != null) {
// Check cooldown to prevent packet spam
long timestamp = System.currentTimeMillis();
if (session.getPacketCooldown().get(cmdId) >= timestamp) {
//LunarCore.getLogger().warn("Dropped a packet " + CmdIdUtils.getCmdIdName(cmdId));
return;
} else {
session.getPacketCooldown().put(cmdId, timestamp + 5);
}
try {
// Make sure session is ready for packets
SessionState state = session.getState();
@@ -70,14 +76,12 @@ public class GameServerPacketHandler {
return;
}
}
// Handle packet
handler.handle(session, data);
} catch (Exception ex) {
ex.printStackTrace();
}
return; // Packet successfully handled
}
// Log unhandled packets

View File

@@ -11,6 +11,8 @@ import emu.lunarcore.server.packet.SessionState;
import emu.lunarcore.util.Utils;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import it.unimi.dsi.fastutil.ints.Int2LongMap;
import it.unimi.dsi.fastutil.ints.Int2LongOpenHashMap;
import kcp.highway.Ukcp;
import lombok.AccessLevel;
import lombok.Getter;
@@ -18,6 +20,7 @@ import lombok.Getter;
@Getter
public class GameSession {
private final GameServer server;
private final Int2LongMap packetCooldown;
private InetSocketAddress address;
private Account account;
@@ -25,13 +28,14 @@ public class GameSession {
// Network
@Getter(AccessLevel.PRIVATE) private Ukcp ukcp;
// Flags
private SessionState state = SessionState.WAITING_FOR_TOKEN;
private boolean useSecretKey;
private GameSession(GameServer server) {
this.server = server;
this.packetCooldown = new Int2LongOpenHashMap();
}
public GameSession(GameServer server, Ukcp ukcp) {

View File

@@ -3,7 +3,5 @@ package emu.lunarcore.server.packet;
import emu.lunarcore.server.game.GameSession;
public abstract class PacketHandler {
protected static final byte[] EMPTY_BYTE_ARRAY = new byte[0];
public abstract void handle(GameSession session, byte[] data) throws Exception;
}