From 881419a673d5d5cc8fdf0f4b5d8897cb892f3736 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/server/PacketPlayInBlockPlace.java b/src/main/java/net/minecraft/server/PacketPlayInBlockPlace.java index 06f3954b0..167da27b2 100644 --- a/src/main/java/net/minecraft/server/PacketPlayInBlockPlace.java +++ b/src/main/java/net/minecraft/server/PacketPlayInBlockPlace.java @@ -5,6 +5,7 @@ import java.io.IOException; public class PacketPlayInBlockPlace implements Packet { private EnumHand a; + public long timestamp; // Spigot public PacketPlayInBlockPlace() {} @@ -13,6 +14,7 @@ public class PacketPlayInBlockPlace implements Packet { } public void a(PacketDataSerializer packetdataserializer) throws IOException { + this.timestamp = System.currentTimeMillis(); // Spigot this.a = (EnumHand) packetdataserializer.a(EnumHand.class); } diff --git a/src/main/java/net/minecraft/server/PacketPlayInUseItem.java b/src/main/java/net/minecraft/server/PacketPlayInUseItem.java index 3c5f81519..ced2336fe 100644 --- a/src/main/java/net/minecraft/server/PacketPlayInUseItem.java +++ b/src/main/java/net/minecraft/server/PacketPlayInUseItem.java @@ -10,10 +10,12 @@ public class PacketPlayInUseItem implements Packet { private float d; private float e; private float f; + public long timestamp; public PacketPlayInUseItem() {} public void a(PacketDataSerializer packetdataserializer) throws IOException { + this.timestamp = System.currentTimeMillis(); // Spigot this.a = packetdataserializer.e(); this.b = (EnumDirection) packetdataserializer.a(EnumDirection.class); this.c = (EnumHand) packetdataserializer.a(EnumHand.class); diff --git a/src/main/java/net/minecraft/server/PlayerConnection.java b/src/main/java/net/minecraft/server/PlayerConnection.java index 73c813820..b3d18b8ae 100644 --- a/src/main/java/net/minecraft/server/PlayerConnection.java +++ b/src/main/java/net/minecraft/server/PlayerConnection.java @@ -1192,9 +1192,29 @@ public class PlayerConnection implements PacketListenerPlayIn, ITickable { // CraftBukkit end } + // 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 + public void a(PacketPlayInUseItem packetplayinuseitem) { PlayerConnectionUtils.ensureMainThread(packetplayinuseitem, this, this.player.getWorldServer()); if (this.player.isFrozen()) return; // CraftBukkit + if (!checkLimit(packetplayinuseitem.timestamp)) return; // Spigot - check limit WorldServer worldserver = this.minecraftServer.getWorldServer(this.player.dimension); EnumHand enumhand = packetplayinuseitem.d(); ItemStack itemstack = this.player.b(enumhand); @@ -1224,6 +1244,7 @@ public class PlayerConnection implements PacketListenerPlayIn, ITickable { public void a(PacketPlayInBlockPlace packetplayinblockplace) { PlayerConnectionUtils.ensureMainThread(packetplayinblockplace, this, this.player.getWorldServer()); if (this.player.isFrozen()) return; // CraftBukkit + if (!checkLimit(packetplayinblockplace.timestamp)) return; // Spigot - check limit WorldServer worldserver = this.minecraftServer.getWorldServer(this.player.dimension); EnumHand enumhand = packetplayinblockplace.b(); ItemStack itemstack = this.player.b(enumhand); -- 2.19.1