mirror of
https://github.com/funkemunky/KauriV3.git
synced 2026-05-31 05:51:55 +00:00
Fly changes
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user