From ff0e345e6896b0d429927e71617b79604576f0f3 Mon Sep 17 00:00:00 2001 From: Salers <74661408+SalersFR@users.noreply.github.com> Date: Thu, 18 Aug 2022 21:11:28 +0200 Subject: [PATCH] Fly changes --- .../dev/brighten/ac/check/impl/fly/FlyA.java | 74 +++++++++++-------- .../ac/data/handlers/GeneralInformation.java | 1 + .../ac/data/handlers/MovementHandler.java | 3 + .../dev/brighten/ac/utils/MovementUtils.java | 2 +- 4 files changed, 49 insertions(+), 31 deletions(-) diff --git a/src/main/java/dev/brighten/ac/check/impl/fly/FlyA.java b/src/main/java/dev/brighten/ac/check/impl/fly/FlyA.java index 6a683a1..3c5048b 100644 --- a/src/main/java/dev/brighten/ac/check/impl/fly/FlyA.java +++ b/src/main/java/dev/brighten/ac/check/impl/fly/FlyA.java @@ -9,8 +9,6 @@ import dev.brighten.ac.packet.ProtocolVersion; import dev.brighten.ac.packet.wrapper.in.WPacketPlayInFlying; import dev.brighten.ac.utils.MathUtils; import dev.brighten.ac.utils.MovementUtils; -import dev.brighten.ac.utils.timer.Timer; -import dev.brighten.ac.utils.timer.impl.MillisTimer; @CheckData(name = "Fly (A)", type = CheckType.MOVEMENT) public class FlyA extends Check { @@ -19,42 +17,58 @@ public class FlyA extends Check { super(player); } - private Timer lastPos = new MillisTimer(); private float buffer; - private static double mult = 0.98f; + + //our predicted value using client movement maths. + private double predictedValue = 0.0; + //how much will the buffer get added + private double bufferAdd; @Action public void onFlying(WPacketPlayInFlying packet) { - if(!packet.isMoved() || (getPlayer().getMovement().getDeltaXZ() == 0 - && getPlayer().getMovement().getDeltaY() == 0)) { + if (!packet.isMoved() || (getPlayer().getMovement().getDeltaXZ() == 0 + && getPlayer().getMovement().getDeltaY() == 0) || !getPlayer().getMovement().getTo().isOnGround()) return; - } - boolean onGround = getPlayer().getMovement().getTo().isOnGround() && getPlayer().getBlockInformation().blocksBelow, - fromGround = getPlayer().getMovement().getFrom().isOnGround(); - double lDeltaY = fromGround ? 0 : getPlayer().getMovement().getLDeltaY(); - double predicted = onGround ? lDeltaY : (lDeltaY - 0.08) * mult; + final double delta = getPlayer().getMovement().getDeltaY(); - if(fromGround && !onGround && getPlayer().getMovement().getDeltaY() > 0) { - predicted = MovementUtils.getJumpHeight(getPlayer()); - } + //using the last y axis movement we got from the player, to estimate his next movement + predictedValue = getPlayer().getMovement().getLDeltaY(); - if(Math.abs(predicted) < 0.005 && ProtocolVersion.getGameVersion().isOrAbove(ProtocolVersion.V1_9)) { - predicted = 0; - } + //if predicted < this, player motion y is set to 0 in mcp, so we'll do same. + final double min = getPlayer().getPlayerVersion().isBelow(ProtocolVersion.V1_9) ? 0.005 : 0.003; - if(lastPos.isPassed(60L)) { - double toCheck = (predicted - 0.08) * mult; + //we can be sure here that he jumped + if (getPlayer().getInfo().getClientAirTicks() == 1) { + //so we're handling his jump + predictedValue = MovementUtils.getJumpHeight(getPlayer()); + bufferAdd = 2; + } else { + //this is how minecraft makes player falls, a fly wouldn't respect this rule - if(Math.abs(getPlayer().getMovement().getDeltaY() - toCheck) - < Math.abs(getPlayer().getMovement().getDeltaY() - predicted)) { - predicted = toCheck; + //gravity + predictedValue -= 0.08; + //air drag + predictedValue *= 0.98F; + + //sometimes, player doesn't send a position packet, its called "0.03", because under a 0.03 xyz length move + //player doesn't send a position packet + if (Math.abs(predictedValue - delta) > 1.0E-6) { + final double mightFixedPrediction = (predictedValue - 0.08) * 0.98F; + if (Math.abs(mightFixedPrediction - delta) < 1.0E-6) + predictedValue = mightFixedPrediction; } + + bufferAdd = 1; } - double deltaPredict = MathUtils.getDelta(getPlayer().getMovement().getDeltaY(), predicted); + if(Math.abs(predictedValue) < min) + predictedValue = 0; - if(!getPlayer().getInfo().isGeneralCancel() + //basically the difference from what we expect the player to move, and what he actually moved. + final double offset = MathUtils.getDelta(predictedValue, delta); + + if (!getPlayer().getInfo().isGeneralCancel() && getPlayer().getInfo().getBlockAbove().isPassed(1) && !getPlayer().getInfo().isOnLadder() && !getPlayer().getBlockInformation().inWeb @@ -63,17 +77,17 @@ public class FlyA extends Check { && !getPlayer().getBlockInformation().fenceBelow && !getPlayer().getBlockInformation().onHalfBlock && getPlayer().getInfo().getVelocity().isPassed(1) - && !getPlayer().getBlockInformation().onSlime && deltaPredict > 0.016) { - if(++buffer > 5) { + && !getPlayer().getBlockInformation().onSlime && offset > 1.0E-5) { + if ((buffer += bufferAdd) > 5) { buffer = 5; - flag("dY=%.3f p=%.3f dx=%.3f", getPlayer().getMovement().getDeltaY(), predicted, + flag("dY=%.3f p=%.3f dx=%.3f", getPlayer().getMovement().getDeltaY(), predictedValue, getPlayer().getMovement().getDeltaXZ()); } - } else buffer-= buffer > 0 ? 0.25f : 0; + } else buffer -= buffer > 0 ? 0.25f : 0; - debug("dY=%.3f p=%.3f dx=%.3f b=%s velocity=%s", getPlayer().getMovement().getDeltaY(), predicted, + debug("dY=%.3f p=%.3f dx=%.3f b=%s velocity=%s", getPlayer().getMovement().getDeltaY(), predictedValue, getPlayer().getMovement().getDeltaXZ(), buffer, getPlayer().getInfo().getVelocity().getPassed()); - lastPos.reset(); + } } diff --git a/src/main/java/dev/brighten/ac/data/handlers/GeneralInformation.java b/src/main/java/dev/brighten/ac/data/handlers/GeneralInformation.java index a7ca6a1..5d13a0b 100644 --- a/src/main/java/dev/brighten/ac/data/handlers/GeneralInformation.java +++ b/src/main/java/dev/brighten/ac/data/handlers/GeneralInformation.java @@ -33,4 +33,5 @@ public class GeneralInformation { private KLocation lastKnownGoodPosition; private List velocityHistory = Collections.synchronizedList(new EvictingList<>(5)); private List possibleCapabilities = new ArrayList<>(); + private int clientGroundTicks, clientAirTicks; } diff --git a/src/main/java/dev/brighten/ac/data/handlers/MovementHandler.java b/src/main/java/dev/brighten/ac/data/handlers/MovementHandler.java index 2cb2aee..6f00d99 100644 --- a/src/main/java/dev/brighten/ac/data/handlers/MovementHandler.java +++ b/src/main/java/dev/brighten/ac/data/handlers/MovementHandler.java @@ -522,5 +522,8 @@ it deltaXZ = Math.hypot(deltaX, deltaZ); // Calculating here to cache since hypot() can be heavy. deltaYaw = to.getLoc().yaw - from.getLoc().yaw; deltaPitch = to.getLoc().pitch - from.getLoc().pitch; + + player.getInfo().setClientGroundTicks(packet.isOnGround() ? player.getInfo().getClientGroundTicks() + 1 : 0); + player.getInfo().setClientAirTicks(!packet.isOnGround() ? player.getInfo().getClientAirTicks() + 1 : 0); } } diff --git a/src/main/java/dev/brighten/ac/utils/MovementUtils.java b/src/main/java/dev/brighten/ac/utils/MovementUtils.java index 6b81889..218bba5 100644 --- a/src/main/java/dev/brighten/ac/utils/MovementUtils.java +++ b/src/main/java/dev/brighten/ac/utils/MovementUtils.java @@ -17,7 +17,7 @@ public class MovementUtils { private static Enchantment DEPTH; - public static float getJumpHeight(APlayer data) { + public static double getJumpHeight(APlayer data) { float baseHeight = 0.42f; baseHeight+= data.getPotionHandler().getEffectByType(PotionEffectType.JUMP).map(ef -> ef.getAmplifier() + 1)