package im.expensive.functions.impl.combat;
import com.google.common.eventbus.Subscribe;
import im.expensive.Expensive;
import im.expensive.command.friends.FriendStorage;
import im.expensive.events.EventInput;
import im.expensive.events.EventMotion;
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.settings.Setting;
import im.expensive.functions.settings.impl.BooleanSetting;
import im.expensive.functions.settings.impl.ModeListSetting;
import im.expensive.functions.settings.impl.ModeSetting;
import im.expensive.functions.settings.impl.SliderSetting;
import im.expensive.utils.math.SensUtils;
import im.expensive.utils.math.StopWatch;
import im.expensive.utils.player.InventoryUtil;
import im.expensive.utils.player.MouseUtil;
import im.expensive.utils.player.MoveUtils;
import lombok.Getter;
import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.player.ClientPlayerEntity;
import net.minecraft.client.network.play.ClientPlayNetHandler;
import net.minecraft.client.world.ClientWorld;
import net.minecraft.enchantment.EnchantmentHelper;
import net.minecraft.enchantment.Enchantments;
import net.minecraft.entity.Entity;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.item.ArmorStandEntity;
import net.minecraft.entity.monster.MonsterEntity;
import net.minecraft.entity.passive.AnimalEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.inventory.container.ClickType;
import net.minecraft.item.ArmorItem;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.network.play.client.CHeldItemChangePacket;
import net.minecraft.tags.FluidTags;
import net.minecraft.util.Hand;
import net.minecraft.util.math.BlockPos;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.vector.Vector2f;
import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.world.World;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import static java.lang.Math.hypot;
import static net.minecraft.util.math.MathHelper.clamp;
import static net.minecraft.util.math.MathHelper.wrapDegrees;
@FunctionRegister(name = "KillAura", type = Category.Combat)
public class KillAura extends Function {
private final ModeSetting type = new ModeSetting("Тип", "Плавная", new String[]{"Плавная", "Резкая"});
private final SliderSetting attackRange = new SliderSetting("Дистанция аттаки", 3.0F, 3.0F, 6.0F, 0.1F);
final ModeListSetting targets = new ModeListSetting("Таргеты", new BooleanSetting[]{new BooleanSetting("Игроки", true), new BooleanSetting("Голые", true), new BooleanSetting("Мобы", false), new BooleanSetting("Животные", false), new BooleanSetting("Друзья", false), new BooleanSetting("Голые невидимки", true), new BooleanSetting("Невидимки", true)});
final ModeListSetting options = new ModeListSetting("Опции", new BooleanSetting[]{new BooleanSetting("Не бить через стены", true), new BooleanSetting("Только криты", true), new BooleanSetting("Ломать щит", true), new BooleanSetting("Отжимать щит", true), new BooleanSetting("Ускорять ротацию при атаке", false), new BooleanSetting("Синхронизировать атаку с ТПС", false), new BooleanSetting("Фокусировать одну цель", true), new BooleanSetting("Коррекция движения", true)});
final ModeSetting correctionType = (new ModeSetting("Тип коррекции", "Незаметный", new String[]{"Незаметный", "Сфокусированный"})).setVisible(() -> (Boolean) this.options.getValueByName("Коррекция движения").get());
private final StopWatch stopWatch = new StopWatch();
final BooleanSetting followTarget = new BooleanSetting("ElytraTarget", false);
private ModeSetting elytraTargetType = (new ModeSetting("ElytraTargetType", "ElytraTarget | Legit", new String[]{"ElytraTarget | Legit", "ElytraTarget | Rage"})).setVisible(() -> (Boolean) this.followTarget.get());
private final SliderSetting ggg = (new SliderSetting("Скорость привязки", 1.0F, 1.0F, 4.0F, 0.1F)).setVisible(() -> this.elytraTargetType.is("ElytraTarget | Rage"));
private Vector2f rotateVector = new Vector2f(0.0F, 0.0F);
private LivingEntity target;
private Entity selected;
int ticks = 0;
boolean isRotated;
final AutoPotion autoPotion;
private final SliderSetting newSliderSetting = (new SliderSetting("Дистанция наводки", 15.0F, 3.0F, 40.0F, 0.5F)).setVisible(() -> (Boolean) this.followTarget.get());
float lastYaw;
float lastPitch;
public KillAura(AutoPotion var1) {
this.autoPotion = var1;
this.addSettings(new Setting[]{this.type, this.attackRange, this.targets, this.options, this.correctionType, this.followTarget, this.elytraTargetType, this.newSliderSetting, this.ggg});
}
[USER=1474073]@Subscribe[/USER]
public void onInput(EventInput var1) {
if ((Boolean) this.options.getValueByName("Коррекция движения").get() && this.correctionType.is("Незаметная") && this.target != null && mc.player != null) {
MoveUtils.fixMovement(var1, this.rotateVector.x);
}
}
[USER=1474073]@Subscribe[/USER]
public void onUpdate(EventUpdate var1) {
if ((Boolean) this.options.getValueByName("Фокусировать одну цель").get() && (this.target == null || !this.isValid(this.target)) || !(Boolean) this.options.getValueByName("Фокусировать одну цель").get()) {
this.updateTarget();
}
if (this.target != null && (!this.autoPotion.isState() || !this.autoPotion.isActive())) {
this.isRotated = false;
if (this.shouldPlayerFalling() && this.stopWatch.hasTimeElapsed()) {
this.updateAttack();
this.ticks = 2;
}
if (this.type.is("Резкая")) {
if (this.ticks > 0) {
this.updateRotation(true, 180.0F, 90.0F);
int var4 = this.ticks;
this.ticks = var4 - 1;
} else {
this.reset();
}
} else if (!this.isRotated) {
this.updateRotation(false, 80.0F, 35.0F);
}
if ((Boolean) this.followTarget.get() && mc.player.isElytraFlying()) {
if (this.elytraTargetType.is("ElytraTarget | Legit")) {
this.lookAtTarget(this.target);
} else if (this.elytraTargetType.is("ElytraTarget | Rage")) {
this.flyTowardsTarget2(this.target);
}
}
} else {
this.stopWatch.setLastMS(0L);
this.reset();
}
}
private void flyTowardsTarget(LivingEntity var1) {
if (var1 != null && mc.player != null) {
if (this.elytraTargetType.is("ElytraTarget | Legit")) {
this.lookAtTarget(var1);
} else if (this.elytraTargetType.is("ElytraTarget | Rage")) {
this.flyTowardsTarget2(var1);
} else {
this.lookAtTarget(var1);
}
}
}
private void flyTowardsTarget2(LivingEntity var1) {
if (var1 != null && mc.player != null) {
Vector3d var2 = new Vector3d(var1.getPosX(), var1.getPosY() + (double) var1.getEyeHeight(), var1.getPosZ());
Vector3d var3 = mc.player.getPositionVec();
double var30 = var2.x;
double var42 = var3.x;
double var4 = var30 - var42;
var30 = var2.y;
var42 = var3.y;
double var6 = var30 - var42;
var30 = var2.z;
var42 = var3.z;
double var8 = var30 - var42;
double var10 = var3.distanceTo(var2);
if (!(var10 < 0.1)) {
float var12 = (Float) this.ggg.get();
double var13 = Math.min((double) var12, var10 / (double) 2.0F);
double var15 = var4 / var10 * var13;
double var17 = var6 / var10 * var13;
double var19 = var8 / var10 * var13;
double var21 = var3.x + var15;
double var23 = var3.y + var17;
double var25 = var3.z + var19;
if (!this.isPathClear(var3, new Vector3d(var21, var23, var25))) {
Vector3d var27 = this.adjustForObstacles(var3, new Vector3d(var15, var17, var19));
var15 = var27.x;
var17 = var27.y;
var19 = var27.z;
}
ClientPlayerEntity var33 = mc.player;
var33.setMotion(new Vector3d(var15, var17, var19));
}
}
}
private boolean isPathClear(Vector3d var1, Vector3d var2) {
Minecraft var3 = Minecraft.getInstance();
ClientWorld var4 = var3.world;
for (double var5 = (double) 0.0F; var5 < (double) 1.0F; var5 += 0.1) {
double var14 = var1.x;
double var19 = var2.x;
double var22 = var1.x;
double var7 = var14 + (var19 - var22) * var5;
var14 = var1.y;
var19 = var2.y;
var22 = var1.y;
double var9 = var14 + (var19 - var22) * var5;
var14 = var1.z;
var19 = var2.z;
var22 = var1.z;
double var11 = var14 + (var19 - var22) * var5;
BlockPos var13 = new BlockPos(var7, var9, var11);
if (!((World) var4).isAirBlock(var13)) {
return false;
}
}
return true;
}
private Vector3d adjustForObstacles(Vector3d var1, Vector3d var2) {
Minecraft var3 = Minecraft.getInstance();
ClientWorld var4 = var3.world;
for (int var5 = 1; var5 <= 3; ++var5) {
Vector3d var6 = var1.add(var2.x, var2.y + (double) var5, var2.z);
if (this.isPathClear(var1, var6)) {
return new Vector3d(var2.x, var2.y + (double) var5, var2.z);
}
}
for (int var7 = 1; var7 <= 3; ++var7) {
Vector3d var8 = var1.add(var2.x + (double) var7, var2.y, var2.z);
if (this.isPathClear(var1, var8)) {
return new Vector3d(var2.x + (double) var7, var2.y, var2.z);
}
}
return var2;
}
private void lookAtTarget(LivingEntity var1) {
Vector3d var2 = new Vector3d(var1.getPosX(), var1.getPosY() + (double) var1.getEyeHeight(), var1.getPosZ());
Vector3d var3 = mc.player.getPositionVec().add((double) 0.0F, (double) mc.player.getEyeHeight(), (double) 0.0F);
double var23 = var2.x;
double var29 = var3.x;
double var4 = var23 - var29;
var23 = var2.y;
var29 = var3.y;
double var6 = var23 - var29;
var23 = var2.z;
var29 = var3.z;
double var8 = var23 - var29;
double var10 = Math.sqrt(var4 * var4 + var6 * var6 + var8 * var8);
double var12 = var4 / var10;
double var14 = var6 / var10;
double var16 = var8 / var10;
float var26 = (float) (Math.atan2(var8, var4) * (180D / Math.PI));
float var18 = var26 - 90.0F;
float var19 = (float) (-(Math.atan2(var6, Math.sqrt(var4 * var4 + var8 * var8)) * (180D / Math.PI)));
mc.player.rotationYaw = var18;
mc.player.rotationPitch = var19;
Vector3d var20 = mc.player.getMotion();
double var21 = var20.length();
mc.player.setMotion(var12 * var21, var14 * var21, var16 * var21);
}
[USER=1474073]@Subscribe[/USER]
private void onWalking(EventMotion var1) {
if (this.target != null && (!this.autoPotion.isState() || !this.autoPotion.isActive())) {
float var2 = this.rotateVector.x;
float var3 = this.rotateVector.y;
var1.setYaw(var2);
var1.setPitch(var3);
mc.player.rotationYawHead = var2;
mc.player.renderYawOffset = var2;
mc.player.rotationPitchHead = var3;
}
}
private void updateTarget() {
ArrayList var1 = new ArrayList();
for (Entity var3 : mc.world.getAllEntities()) {
if (var3 instanceof LivingEntity var9) {
LivingEntity var4 = var9;
if (this.isValid(var9)) {
var1.add(var4);
}
}
}
if (var1.isEmpty()) {
this.target = null;
} else if (var1.size() == 1) {
this.target = (LivingEntity) var1.get(0);
} else {
var1.sort(Comparator.comparingDouble((var1x) -> {
if (var1x instanceof PlayerEntity var3) {
return -this.getEntityArmor(var3);
} else if (var1x instanceof LivingEntity var2) {
return (double) (-var2.getTotalArmorValue());
} else {
return (double) 0.0F;
}
}).thenComparing((var1x, var2) -> {
double var3 = this.getEntityHealth((LivingEntity) var1x);
double var5 = this.getEntityHealth((LivingEntity) var2);
return Double.compare(var3, var5);
}).thenComparing((var0, var1x) -> {
double var2 = (double) mc.player.getDistance((LivingEntity) var0);
double var4 = (double) mc.player.getDistance((LivingEntity) var1x);
return Double.compare(var2, var4);
}));
this.target = (LivingEntity) var1.get(0);
}
}
private void updateRotation(boolean var1, float var2, float var3) {
Vector3d var27 = this.target.getPositionVec();
double var44 = mc.player.getPosYEye();
double var10003 = this.target.getPosY();
Vector3d var4 = var27.add((double) 0.0F, MathHelper.clamp(var44 - var10003, (double) 0.0F, (double) this.target.getHeight() * (mc.player.getDistanceEyePos(this.target) / (double) (Float) this.attackRange.get())), (double) 0.0F).subtract(mc.player.getEyePosition(1.0F));
this.isRotated = true;
double var28 = Math.toDegrees(Math.atan2(var4.z, var4.x));
float var5 = (float) MathHelper.wrapDegrees(var28 - (double) 90.0F);
float var6 = (float) (-Math.toDegrees(Math.atan2(var4.y, Math.hypot(var4.x, var4.z))));
float var35 = this.rotateVector.x;
float var7 = MathHelper.wrapDegrees(var5 - var35);
var35 = this.rotateVector.y;
float var8 = MathHelper.wrapDegrees(var6 - var35);
int var9 = (int) var7;
switch ((String) this.type.get()) {
case "Плавная":
float var18 = Math.min(Math.max(Math.abs(var7), 1.0F), var2);
float var20 = Math.min(Math.max(Math.abs(var8), 1.0F), var3);
float var29;
if (var1 && this.selected != this.target && (Boolean) this.options.getValueByName("Ускорять ротацию при атаке").get()) {
var29 = Math.max(Math.abs(var8), 1.0F);
} else {
var29 = var20 / 3.0F;
}
var20 = var29;
var35 = this.lastYaw;
if (Math.abs(var18 - var35) <= 3.0F) {
var18 = this.lastYaw + 3.1F;
}
float var22 = this.rotateVector.x + (var7 > 0.0F ? var18 : -var18);
float var15 = MathHelper.clamp(this.rotateVector.y + (var8 > 0.0F ? var20 : -var20), -89.0F, 89.0F);
float var16 = SensUtils.getGCDValue();
float var49 = this.rotateVector.x;
var35 = (var22 - var49) % var16;
var22 -= var35;
var49 = this.rotateVector.y;
var35 = (var15 - var49) % var16;
var15 -= var35;
this.rotateVector = new Vector2f(var22, var15);
this.lastYaw = var18;
this.lastPitch = var20;
if ((Boolean) this.options.getValueByName("Коррекция движения").get()) {
mc.player.rotationYawOffset = var22;
}
break;
case "Резкая":
float var12 = this.rotateVector.x + (float) var9;
float var13 = MathHelper.clamp(this.rotateVector.y + var8, -90.0F, 90.0F);
float var14 = SensUtils.getGCDValue();
float var45 = this.rotateVector.x;
this.rotateVector = new Vector2f(var12, var13);
if ((Boolean) this.options.getValueByName("Коррекция движения").get()) {
mc.player.rotationYawOffset = var12;
}
}
}
private void updateAttack() {
this.selected = MouseUtil.getMouseOver(this.target, this.rotateVector.x, this.rotateVector.y, (double) (Float) this.attackRange.get());
if ((Boolean) this.options.getValueByName("Ускорять ротацию при атаке").get()) {
this.updateRotation(true, 60.0F, 35.0F);
}
if ((Boolean) this.followTarget.get() && mc.player.isElytraFlying()) {
this.selected = MouseUtil.getMouseOver(this.target, this.rotateVector.x, this.rotateVector.y, (double) (Float) this.attackRange.get());
}
if (this.selected != null && this.selected == this.target) {
if (mc.player.isBlocking() && (Boolean) this.options.getValueByName("Отжимать щит").get()) {
mc.playerController.onStoppedUsingItem(mc.player);
}
this.stopWatch.setLastMS(500L);
mc.playerController.attackEntity(mc.player, this.target);
mc.player.swingArm(Hand.MAIN_HAND);
LivingEntity var1 = this.target;
}
}
private boolean shouldPlayerFalling() {
boolean var1 = mc.player.isInWater() && mc.player.areEyesInFluid(FluidTags.WATER) || mc.player.isInLava() || mc.player.isOnLadder() || mc.player.isPassenger() || mc.player.abilities.isFlying;
float var2 = mc.player.getCooledAttackStrength((Boolean) this.options.getValueByName("Синхронизировать атаку с ТПС").get() ? Expensive.getInstance().getTpsCalc().getAdjustTicks() : 1.5F);
if (var2 < 0.92F) {
return false;
} else if (!var1 && (Boolean) this.options.getValueByName("Только криты").get()) {
return !mc.player.isOnGround() && mc.player.fallDistance > 0.0F;
} else {
return true;
}
}
private boolean isValid(LivingEntity var1) {
if (var1 instanceof ClientPlayerEntity) {
return false;
} else if (var1.ticksExisted < 3) {
return false;
} else {
if ((Boolean) this.followTarget.get() && mc.player.isElytraFlying()) {
if (mc.player.getDistanceEyePos(var1) > (double) (Float) this.newSliderSetting.get()) {
return false;
}
} else if (mc.player.getDistanceEyePos(var1) > (double) (Float) this.attackRange.get()) {
return false;
}
if ((Boolean) this.options.getValueByName("Не бить через стены").get() && !mc.player.canEntityBeSeen(var1)) {
return false;
} else {
if (var1 instanceof PlayerEntity) {
PlayerEntity var2 = (PlayerEntity) var1;
if (AntiBot.isBot(var1)) {
return false;
}
if (!(Boolean) this.targets.getValueByName("Друзья").get() && FriendStorage.isFriend(var2.getName().getString())) {
return false;
}
if (var2.getName().getString().equalsIgnoreCase(mc.player.getName().getString())) {
return false;
}
}
if (var1 instanceof PlayerEntity) {
if (!(Boolean) this.targets.getValueByName("Игроки").get()) {
return false;
}
if (var1.getTotalArmorValue() == 0 && !(Boolean) this.targets.getValueByName("Голые").get()) {
return false;
}
if (var1.isInvisible() && var1.getTotalArmorValue() == 0 && !(Boolean) this.targets.getValueByName("Голые невидимки").get()) {
return false;
}
if (var1.isInvisible() && !(Boolean) this.targets.getValueByName("Невидимки").get()) {
return false;
}
} else if (var1 instanceof MonsterEntity) {
if (!(Boolean) this.targets.getValueByName("Мобы").get()) {
return false;
}
} else if (var1 instanceof AnimalEntity && !(Boolean) this.targets.getValueByName("Животные").get()) {
return false;
}
return !var1.isInvulnerable() && var1.isAlive() && !(var1 instanceof ArmorStandEntity);
}
}
}
private void breakShieldPlayer(PlayerEntity var1) {
if (var1.isBlocking()) {
int var2 = InventoryUtil.getInstance().getAxeInInventory(false);
int var3 = InventoryUtil.getInstance().getAxeInInventory(true);
if (var3 == -1 && var2 != -1) {
int var4 = InventoryUtil.getInstance().findBestSlotInHotBar();
mc.playerController.windowClick(0, var2, 0, ClickType.PICKUP, mc.player);
mc.playerController.windowClick(0, var4 + 36, 0, ClickType.PICKUP, mc.player);
ClientPlayNetHandler var7 = mc.player.connection;
var7.sendPacket(new CHeldItemChangePacket(var4));
mc.playerController.attackEntity(mc.player, var1);
mc.player.swingArm(Hand.MAIN_HAND);
var7 = mc.player.connection;
var7.sendPacket(new CHeldItemChangePacket(mc.player.inventory.currentItem));
mc.playerController.windowClick(0, var4 + 36, 0, ClickType.PICKUP, mc.player);
mc.playerController.windowClick(0, var2, 0, ClickType.PICKUP, mc.player);
}
if (var3 != -1) {
ClientPlayNetHandler var9 = mc.player.connection;
var9.sendPacket(new CHeldItemChangePacket(var3));
mc.playerController.attackEntity(mc.player, var1);
mc.player.swingArm(Hand.MAIN_HAND);
var9 = mc.player.connection;
var9.sendPacket(new CHeldItemChangePacket(mc.player.inventory.currentItem));
}
}
}
private void reset() {
if ((Boolean) this.options.getValueByName("Коррекция движения").get()) {
mc.player.rotationYawOffset = (float) Integer.MIN_VALUE;
}
this.rotateVector = new Vector2f(mc.player.rotationYaw, mc.player.rotationPitch);
}
public void onEnable() {
super.onEnable();
this.reset();
this.target = null;
}
public void onDisable() {
super.onDisable();
this.reset();
this.stopWatch.setLastMS(0L);
this.target = null;
}
private double getEntityArmor(PlayerEntity var1) {
double var2 = (double) 0.0F;
for (int var4 = 0; var4 < 4; ++var4) {
ItemStack var5 = (ItemStack) var1.inventory.armorInventory.get(var4);
if (var5.getItem() instanceof ArmorItem) {
var2 += this.getProtectionLvl(var5);
}
}
return var2;
}
private double getProtectionLvl(ItemStack var1) {
Item var2 = var1.getItem();
if (var2 instanceof ArmorItem var3) {
double var4 = (double) var3.getDamageReduceAmount();
if (var1.isEnchanted()) {
var4 += (double) EnchantmentHelper.getEnchantmentLevel(Enchantments.PROTECTION, var1) * (double) 0.25F;
}
return var4;
} else {
return (double) 0.0F;
}
}
private double getEntityHealth(LivingEntity var1) {
if (var1 instanceof PlayerEntity var2) {
return (double) (var2.getHealth() + var2.getAbsorptionAmount()) * (this.getEntityArmor(var2) / (double) 20.0F);
} else {
return (double) (var1.getHealth() + var1.getAbsorptionAmount());
}
}
public ModeSetting getType() {
return this.type;
}
public ModeListSetting getOptions() {
return this.options;
}
public StopWatch getStopWatch() {
return this.stopWatch;
}
public LivingEntity getTarget() {
return this.target;
}
}