/** * Feed the check but no violations processing (convenience method). * @param player * @param weight * @param now * @param pData */ public static final void feed(final Player player, final float weight, final long now, final IPlayerData pData){ pData.getGenericInstance(CombinedData.class).improbableCount.add(now, weight); }
@Override protected float getScore(List<Character> chars, long ts) { lastAdd = ts; final char[] a = DigestedWords.toArray(chars); final String key = new String(a); ActionFrequency freq = entries.get(key); if (freq == null){ freq = new ActionFrequency(nBuckets, durBucket); entries.put(key, freq); return 0.0f; } freq.update(ts); float score = Math.min(1.0f, freq.score(factor)); freq.add(ts, 1.0f); return score; }
public boolean check(final Player damager, final Player damaged, final FightData data, final FightConfig cc){ // Check if the Entity Id's are Equals if (damager.getEntityId() != damaged.getEntityId()) return false; boolean cancel = false; // Treat self hitting as instant violation. data.selfHitVL.add(System.currentTimeMillis(), 1.0f); // NOTE: This lets VL decrease slightly over 30 seconds, one could also use a number, but this is more tolerant. cancel = executeActions(damager, data.selfHitVL.score(0.99f), 1.0f, cc.selfHitActions).willCancel(); return cancel; }
nanos = System.nanoTime() - nanos; if (nanos > 0L) { taskLoad.add(tick, nanos);
/** * Always update data, check bypass on violation only. * * @param player * @param time * @param data * @param cc * @return */ public boolean check(final Player player, final DataPacketFlying packetData, final long time, final NetData data, final NetConfig cc, final IPlayerData pData) { data.flyingFrequencyAll.add(time, 1f); final float allScore = data.flyingFrequencyAll.score(1f); if (allScore / cc.flyingFrequencySeconds > cc.flyingFrequencyPPS && executeActions(player, allScore / cc.flyingFrequencySeconds - cc.flyingFrequencyPPS, 1.0 / cc.flyingFrequencySeconds, cc.flyingFrequencyActions).willCancel()) { return true; } else { return false; } }
data.yawFreq.add(now, dNorm); return false;
public boolean check(final Player player, final ChatConfig cc, final ChatData data) { final long now = System.currentTimeMillis(); // Skip if is too close to the startup time. if (now - TickTask.getTimeStart() < cc.loginsStartupDelay) return false; // Split into 6 buckets always. final long durBucket = 1000L * cc.loginsSeconds / 6; final ActionFrequency freq = getActionFrequency(player.getWorld().getName(), 6, durBucket, cc.loginsPerWorldCount); freq.update(now); final boolean cancel = freq.score(1f) > cc.loginsLimit; // TODO: >= ... This will be 1 after the first login (!). if (!cancel) freq.add(1f); return cancel; }
@SuppressWarnings("deprecation") private void frequentTasks(final int tick, final long timeLast, final Player player) { if (player != null) { // Common criteria ... if (player.isOnline()) { long nanos = System.nanoTime(); // Set back. if (requestPlayerSetBack) { requestPlayerSetBack = false; MovingUtil.processStoredSetBack(player, "Player set back on tick: ", this); } // Inventory update. if (requestUpdateInventory) { requestUpdateInventory = false; player.updateInventory(); } // Permission updates (high priority). final Collection<RegisteredPermission> updatable = updatePermissions.getMergePrimaryThreadAndClear(); if (updatable != null) { for (final RegisteredPermission registeredPermission : updatable) { // (Force update could be inefficient.) hasPermission(registeredPermission, player); } } nanos = System.nanoTime() - nanos; if (nanos > 0L) { taskLoad.add(tick, nanos); } } // (The player is online.) } // (The player is not null.) }
/** * Checks hasBypass on violation only. * @param player * @param time * @param data * @param cc * @return If to cancel. */ public boolean check(final Player player, final long time, final NetData data, final NetConfig cc, final IPlayerData pData) { data.keepAliveFreq.add(time, 1f); final float first = data.keepAliveFreq.bucketScore(0); if (first > 1f) { // Trigger a violation. final double vl = Math.max(first - 1f, data.keepAliveFreq.score(1f) - data.keepAliveFreq.numberOfBuckets()); if (executeActions(player, vl, 1.0, cc.keepAliveFrequencyActions).willCancel()) { return true; } } return false; }
/** * Actual state. * * @param player * @param data * * @param cc * * @return If to cancel a packet event. */ public boolean check(final Player player, final NetData data, final NetConfig cc) { data.packetFrequency.add(System.currentTimeMillis(), 1f); final long fDur = data.packetFrequency.bucketDuration() * data.packetFrequency.numberOfBuckets(); double amount = data.packetFrequency.score(1f) * 1000f / (float) fDur; // if (data.debug) { // debug(player, "Basic amount: " + amount); // } if (amount > cc.packetFrequencyPacketsPerSecond) { amount /= TickTask.getLag(fDur); if (amount > cc.packetFrequencyPacketsPerSecond) { if (executeActions(player, amount - cc.packetFrequencyPacketsPerSecond, 1.0, cc.packetFrequencyActions).willCancel()) { return true; } } } return false; // Cancel state. }
data.frequencyBuckets.add(System.currentTimeMillis(), interval);
data.speedBuckets.add(now, 1f);
player.sendMessage("WrongBlock failure with dist: " + dist); data.wrongBlockVL.add(now, (float) (dist + 1) / 2f); final float score = data.wrongBlockVL.score(0.9f); if (score > cc.wrongBLockLevel) {
final IPlayerData pData) { data.fastPlaceBuckets.add(System.currentTimeMillis(), 1f); final boolean lag = pData.getCurrentWorldData().shouldAdjustToLag(type);
data.fastBreakPenalties.add(now, (float) missingTime);
data.commandsWeights.add(now, weight); if (tick < data.commandsShortTermTick){
public boolean check(final Player player, final long time, final NetData data, final NetConfig cc, final IPlayerData pData) { data.attackFrequencySeconds.add(time, 1f); double maxVL = 0.0; float maxLimit = 0f;
data.fastClickFreq.add(now, amount);
data.improbableCount.add(now, weight); final float shortTerm = data.improbableCount.bucketScore(0); double violation = 0;