diff --git a/src/fr/neatmonster/nocheatplus/checks/moving/SurvivalFly.java b/src/fr/neatmonster/nocheatplus/checks/moving/SurvivalFly.java
index c9ce3b51..d4a93db9 100644
--- a/src/fr/neatmonster/nocheatplus/checks/moving/SurvivalFly.java
+++ b/src/fr/neatmonster/nocheatplus/checks/moving/SurvivalFly.java
@@ -14,6 +14,7 @@ import fr.neatmonster.nocheatplus.checks.Check;
import fr.neatmonster.nocheatplus.checks.CheckType;
import fr.neatmonster.nocheatplus.checks.ViolationData;
import fr.neatmonster.nocheatplus.players.Permissions;
+import fr.neatmonster.nocheatplus.utilities.ActionFrequency;
import fr.neatmonster.nocheatplus.utilities.BlockProperties;
import fr.neatmonster.nocheatplus.utilities.CheckUtils;
import fr.neatmonster.nocheatplus.utilities.PlayerLocation;
@@ -149,7 +150,7 @@ public class SurvivalFly extends Check {
setBackSafe = true;
}
}
- }
+ }
}
}
if (useWorkaround){ // !toOnGround && to.isAboveStairs()) {
@@ -163,7 +164,7 @@ public class SurvivalFly extends Check {
data.clearAccounting();
// Tell NoFall that we assume the player to have been on ground somehow.
data.noFallAssumeGround = true;
- resetFrom = true;
+ resetFrom = true; // Note: if removing this, other conditions need to check noFallAssume...
if (cc.debug) System.out.println(player.getName() + " Y-INCONSISTENCY WORKAROUND USED");
}
}
@@ -310,8 +311,8 @@ public class SurvivalFly extends Check {
vAllowedDistance -= Math.max(0, (data.survivalFlyJumpPhase - maxJumpPhase) * 0.15D);
}
- vDistanceAboveLimit = to.getY() - data.setBack.getY() - vAllowedDistance;
-
+ vDistanceAboveLimit = to.getY() - data.setBack.getY() - vAllowedDistance;
+
// System.out.println("vda = " +vDistanceAboveLimit + " / vc = " + data.verticalVelocityCounter + " / vf = " + data.verticalFreedom + " / v = " + player.getVelocity().length());
// Step can also be blocked.
@@ -319,49 +320,34 @@ public class SurvivalFly extends Check {
vDistanceAboveLimit = Math.max(vDistanceAboveLimit, Math.abs(yDistance));
components.add("step");
}
-
- }
+ }
+
if (data.noFallAssumeGround || fromOnGround || toOnGround) {
// Some reset condition.
data.jumpAmplifier = MovingListener.getJumpAmplifier(mcPlayer);
}
-
- if (cc.survivalFlyAccounting && !resetFrom){
- final boolean useH = data.horizontalFreedom <= 0.001D;
- final boolean useV = data.verticalFreedom <= 0.001D;
- if (useH){
- data.hDistSum.add(now, (float) hDistance);
- data.hDistCount.add(now, 1f);
- }
- if (useV){
- data.vDistSum.add(now, (float) (yDistance));
- data.vDistCount.add(now, 1f);
- }
- if (useH && data.hDistCount.getScore(2) > 0 && data.hDistCount.getScore(1) > 0){
- final float hsc0 = data.hDistSum.getScore(1);
- final float hsc1 = data.hDistSum.getScore(2);
- if (hsc0 < hsc1 || hDistance < 3.9 && hsc0 == hsc1){
- hDistanceAboveLimit = Math.max(hDistanceAboveLimit, hsc0 - hsc1);
- components.add("hacc");
- }
- }
- if (useV && data.vDistCount.getScore(2) > 0 && data.vDistCount.getScore(1) > 0){
- final float vsc0 = data.vDistSum.getScore(1);
- final float vsc1 = data.vDistSum.getScore(2);
- if (vsc0 < vsc1 || yDistance < 3.9 && vsc0 == vsc1){
- vDistanceAboveLimit = Math.max(vDistanceAboveLimit, vsc0 - vsc1);
- components.add("vacc");
- }
- }
-
- // Check if y-direction is going upwards without speed / ground.
- if (!data.noFallAssumeGround && yDistance > 0 && data.survivalFlyLastYDist < 0 && data.verticalFreedom <= 0.001) {
- // Moving upwards without having touched the ground.
- vDistanceAboveLimit = Math.max(vDistanceAboveLimit, Math.abs(yDistance));
- components.add("ychange");
+
+ // Accounting support.
+ if (cc.survivalFlyAccounting && !resetFrom) {
+ // Horizontal.
+ if (data.horizontalFreedom <= 0.001D){
+ // This only checks general speed decrease oncevelocity is smoked up.
+ hDistanceAboveLimit = Math.max(hDistanceAboveLimit, doAccounting(now, hDistance, data.hDistSum, data.hDistCount, components, "hacc"));
}
- }
-
+ // Vertical.
+ if (data.verticalFreedom <= 0.001D) {
+ // Here yDistance can be negative and positive (!).
+ // TODO: Might demand resetting on some direction changes (bunny,)
+ vDistanceAboveLimit = Math.max(vDistanceAboveLimit, doAccounting(now, yDistance, data.vDistSum, data.vDistCount, components, "vacc"));
+ // Check if y-direction is going upwards without speed / ground.
+ if (yDistance >= 0 && data.survivalFlyLastYDist < 0) {
+ // Moving upwards without having touched the ground.
+ vDistanceAboveLimit = Math.max(vDistanceAboveLimit, Math.abs(yDistance));
+ components.add("ychange");
+ }
+ }
+ }
+
final double result = (Math.max(hDistanceAboveLimit, 0D) + Math.max(vDistanceAboveLimit, 0D)) * 100D;
data.survivalFlyJumpPhase++;
@@ -420,5 +406,30 @@ public class SurvivalFly extends Check {
data.survivalFlyLastYDist = yDistance;
return null;
}
-
+
+ /**
+ * Keep track of values, demanding that with time the values decrease.
+ * The ActionFrequency objects have 3 buckets.
+ * @param now
+ * @param value
+ * @param sum
+ * @param count
+ * @param tags
+ * @param tag
+ * @return
+ */
+ private static final double doAccounting(final long now, final double value, final ActionFrequency sum, final ActionFrequency count, final ArrayList tags, String tag)
+ {
+ sum.add(now, (float) value);
+ count.add(now, 1f);
+ if (count.getScore(2) > 0 && count.getScore(1) > 0) {
+ final float sc0 = sum.getScore(1);
+ final float sc1 = sum.getScore(2);
+ if (sc0 < sc1 || value < 3.9 && sc0 == sc1) {
+ tags.add(tag);
+ return sc0 - sc1;
+ }
+ }
+ return 0;
+ }
}