Загрузка данных


package dev.dikson.wtf.module.impl.render;

import com.darkmagician6.eventapi.EventTarget;
import dev.dikson.wtf.Furios;
import dev.dikson.wtf.event.render.EventRender2D;
import dev.dikson.wtf.manager.dragging.DragManager;
import dev.dikson.wtf.manager.dragging.Draggable;
import dev.dikson.wtf.manager.theme.Themes;
import dev.dikson.wtf.module.Category;
import dev.dikson.wtf.module.Module;
import dev.dikson.wtf.module.ModuleAnnotation;
import dev.dikson.wtf.module.impl.combat.AttackAura;
import dev.dikson.wtf.module.setting.impl.BooleanSetting;
import dev.dikson.wtf.module.setting.impl.ModeSetting;
import dev.dikson.wtf.module.setting.impl.NumberSetting;
import dev.dikson.wtf.utility.math.MathUtility;
import dev.dikson.wtf.utility.misc.TimerHelper;
import dev.dikson.wtf.utility.render.RenderUtility;
import dev.dikson.wtf.utility.render.StencilUtility;
import dev.dikson.wtf.utility.render.animation.Animation;
import dev.dikson.wtf.utility.render.animation.AnimationMath;
import dev.dikson.wtf.utility.render.animation.Direction;
import dev.dikson.wtf.utility.render.animation.impl.EaseInOutQuad;
import dev.dikson.wtf.utility.render.font.FontRenderer;
import dev.dikson.wtf.utility.render.font.Fonts;
import net.minecraft.block.material.Material;
import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.AbstractClientPlayer;
import net.minecraft.client.gui.GuiChat;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.ThreadDownloadImageData;
import net.minecraft.client.renderer.texture.ITextureObject;
import net.minecraft.client.renderer.texture.SimpleTexture;
import net.minecraft.client.renderer.texture.TextureUtil;
import net.minecraft.entity.EntityLivingBase;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
import net.minecraft.util.text.TextFormatting;
import lombok.Getter;


import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Objects;

@ModuleAnnotation(name = "TargetHUD", category = Category.RENDER)
public class TargetHud extends Module {
    public static ModeSetting targetMode;
    private final Draggable targetHudDraggable;
    public static BooleanSetting glow, absor, hporprocent;
    public NumberSetting glowRadius;
    public static BooleanSetting glowHP, winning, shadow;
    private float hp;
    public int posY, posX;
    public static float animWidth123123123 = 0.0F;
    public static TimerHelper thudTimer = new TimerHelper();
    public static HashMap<String, SkinData> cache;
    private final Animation animation;
    private EntityLivingBase currentTarget;
    private float absorhp;

    public TargetHud() {
        this.targetHudDraggable = DragManager.create(this, "Target HUD", 300, 10);
        this.glowRadius = new NumberSetting("Glow Radius", 10.0f, 7.0f, 10.0f, 1.0f, () -> glow.get() && targetMode.is("Skeet"));
        this.animation = new EaseInOutQuad(175, 1.0f);

    }

    @EventTarget
    public void onRender2D(final EventRender2D ignoredEventRender2D) {
        if (Minecraft.gameSettings.showDebugInfo) return;
        if (targetMode.is("Test")) renderTestMode();
        else if (targetMode.is("Skeet")) renderSkeetMode();
    }

    private void renderTestMode() {
        this.targetHudDraggable.setWidth(108);
        this.targetHudDraggable.setHeight(39.5f);
        if (AttackAura.targetEntity != null) currentTarget = AttackAura.targetEntity;
        else if (mc.currentScreen instanceof GuiChat) currentTarget = Minecraft.player;

        if (currentTarget != null) {
            if (AttackAura.targetEntity == null && !(mc.currentScreen instanceof GuiChat)) animation.setDirection(Direction.BACKWARDS);
            else animation.setDirection(Direction.FORWARDS);

            posX = targetHudDraggable.getX();
            posY = targetHudDraggable.getY();
            RenderUtility.scaleStart(posX + 55, posY + 21.5f, animation.getOutput());
            RenderUtility.furiosshader(posX, posY + 2, 107, 36, 10);

            if (currentTarget instanceof EntityPlayer) {
                RenderUtility.scaleStart(posX, posY, 0.1255f);
                RenderUtility.drawFace228(posX + 14, posY + 32, 0, 0, 256, 256, (AbstractClientPlayer) currentTarget);
                RenderUtility.scaleEnd();
            } else {
                Fonts.furios4.drawCenteredString("N", posX + 18, posY + 14, Furios.getInstance().getThemeManager().getCurrentGuiTheme().equals(Themes.DARK.getTheme()) ? Color.WHITE.getRGB() : Color.BLACK.getRGB());
            }

            absorhp = MathUtility.clamp(MathUtility.lerp(absorhp, currentTarget.getAbsorptionAmount(), (float) (5.0 * AnimationMath.deltaTime())), 0.0F, 5.0F);
            hp = MathUtility.clamp(MathUtility.lerp(hp, currentTarget.getHealth() / currentTarget.getMaxHealth(), (float) (5.0 * AnimationMath.deltaTime())), 0.0F, 1.0F);
            animWidth123123123 = AnimationMath.fast(animWidth123123123, hp, 1.0F);
            RenderUtility.drawRoundedRect(posX + 36F, posY + 27, 67.0F, 8.0F, 5.0F, new Color(77, 77, 77, 44).getRGB());
            float currentHP = currentTarget.getHealth();
            if (currentHP >= 13.0F) {
                RenderUtility.drawRoundedGradientRect(posX + 36F, posY + 27, 67.0F * hp, 8.0F, 7.0F, 8.0F, new Color(12, 71, 0, 250).brighter().getRGB(), new Color(26, 26, 26, 250).brighter().getRGB(), new Color(1, 231, 1, 250).brighter().getRGB(), new Color(0, 153, 0, 250).brighter().getRGB());
                RenderUtility.drawGradientGlow(posX + 36F, posY + 27, 67.0F * hp, 8.0F, 4, new Color(12, 71, 0, 250).brighter(), new Color(26, 26, 26, 250).brighter(), new Color(1, 231, 1, 250).brighter(), new Color(0, 153, 0, 250).brighter());
            } else if (currentHP >= 6.5F) {
                RenderUtility.drawRoundedGradientRect(posX + 36F, posY + 27, 67.0F * hp, 8.0F, 7.0F, 8.0F, new Color(62, 71, 0, 250).brighter().getRGB(), new Color(32, 32, 32, 250).brighter().getRGB(), new Color(255, 255, 0, 250).brighter().getRGB(), new Color(153, 153, 0, 250).brighter().getRGB());
                RenderUtility.drawGradientGlow(posX + 36F, posY + 27, 67.0F * hp, 8.0F, 4, new Color(62, 71, 0, 250).brighter(), new Color(32, 32, 32, 250).brighter(), new Color(255, 255, 0, 250).brighter(), new Color(153, 153, 0, 250).brighter());
            } else {
                RenderUtility.drawRoundedGradientRect(posX + 36F, posY + 27, 67.0F * hp, 8.0F, 7.0F, 8.0F, new Color(71, 0, 0, 250).brighter().getRGB(), new Color(32, 32, 32, 250).brighter().getRGB(), new Color(102, 0, 0, 250).brighter().getRGB(), new Color(204, 0, 0, 250).brighter().getRGB());
                RenderUtility.drawGradientGlow(posX + 36F, posY + 27, 67.0F * hp, 8.0F, 4, new Color(71, 0, 0, 250).brighter(), new Color(32, 32, 32, 250).brighter(), new Color(102, 0, 0, 250).brighter(), new Color(204, 0, 0, 250).brighter());
            }

            RenderUtility.drawRoundedGradientRect(posX + 36F, posY + 27, 50.0F * absorhp / currentTarget.getMaxHealth() * 3.0F, 8.0F, 6.0F, 1.0F, -39424, -39424, -10496, -10496);
            RenderUtility.drawGradientGlowth(posX + 36F, posY + 27, 50.0F * absorhp / currentTarget.getMaxHealth() * 3.0F, 8.0F, 4, -39424, -39424, -10496, -10496);
            Fonts.SEMI_BOLD_14.drawString("HP: " + MathUtility.round(hp * 20.0F, 0.1), posX + 37, posY + 18, Furios.getInstance().getThemeManager().getCurrentGuiTheme().equals(Themes.DARK.getTheme()) ? Color.WHITE.getRGB() : Color.BLACK.getRGB());
            Fonts.SEMI_BOLD_15.drawSubstring(currentTarget.getName(), posX + 36.5f, posY + 7.5f, Furios.getInstance().getThemeManager().getCurrentGuiTheme().equals(Themes.DARK.getTheme()) ? Color.WHITE.getRGB() : Color.BLACK.getRGB(), 55.0F);
            RenderUtility.scaleEnd();
        }
    }

    private void renderSkeetMode() {
        this.targetHudDraggable.setWidth(137);
        this.targetHudDraggable.setHeight(44);
        if (AttackAura.targetEntity != null) currentTarget = AttackAura.targetEntity;
        else if (mc.currentScreen instanceof GuiChat) currentTarget = Minecraft.player;

        if (currentTarget != null) {
            if (AttackAura.targetEntity == null && !(mc.currentScreen instanceof GuiChat)) animation.setDirection(Direction.BACKWARDS);
            else animation.setDirection(Direction.FORWARDS);

            RenderUtility.scaleStart(targetHudDraggable.getX() + 56, targetHudDraggable.getY() + 19, animation.getOutput());
            RenderUtility.drawRoundedRect(targetHudDraggable.getX() - 7.8F, targetHudDraggable.getY() - 6.5F, 144.8F, 49.8F, 0.0F, new Color(0, 0, 0, 255).getRGB());
            RenderUtility.drawRoundedRect(targetHudDraggable.getX() - 7.3F, targetHudDraggable.getY() - 6.0F, 143.8F, 49.0F, 0.0F, new Color(44, 44, 44, 255).getRGB());
            RenderUtility.drawRoundedRect(targetHudDraggable.getX() - 3, targetHudDraggable.getY() - 2, 135.0F, 41.0F, 0.0F, new Color(21, 24, 21, 255).getRGB());
            RenderUtility.drawRoundedRect(targetHudDraggable.getX() + 2, targetHudDraggable.getY() + 1.0F, 33.0F, 35.5F, 0.0F, new Color(44, 44, 44, 255).getRGB());
            RenderUtility.drawRoundedRect(targetHudDraggable.getX() + 3, targetHudDraggable.getY() + 2.0F, 31.0F, 33.5F, 0.0F, new Color(21, 24, 21, 255).getRGB());

            if (currentTarget instanceof EntityPlayer) {
                float var12 = getHurtPercent(currentTarget);
                GlStateManager.enableColorMaterial();
                GlStateManager.color(1.0F, 1.0F - var12, 1.0F - var12, 1.0F);
            }

            StencilUtility.initStencilToWrite();
            RenderUtility.drawRoundedRect(targetHudDraggable.getX(), targetHudDraggable.getY(), 112.0F, 32.0F, 5.0F, new Color(30, 30, 30).getRGB());
            StencilUtility.readStencilBuffer(1);
            Fonts.tenacityBold16.drawSubstring(TextFormatting.getTextWithoutFormattingCodes(currentTarget.getName()), targetHudDraggable.getX() + 41, targetHudDraggable.getY() + 4, Color.WHITE.getRGB(), 65.0F);
            StencilUtility.uninitStencilBuffer();

            int var9 = 36;
            for (Iterator<ItemStack> var13 = currentTarget.getEquipmentAndArmor().iterator(); var13.hasNext(); var9 -= 15) {
                ItemStack var5 = var13.next();
                if (!var5.isEmpty()) {
                    GlStateManager.pushMatrix();
                    GlStateManager.translate(targetHudDraggable.getX() + var9 + 79, targetHudDraggable.getY() + 25, 0.0F);
                    GlStateManager.scale(0.8, 0.9, 0.9);
                    RenderUtility.drawItemStack(var5, 0, 0);
                    GlStateManager.popMatrix();
                }
            }

            hp = MathUtility.clamp(MathUtility.lerp(hp, currentTarget.getHealth() / currentTarget.getMaxHealth(), (float) (45.0 * AnimationMath.deltaTime())), 0.0F, 1.0F);
            Color var11 = getVar11();

            RenderUtility.drawEntityOnScreen(targetHudDraggable.getX() + 19, targetHudDraggable.getY() + 36, 17, currentTarget);
            RenderUtility.drawRect(targetHudDraggable.getX() + 41, targetHudDraggable.getY() + 13.5F, 79.0F, 5.0F, Color.black.getRGB());
            RenderUtility.drawRect(targetHudDraggable.getX() + 41, targetHudDraggable.getY() + 13.5F, 79.0F * hp, 5.0F, var11.getRGB());

            if (absor.get()) {
                absorhp = MathUtility.clamp(MathUtility.lerp(absorhp, currentTarget.getAbsorptionAmount(), (float) (12.0 * AnimationMath.deltaTime())), 0.0F, 1.3F);
                RenderUtility.drawRect(targetHudDraggable.getX() + 41, targetHudDraggable.getY() + 13.5F, 237.0F * absorhp / currentTarget.getMaxHealth(), 5.0F, Color.ORANGE.getRGB());
            }

            Fonts.tenacityBold13.drawCenteredString("            |   |   |   |   |   |   |   |   |     ", targetHudDraggable.getX() + 74.0F, targetHudDraggable.getY() + 14.5F, Color.BLACK.getRGB());
            RenderUtility.drawRoundedRect(targetHudDraggable.getX() + 38, targetHudDraggable.getY() + 18, 82.0F, 2.0F, 0.0F, new Color(22, 22, 22, 255).getRGB());
            RenderUtility.drawRoundedRect(targetHudDraggable.getX() + 38, targetHudDraggable.getY() + 11, 82.0F, 2.0F, 0.0F, new Color(22, 22, 22, 255).getRGB());

            if (glow.get()) {
                RenderUtility.drawGlow(targetHudDraggable.getX() + 41, targetHudDraggable.getY() + 13, 79.0F * hp, 5.0F, glowRadius.getInt(), var11);
            }

            FontRenderer var14 = Fonts.tenacityBold16;
            if (!hporprocent.get()) {
                int var10 = (int) MathUtility.round(hp * 20.0F + currentTarget.getAbsorptionAmount(), 0.5);
                var14.drawString("HP:" + var10 + " | Dist:" + (int) Minecraft.player.getDistance(currentTarget), targetHudDraggable.getX() + 41, targetHudDraggable.getY() + 20.5F, Color.WHITE.getRGB());
            } else {
                int var10 = (int) MathUtility.round(hp * 100.0F + currentTarget.getAbsorptionAmount(), 0.5);
                var14.drawString("HP: " + var10 + "% | Dist:" + (int) Minecraft.player.getDistance(currentTarget), targetHudDraggable.getX() + 41, targetHudDraggable.getY() + 20.5F, Color.WHITE.getRGB());
            }
            RenderUtility.scaleEnd();
        }
    }

    private Color getVar11() {
        Color var11 = Color.GREEN;
        if (!(currentTarget.getHealth() >= 17.0F)) {
            if (currentTarget.getHealth() >= 6.0F && currentTarget.getHealth() <= 14.0F) {
                var11 = Color.YELLOW;
            } else if (currentTarget.getHealth() > 0.0F && currentTarget.getHealth() <= 6.0F) {
                var11 = Color.RED;
            } else if (currentTarget != null && currentTarget.getHealth() <= 0.0F) {
                var11 = Color.RED;
            }
        }
        return var11;
    }

    public static BufferedImage parseBufferedImage(final ITextureObject ito) throws Exception {
        if (ito instanceof ThreadDownloadImageData t) {
            new BufferedImage(64, 64, 2);
            return Objects.requireNonNull(t.imageBuffer).cache();
        }
        if (ito instanceof final SimpleTexture st) {
            return TextureUtil.readBufferedImage(TargetHud.mc.renderEngine.resourceManager.getResource(st.textureLocation).getInputStream());
        }
        return null;
    }

    public static int getTooltipOffset() {
        int offset = 63;
        if (!Minecraft.player.isCreative()) {
            if (Minecraft.player.isInsideOfMaterial(Material.WATER)) {
                offset += 10;
            }
        }
        return offset;
    }

    private static float getHurtPercent(final EntityLivingBase entity) {
        return (entity.hurtTime - ((entity.hurtTime != 0) ? TargetHud.mc.timer.renderPartialTicks : 0.0f)) / 10.0f;
    }

    static {
        TargetHud.targetMode = new ModeSetting("Mode", "Skeet", "Skeet", "Test");
        TargetHud.glow = new BooleanSetting("Glow", true, () -> TargetHud.targetMode.is("Skeet"));
        TargetHud.absor = new BooleanSetting("Absorb", false);
        TargetHud.hporprocent = new BooleanSetting("HP Per", false, () -> TargetHud.targetMode.is("Skeet"));
        TargetHud.cache = new HashMap<>();
    }

    public static class SkinData {
        private int texture;
        @Getter
        private boolean loaded;

        public void setBufferedImage(final BufferedImage bi) {
            TextureUtil.uploadTextureImageAllocate(this.texture = TextureUtil.glGenTextures(), bi.getSubimage(8, 8, 8, 8), false, true);
        }

        public void setLoaded() {
            this.loaded = true;
        }

        public int getTextureID() {
            return this.texture;
        }
    }
}