From 8c624230694f157adafc84d3327a12fd379de5e1 Mon Sep 17 00:00:00 2001 From: Alexander01998 Date: Fri, 20 Nov 2020 01:35:58 +0100 Subject: [PATCH] Add FeedAuraHack --- .../java/net/wurstclient/hack/HackList.java | 1 + .../net/wurstclient/hacks/FeedAuraHack.java | 231 ++++++++++++++++++ 2 files changed, 232 insertions(+) create mode 100644 src/main/java/net/wurstclient/hacks/FeedAuraHack.java diff --git a/src/main/java/net/wurstclient/hack/HackList.java b/src/main/java/net/wurstclient/hack/HackList.java index 64b34ae6..934148fb 100644 --- a/src/main/java/net/wurstclient/hack/HackList.java +++ b/src/main/java/net/wurstclient/hack/HackList.java @@ -80,6 +80,7 @@ public final class HackList implements UpdateListener public final FastBreakHack fastBreakHack = new FastBreakHack(); public final FastLadderHack fastLadderHack = new FastLadderHack(); public final FastPlaceHack fastPlaceHack = new FastPlaceHack(); + public final FeedAuraHack feedAuraHack = new FeedAuraHack(); public final FightBotHack fightBotHack = new FightBotHack(); public final FishHack fishHack = new FishHack(); public final FlightHack flightHack = new FlightHack(); diff --git a/src/main/java/net/wurstclient/hacks/FeedAuraHack.java b/src/main/java/net/wurstclient/hacks/FeedAuraHack.java new file mode 100644 index 00000000..1db6d3a2 --- /dev/null +++ b/src/main/java/net/wurstclient/hacks/FeedAuraHack.java @@ -0,0 +1,231 @@ +/* + * Copyright (c) 2014-2020 Wurst-Imperium and contributors. + * + * This source code is subject to the terms of the GNU General Public + * License, version 3. If a copy of the GPL was not distributed with this + * file, You can obtain one at: https://www.gnu.org/licenses/gpl-3.0.txt + */ +package net.wurstclient.hacks; + +import java.util.Comparator; +import java.util.function.ToDoubleFunction; +import java.util.stream.Stream; +import java.util.stream.StreamSupport; + +import org.lwjgl.opengl.GL11; + +import net.minecraft.client.network.ClientPlayerEntity; +import net.minecraft.client.network.ClientPlayerInteractionManager; +import net.minecraft.entity.Entity; +import net.minecraft.entity.LivingEntity; +import net.minecraft.entity.passive.AnimalEntity; +import net.minecraft.item.ItemStack; +import net.minecraft.util.ActionResult; +import net.minecraft.util.Hand; +import net.minecraft.util.hit.EntityHitResult; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.Box; +import net.wurstclient.Category; +import net.wurstclient.SearchTags; +import net.wurstclient.events.PostMotionListener; +import net.wurstclient.events.RenderListener; +import net.wurstclient.events.UpdateListener; +import net.wurstclient.hack.Hack; +import net.wurstclient.settings.EnumSetting; +import net.wurstclient.settings.SliderSetting; +import net.wurstclient.settings.SliderSetting.ValueDisplay; +import net.wurstclient.util.RenderUtils; +import net.wurstclient.util.RotationUtils; + +@SearchTags({"feed aura", "BreedAura", "breed aura", "AutoBreeder", + "auto breeder"}) +public final class FeedAuraHack extends Hack + implements UpdateListener, PostMotionListener, RenderListener +{ + private final SliderSetting range = new SliderSetting("Range", + "Determines how far FeedAura will reach\n" + "to feed animals.\n" + + "Anything that is further away than the\n" + + "specified value will not be fed.", + 5, 1, 10, 0.05, ValueDisplay.DECIMAL); + + private final EnumSetting priority = new EnumSetting<>("Priority", + "Determines which animal will be fed first.\n" + + "\u00a7lDistance\u00a7r - Feeds the closest animal.\n" + + "\u00a7lAngle\u00a7r - Feeds the animal that requires\n" + + "the least head movement.\n" + + "\u00a7lHealth\u00a7r - Feeds the weakest animal.", + Priority.values(), Priority.ANGLE); + + private AnimalEntity target; + private AnimalEntity renderTarget; + + public FeedAuraHack() + { + super("FeedAura", "Automatically feeds animals around you."); + setCategory(Category.OTHER); + addSetting(range); + addSetting(priority); + } + + @Override + protected void onEnable() + { + // disable other auras + WURST.getHax().clickAuraHack.setEnabled(false); + WURST.getHax().fightBotHack.setEnabled(false); + WURST.getHax().killauraLegitHack.setEnabled(false); + WURST.getHax().multiAuraHack.setEnabled(false); + WURST.getHax().protectHack.setEnabled(false); + WURST.getHax().triggerBotHack.setEnabled(false); + WURST.getHax().tpAuraHack.setEnabled(false); + + EVENTS.add(UpdateListener.class, this); + EVENTS.add(PostMotionListener.class, this); + EVENTS.add(RenderListener.class, this); + } + + @Override + protected void onDisable() + { + EVENTS.remove(UpdateListener.class, this); + EVENTS.remove(PostMotionListener.class, this); + EVENTS.remove(RenderListener.class, this); + + target = null; + renderTarget = null; + } + + @Override + public void onUpdate() + { + ClientPlayerEntity player = MC.player; + ItemStack heldStack = player.inventory.getMainHandStack(); + + double rangeSq = Math.pow(range.getValue(), 2); + Stream stream = StreamSupport + .stream(MC.world.getEntities().spliterator(), true) + .filter(e -> !e.removed).filter(e -> e instanceof AnimalEntity) + .map(e -> (AnimalEntity)e).filter(e -> e.getHealth() > 0) + .filter(e -> player.squaredDistanceTo(e) <= rangeSq) + .filter(e -> e.isBreedingItem(heldStack)).filter(e -> e.canEat()); + + target = stream.min(priority.getSelected().comparator).orElse(null); + renderTarget = target; + if(target == null) + return; + + WURST.getRotationFaker() + .faceVectorPacket(target.getBoundingBox().getCenter()); + } + + @Override + public void onPostMotion() + { + if(target == null) + return; + + ClientPlayerInteractionManager im = MC.interactionManager; + ClientPlayerEntity player = MC.player; + Hand hand = Hand.MAIN_HAND; + + EntityHitResult hitResult = new EntityHitResult(target); + ActionResult actionResult = + im.interactEntityAtLocation(player, target, hitResult, hand); + + if(!actionResult.isAccepted()) + actionResult = im.interactEntity(player, target, hand); + + if(actionResult.isAccepted() && actionResult.shouldSwingHand()) + player.swingHand(hand); + + target = null; + } + + @Override + public void onRender(float partialTicks) + { + if(renderTarget == null) + return; + + // GL settings + GL11.glEnable(GL11.GL_BLEND); + GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); + GL11.glEnable(GL11.GL_LINE_SMOOTH); + GL11.glLineWidth(2); + GL11.glDisable(GL11.GL_TEXTURE_2D); + GL11.glEnable(GL11.GL_CULL_FACE); + GL11.glDisable(GL11.GL_DEPTH_TEST); + GL11.glDisable(GL11.GL_LIGHTING); + + GL11.glPushMatrix(); + RenderUtils.applyRenderOffset(); + + Box box = new Box(BlockPos.ORIGIN); + float p = 1; + LivingEntity le = renderTarget; + p = (le.getMaxHealth() - le.getHealth()) / le.getMaxHealth(); + float red = p * 2F; + float green = 2 - red; + + GL11.glTranslated( + renderTarget.prevX + + (renderTarget.getX() - renderTarget.prevX) * partialTicks, + renderTarget.prevY + + (renderTarget.getY() - renderTarget.prevY) * partialTicks, + renderTarget.prevZ + + (renderTarget.getZ() - renderTarget.prevZ) * partialTicks); + GL11.glTranslated(0, 0.05, 0); + GL11.glScaled(renderTarget.getWidth(), renderTarget.getHeight(), + renderTarget.getWidth()); + GL11.glTranslated(-0.5, 0, -0.5); + + if(p < 1) + { + GL11.glTranslated(0.5, 0.5, 0.5); + GL11.glScaled(p, p, p); + GL11.glTranslated(-0.5, -0.5, -0.5); + } + + GL11.glColor4f(red, green, 0, 0.25F); + RenderUtils.drawSolidBox(box); + + GL11.glColor4f(red, green, 0, 0.5F); + RenderUtils.drawOutlinedBox(box); + + GL11.glPopMatrix(); + + // GL resets + GL11.glColor4f(1, 1, 1, 1); + GL11.glEnable(GL11.GL_DEPTH_TEST); + GL11.glEnable(GL11.GL_TEXTURE_2D); + GL11.glDisable(GL11.GL_BLEND); + GL11.glDisable(GL11.GL_LINE_SMOOTH); + } + + private enum Priority + { + DISTANCE("Distance", e -> MC.player.squaredDistanceTo(e)), + + ANGLE("Angle", + e -> RotationUtils + .getAngleToLookVec(e.getBoundingBox().getCenter())), + + HEALTH("Health", e -> e instanceof LivingEntity + ? ((LivingEntity)e).getHealth() : Integer.MAX_VALUE); + + private final String name; + private final Comparator comparator; + + private Priority(String name, ToDoubleFunction keyExtractor) + { + this.name = name; + comparator = Comparator.comparingDouble(keyExtractor); + } + + @Override + public String toString() + { + return name; + } + } +}