diff --git a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/checks/fight/Critical.java b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/checks/fight/Critical.java index fcc2f687..d0d52b6f 100644 --- a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/checks/fight/Critical.java +++ b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/checks/fight/Critical.java @@ -1,11 +1,16 @@ package fr.neatmonster.nocheatplus.checks.fight; +import java.util.ArrayList; +import java.util.List; + import org.bukkit.Location; import org.bukkit.entity.Player; import org.bukkit.potion.PotionEffectType; +import fr.neatmonster.nocheatplus.actions.ParameterName; import fr.neatmonster.nocheatplus.checks.Check; import fr.neatmonster.nocheatplus.checks.CheckType; +import fr.neatmonster.nocheatplus.checks.ViolationData; import fr.neatmonster.nocheatplus.checks.moving.MovingConfig; import fr.neatmonster.nocheatplus.checks.moving.MovingData; import fr.neatmonster.nocheatplus.checks.moving.MovingListener; @@ -73,23 +78,33 @@ public class Critical extends Check { if (dataM.sfLowJump || player.getFallDistance() < cc.criticalFallDistance && !BlockProperties.isOnGroundOrResetCond(player, loc, mCc.yOnGround)){ final MovingConfig ccM = MovingConfig.getConfig(player); if (MovingListener.shouldCheckSurvivalFly(player, dataM, ccM)){ - final double deltaFallDistance = (cc.criticalFallDistance - player.getFallDistance()) - / cc.criticalFallDistance; - final double deltaVelocity = (cc.criticalVelocity - Math.abs(player.getVelocity().getY())) - / cc.criticalVelocity; - final double delta = deltaFallDistance > 0D ? deltaFallDistance - : 0D + deltaVelocity > 0D ? deltaVelocity : 0D; - + final double deltaFallDistance = (cc.criticalFallDistance - player.getFallDistance()) / cc.criticalFallDistance; + final double deltaVelocity = (cc.criticalVelocity - Math.abs(player.getVelocity().getY())) / cc.criticalVelocity; + double delta = deltaFallDistance > 0D ? deltaFallDistance : 0D + deltaVelocity > 0D ? deltaVelocity : 0D; + + final List tags = new ArrayList(); + // Player failed the check, but this is influenced by lag so don't do it if there was lag. if (TickTask.getLag(1000) < 1.5){ // TODO: 1.5 is a fantasy value. // Increment the violation level. data.criticalVL += delta; } + else{ + tags.add("lag"); + delta = 0; + } // Execute whatever actions are associated with this check and the violation level and find out if we // should cancel the event. - cancel = executeActions(player, data.criticalVL, delta, cc.criticalActions); + final ViolationData vd = new ViolationData(this, player, data.criticalVL, delta, cc.criticalActions); + if (vd.needsParameters()){ + if (dataM.sfLowJump){ + tags.add("sf_lowjump"); + } + vd.setParameter(ParameterName.TAGS, StringUtil.join(tags, "+")); + } + cancel = executeActions(vd); } } } diff --git a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/checks/fight/FightListener.java b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/checks/fight/FightListener.java index 4d518519..20a5c388 100644 --- a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/checks/fight/FightListener.java +++ b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/checks/fight/FightListener.java @@ -276,7 +276,6 @@ public class FightListener extends CheckListener implements JoinLeaveListener{ final FightData damagedData = damagedPlayer == null ? null : FightData.getData(damagedPlayer); final boolean damagedIsDead = damaged.isDead(); if (damagedPlayer != null && !damagedIsDead) { -// if (godMode.isEnabled(player) && godMode.check(player)){ if (!damagedPlayer.isDead() && godMode.isEnabled(damagedPlayer) && godMode.check(damagedPlayer, event.getDamage(), damagedData)){ // It requested to "cancel" the players invulnerability, so set his noDamageTicks to 0. damagedPlayer.setNoDamageTicks(0); diff --git a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/checks/fight/GodMode.java b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/checks/fight/GodMode.java index 54f2c1dd..9767cc8f 100644 --- a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/checks/fight/GodMode.java +++ b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/checks/fight/GodMode.java @@ -29,63 +29,6 @@ public class GodMode extends Check { public GodMode() { super(CheckType.FIGHT_GODMODE); } - - /** - * Checks a player. - * - * @param player - * the player - * @return true, if successful - */ - public boolean check(final Player player) { - final FightData data = FightData.getData(player); - - boolean cancel = false; - - // Check at most once a second. - if (data.godModeLastTime < System.currentTimeMillis() - 1000L) { - data.godModeLastTime = System.currentTimeMillis(); - - final int age = player.getTicksLived(); - - // How much older did he get? - final int ageDelta = Math.max(0, age - data.godModeLastAge); - - if (player.getNoDamageTicks() > 0 && ageDelta < 15) { - // He is invulnerable and didn't age fast enough, that costs some points. - data.godModeBuffer -= 15 - ageDelta; - - // Still points left? - if (data.godModeBuffer <= 0) { - // No, that means we can increase his violation level. - data.godModeVL -= data.godModeBuffer; - - // Execute whatever actions are associated with this check and the violation level and find out if - // we should cancel the event. - cancel = executeActions(player, data.godModeVL, -data.godModeBuffer, - FightConfig.getConfig(player).godModeActions); - } - } else { - // Give some new points, once a second. - data.godModeBuffer += 15; - - // Decrease the violation level. - data.godModeVL *= 0.95; - } - - if (data.godModeBuffer < 0) - // Can't have less than 0! - data.godModeBuffer = 0; - else if (data.godModeBuffer > 30) - // And 30 is enough for simple lag situations. - data.godModeBuffer = 30; - - // Start age counting from a new time. - data.godModeLastAge = age; - } - - return cancel; - } /** * New style god mode check. Much more sensitive. diff --git a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/checks/moving/MovingData.java b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/checks/moving/MovingData.java index ef7a9004..124c00ba 100644 --- a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/checks/moving/MovingData.java +++ b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/checks/moving/MovingData.java @@ -160,6 +160,7 @@ public class MovingData extends ACheckData { /** Indicate low jumping descending phase (likely cheating). */ public boolean sfLowJump = false; + public boolean sfNoLowJump = false; // Hacks. /** * Last valid y distance covered by a move. Integer.MAX_VALUE indicates "not set". diff --git a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/checks/moving/MovingListener.java b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/checks/moving/MovingListener.java index 40bd5372..e2a54a46 100644 --- a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/checks/moving/MovingListener.java +++ b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/checks/moving/MovingListener.java @@ -1008,7 +1008,9 @@ public class MovingListener extends CheckListener implements TickListener, IRemo final Vector velocity = event.getVelocity(); - if (cc.debug) System.out.println(event.getPlayer().getName() + " new velocity: " + velocity); + if (cc.debug){ + System.out.println(event.getPlayer().getName() + " new velocity: " + velocity); + } double newVal = velocity.getY(); boolean used = false; @@ -1036,6 +1038,7 @@ public class MovingListener extends CheckListener implements TickListener, IRemo // Set dirty flag here. if (used){ data.sfDirty = true; + data.sfNoLowJump = true; } // TODO: clear accounting here ? @@ -1070,6 +1073,8 @@ public class MovingListener extends CheckListener implements TickListener, IRemo Location newTo = null; final MovingData data = MovingData.getData(player); + data.sfNoLowJump = true; + if (morePacketsVehicle.isEnabled(player)){ // If the player is handled by the more packets vehicle check, execute it. newTo = morePacketsVehicle.check(player, from, to); diff --git a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/checks/moving/SurvivalFly.java b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/checks/moving/SurvivalFly.java index fd691762..7990321b 100644 --- a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/checks/moving/SurvivalFly.java +++ b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/checks/moving/SurvivalFly.java @@ -282,6 +282,7 @@ public class SurvivalFly extends Check { // Calculate the vertical speed limit based on the current jump phase. double vAllowedDistance = 0, vDistanceAboveLimit = 0; if (from.isInWeb()){ + data.sfNoLowJump = true; // Very simple: force players to descend or stay. vAllowedDistance = from.isOnGround() ? 0.1D : 0; data.jumpAmplifier = 0; // TODO: later maybe fetch. @@ -301,6 +302,7 @@ public class SurvivalFly extends Check { } else if (data.verticalFreedom <= 0.001 && from.isOnClimbable()){ // Ladder types. + data.sfNoLowJump = true; // TODO: bring in in-medium accounting. // // TODO: make these extra checks to the jumpphase thing ? // if (fromOnGround) vAllowedDistance = climbSpeed + 0.3; @@ -328,6 +330,7 @@ public class SurvivalFly extends Check { } else if (data.verticalFreedom <= 0.001 && from.isInLiquid() && (Math.abs(yDistance) > 0.2 || to.isInLiquid())){ // Swimming... + data.sfNoLowJump = true; if (yDistance >= 0){ // This is more simple to test. // TODO: Friction in water... @@ -378,6 +381,7 @@ public class SurvivalFly extends Check { if (data.mediumLiftOff == MediumLiftOff.LIMIT_JUMP){ // TODO: In normal water this is 0. Could set higher for special cases only (needs efficient data + flags collection?). maxJumpPhase = 3; + data.sfNoLowJump = true; if (data.sfJumpPhase > 0) tags.add("limitjump"); } else if (data.jumpAmplifier > 0){ @@ -526,6 +530,7 @@ public class SurvivalFly extends Check { data.sfJumpPhase = 0; data.clearAccounting(); data.sfLowJump = false; + data.sfNoLowJump = false; // TODO: Experimental: reset velocity. if (data.verticalVelocityUsed > cc.velocityGraceTicks && toOnGround && yDistance < 0){ data.verticalVelocityCounter = 0; @@ -540,6 +545,7 @@ public class SurvivalFly extends Check { data.sfJumpPhase = 1; // TODO: ? data.clearAccounting(); data.sfLowJump = false; + // not resetting nolow... } // Check removal of active horizontal velocity. @@ -979,7 +985,7 @@ public class SurvivalFly extends Check { // Decrease tags.add("ychdec"); // Detect low jumping. - if (!data.sfDirty && data.mediumLiftOff == MediumLiftOff.GROUND){ + if (!data.sfNoLowJump && !data.sfDirty && data.mediumLiftOff == MediumLiftOff.GROUND){ final double setBackYDistance = to.getY() - data.getSetBackY(); if (setBackYDistance > 0.0){ // Only count it if the player has actually been jumping (higher than setback). diff --git a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/config/DefaultConfig.java b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/config/DefaultConfig.java index d36acaab..6abccab0 100644 --- a/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/config/DefaultConfig.java +++ b/NCPPlugin/src/main/java/fr/neatmonster/nocheatplus/config/DefaultConfig.java @@ -470,7 +470,7 @@ public class DefaultConfig extends ConfigFile { set(ConfPaths.STRINGS + ".color", start + "sent colored chat message" + end); set(ConfPaths.STRINGS + ".commands", start + "issued too many commands" + end); set(ConfPaths.STRINGS + ".combspeed", start + "performs different actions at very high speed" + end); - set(ConfPaths.STRINGS + ".critical", start + "tried to do a critical hit but wasn't technically jumping" + end); + set(ConfPaths.STRINGS + ".critical", start + "tried to do a critical hit but wasn't technically jumping [tags]" + end); set(ConfPaths.STRINGS + ".drop", start + "tried to drop more items than allowed" + end); set(ConfPaths.STRINGS + ".dropkick", "ncp delay ncp kick [player] Dropping items too fast."); set(ConfPaths.STRINGS + ".fastbreak", start + "tried to break blocks ([blockid]) faster than possible" + end);