package im.rez.module.modules.combat;
import im.rez.event.Event;
import im.rez.event.events.EventTick;
import im.rez.module.Category;
import im.rez.module.Module;
import net.minecraft.client.Minecraft;
import net.minecraft.entity.Entity;
import net.minecraft.entity.LivingEntity;
import net.minecraft.util.Hand;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.util.math.RayTraceContext;
import net.minecraft.util.math.RayTraceResult;
import net.minecraft.tags.FluidTags;
import net.minecraft.network.play.client.CPlayerPacket;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
public class AttackAura extends Module {
private final Minecraft mc = Minecraft.getInstance();
private LivingEntity target;
private final float attackRange = 3.0F;
private float originalYaw;
private float originalPitch;
private boolean isAttacking = false;
private boolean isFalling = false;
private float visualYaw;
private float visualPitch;
public AttackAura() {
super("Aura", Category.COMBAT, "Automatically attacks entities within a radius", -1, 0);
}
[USER=1367676]@override[/USER]
public void event(Event e) {
if (e instanceof EventTick) {
if (mc.world == null || mc.player == null) return;
if (mc.player.fallDistance > 0.0F && !mc.player.isOnGround()) {
isFalling = true;
} else if (mc.player.isOnGround()) {
isFalling = false;
}
if (target == null || !isValid(target)) {
findTarget();
}
if (target != null && isFalling && shouldPlayerAttack()) {
if (!isAttacking) {
originalYaw = mc.player.rotationYaw;
originalPitch = mc.player.rotationPitch;
visualYaw = calculateYawToTarget(target);
visualPitch = calculatePitchToNeck(target);
isAttacking = true;
}
overrideRotationPackets();
attackTarget(target);
} else if (isAttacking) {
visualYaw = originalYaw;
visualPitch = originalPitch;
overrideRotationPackets();
if (isModelAligned(originalYaw, originalPitch)) {
isAttacking = false;
}
}
}
}
private void overrideRotationPackets() {
if (!mc.player.isPassenger()) {
Vector3d movement = mc.player.getDeltaMovement();
CPlayerPacket.PositionRotationPacket packet = new CPlayerPacket.PositionRotationPacket(
movement.x, -999.0, movement.z, visualYaw, visualPitch, mc.player.isOnGround()
);
mc.player.connection.send(packet);
mc.player.yRotLast = visualYaw;
mc.player.xRotLast = visualPitch;
}
}
private boolean shouldPlayerAttack() {
boolean cancelReason = mc.player.isInWater() && mc.player.areEyesInFluid(FluidTags.WATER) ||
mc.player.isInLava() ||
mc.player.isOnLadder() ||
mc.player.isPassenger() ||
mc.player.abilities.isFlying;
return !cancelReason && !mc.player.isOnGround() && mc.player.fallDistance > 0.5F;
}
private boolean isModelAligned(float targetYaw, float targetPitch) {
float yawDifference = Math.abs(MathHelper.wrapDegrees(targetYaw - mc.player.renderYawOffset));
float pitchDifference = Math.abs(MathHelper.wrapDegrees(targetPitch - mc.player.rotationPitch));
return yawDifference <= 0.1F && pitchDifference <= 0.1F;
}
private void findTarget() {
List<LivingEntity> candidates = new ArrayList<>();
for (Entity entity : mc.world.getAllEntities()) {
if (entity instanceof LivingEntity) {
LivingEntity living = (LivingEntity) entity;
if (isValid(living) && isInFieldOfView(living)) {
candidates.add(living);
}
}
}
candidates.sort(Comparator.comparingDouble(mc.player::getDistance));
target = candidates.isEmpty() ? null : candidates.get(0);
}
private boolean isValid(LivingEntity entity) {
return entity != mc.player &&
entity.isAlive() &&
!entity.isSpectator() &&
entity.getDistance(mc.player) <= attackRange;
}
private boolean isInFieldOfView(LivingEntity entity) {
float yawToEntity = calculateYawToTarget(entity);
float pitchToEntity = calculatePitchToNeck(entity);
float yawDifference = Math.abs(MathHelper.wrapDegrees(yawToEntity - mc.player.rotationYaw));
float pitchDifference = Math.abs(MathHelper.wrapDegrees(pitchToEntity - mc.player.rotationPitch));
return yawDifference <= 45.0F && pitchDifference <= 45.0F;
}
private float calculateYawToTarget(LivingEntity entity) {
Vector3d diff = entity.getPositionVec().subtract(mc.player.getPositionVec());
return (float) MathHelper.wrapDegrees(Math.toDegrees(Math.atan2(diff.z, diff.x)) - 90.0);
}
private float calculatePitchToNeck(LivingEntity entity) {
double targetY = entity.getBoundingBox().minY + entity.getHeight() * 0.75;
double playerY = mc.player.getPosYEye();
double heightDiff = targetY - playerY;
Vector3d diff = entity.getPositionVec().subtract(mc.player.getPositionVec());
double horizontalDistance = MathHelper.sqrt(diff.x * diff.x + diff.z * diff.z);
return (float) -Math.toDegrees(Math.atan2(heightDiff, horizontalDistance));
}
private void attackTarget(LivingEntity target) {
if (mc.player.getCooledAttackStrength(0) >= 1.0f) {
mc.playerController.attackEntity(mc.player, target);
mc.player.swingArm(Hand.MAIN_HAND);
mc.player.resetCooldown();
}
}
}