From cb7c1d280247b5e25689cd1db199a3666908d6dc Mon Sep 17 00:00:00 2001 From: Thinkofdeath Date: Sun, 29 Jun 2014 21:10:34 +0100 Subject: [PATCH] Limit block placement/interaction packets diff --git a/src/main/java/net/minecraft/network/protocol/game/PacketPlayInBlockPlace.java b/src/main/java/net/minecraft/network/protocol/game/PacketPlayInBlockPlace.java index 774be58a0..3267f98e3 100644 --- a/src/main/java/net/minecraft/network/protocol/game/PacketPlayInBlockPlace.java +++ b/src/main/java/net/minecraft/network/protocol/game/PacketPlayInBlockPlace.java @@ -14,6 +14,7 @@ public class PacketPlayInBlockPlace implements Packet { private final int sequence; private final float yRot; private final float xRot; + public long timestamp; // Spigot public PacketPlayInBlockPlace(EnumHand enumhand, int i, float f, float f1) { this.hand = enumhand; @@ -23,6 +24,7 @@ public class PacketPlayInBlockPlace implements Packet { } private PacketPlayInBlockPlace(PacketDataSerializer packetdataserializer) { + this.timestamp = System.currentTimeMillis(); // Spigot this.hand = (EnumHand) packetdataserializer.readEnum(EnumHand.class); this.sequence = packetdataserializer.readVarInt(); this.yRot = packetdataserializer.readFloat(); diff --git a/src/main/java/net/minecraft/network/protocol/game/PacketPlayInUseItem.java b/src/main/java/net/minecraft/network/protocol/game/PacketPlayInUseItem.java index 92a182668..66ac250db 100644 --- a/src/main/java/net/minecraft/network/protocol/game/PacketPlayInUseItem.java +++ b/src/main/java/net/minecraft/network/protocol/game/PacketPlayInUseItem.java @@ -14,6 +14,7 @@ public class PacketPlayInUseItem implements Packet { private final MovingObjectPositionBlock blockHit; private final EnumHand hand; private final int sequence; + public long timestamp; // Spigot public PacketPlayInUseItem(EnumHand enumhand, MovingObjectPositionBlock movingobjectpositionblock, int i) { this.hand = enumhand; @@ -22,6 +23,7 @@ public class PacketPlayInUseItem implements Packet { } private PacketPlayInUseItem(PacketDataSerializer packetdataserializer) { + this.timestamp = System.currentTimeMillis(); // Spigot this.hand = (EnumHand) packetdataserializer.readEnum(EnumHand.class); this.blockHit = packetdataserializer.readBlockHitResult(); this.sequence = packetdataserializer.readVarInt(); diff --git a/src/main/java/net/minecraft/server/network/PlayerConnection.java b/src/main/java/net/minecraft/server/network/PlayerConnection.java index 8ace16b40..da95cd08c 100644 --- a/src/main/java/net/minecraft/server/network/PlayerConnection.java +++ b/src/main/java/net/minecraft/server/network/PlayerConnection.java @@ -1712,10 +1712,30 @@ public class PlayerConnection extends ServerCommonPacketListenerImpl implements } } + // Spigot start - limit place/interactions + private int limitedPackets; + private long lastLimitedPacket = -1; + + private boolean checkLimit(long timestamp) { + if (lastLimitedPacket != -1 && timestamp - lastLimitedPacket < 30 && limitedPackets++ >= 4) { + return false; + } + + if (lastLimitedPacket == -1 || timestamp - lastLimitedPacket >= 30) { + lastLimitedPacket = timestamp; + limitedPackets = 0; + return true; + } + + return true; + } + // Spigot end + @Override public void handleUseItemOn(PacketPlayInUseItem packetplayinuseitem) { PlayerConnectionUtils.ensureRunningOnSameThread(packetplayinuseitem, this, this.player.serverLevel()); if (this.player.isImmobile()) return; // CraftBukkit + if (!checkLimit(packetplayinuseitem.timestamp)) return; // Spigot - check limit if (this.player.hasClientLoaded()) { this.player.connection.ackBlockChangesUpTo(packetplayinuseitem.getSequence()); WorldServer worldserver = this.player.serverLevel(); @@ -1778,6 +1798,7 @@ public class PlayerConnection extends ServerCommonPacketListenerImpl implements public void handleUseItem(PacketPlayInBlockPlace packetplayinblockplace) { PlayerConnectionUtils.ensureRunningOnSameThread(packetplayinblockplace, this, this.player.serverLevel()); if (this.player.isImmobile()) return; // CraftBukkit + if (!checkLimit(packetplayinblockplace.timestamp)) return; // Spigot - check limit if (this.player.hasClientLoaded()) { this.ackBlockChangesUpTo(packetplayinblockplace.getSequence()); WorldServer worldserver = this.player.serverLevel(); -- 2.49.0