Add shortterm component to frequency check.

This commit is contained in:
asofold 2012-09-13 13:41:13 +02:00
parent 0c12553c4b
commit 3ed408a3af
5 changed files with 40 additions and 7 deletions

View File

@ -92,6 +92,9 @@ public class BlockBreakConfig extends ACheckConfig {
public final float frequencyBucketFactor; public final float frequencyBucketFactor;
public final int frequencyIntervalCreative; public final int frequencyIntervalCreative;
public final int frequencyIntervalSurvival; public final int frequencyIntervalSurvival;
public final int frequencyShortTermLimit;
public final int frequencyShortTermTicks;
public final ActionList frequencyActions; public final ActionList frequencyActions;
public boolean improbableFastBreakCheck; public boolean improbableFastBreakCheck;
@ -135,6 +138,8 @@ public class BlockBreakConfig extends ACheckConfig {
frequencyBucketFactor = (float) data.getDouble(ConfPaths.BLOCKBREAK_FREQUENCY_BUCKETS_FACTOR, 1f); frequencyBucketFactor = (float) data.getDouble(ConfPaths.BLOCKBREAK_FREQUENCY_BUCKETS_FACTOR, 1f);
frequencyIntervalCreative = data.getInt(ConfPaths.BLOCKBREAK_FREQUENCY_MOD_CREATIVE); frequencyIntervalCreative = data.getInt(ConfPaths.BLOCKBREAK_FREQUENCY_MOD_CREATIVE);
frequencyIntervalSurvival = data.getInt(ConfPaths.BLOCKBREAK_FREQUENCY_MOD_SURVIVAL); frequencyIntervalSurvival = data.getInt(ConfPaths.BLOCKBREAK_FREQUENCY_MOD_SURVIVAL);
frequencyShortTermLimit = data.getInt(ConfPaths.BLOCKBREAK_FREQUENCY_SHORTTERM_LIMIT);
frequencyShortTermTicks = data.getInt(ConfPaths.BLOCKBREAK_FREQUENCY_SHORTTERM_TICKS);
frequencyActions = data.getActionList(ConfPaths.BLOCKBREAK_FREQUENCY_ACTIONS, Permissions.BLOCKBREAK_FREQUENCY); frequencyActions = data.getActionList(ConfPaths.BLOCKBREAK_FREQUENCY_ACTIONS, Permissions.BLOCKBREAK_FREQUENCY);
improbableFastBreakCheck = data.getBoolean(ConfPaths.COMBINED_IMPROBABLE_FASTBREAK_CHECK); improbableFastBreakCheck = data.getBoolean(ConfPaths.COMBINED_IMPROBABLE_FASTBREAK_CHECK);

View File

@ -89,6 +89,8 @@ public class BlockBreakData extends ACheckData {
public long fastBreakfirstDamage = System.currentTimeMillis(); public long fastBreakfirstDamage = System.currentTimeMillis();
public final ActionFrequency frequencyBuckets; public final ActionFrequency frequencyBuckets;
public int frequencyShortTermCount;
public int frequencyShortTermTick;
// Data of the no swing check. // Data of the no swing check.
public boolean noSwingArmSwung = true; public boolean noSwingArmSwung = true;

View File

@ -5,6 +5,7 @@ import org.bukkit.entity.Player;
import fr.neatmonster.nocheatplus.checks.Check; import fr.neatmonster.nocheatplus.checks.Check;
import fr.neatmonster.nocheatplus.checks.CheckType; import fr.neatmonster.nocheatplus.checks.CheckType;
import fr.neatmonster.nocheatplus.utilities.TickTask;
/** /**
* This checks just limits the number of blocks broken per time frame. * This checks just limits the number of blocks broken per time frame.
@ -22,16 +23,36 @@ public class Frequency extends Check {
final float interval = (float) ((player.getGameMode() == GameMode.CREATIVE)?(cc.frequencyIntervalCreative):(cc.frequencyIntervalSurvival)); final float interval = (float) ((player.getGameMode() == GameMode.CREATIVE)?(cc.frequencyIntervalCreative):(cc.frequencyIntervalSurvival));
data.frequencyBuckets.add(System.currentTimeMillis(), interval); data.frequencyBuckets.add(System.currentTimeMillis(), interval);
final float score = data.frequencyBuckets.getScore(cc.frequencyBucketFactor); // Full period frequency.
final float allowed = cc.frequencyBuckets * cc.frequencyBucketDur; final float fullScore = data.frequencyBuckets.getScore(cc.frequencyBucketFactor);
final float fullTime = cc.frequencyBuckets * cc.frequencyBucketDur;
// Short term arrivals.
final int tick = TickTask.getTick();
if (tick - data.frequencyShortTermTick < cc.frequencyShortTermTicks){
// Within range, add.
data.frequencyShortTermCount ++;
System.out.println(data.frequencyShortTermCount);
}
else{
data.frequencyShortTermTick = tick;
data.frequencyShortTermCount = 1;
}
// Find if one of both or both are violations:
final float fullViolation = (fullScore > fullTime) ? (fullScore - fullTime) : 0;
final float shortTermWeight = 50f * cc.frequencyShortTermTicks / (float) cc.frequencyShortTermLimit;
final float shortTermViolation = (data.frequencyShortTermCount > cc.frequencyShortTermLimit)
? (data.frequencyShortTermCount - cc.frequencyShortTermLimit) * shortTermWeight : 0;
final float violation = Math.max(fullViolation, shortTermViolation);
boolean cancel = false; boolean cancel = false;
if (score > allowed){ if (violation > 0){
final double change = (score - allowed) / 1000; final double change = violation / 1000;
data.frequencyVL += change; data.frequencyVL += change;
cancel = executeActions(player, data.frequencyVL, change, cc.frequencyActions); cancel = executeActions(player, data.frequencyVL, change, cc.frequencyActions);
} }
else if (data.frequencyVL > 0d && score < allowed * .75) else if (data.frequencyVL > 0d && fullScore < fullTime * .75)
data.frequencyVL *= 0.95; data.frequencyVL *= 0.95;
return cancel; return cancel;

View File

@ -86,6 +86,9 @@ public abstract class ConfPaths {
public static final String BLOCKBREAK_FREQUENCY_BUCKETS_DUR = BLOCKBREAK_FREQUENCY_BUCKETS + "duration"; public static final String BLOCKBREAK_FREQUENCY_BUCKETS_DUR = BLOCKBREAK_FREQUENCY_BUCKETS + "duration";
public static final String BLOCKBREAK_FREQUENCY_BUCKETS_FACTOR = BLOCKBREAK_FREQUENCY_BUCKETS + "factor"; public static final String BLOCKBREAK_FREQUENCY_BUCKETS_FACTOR = BLOCKBREAK_FREQUENCY_BUCKETS + "factor";
public static final String BLOCKBREAK_FREQUENCY_BUCKETS_N = BLOCKBREAK_FREQUENCY_BUCKETS + "number"; public static final String BLOCKBREAK_FREQUENCY_BUCKETS_N = BLOCKBREAK_FREQUENCY_BUCKETS + "number";
private static final String BLOCKBREAK_FREQUENCY_SHORTTERM = BLOCKBREAK_FREQUENCY + "shortterm.";
public static final String BLOCKBREAK_FREQUENCY_SHORTTERM_LIMIT = BLOCKBREAK_FREQUENCY_SHORTTERM + "limit";
public static final String BLOCKBREAK_FREQUENCY_SHORTTERM_TICKS = BLOCKBREAK_FREQUENCY_SHORTTERM + "ticks";
public static final String BLOCKBREAK_FREQUENCY_ACTIONS = BLOCKBREAK_FREQUENCY + "actions"; public static final String BLOCKBREAK_FREQUENCY_ACTIONS = BLOCKBREAK_FREQUENCY + "actions";
private static final String BLOCKBREAK_NOSWING = BLOCKBREAK + "noswing."; private static final String BLOCKBREAK_NOSWING = BLOCKBREAK + "noswing.";

View File

@ -74,8 +74,10 @@ public class DefaultConfig extends ConfigFile {
set(ConfPaths.BLOCKBREAK_FASTBREAK_ACTIONS, "cancel vl>500 log:fastbreak:3:5:cif cancel"); set(ConfPaths.BLOCKBREAK_FASTBREAK_ACTIONS, "cancel vl>500 log:fastbreak:3:5:cif cancel");
set(ConfPaths.BLOCKBREAK_FREQUENCY_CHECK, true); set(ConfPaths.BLOCKBREAK_FREQUENCY_CHECK, true);
set(ConfPaths.BLOCKBREAK_FREQUENCY_MOD_CREATIVE, 100); set(ConfPaths.BLOCKBREAK_FREQUENCY_MOD_CREATIVE, 95);
set(ConfPaths.BLOCKBREAK_FREQUENCY_MOD_SURVIVAL, 50); set(ConfPaths.BLOCKBREAK_FREQUENCY_MOD_SURVIVAL, 45);
set(ConfPaths.BLOCKBREAK_FREQUENCY_SHORTTERM_TICKS, 5);
set(ConfPaths.BLOCKBREAK_FREQUENCY_SHORTTERM_LIMIT, 7);
set(ConfPaths.BLOCKBREAK_FREQUENCY_ACTIONS, "cancel vl>5 log:bbfrequency:3:5:cif cancel vl>60 log:bbfrequency:0:5:cif cancel cmd:kickfrequency"); set(ConfPaths.BLOCKBREAK_FREQUENCY_ACTIONS, "cancel vl>5 log:bbfrequency:3:5:cif cancel vl>60 log:bbfrequency:0:5:cif cancel cmd:kickfrequency");
set(ConfPaths.BLOCKBREAK_NOSWING_CHECK, true); set(ConfPaths.BLOCKBREAK_NOSWING_CHECK, true);