diff --git a/NCPCore/src/main/java/fr/neatmonster/nocheatplus/checks/moving/MorePackets.java b/NCPCore/src/main/java/fr/neatmonster/nocheatplus/checks/moving/MorePackets.java index 68e4cb47..f162cd2b 100644 --- a/NCPCore/src/main/java/fr/neatmonster/nocheatplus/checks/moving/MorePackets.java +++ b/NCPCore/src/main/java/fr/neatmonster/nocheatplus/checks/moving/MorePackets.java @@ -60,7 +60,7 @@ public class MorePackets extends Check { } // Check for a violation of the set limits. - final double violation = NetStatic.morePacketsCheck(data.morePacketsFreq, time, 1f, cc.morePacketsEPSMax, cc.morePacketsEPSIdeal); + final double violation = NetStatic.morePacketsCheck(data.morePacketsFreq, time, 1f, cc.morePacketsEPSMax, cc.morePacketsEPSIdeal, data.morePacketsBurstFreq, cc.morePacketsBurstPackets, cc.morePacketsBurstEPM); // Process violation result. if (violation > 0.0) { diff --git a/NCPCore/src/main/java/fr/neatmonster/nocheatplus/checks/moving/MovingConfig.java b/NCPCore/src/main/java/fr/neatmonster/nocheatplus/checks/moving/MovingConfig.java index 5a14fa78..6d3ff182 100644 --- a/NCPCore/src/main/java/fr/neatmonster/nocheatplus/checks/moving/MovingConfig.java +++ b/NCPCore/src/main/java/fr/neatmonster/nocheatplus/checks/moving/MovingConfig.java @@ -80,6 +80,8 @@ public class MovingConfig extends ACheckConfig { public final float morePacketsEPSIdeal; /** The maximum number of packets per second that we accept. */ public final float morePacketsEPSMax; + public final float morePacketsBurstPackets; + public final double morePacketsBurstEPM; public final ActionList morePacketsActions; public final boolean morePacketsVehicleCheck; @@ -173,6 +175,8 @@ public class MovingConfig extends ACheckConfig { morePacketsCheck = config.getBoolean(ConfPaths.MOVING_MOREPACKETS_CHECK); morePacketsEPSIdeal = config.getInt(ConfPaths.MOVING_MOREPACKETS_EPSIDEAL); morePacketsEPSMax = Math.max(morePacketsEPSIdeal, config.getInt(ConfPaths.MOVING_MOREPACKETS_EPSMAX)); + morePacketsBurstPackets = config.getInt(ConfPaths.MOVING_MOREPACKETS_BURST_PACKETS); + morePacketsBurstEPM = config.getInt(ConfPaths.MOVING_MOREPACKETS_BURST_EPM); morePacketsActions = config.getOptimizedActionList(ConfPaths.MOVING_MOREPACKETS_ACTIONS, Permissions.MOVING_MOREPACKETS); morePacketsVehicleCheck = config.getBoolean(ConfPaths.MOVING_MOREPACKETSVEHICLE_CHECK); diff --git a/NCPCore/src/main/java/fr/neatmonster/nocheatplus/checks/moving/MovingData.java b/NCPCore/src/main/java/fr/neatmonster/nocheatplus/checks/moving/MovingData.java index ff261f4a..eb2aefa3 100644 --- a/NCPCore/src/main/java/fr/neatmonster/nocheatplus/checks/moving/MovingData.java +++ b/NCPCore/src/main/java/fr/neatmonster/nocheatplus/checks/moving/MovingData.java @@ -123,7 +123,7 @@ public class MovingData extends ACheckData { /** Active velocity entries (horizontal distance). */ public final List hVelActive = new LinkedList(); /** Queued velocity entries (horizontal distance). */ - public final List hVelQueued = new LinkedList(); + public final List hVelQueued = new LinkedList(); // Coordinates. /** Last from coordinates. */ @@ -148,7 +148,10 @@ public class MovingData extends ACheckData { public boolean creativeFlyPreviousRefused; // Data of the more packets check. + /** Packet frequency count. */ public final ActionFrequency morePacketsFreq = new ActionFrequency(10, 500); + /** Burst count. */ + public final ActionFrequency morePacketsBurstFreq = new ActionFrequency(12, 5000); private Location morePacketsSetback = null; // Data of the more packets vehicle check. diff --git a/NCPCore/src/main/java/fr/neatmonster/nocheatplus/config/ConfPaths.java b/NCPCore/src/main/java/fr/neatmonster/nocheatplus/config/ConfPaths.java index 2a73c05f..4b1a3483 100644 --- a/NCPCore/src/main/java/fr/neatmonster/nocheatplus/config/ConfPaths.java +++ b/NCPCore/src/main/java/fr/neatmonster/nocheatplus/config/ConfPaths.java @@ -505,6 +505,9 @@ public abstract class ConfPaths { public static final String MOVING_MOREPACKETS_CHECK = MOVING_MOREPACKETS + "active"; public static final String MOVING_MOREPACKETS_EPSIDEAL = MOVING_MOREPACKETS + "epsideal"; public static final String MOVING_MOREPACKETS_EPSMAX = MOVING_MOREPACKETS + "epsmax"; + private static final String MOVING_MOREPACKETS_BURST = MOVING_MOREPACKETS + "burst."; + public static final String MOVING_MOREPACKETS_BURST_PACKETS = MOVING_MOREPACKETS_BURST + "packets"; + public static final String MOVING_MOREPACKETS_BURST_EPM = MOVING_MOREPACKETS_BURST + "epmviolation"; public static final String MOVING_MOREPACKETS_ACTIONS = MOVING_MOREPACKETS + "actions"; private static final String MOVING_MOREPACKETSVEHICLE = MOVING + "morepacketsvehicle."; diff --git a/NCPCore/src/main/java/fr/neatmonster/nocheatplus/config/DefaultConfig.java b/NCPCore/src/main/java/fr/neatmonster/nocheatplus/config/DefaultConfig.java index 6d165ca1..1c8b1f86 100644 --- a/NCPCore/src/main/java/fr/neatmonster/nocheatplus/config/DefaultConfig.java +++ b/NCPCore/src/main/java/fr/neatmonster/nocheatplus/config/DefaultConfig.java @@ -357,6 +357,8 @@ public class DefaultConfig extends ConfigFile { set(ConfPaths.MOVING_MOREPACKETS_CHECK, true); set(ConfPaths.MOVING_MOREPACKETS_EPSIDEAL, 20); set(ConfPaths.MOVING_MOREPACKETS_EPSMAX, 22); + set(ConfPaths.MOVING_MOREPACKETS_BURST_PACKETS, 40); + set(ConfPaths.MOVING_MOREPACKETS_BURST_EPM, 30); set(ConfPaths.MOVING_MOREPACKETS_ACTIONS, "cancel vl>10 log:morepackets:0:2:if cancel vl>100 log:morepackets:0:2:if cancel cmd:kickpackets"); set(ConfPaths.MOVING_MOREPACKETSVEHICLE_CHECK, true); diff --git a/NCPCore/src/main/java/fr/neatmonster/nocheatplus/net/NetStatic.java b/NCPCore/src/main/java/fr/neatmonster/nocheatplus/net/NetStatic.java index b0d252ea..0780e259 100644 --- a/NCPCore/src/main/java/fr/neatmonster/nocheatplus/net/NetStatic.java +++ b/NCPCore/src/main/java/fr/neatmonster/nocheatplus/net/NetStatic.java @@ -30,9 +30,12 @@ public class NetStatic { * @param idealPackets * The "ideal" amount of packets per second. Used for "burning" * time frames by setting them to this amount. - * @return The violation amount, i.e. "count above limit". + * @param burstFreq Counting burst events, should be covering a minute or so. + * @param burstPackets Packets in the first time window to add to burst count. + * @param burstEPM Events per minute to trigger a burst violation. + * @return The violation amount, i.e. "count above limit", 0.0 if no violation. */ - public static double morePacketsCheck(final ActionFrequency packetFreq, final long time, final float packets, final float maxPackets, final float idealPackets) { + public static double morePacketsCheck(final ActionFrequency packetFreq, final long time, final float packets, final float maxPackets, final float idealPackets, final ActionFrequency burstFreq, final float burstPackets, final double burstEPM) { // Pull down stuff. final long winDur = packetFreq.bucketDuration(); final int winNum = packetFreq.numberOfBuckets(); @@ -75,7 +78,7 @@ public class NetStatic { final double fullCount; if (burnStart < winNum) { // Assume all following time windows are burnt. - // TODO: empty score + trailing score !? max with trailing bukkets * ideal (!) + // TODO: empty score + trailing score !? max with trailing buckets * ideal (!) final float trailing = Math.max(packetFreq.trailingScore(burnStart, 1f), burnScore * (winNum - burnStart - empty)); final float leading = packetFreq.leadingScore(burnStart, 1f); fullCount = leading + trailing; @@ -84,8 +87,13 @@ public class NetStatic { fullCount = packetFreq.score(1f); } - return (double) fullCount - (double) (maxPackets * winNum * winDur / 1000f); - + double violation = (double) fullCount - (double) (maxPackets * winNum * winDur / 1000f); + final float burst = packetFreq.bucketScore(0); + if (burst > burstPackets) { + burstFreq.add(time, 1f); // TODO: Remove float packets or do this properly. + violation = Math.max(violation, burstEPM * (double) (burstFreq.bucketDuration() * burstFreq.numberOfBuckets()) / 60000.0 - (double) burstFreq.score(0f)); + } + return Math.max(0.0, violation); } }