package im.expensive.functions.impl.movement;
import com.google.common.eventbus.Subscribe;
import im.expensive.functions.api.Category;
import im.expensive.functions.api.Function;
import im.expensive.functions.api.FunctionRegister;
import im.expensive.events.EventUpdate;
import net.minecraft.client.Minecraft;
@FunctionRegister(name = "Auto Sprint", type = Category.Movement)
public class AutoSprint extends Function {
private final Minecraft mc = Minecraft.getInstance();
private boolean wasAttacking = false;
private long lastAttackTime = 0;
private long lastEatTime = 0;
[USER=1474073]@Subscribe[/USER]
public void onUpdate(EventUpdate e) {
if (mc.player == null) return;
boolean isEating = mc.player.isHandActive() && mc.player.getHeldItem(mc.player.getActiveHand()).getItem().isFood();
boolean isAttacking = mc.gameSettings.keyBindAttack.isKeyDown();
// Если игрок ест, выключаем спринт
if (isEating) {
mc.player.setSprinting(false);
lastEatTime = System.currentTimeMillis();
return;
}
// Если игрок атакует, выключаем спринт и фиксируем время
if (isAttacking) {
mc.player.setSprinting(false);
wasAttacking = true;
lastAttackTime = System.currentTimeMillis();
return;
}
// Ждём 300 мс после удара перед включением спринта
if (wasAttacking && System.currentTimeMillis() - lastAttackTime < 300) return;
wasAttacking = false;
// Ждём 500 мс после еды перед включением спринта
if (System.currentTimeMillis() - lastEatTime < 500) return;
// Если игрок не крадётся, не стоит вплотную к стене и двигается, включаем спринт
if (!mc.player.isSneaking() && !mc.player.collidedHorizontally && isMoving()) {
mc.player.setSprinting(true);
}
}
private boolean isMoving() {
return mc.player.movementInput.moveForward > 0.0f;
}
[USER=1367676]@override[/USER]
public void onDisable() {
if (mc.player != null) {
mc.player.setSprinting(false);
}
super.onDisable();
}
}