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 org.reflections.Reflections;
import emu.lunarcore.LunarCore; import emu.lunarcore.LunarCore;
import emu.lunarcore.server.packet.CmdId; import emu.lunarcore.server.packet.*;
import emu.lunarcore.server.packet.Opcodes;
import emu.lunarcore.server.packet.PacketHandler;
import emu.lunarcore.server.packet.SessionState;
import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap; import it.unimi.dsi.fastutil.ints.Int2ObjectOpenHashMap;
@@ -51,6 +48,15 @@ public class GameServerPacketHandler {
PacketHandler handler = this.handlers.get(cmdId); PacketHandler handler = this.handlers.get(cmdId);
if (handler != null) { 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 { try {
// Make sure session is ready for packets // Make sure session is ready for packets
SessionState state = session.getState(); SessionState state = session.getState();
@@ -76,8 +82,6 @@ public class GameServerPacketHandler {
} catch (Exception ex) { } catch (Exception ex) {
ex.printStackTrace(); ex.printStackTrace();
} }
return; // Packet successfully handled
} }
// Log unhandled packets // Log unhandled packets

View File

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

View File

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