Fly changes

This commit is contained in:
Salers
2022-08-18 21:11:28 +02:00
parent 8fe45b623f
commit ff0e345e68
4 changed files with 49 additions and 31 deletions
@@ -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();
}
}
@@ -33,4 +33,5 @@ public class GeneralInformation {
private KLocation lastKnownGoodPosition;
private List<Vector> velocityHistory = Collections.synchronizedList(new EvictingList<>(5));
private List<PlayerCapabilities> possibleCapabilities = new ArrayList<>();
private int clientGroundTicks, clientAirTicks;
}
@@ -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);
}
}
@@ -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)