package im.expensive.functions.impl.movement;
import com.google.common.eventbus.Subscribe;
import im.expensive.Expensive;
import im.expensive.events.EventUpdate;
import im.expensive.functions.api.Category;
import im.expensive.functions.api.Function;
import im.expensive.functions.api.FunctionRegister;
import im.expensive.functions.impl.combat.KillAura;
import im.expensive.functions.settings.impl.BooleanSetting;
import im.expensive.functions.settings.impl.SliderSetting;
import im.expensive.utils.player.MoveUtils;
import net.minecraft.entity.LivingEntity;
@FunctionRegister(name = "StrafeRage", type = Category.Movement)
public class StrafeRage extends Function {
private final BooleanSetting 跳跃 = new BooleanSetting("Jump", true);
private final SliderSetting 距离 = new SliderSetting("Distance", 2.5f, 0.5f, 6.0f, 0.5f);
private final SliderSetting 速度 = new SliderSetting("Speed", 1.8f, 0.5f, 5.0f, 0.5f);
private final BooleanSetting 激进模式 = new BooleanSetting("Aggressive", true);
private final SliderSetting 环绕半径 = new SliderSetting("StrafeRadius", 1.5f, 0.5f, 4.0f, 0.5f);
private boolean 切换方向 = false;
private int 环绕计时器 = 0;
public StrafeRage() {
addSettings(跳跃, 距离, 速度, 激进模式, 环绕半径);
}
@Override
public void onEnable() {
super.onEnable();
切换方向 = false;
环绕计时器 = 0;
}
@Override
public void onDisable() {
super.onDisable();
if (mc.player != null && mc.player.movementInput != null) {
mc.player.movementInput.moveForward = 0.0f;
mc.player.movementInput.moveStrafe = 0.0f;
}
}
private boolean 可环绕() {
if (mc.player == null || mc.world == null) return false;
return !mc.player.abilities.isFlying;
}
@Subscribe
private void onPast(EventUpdate 事件更新) {
if (!可环绕()) return;
KillAura 自动攻击 = Expensive.getInstance().getFunctionRegistry().getKillAura();
if (自动攻击 != null && 自动攻击.getTarget() != null && 自动攻击.isState()) {
LivingEntity 目标 = 自动攻击.getTarget();
if (mc.player.isOnGround() && 跳跃.get()) {
mc.player.jump();
}
double 当前距离 = Math.sqrt(mc.player.getDistanceSq(目标));
double 移动速度 = 速度.get();
if (当前距离 > 距离.get()) {
double 差值X = 目标.getPosX() - mc.player.getPosX();
double 差值Z = 目标.getPosZ() - mc.player.getPosZ();
double 目标距离 = Math.sqrt(差值X * 差值X + 差值Z * 差值Z);
if (目标距离 > 0) {
double 标准化X = 差值X / 目标距离;
double 标准化Z = 差值Z / 目标距离;
double 最终速度 = 激进模式.get() ? 移动速度 * 1.2 : 移动速度;
mc.player.setVelocity(
标准化X * 最终速度 * 0.3,
mc.player.motion.getY(),
标准化Z * 最终速度 * 0.3
);
mc.player.movementInput.moveForward = 1.0f;
mc.player.movementInput.moveStrafe = 0.0f;
double 偏航角 = Math.toDegrees(Math.atan2(差值Z, 差值X)) - 90.0;
float 旧偏航 = mc.player.rotationYaw;
mc.player.setRotation((float) 偏航角, mc.player.rotationPitch);
MoveUtils.setMotion(最终速度 * 0.2);
}
} else {
环绕计时器++;
if (环绕计时器 > 40) {
切换方向 = !切换方向;
环绕计时器 = 0;
}
double 角度 = Math.atan2(mc.player.getPosZ() - 目标.getPosZ(), mc.player.getPosX() - 目标.getPosX());
角度 += 切换方向 ? 0.15 : -0.15;
double 环绕X = 目标.getPosX() + 环绕半径.get() * Math.cos(角度);
double 环绕Z = 目标.getPosZ() + 环绕半径.get() * Math.sin(角度);
double 环绕差值X = 环绕X - mc.player.getPosX();
double 环绕差值Z = 环绕Z - mc.player.getPosZ();
double 环绕距离 = Math.sqrt(环绕差值X * 环绕差值X + 环绕差值Z * 环绕差值Z);
if (环绕距离 > 0.1) {
double 环绕标准化X = 环绕差值X / 环绕距离;
double 环绕标准化Z = 环绕差值Z / 环绕距离;
double 环绕速度 = 移动速度 * 0.8;
mc.player.setVelocity(
环绕标准化X * 环绕速度 * 0.25,
mc.player.getMotion().getY(),
环绕标准化Z * 环绕速度 * 0.25
);
mc.player.movementInput.moveForward = 0.8f;
mc.player.movementInput.moveStrafe = 切换方向 ? 0.6f : -0.6f;
double 环绕偏航角 = Math.toDegrees(Math.atan2(环绕差值Z, 环绕差值X)) - 90.0;
float 旧偏航角 = mc.player.rotationYaw;
mc.player.setRotation((float) 环绕偏航角, mc.player.rotationPitch);
MoveUtils.setMotion(环绕速度 * 0.15);
mc.player.setRotation(旧偏航角, mc.player.rotationPitch);
}
}
}
}
}