Подписывайтесь на наш Telegram и не пропускайте важные новости! Перейти

Визуальная часть TargetHUD Zenith | Вроде красивый

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
7 Дек 2025
Сообщения
68
Реакции
1
Выберите загрузчик игры
  1. Прочие моды
Моя первая работа с таргет худом, если не красиво, сорян, /del принимаются

SS - прикрепил

DW - код
TargetHUD:
Expand Collapse Copy
package dev.silent.implement.features.draggables;

import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.render.entity.EntityRenderer;
import net.minecraft.client.render.entity.LivingEntityRenderer;
import net.minecraft.client.render.entity.state.LivingEntityRenderState;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.entity.LivingEntity;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.MathHelper;
import dev.silent.api.feature.draggable.AbstractDraggable;
import dev.silent.api.system.animation.Animation;
import dev.silent.api.system.animation.Direction;
import dev.silent.api.system.animation.implement.DecelerateAnimation;
import dev.silent.api.system.font.FontRenderer;
import dev.silent.api.system.font.Fonts;
import dev.silent.api.system.shape.ShapeProperties;
import dev.silent.common.util.color.ColorUtil;
import dev.silent.common.util.item.ItemUtil;
import dev.silent.common.util.math.MathUtil;
import dev.silent.common.util.other.StopWatch;
import dev.silent.common.util.entity.PlayerIntersectionUtil;
import dev.silent.common.util.render.Render2DUtil;
import dev.silent.common.util.render.ScissorManager;
import dev.silent.core.Main;
import dev.silent.implement.features.modules.combat.Aura;

import java.awt.Color;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.stream.StreamSupport;

public class TargetHud extends AbstractDraggable {

    private final Animation animation = new DecelerateAnimation().setMs(200).setValue(1);
    private final StopWatch stopWatch = new StopWatch();
    private LivingEntity lastTarget;
    private Item lastItem = Items.AIR;
    private float health;
    private float absorptionWidthSmooth;

    private float lastTotalHp = 0.0F;
    private final List<HealingText> healingTexts = new ArrayList<>();

    public TargetHud() {
        super("Target Hud", 10, 40, 100, 36, true);
    }

    @Override
    public boolean visible() {
        return scaleAnimation.isDirection(Direction.FORWARDS);
    }

    @Override
    public void tick() {
        LivingEntity auraTarget = Aura.getInstance().getTarget();

        if (auraTarget != null) {
            lastTarget = auraTarget;
            startAnimation();
        } else if (PlayerIntersectionUtil.isChat(mc.currentScreen)) {
            lastTarget = mc.player;
            startAnimation();
        } else if (stopWatch.finished(500)) {
            stopAnimation();
        }

        if (lastTarget != null) {
            float currentTotalHp = PlayerIntersectionUtil.getHealth(lastTarget);

            if (currentTotalHp > lastTotalHp && lastTotalHp != 0.0F) {
                float healedAmount = currentTotalHp - lastTotalHp;
                if (healedAmount > 0.01F) {
                    String healString = "+" + PlayerIntersectionUtil.getHealthString(healedAmount);
                    healingTexts.add(new HealingText(healString));
                }
            }
            lastTotalHp = currentTotalHp;
        } else {
            lastTotalHp = 0.0F;
        }
    }

    @Override
    public void drawDraggable(DrawContext context) {
        if (lastTarget != null) {
            MatrixStack matrix = context.getMatrices();
            drawUsingItem(context, matrix);
            drawMain(context, matrix);
            drawFace(context);
            drawArmor(context, matrix);
        }
    }

    private void drawMain(DrawContext context, MatrixStack matrix) {
        FontRenderer font = Fonts.getSize(16);
        FontRenderer smallFont = Fonts.getSize(14);

        float totalHp = PlayerIntersectionUtil.getHealth(lastTarget);
        float baseHp = lastTarget.getHealth();
        float absorptionHp = lastTarget.getAbsorptionAmount();
        float maxBaseHp = lastTarget.getMaxHealth();
        float widthHp = 58;

        float barY = getY() + 31F;
        float absorptionBarY = barY - 1F;
        float textY = getY() + 23;
        float nameY = getY() + 7;
        float contentX = getX() + 34;
        float alignedX = contentX + 2;
        float verticalDividerX = getX() + 32;
        float verticalDividerY = getY() + 2;
        float verticalDividerHeight = getHeight() - 3f;

        blur.render(ShapeProperties.create(matrix, getX(), getY(), getWidth(), getHeight()).round(7).softness(1)
                .thickness(2).outlineColor(ColorUtil.getOutline()).color(ColorUtil.getRect(0.6F)).build());

        rectangle.render(ShapeProperties.create(matrix, verticalDividerX, verticalDividerY, 0.7F, verticalDividerHeight)
                .color(ColorUtil.getOutline()).build());
        rectangle.render(ShapeProperties.create(matrix, contentX, getY() + 17F, widthHp, 0.7F)
                .color(ColorUtil.getOutline()).build());

        String mainHpText = PlayerIntersectionUtil.getHealthString(totalHp) + " хп";
        String absText = absorptionHp > 0 ? " + " + PlayerIntersectionUtil.getHealthString(absorptionHp) + " хп" : "";
        int targetColor = baseHp >= 10 ? ColorUtil.getColor(85, 255, 85) : ColorUtil.getColor(255, 85, 85);

        smallFont.drawGradientString(matrix, mainHpText, alignedX, textY, Color.WHITE.getRGB(), targetColor);

        if (!absText.isEmpty()) {
            float absX = alignedX + smallFont.getStringWidth(mainHpText);
            smallFont.drawString(matrix, absText, absX, textY, ColorUtil.getColor(255, 255, 0));
        }

        health = MathHelper.clamp(MathUtil.interpolateSmooth(1, health, Math.round(baseHp / maxBaseHp * widthHp)), 2, widthHp);

        String name = lastTarget.getName().getString();
        if (font.getStringWidth(name) > 60) {
            ScissorManager scissorManager = Main.getInstance().getScissorManager();
            scissorManager.push(matrix.peek().getPositionMatrix(), getX(), getY(), getWidth() - 2, getHeight());
            font.drawGradientString(matrix, name, alignedX, nameY, ColorUtil.getText(), ColorUtil.getText(0.6F));
            scissorManager.pop();
        } else font.drawString(matrix, name, alignedX, nameY, ColorUtil.getText());

        if (absorptionHp > 0 || absorptionWidthSmooth > 0.5) {
            float targetAbsWidth = MathHelper.clamp((absorptionHp / maxBaseHp) * widthHp, 0, widthHp);
            absorptionWidthSmooth = MathUtil.interpolateSmooth(0.1, absorptionWidthSmooth, targetAbsWidth);
            rectangle.render(ShapeProperties.create(matrix, contentX, absorptionBarY, absorptionWidthSmooth, 2F)
                    .round(0.75F).color(ColorUtil.getColor(255, 255, 0)).build());
        }

        rectangle.render(ShapeProperties.create(matrix, contentX, barY, widthHp, 2f).round(0.75F).color(0xFF060712).build());
        rectangle.render(ShapeProperties.create(matrix, contentX, barY, health, 2F).softness(4).round(1).color(ColorUtil.roundClientColor(0.6F)).build());
        rectangle.render(ShapeProperties.create(matrix, contentX, barY, health, 2F).round(0.75F).color(ColorUtil.roundClientColor(1)).build());

        float currentX = alignedX + smallFont.getStringWidth(mainHpText + absText) + 2;
        Iterator<HealingText> iterator = healingTexts.iterator();
        while (iterator.hasNext()) {
            HealingText text = iterator.next();
            if (text.isFinished()) {
                iterator.remove();
                continue;
            }
            float progress = text.getAnimationValue();
            float yOffset = 6 * progress;
            int alpha = (int) (255 * (1.0F - progress));
            int color = ColorUtil.getColor(85, 255, 85, Math.max(0, alpha));
            smallFont.drawString(matrix, text.text, currentX, textY - yOffset, color);
            currentX += smallFont.getStringWidth(text.text) + 2;
        }
    }

    private void drawArmor(DrawContext context, MatrixStack matrix) {
        List<ItemStack> items = StreamSupport.stream(lastTarget.getEquippedItems().spliterator(), false).filter(s -> !s.isEmpty()).toList();
        if (!items.isEmpty()) {
            float x = getX() + getWidth() / 2F - items.size() * 5.5F;
            float y = getY() + getHeight() - 1;
            float itemX = -10.5F;
            matrix.push();
            matrix.translate(x, y, -200);
            blur.render(ShapeProperties.create(matrix, 0, 0, items.size() * 11, 11).round(3F).softness(1).thickness(2).outlineColor(ColorUtil.getOutline()).color(ColorUtil.getRect(0.6F)).build());
            for (ItemStack stack : items) Render2DUtil.defaultDrawStack(context, stack, itemX += 11, 0.5F, false, true, 0.5F);
            matrix.pop();
        }
    }

    private void drawUsingItem(DrawContext context, MatrixStack matrix) {
        animation.setDirection(lastTarget.isUsingItem() ? Direction.FORWARDS : Direction.BACKWARDS);
        if (!lastTarget.getActiveItem().isEmpty()) lastItem = lastTarget.getActiveItem().getItem();

        if (!animation.isFinished(Direction.BACKWARDS) && !lastItem.equals(Items.AIR)) {
            float anim = animation.getOutput().floatValue();
            float progress = (lastTarget.getItemUseTime() + tickCounter.getTickDelta(false)) / ItemUtil.maxUseTick(lastItem) * 360;
            float x = getX() - (29) * anim;
            float y = getY() + 6;

            ScissorManager scissorManager = Main.getInstance().getScissorManager();
            scissorManager.push(matrix.peek().getPositionMatrix(), getX() - 50, getY(), 50, getHeight());
            MathUtil.setAlpha(anim, () -> {
                blur.render(ShapeProperties.create(matrix, x, y, 24, 24).round(12).softness(1).thickness(2).outlineColor(ColorUtil.getOutline()).color(ColorUtil.getRect(0.6F)).build());
                arc.render(ShapeProperties.create(matrix, x, y, 24, 24).round(1F).thickness(0.2f).end(progress).color(ColorUtil.fade(0), ColorUtil.fade(200), ColorUtil.fade(0), ColorUtil.fade(200)).build());
                Render2DUtil.defaultDrawStack(context, lastItem.getDefaultStack(), x + 3, y + 3, false, false, 1);
            });
            scissorManager.pop();
        }
    }

    private void drawFace(DrawContext context) {
        EntityRenderer<? super LivingEntity, ?> baseRenderer = mc.getEntityRenderDispatcher().getRenderer(lastTarget);
        if (!(baseRenderer instanceof LivingEntityRenderer<?, ?, ?>)) return;

        LivingEntityRenderer<LivingEntity, LivingEntityRenderState, ?> renderer = (LivingEntityRenderer<LivingEntity, LivingEntityRenderState, ?>) baseRenderer;
        LivingEntityRenderState state = renderer.getAndUpdateRenderState(lastTarget, tickCounter.getTickDelta(false));
        Identifier texture = renderer.getTexture(state);

        float faceX = getX() + 5, faceY = getY() + 5.5F;
        blur.render(ShapeProperties.create(context.getMatrices(), getX() + 4.5F, getY() + 5F, 26, 26).round(7).thickness(0.5F).outlineColor(ColorUtil.getOutline()).color(ColorUtil.getRect(0.0F)).build());
        Render2DUtil.drawTexture(context, texture, faceX, faceY, 25, 3, 8, 8, 64, ColorUtil.getRect(1), ColorUtil.multRed(-1, 1 + lastTarget.hurtTime / 4F));
    }

    private static class HealingText {
        private final Animation animation;
        public final String text;

        public HealingText(String text) {
            this.text = text;
            this.animation = new DecelerateAnimation().setMs(600).setValue(1.0F);
            this.animation.setDirection(Direction.FORWARDS);
        }

        public float getAnimationValue() {
            return animation == null ? 0 : animation.getOutput().floatValue();
        }

        public boolean isFinished() {
            return animation == null || animation.isFinished(Direction.FORWARDS);
        }
    }
}
1774081960332.png
 
Последнее редактирование:
SS - прикрепил

DW - код
TargetHUD:
Expand Collapse Copy
package dev.silent.implement.features.draggables;

import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.render.entity.EntityRenderer;
import net.minecraft.client.render.entity.LivingEntityRenderer;
import net.minecraft.client.render.entity.state.LivingEntityRenderState;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.entity.LivingEntity;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.MathHelper;
import dev.silent.api.feature.draggable.AbstractDraggable;
import dev.silent.api.system.animation.Animation;
import dev.silent.api.system.animation.Direction;
import dev.silent.api.system.animation.implement.DecelerateAnimation;
import dev.silent.api.system.font.FontRenderer;
import dev.silent.api.system.font.Fonts;
import dev.silent.api.system.shape.ShapeProperties;
import dev.silent.common.util.color.ColorUtil;
import dev.silent.common.util.item.ItemUtil;
import dev.silent.common.util.math.MathUtil;
import dev.silent.common.util.other.StopWatch;
import dev.silent.common.util.entity.PlayerIntersectionUtil;
import dev.silent.common.util.render.Render2DUtil;
import dev.silent.common.util.render.ScissorManager;
import dev.silent.core.Main;
import dev.silent.implement.features.modules.combat.Aura;

import java.awt.Color;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.stream.StreamSupport;

public class TargetHud extends AbstractDraggable {

    private final Animation animation = new DecelerateAnimation().setMs(200).setValue(1);
    private final StopWatch stopWatch = new StopWatch();
    private LivingEntity lastTarget;
    private Item lastItem = Items.AIR;
    private float health;
    private float absorptionWidthSmooth;

    private float lastTotalHp = 0.0F;
    private final List<HealingText> healingTexts = new ArrayList<>();

    public TargetHud() {
        super("Target Hud", 10, 40, 100, 36, true);
    }

    @Override
    public boolean visible() {
        return scaleAnimation.isDirection(Direction.FORWARDS);
    }

    @Override
    public void tick() {
        LivingEntity auraTarget = Aura.getInstance().getTarget();

        if (auraTarget != null) {
            lastTarget = auraTarget;
            startAnimation();
        } else if (PlayerIntersectionUtil.isChat(mc.currentScreen)) {
            lastTarget = mc.player;
            startAnimation();
        } else if (stopWatch.finished(500)) {
            stopAnimation();
        }

        if (lastTarget != null) {
            float currentTotalHp = PlayerIntersectionUtil.getHealth(lastTarget);

            if (currentTotalHp > lastTotalHp && lastTotalHp != 0.0F) {
                float healedAmount = currentTotalHp - lastTotalHp;
                if (healedAmount > 0.01F) {
                    String healString = "+" + PlayerIntersectionUtil.getHealthString(healedAmount);
                    healingTexts.add(new HealingText(healString));
                }
            }
            lastTotalHp = currentTotalHp;
        } else {
            lastTotalHp = 0.0F;
        }
    }

    @Override
    public void drawDraggable(DrawContext context) {
        if (lastTarget != null) {
            MatrixStack matrix = context.getMatrices();
            drawUsingItem(context, matrix);
            drawMain(context, matrix);
            drawFace(context);
            drawArmor(context, matrix);
        }
    }

    private void drawMain(DrawContext context, MatrixStack matrix) {
        FontRenderer font = Fonts.getSize(16);
        FontRenderer smallFont = Fonts.getSize(14);

        float totalHp = PlayerIntersectionUtil.getHealth(lastTarget);
        float baseHp = lastTarget.getHealth();
        float absorptionHp = lastTarget.getAbsorptionAmount();
        float maxBaseHp = lastTarget.getMaxHealth();
        float widthHp = 58;

        float barY = getY() + 31F;
        float absorptionBarY = barY - 1F;
        float textY = getY() + 23;
        float nameY = getY() + 7;
        float contentX = getX() + 34;
        float alignedX = contentX + 2;
        float verticalDividerX = getX() + 32;
        float verticalDividerY = getY() + 2;
        float verticalDividerHeight = getHeight() - 3f;

        blur.render(ShapeProperties.create(matrix, getX(), getY(), getWidth(), getHeight()).round(7).softness(1)
                .thickness(2).outlineColor(ColorUtil.getOutline()).color(ColorUtil.getRect(0.6F)).build());

        rectangle.render(ShapeProperties.create(matrix, verticalDividerX, verticalDividerY, 0.7F, verticalDividerHeight)
                .color(ColorUtil.getOutline()).build());
        rectangle.render(ShapeProperties.create(matrix, contentX, getY() + 17F, widthHp, 0.7F)
                .color(ColorUtil.getOutline()).build());

        String mainHpText = PlayerIntersectionUtil.getHealthString(totalHp) + " хп";
        String absText = absorptionHp > 0 ? " + " + PlayerIntersectionUtil.getHealthString(absorptionHp) + " хп" : "";
        int targetColor = baseHp >= 10 ? ColorUtil.getColor(85, 255, 85) : ColorUtil.getColor(255, 85, 85);

        smallFont.drawGradientString(matrix, mainHpText, alignedX, textY, Color.WHITE.getRGB(), targetColor);

        if (!absText.isEmpty()) {
            float absX = alignedX + smallFont.getStringWidth(mainHpText);
            smallFont.drawString(matrix, absText, absX, textY, ColorUtil.getColor(255, 255, 0));
        }

        health = MathHelper.clamp(MathUtil.interpolateSmooth(1, health, Math.round(baseHp / maxBaseHp * widthHp)), 2, widthHp);

        String name = lastTarget.getName().getString();
        if (font.getStringWidth(name) > 60) {
            ScissorManager scissorManager = Main.getInstance().getScissorManager();
            scissorManager.push(matrix.peek().getPositionMatrix(), getX(), getY(), getWidth() - 2, getHeight());
            font.drawGradientString(matrix, name, alignedX, nameY, ColorUtil.getText(), ColorUtil.getText(0.6F));
            scissorManager.pop();
        } else font.drawString(matrix, name, alignedX, nameY, ColorUtil.getText());

        if (absorptionHp > 0 || absorptionWidthSmooth > 0.5) {
            float targetAbsWidth = MathHelper.clamp((absorptionHp / maxBaseHp) * widthHp, 0, widthHp);
            absorptionWidthSmooth = MathUtil.interpolateSmooth(0.1, absorptionWidthSmooth, targetAbsWidth);
            rectangle.render(ShapeProperties.create(matrix, contentX, absorptionBarY, absorptionWidthSmooth, 2F)
                    .round(0.75F).color(ColorUtil.getColor(255, 255, 0)).build());
        }

        rectangle.render(ShapeProperties.create(matrix, contentX, barY, widthHp, 2f).round(0.75F).color(0xFF060712).build());
        rectangle.render(ShapeProperties.create(matrix, contentX, barY, health, 2F).softness(4).round(1).color(ColorUtil.roundClientColor(0.6F)).build());
        rectangle.render(ShapeProperties.create(matrix, contentX, barY, health, 2F).round(0.75F).color(ColorUtil.roundClientColor(1)).build());

        float currentX = alignedX + smallFont.getStringWidth(mainHpText + absText) + 2;
        Iterator<HealingText> iterator = healingTexts.iterator();
        while (iterator.hasNext()) {
            HealingText text = iterator.next();
            if (text.isFinished()) {
                iterator.remove();
                continue;
            }
            float progress = text.getAnimationValue();
            float yOffset = 6 * progress;
            int alpha = (int) (255 * (1.0F - progress));
            int color = ColorUtil.getColor(85, 255, 85, Math.max(0, alpha));
            smallFont.drawString(matrix, text.text, currentX, textY - yOffset, color);
            currentX += smallFont.getStringWidth(text.text) + 2;
        }
    }

    private void drawArmor(DrawContext context, MatrixStack matrix) {
        List<ItemStack> items = StreamSupport.stream(lastTarget.getEquippedItems().spliterator(), false).filter(s -> !s.isEmpty()).toList();
        if (!items.isEmpty()) {
            float x = getX() + getWidth() / 2F - items.size() * 5.5F;
            float y = getY() + getHeight() - 1;
            float itemX = -10.5F;
            matrix.push();
            matrix.translate(x, y, -200);
            blur.render(ShapeProperties.create(matrix, 0, 0, items.size() * 11, 11).round(3F).softness(1).thickness(2).outlineColor(ColorUtil.getOutline()).color(ColorUtil.getRect(0.6F)).build());
            for (ItemStack stack : items) Render2DUtil.defaultDrawStack(context, stack, itemX += 11, 0.5F, false, true, 0.5F);
            matrix.pop();
        }
    }

    private void drawUsingItem(DrawContext context, MatrixStack matrix) {
        animation.setDirection(lastTarget.isUsingItem() ? Direction.FORWARDS : Direction.BACKWARDS);
        if (!lastTarget.getActiveItem().isEmpty()) lastItem = lastTarget.getActiveItem().getItem();

        if (!animation.isFinished(Direction.BACKWARDS) && !lastItem.equals(Items.AIR)) {
            float anim = animation.getOutput().floatValue();
            float progress = (lastTarget.getItemUseTime() + tickCounter.getTickDelta(false)) / ItemUtil.maxUseTick(lastItem) * 360;
            float x = getX() - (29) * anim;
            float y = getY() + 6;

            ScissorManager scissorManager = Main.getInstance().getScissorManager();
            scissorManager.push(matrix.peek().getPositionMatrix(), getX() - 50, getY(), 50, getHeight());
            MathUtil.setAlpha(anim, () -> {
                blur.render(ShapeProperties.create(matrix, x, y, 24, 24).round(12).softness(1).thickness(2).outlineColor(ColorUtil.getOutline()).color(ColorUtil.getRect(0.6F)).build());
                arc.render(ShapeProperties.create(matrix, x, y, 24, 24).round(1F).thickness(0.2f).end(progress).color(ColorUtil.fade(0), ColorUtil.fade(200), ColorUtil.fade(0), ColorUtil.fade(200)).build());
                Render2DUtil.defaultDrawStack(context, lastItem.getDefaultStack(), x + 3, y + 3, false, false, 1);
            });
            scissorManager.pop();
        }
    }

    private void drawFace(DrawContext context) {
        EntityRenderer<? super LivingEntity, ?> baseRenderer = mc.getEntityRenderDispatcher().getRenderer(lastTarget);
        if (!(baseRenderer instanceof LivingEntityRenderer<?, ?, ?>)) return;

        LivingEntityRenderer<LivingEntity, LivingEntityRenderState, ?> renderer = (LivingEntityRenderer<LivingEntity, LivingEntityRenderState, ?>) baseRenderer;
        LivingEntityRenderState state = renderer.getAndUpdateRenderState(lastTarget, tickCounter.getTickDelta(false));
        Identifier texture = renderer.getTexture(state);

        float faceX = getX() + 5, faceY = getY() + 5.5F;
        blur.render(ShapeProperties.create(context.getMatrices(), getX() + 4.5F, getY() + 5F, 26, 26).round(7).thickness(0.5F).outlineColor(ColorUtil.getOutline()).color(ColorUtil.getRect(0.0F)).build());
        Render2DUtil.drawTexture(context, texture, faceX, faceY, 25, 3, 8, 8, 64, ColorUtil.getRect(1), ColorUtil.multRed(-1, 1 + lastTarget.hurtTime / 4F));
    }

    private static class HealingText {
        private final Animation animation;
        public final String text;

        public HealingText(String text) {
            this.text = text;
            this.animation = new DecelerateAnimation().setMs(600).setValue(1.0F);
            this.animation.setDirection(Direction.FORWARDS);
        }

        public float getAnimationValue() {
            return animation == null ? 0 : animation.getOutput().floatValue();
        }

        public boolean isFinished() {
            return animation == null || animation.isFinished(Direction.FORWARDS);
        }
    }
}
Посмотреть вложение 330965
неа не красивый
 
Моя первая работа с таргет худом, если не красиво, сорян, /del принимаются

SS - прикрепил

DW - код
TargetHUD:
Expand Collapse Copy
package dev.silent.implement.features.draggables;

import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.render.entity.EntityRenderer;
import net.minecraft.client.render.entity.LivingEntityRenderer;
import net.minecraft.client.render.entity.state.LivingEntityRenderState;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.entity.LivingEntity;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.MathHelper;
import dev.silent.api.feature.draggable.AbstractDraggable;
import dev.silent.api.system.animation.Animation;
import dev.silent.api.system.animation.Direction;
import dev.silent.api.system.animation.implement.DecelerateAnimation;
import dev.silent.api.system.font.FontRenderer;
import dev.silent.api.system.font.Fonts;
import dev.silent.api.system.shape.ShapeProperties;
import dev.silent.common.util.color.ColorUtil;
import dev.silent.common.util.item.ItemUtil;
import dev.silent.common.util.math.MathUtil;
import dev.silent.common.util.other.StopWatch;
import dev.silent.common.util.entity.PlayerIntersectionUtil;
import dev.silent.common.util.render.Render2DUtil;
import dev.silent.common.util.render.ScissorManager;
import dev.silent.core.Main;
import dev.silent.implement.features.modules.combat.Aura;

import java.awt.Color;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.stream.StreamSupport;

public class TargetHud extends AbstractDraggable {

    private final Animation animation = new DecelerateAnimation().setMs(200).setValue(1);
    private final StopWatch stopWatch = new StopWatch();
    private LivingEntity lastTarget;
    private Item lastItem = Items.AIR;
    private float health;
    private float absorptionWidthSmooth;

    private float lastTotalHp = 0.0F;
    private final List<HealingText> healingTexts = new ArrayList<>();

    public TargetHud() {
        super("Target Hud", 10, 40, 100, 36, true);
    }

    @Override
    public boolean visible() {
        return scaleAnimation.isDirection(Direction.FORWARDS);
    }

    @Override
    public void tick() {
        LivingEntity auraTarget = Aura.getInstance().getTarget();

        if (auraTarget != null) {
            lastTarget = auraTarget;
            startAnimation();
        } else if (PlayerIntersectionUtil.isChat(mc.currentScreen)) {
            lastTarget = mc.player;
            startAnimation();
        } else if (stopWatch.finished(500)) {
            stopAnimation();
        }

        if (lastTarget != null) {
            float currentTotalHp = PlayerIntersectionUtil.getHealth(lastTarget);

            if (currentTotalHp > lastTotalHp && lastTotalHp != 0.0F) {
                float healedAmount = currentTotalHp - lastTotalHp;
                if (healedAmount > 0.01F) {
                    String healString = "+" + PlayerIntersectionUtil.getHealthString(healedAmount);
                    healingTexts.add(new HealingText(healString));
                }
            }
            lastTotalHp = currentTotalHp;
        } else {
            lastTotalHp = 0.0F;
        }
    }

    @Override
    public void drawDraggable(DrawContext context) {
        if (lastTarget != null) {
            MatrixStack matrix = context.getMatrices();
            drawUsingItem(context, matrix);
            drawMain(context, matrix);
            drawFace(context);
            drawArmor(context, matrix);
        }
    }

    private void drawMain(DrawContext context, MatrixStack matrix) {
        FontRenderer font = Fonts.getSize(16);
        FontRenderer smallFont = Fonts.getSize(14);

        float totalHp = PlayerIntersectionUtil.getHealth(lastTarget);
        float baseHp = lastTarget.getHealth();
        float absorptionHp = lastTarget.getAbsorptionAmount();
        float maxBaseHp = lastTarget.getMaxHealth();
        float widthHp = 58;

        float barY = getY() + 31F;
        float absorptionBarY = barY - 1F;
        float textY = getY() + 23;
        float nameY = getY() + 7;
        float contentX = getX() + 34;
        float alignedX = contentX + 2;
        float verticalDividerX = getX() + 32;
        float verticalDividerY = getY() + 2;
        float verticalDividerHeight = getHeight() - 3f;

        blur.render(ShapeProperties.create(matrix, getX(), getY(), getWidth(), getHeight()).round(7).softness(1)
                .thickness(2).outlineColor(ColorUtil.getOutline()).color(ColorUtil.getRect(0.6F)).build());

        rectangle.render(ShapeProperties.create(matrix, verticalDividerX, verticalDividerY, 0.7F, verticalDividerHeight)
                .color(ColorUtil.getOutline()).build());
        rectangle.render(ShapeProperties.create(matrix, contentX, getY() + 17F, widthHp, 0.7F)
                .color(ColorUtil.getOutline()).build());

        String mainHpText = PlayerIntersectionUtil.getHealthString(totalHp) + " хп";
        String absText = absorptionHp > 0 ? " + " + PlayerIntersectionUtil.getHealthString(absorptionHp) + " хп" : "";
        int targetColor = baseHp >= 10 ? ColorUtil.getColor(85, 255, 85) : ColorUtil.getColor(255, 85, 85);

        smallFont.drawGradientString(matrix, mainHpText, alignedX, textY, Color.WHITE.getRGB(), targetColor);

        if (!absText.isEmpty()) {
            float absX = alignedX + smallFont.getStringWidth(mainHpText);
            smallFont.drawString(matrix, absText, absX, textY, ColorUtil.getColor(255, 255, 0));
        }

        health = MathHelper.clamp(MathUtil.interpolateSmooth(1, health, Math.round(baseHp / maxBaseHp * widthHp)), 2, widthHp);

        String name = lastTarget.getName().getString();
        if (font.getStringWidth(name) > 60) {
            ScissorManager scissorManager = Main.getInstance().getScissorManager();
            scissorManager.push(matrix.peek().getPositionMatrix(), getX(), getY(), getWidth() - 2, getHeight());
            font.drawGradientString(matrix, name, alignedX, nameY, ColorUtil.getText(), ColorUtil.getText(0.6F));
            scissorManager.pop();
        } else font.drawString(matrix, name, alignedX, nameY, ColorUtil.getText());

        if (absorptionHp > 0 || absorptionWidthSmooth > 0.5) {
            float targetAbsWidth = MathHelper.clamp((absorptionHp / maxBaseHp) * widthHp, 0, widthHp);
            absorptionWidthSmooth = MathUtil.interpolateSmooth(0.1, absorptionWidthSmooth, targetAbsWidth);
            rectangle.render(ShapeProperties.create(matrix, contentX, absorptionBarY, absorptionWidthSmooth, 2F)
                    .round(0.75F).color(ColorUtil.getColor(255, 255, 0)).build());
        }

        rectangle.render(ShapeProperties.create(matrix, contentX, barY, widthHp, 2f).round(0.75F).color(0xFF060712).build());
        rectangle.render(ShapeProperties.create(matrix, contentX, barY, health, 2F).softness(4).round(1).color(ColorUtil.roundClientColor(0.6F)).build());
        rectangle.render(ShapeProperties.create(matrix, contentX, barY, health, 2F).round(0.75F).color(ColorUtil.roundClientColor(1)).build());

        float currentX = alignedX + smallFont.getStringWidth(mainHpText + absText) + 2;
        Iterator<HealingText> iterator = healingTexts.iterator();
        while (iterator.hasNext()) {
            HealingText text = iterator.next();
            if (text.isFinished()) {
                iterator.remove();
                continue;
            }
            float progress = text.getAnimationValue();
            float yOffset = 6 * progress;
            int alpha = (int) (255 * (1.0F - progress));
            int color = ColorUtil.getColor(85, 255, 85, Math.max(0, alpha));
            smallFont.drawString(matrix, text.text, currentX, textY - yOffset, color);
            currentX += smallFont.getStringWidth(text.text) + 2;
        }
    }

    private void drawArmor(DrawContext context, MatrixStack matrix) {
        List<ItemStack> items = StreamSupport.stream(lastTarget.getEquippedItems().spliterator(), false).filter(s -> !s.isEmpty()).toList();
        if (!items.isEmpty()) {
            float x = getX() + getWidth() / 2F - items.size() * 5.5F;
            float y = getY() + getHeight() - 1;
            float itemX = -10.5F;
            matrix.push();
            matrix.translate(x, y, -200);
            blur.render(ShapeProperties.create(matrix, 0, 0, items.size() * 11, 11).round(3F).softness(1).thickness(2).outlineColor(ColorUtil.getOutline()).color(ColorUtil.getRect(0.6F)).build());
            for (ItemStack stack : items) Render2DUtil.defaultDrawStack(context, stack, itemX += 11, 0.5F, false, true, 0.5F);
            matrix.pop();
        }
    }

    private void drawUsingItem(DrawContext context, MatrixStack matrix) {
        animation.setDirection(lastTarget.isUsingItem() ? Direction.FORWARDS : Direction.BACKWARDS);
        if (!lastTarget.getActiveItem().isEmpty()) lastItem = lastTarget.getActiveItem().getItem();

        if (!animation.isFinished(Direction.BACKWARDS) && !lastItem.equals(Items.AIR)) {
            float anim = animation.getOutput().floatValue();
            float progress = (lastTarget.getItemUseTime() + tickCounter.getTickDelta(false)) / ItemUtil.maxUseTick(lastItem) * 360;
            float x = getX() - (29) * anim;
            float y = getY() + 6;

            ScissorManager scissorManager = Main.getInstance().getScissorManager();
            scissorManager.push(matrix.peek().getPositionMatrix(), getX() - 50, getY(), 50, getHeight());
            MathUtil.setAlpha(anim, () -> {
                blur.render(ShapeProperties.create(matrix, x, y, 24, 24).round(12).softness(1).thickness(2).outlineColor(ColorUtil.getOutline()).color(ColorUtil.getRect(0.6F)).build());
                arc.render(ShapeProperties.create(matrix, x, y, 24, 24).round(1F).thickness(0.2f).end(progress).color(ColorUtil.fade(0), ColorUtil.fade(200), ColorUtil.fade(0), ColorUtil.fade(200)).build());
                Render2DUtil.defaultDrawStack(context, lastItem.getDefaultStack(), x + 3, y + 3, false, false, 1);
            });
            scissorManager.pop();
        }
    }

    private void drawFace(DrawContext context) {
        EntityRenderer<? super LivingEntity, ?> baseRenderer = mc.getEntityRenderDispatcher().getRenderer(lastTarget);
        if (!(baseRenderer instanceof LivingEntityRenderer<?, ?, ?>)) return;

        LivingEntityRenderer<LivingEntity, LivingEntityRenderState, ?> renderer = (LivingEntityRenderer<LivingEntity, LivingEntityRenderState, ?>) baseRenderer;
        LivingEntityRenderState state = renderer.getAndUpdateRenderState(lastTarget, tickCounter.getTickDelta(false));
        Identifier texture = renderer.getTexture(state);

        float faceX = getX() + 5, faceY = getY() + 5.5F;
        blur.render(ShapeProperties.create(context.getMatrices(), getX() + 4.5F, getY() + 5F, 26, 26).round(7).thickness(0.5F).outlineColor(ColorUtil.getOutline()).color(ColorUtil.getRect(0.0F)).build());
        Render2DUtil.drawTexture(context, texture, faceX, faceY, 25, 3, 8, 8, 64, ColorUtil.getRect(1), ColorUtil.multRed(-1, 1 + lastTarget.hurtTime / 4F));
    }

    private static class HealingText {
        private final Animation animation;
        public final String text;

        public HealingText(String text) {
            this.text = text;
            this.animation = new DecelerateAnimation().setMs(600).setValue(1.0F);
            this.animation.setDirection(Direction.FORWARDS);
        }

        public float getAnimationValue() {
            return animation == null ? 0 : animation.getOutput().floatValue();
        }

        public boolean isFinished() {
            return animation == null || animation.isFinished(Direction.FORWARDS);
        }
    }
}
Посмотреть вложение 330965


XD даун просто взял перезалил от другого типа /del
 
Моя первая работа с таргет худом, если не красиво, сорян, /del принимаются

SS - прикрепил

DW - код
TargetHUD:
Expand Collapse Copy
package dev.silent.implement.features.draggables;

import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.render.entity.EntityRenderer;
import net.minecraft.client.render.entity.LivingEntityRenderer;
import net.minecraft.client.render.entity.state.LivingEntityRenderState;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.entity.LivingEntity;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.MathHelper;
import dev.silent.api.feature.draggable.AbstractDraggable;
import dev.silent.api.system.animation.Animation;
import dev.silent.api.system.animation.Direction;
import dev.silent.api.system.animation.implement.DecelerateAnimation;
import dev.silent.api.system.font.FontRenderer;
import dev.silent.api.system.font.Fonts;
import dev.silent.api.system.shape.ShapeProperties;
import dev.silent.common.util.color.ColorUtil;
import dev.silent.common.util.item.ItemUtil;
import dev.silent.common.util.math.MathUtil;
import dev.silent.common.util.other.StopWatch;
import dev.silent.common.util.entity.PlayerIntersectionUtil;
import dev.silent.common.util.render.Render2DUtil;
import dev.silent.common.util.render.ScissorManager;
import dev.silent.core.Main;
import dev.silent.implement.features.modules.combat.Aura;

import java.awt.Color;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.stream.StreamSupport;

public class TargetHud extends AbstractDraggable {

    private final Animation animation = new DecelerateAnimation().setMs(200).setValue(1);
    private final StopWatch stopWatch = new StopWatch();
    private LivingEntity lastTarget;
    private Item lastItem = Items.AIR;
    private float health;
    private float absorptionWidthSmooth;

    private float lastTotalHp = 0.0F;
    private final List<HealingText> healingTexts = new ArrayList<>();

    public TargetHud() {
        super("Target Hud", 10, 40, 100, 36, true);
    }

    @Override
    public boolean visible() {
        return scaleAnimation.isDirection(Direction.FORWARDS);
    }

    @Override
    public void tick() {
        LivingEntity auraTarget = Aura.getInstance().getTarget();

        if (auraTarget != null) {
            lastTarget = auraTarget;
            startAnimation();
        } else if (PlayerIntersectionUtil.isChat(mc.currentScreen)) {
            lastTarget = mc.player;
            startAnimation();
        } else if (stopWatch.finished(500)) {
            stopAnimation();
        }

        if (lastTarget != null) {
            float currentTotalHp = PlayerIntersectionUtil.getHealth(lastTarget);

            if (currentTotalHp > lastTotalHp && lastTotalHp != 0.0F) {
                float healedAmount = currentTotalHp - lastTotalHp;
                if (healedAmount > 0.01F) {
                    String healString = "+" + PlayerIntersectionUtil.getHealthString(healedAmount);
                    healingTexts.add(new HealingText(healString));
                }
            }
            lastTotalHp = currentTotalHp;
        } else {
            lastTotalHp = 0.0F;
        }
    }

    @Override
    public void drawDraggable(DrawContext context) {
        if (lastTarget != null) {
            MatrixStack matrix = context.getMatrices();
            drawUsingItem(context, matrix);
            drawMain(context, matrix);
            drawFace(context);
            drawArmor(context, matrix);
        }
    }

    private void drawMain(DrawContext context, MatrixStack matrix) {
        FontRenderer font = Fonts.getSize(16);
        FontRenderer smallFont = Fonts.getSize(14);

        float totalHp = PlayerIntersectionUtil.getHealth(lastTarget);
        float baseHp = lastTarget.getHealth();
        float absorptionHp = lastTarget.getAbsorptionAmount();
        float maxBaseHp = lastTarget.getMaxHealth();
        float widthHp = 58;

        float barY = getY() + 31F;
        float absorptionBarY = barY - 1F;
        float textY = getY() + 23;
        float nameY = getY() + 7;
        float contentX = getX() + 34;
        float alignedX = contentX + 2;
        float verticalDividerX = getX() + 32;
        float verticalDividerY = getY() + 2;
        float verticalDividerHeight = getHeight() - 3f;

        blur.render(ShapeProperties.create(matrix, getX(), getY(), getWidth(), getHeight()).round(7).softness(1)
                .thickness(2).outlineColor(ColorUtil.getOutline()).color(ColorUtil.getRect(0.6F)).build());

        rectangle.render(ShapeProperties.create(matrix, verticalDividerX, verticalDividerY, 0.7F, verticalDividerHeight)
                .color(ColorUtil.getOutline()).build());
        rectangle.render(ShapeProperties.create(matrix, contentX, getY() + 17F, widthHp, 0.7F)
                .color(ColorUtil.getOutline()).build());

        String mainHpText = PlayerIntersectionUtil.getHealthString(totalHp) + " хп";
        String absText = absorptionHp > 0 ? " + " + PlayerIntersectionUtil.getHealthString(absorptionHp) + " хп" : "";
        int targetColor = baseHp >= 10 ? ColorUtil.getColor(85, 255, 85) : ColorUtil.getColor(255, 85, 85);

        smallFont.drawGradientString(matrix, mainHpText, alignedX, textY, Color.WHITE.getRGB(), targetColor);

        if (!absText.isEmpty()) {
            float absX = alignedX + smallFont.getStringWidth(mainHpText);
            smallFont.drawString(matrix, absText, absX, textY, ColorUtil.getColor(255, 255, 0));
        }

        health = MathHelper.clamp(MathUtil.interpolateSmooth(1, health, Math.round(baseHp / maxBaseHp * widthHp)), 2, widthHp);

        String name = lastTarget.getName().getString();
        if (font.getStringWidth(name) > 60) {
            ScissorManager scissorManager = Main.getInstance().getScissorManager();
            scissorManager.push(matrix.peek().getPositionMatrix(), getX(), getY(), getWidth() - 2, getHeight());
            font.drawGradientString(matrix, name, alignedX, nameY, ColorUtil.getText(), ColorUtil.getText(0.6F));
            scissorManager.pop();
        } else font.drawString(matrix, name, alignedX, nameY, ColorUtil.getText());

        if (absorptionHp > 0 || absorptionWidthSmooth > 0.5) {
            float targetAbsWidth = MathHelper.clamp((absorptionHp / maxBaseHp) * widthHp, 0, widthHp);
            absorptionWidthSmooth = MathUtil.interpolateSmooth(0.1, absorptionWidthSmooth, targetAbsWidth);
            rectangle.render(ShapeProperties.create(matrix, contentX, absorptionBarY, absorptionWidthSmooth, 2F)
                    .round(0.75F).color(ColorUtil.getColor(255, 255, 0)).build());
        }

        rectangle.render(ShapeProperties.create(matrix, contentX, barY, widthHp, 2f).round(0.75F).color(0xFF060712).build());
        rectangle.render(ShapeProperties.create(matrix, contentX, barY, health, 2F).softness(4).round(1).color(ColorUtil.roundClientColor(0.6F)).build());
        rectangle.render(ShapeProperties.create(matrix, contentX, barY, health, 2F).round(0.75F).color(ColorUtil.roundClientColor(1)).build());

        float currentX = alignedX + smallFont.getStringWidth(mainHpText + absText) + 2;
        Iterator<HealingText> iterator = healingTexts.iterator();
        while (iterator.hasNext()) {
            HealingText text = iterator.next();
            if (text.isFinished()) {
                iterator.remove();
                continue;
            }
            float progress = text.getAnimationValue();
            float yOffset = 6 * progress;
            int alpha = (int) (255 * (1.0F - progress));
            int color = ColorUtil.getColor(85, 255, 85, Math.max(0, alpha));
            smallFont.drawString(matrix, text.text, currentX, textY - yOffset, color);
            currentX += smallFont.getStringWidth(text.text) + 2;
        }
    }

    private void drawArmor(DrawContext context, MatrixStack matrix) {
        List<ItemStack> items = StreamSupport.stream(lastTarget.getEquippedItems().spliterator(), false).filter(s -> !s.isEmpty()).toList();
        if (!items.isEmpty()) {
            float x = getX() + getWidth() / 2F - items.size() * 5.5F;
            float y = getY() + getHeight() - 1;
            float itemX = -10.5F;
            matrix.push();
            matrix.translate(x, y, -200);
            blur.render(ShapeProperties.create(matrix, 0, 0, items.size() * 11, 11).round(3F).softness(1).thickness(2).outlineColor(ColorUtil.getOutline()).color(ColorUtil.getRect(0.6F)).build());
            for (ItemStack stack : items) Render2DUtil.defaultDrawStack(context, stack, itemX += 11, 0.5F, false, true, 0.5F);
            matrix.pop();
        }
    }

    private void drawUsingItem(DrawContext context, MatrixStack matrix) {
        animation.setDirection(lastTarget.isUsingItem() ? Direction.FORWARDS : Direction.BACKWARDS);
        if (!lastTarget.getActiveItem().isEmpty()) lastItem = lastTarget.getActiveItem().getItem();

        if (!animation.isFinished(Direction.BACKWARDS) && !lastItem.equals(Items.AIR)) {
            float anim = animation.getOutput().floatValue();
            float progress = (lastTarget.getItemUseTime() + tickCounter.getTickDelta(false)) / ItemUtil.maxUseTick(lastItem) * 360;
            float x = getX() - (29) * anim;
            float y = getY() + 6;

            ScissorManager scissorManager = Main.getInstance().getScissorManager();
            scissorManager.push(matrix.peek().getPositionMatrix(), getX() - 50, getY(), 50, getHeight());
            MathUtil.setAlpha(anim, () -> {
                blur.render(ShapeProperties.create(matrix, x, y, 24, 24).round(12).softness(1).thickness(2).outlineColor(ColorUtil.getOutline()).color(ColorUtil.getRect(0.6F)).build());
                arc.render(ShapeProperties.create(matrix, x, y, 24, 24).round(1F).thickness(0.2f).end(progress).color(ColorUtil.fade(0), ColorUtil.fade(200), ColorUtil.fade(0), ColorUtil.fade(200)).build());
                Render2DUtil.defaultDrawStack(context, lastItem.getDefaultStack(), x + 3, y + 3, false, false, 1);
            });
            scissorManager.pop();
        }
    }

    private void drawFace(DrawContext context) {
        EntityRenderer<? super LivingEntity, ?> baseRenderer = mc.getEntityRenderDispatcher().getRenderer(lastTarget);
        if (!(baseRenderer instanceof LivingEntityRenderer<?, ?, ?>)) return;

        LivingEntityRenderer<LivingEntity, LivingEntityRenderState, ?> renderer = (LivingEntityRenderer<LivingEntity, LivingEntityRenderState, ?>) baseRenderer;
        LivingEntityRenderState state = renderer.getAndUpdateRenderState(lastTarget, tickCounter.getTickDelta(false));
        Identifier texture = renderer.getTexture(state);

        float faceX = getX() + 5, faceY = getY() + 5.5F;
        blur.render(ShapeProperties.create(context.getMatrices(), getX() + 4.5F, getY() + 5F, 26, 26).round(7).thickness(0.5F).outlineColor(ColorUtil.getOutline()).color(ColorUtil.getRect(0.0F)).build());
        Render2DUtil.drawTexture(context, texture, faceX, faceY, 25, 3, 8, 8, 64, ColorUtil.getRect(1), ColorUtil.multRed(-1, 1 + lastTarget.hurtTime / 4F));
    }

    private static class HealingText {
        private final Animation animation;
        public final String text;

        public HealingText(String text) {
            this.text = text;
            this.animation = new DecelerateAnimation().setMs(600).setValue(1.0F);
            this.animation.setDirection(Direction.FORWARDS);
        }

        public float getAnimationValue() {
            return animation == null ? 0 : animation.getOutput().floatValue();
        }

        public boolean isFinished() {
            return animation == null || animation.isFinished(Direction.FORWARDS);
        }
    }
}
Посмотреть вложение 330965
не ты реально прикол тянешь или че братан ты мало того своего калище клиент делаешь кривую залупу так еще и чужие темы решил под видом своих перезаливать?
 
не ты реально прикол тянешь или че братан ты мало того своего калище клиент делаешь кривую залупу так еще и чужие темы решил под видом своих перезаливать?
я не знаю нахуя он репутацию свою же проебывает
 
Моя первая работа с таргет худом, если не красиво, сорян, /del принимаются

SS - прикрепил

DW - код
TargetHUD:
Expand Collapse Copy
package dev.silent.implement.features.draggables;

import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.render.entity.EntityRenderer;
import net.minecraft.client.render.entity.LivingEntityRenderer;
import net.minecraft.client.render.entity.state.LivingEntityRenderState;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.entity.LivingEntity;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.MathHelper;
import dev.silent.api.feature.draggable.AbstractDraggable;
import dev.silent.api.system.animation.Animation;
import dev.silent.api.system.animation.Direction;
import dev.silent.api.system.animation.implement.DecelerateAnimation;
import dev.silent.api.system.font.FontRenderer;
import dev.silent.api.system.font.Fonts;
import dev.silent.api.system.shape.ShapeProperties;
import dev.silent.common.util.color.ColorUtil;
import dev.silent.common.util.item.ItemUtil;
import dev.silent.common.util.math.MathUtil;
import dev.silent.common.util.other.StopWatch;
import dev.silent.common.util.entity.PlayerIntersectionUtil;
import dev.silent.common.util.render.Render2DUtil;
import dev.silent.common.util.render.ScissorManager;
import dev.silent.core.Main;
import dev.silent.implement.features.modules.combat.Aura;

import java.awt.Color;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.stream.StreamSupport;

public class TargetHud extends AbstractDraggable {

    private final Animation animation = new DecelerateAnimation().setMs(200).setValue(1);
    private final StopWatch stopWatch = new StopWatch();
    private LivingEntity lastTarget;
    private Item lastItem = Items.AIR;
    private float health;
    private float absorptionWidthSmooth;

    private float lastTotalHp = 0.0F;
    private final List<HealingText> healingTexts = new ArrayList<>();

    public TargetHud() {
        super("Target Hud", 10, 40, 100, 36, true);
    }

    @Override
    public boolean visible() {
        return scaleAnimation.isDirection(Direction.FORWARDS);
    }

    @Override
    public void tick() {
        LivingEntity auraTarget = Aura.getInstance().getTarget();

        if (auraTarget != null) {
            lastTarget = auraTarget;
            startAnimation();
        } else if (PlayerIntersectionUtil.isChat(mc.currentScreen)) {
            lastTarget = mc.player;
            startAnimation();
        } else if (stopWatch.finished(500)) {
            stopAnimation();
        }

        if (lastTarget != null) {
            float currentTotalHp = PlayerIntersectionUtil.getHealth(lastTarget);

            if (currentTotalHp > lastTotalHp && lastTotalHp != 0.0F) {
                float healedAmount = currentTotalHp - lastTotalHp;
                if (healedAmount > 0.01F) {
                    String healString = "+" + PlayerIntersectionUtil.getHealthString(healedAmount);
                    healingTexts.add(new HealingText(healString));
                }
            }
            lastTotalHp = currentTotalHp;
        } else {
            lastTotalHp = 0.0F;
        }
    }

    @Override
    public void drawDraggable(DrawContext context) {
        if (lastTarget != null) {
            MatrixStack matrix = context.getMatrices();
            drawUsingItem(context, matrix);
            drawMain(context, matrix);
            drawFace(context);
            drawArmor(context, matrix);
        }
    }

    private void drawMain(DrawContext context, MatrixStack matrix) {
        FontRenderer font = Fonts.getSize(16);
        FontRenderer smallFont = Fonts.getSize(14);

        float totalHp = PlayerIntersectionUtil.getHealth(lastTarget);
        float baseHp = lastTarget.getHealth();
        float absorptionHp = lastTarget.getAbsorptionAmount();
        float maxBaseHp = lastTarget.getMaxHealth();
        float widthHp = 58;

        float barY = getY() + 31F;
        float absorptionBarY = barY - 1F;
        float textY = getY() + 23;
        float nameY = getY() + 7;
        float contentX = getX() + 34;
        float alignedX = contentX + 2;
        float verticalDividerX = getX() + 32;
        float verticalDividerY = getY() + 2;
        float verticalDividerHeight = getHeight() - 3f;

        blur.render(ShapeProperties.create(matrix, getX(), getY(), getWidth(), getHeight()).round(7).softness(1)
                .thickness(2).outlineColor(ColorUtil.getOutline()).color(ColorUtil.getRect(0.6F)).build());

        rectangle.render(ShapeProperties.create(matrix, verticalDividerX, verticalDividerY, 0.7F, verticalDividerHeight)
                .color(ColorUtil.getOutline()).build());
        rectangle.render(ShapeProperties.create(matrix, contentX, getY() + 17F, widthHp, 0.7F)
                .color(ColorUtil.getOutline()).build());

        String mainHpText = PlayerIntersectionUtil.getHealthString(totalHp) + " хп";
        String absText = absorptionHp > 0 ? " + " + PlayerIntersectionUtil.getHealthString(absorptionHp) + " хп" : "";
        int targetColor = baseHp >= 10 ? ColorUtil.getColor(85, 255, 85) : ColorUtil.getColor(255, 85, 85);

        smallFont.drawGradientString(matrix, mainHpText, alignedX, textY, Color.WHITE.getRGB(), targetColor);

        if (!absText.isEmpty()) {
            float absX = alignedX + smallFont.getStringWidth(mainHpText);
            smallFont.drawString(matrix, absText, absX, textY, ColorUtil.getColor(255, 255, 0));
        }

        health = MathHelper.clamp(MathUtil.interpolateSmooth(1, health, Math.round(baseHp / maxBaseHp * widthHp)), 2, widthHp);

        String name = lastTarget.getName().getString();
        if (font.getStringWidth(name) > 60) {
            ScissorManager scissorManager = Main.getInstance().getScissorManager();
            scissorManager.push(matrix.peek().getPositionMatrix(), getX(), getY(), getWidth() - 2, getHeight());
            font.drawGradientString(matrix, name, alignedX, nameY, ColorUtil.getText(), ColorUtil.getText(0.6F));
            scissorManager.pop();
        } else font.drawString(matrix, name, alignedX, nameY, ColorUtil.getText());

        if (absorptionHp > 0 || absorptionWidthSmooth > 0.5) {
            float targetAbsWidth = MathHelper.clamp((absorptionHp / maxBaseHp) * widthHp, 0, widthHp);
            absorptionWidthSmooth = MathUtil.interpolateSmooth(0.1, absorptionWidthSmooth, targetAbsWidth);
            rectangle.render(ShapeProperties.create(matrix, contentX, absorptionBarY, absorptionWidthSmooth, 2F)
                    .round(0.75F).color(ColorUtil.getColor(255, 255, 0)).build());
        }

        rectangle.render(ShapeProperties.create(matrix, contentX, barY, widthHp, 2f).round(0.75F).color(0xFF060712).build());
        rectangle.render(ShapeProperties.create(matrix, contentX, barY, health, 2F).softness(4).round(1).color(ColorUtil.roundClientColor(0.6F)).build());
        rectangle.render(ShapeProperties.create(matrix, contentX, barY, health, 2F).round(0.75F).color(ColorUtil.roundClientColor(1)).build());

        float currentX = alignedX + smallFont.getStringWidth(mainHpText + absText) + 2;
        Iterator<HealingText> iterator = healingTexts.iterator();
        while (iterator.hasNext()) {
            HealingText text = iterator.next();
            if (text.isFinished()) {
                iterator.remove();
                continue;
            }
            float progress = text.getAnimationValue();
            float yOffset = 6 * progress;
            int alpha = (int) (255 * (1.0F - progress));
            int color = ColorUtil.getColor(85, 255, 85, Math.max(0, alpha));
            smallFont.drawString(matrix, text.text, currentX, textY - yOffset, color);
            currentX += smallFont.getStringWidth(text.text) + 2;
        }
    }

    private void drawArmor(DrawContext context, MatrixStack matrix) {
        List<ItemStack> items = StreamSupport.stream(lastTarget.getEquippedItems().spliterator(), false).filter(s -> !s.isEmpty()).toList();
        if (!items.isEmpty()) {
            float x = getX() + getWidth() / 2F - items.size() * 5.5F;
            float y = getY() + getHeight() - 1;
            float itemX = -10.5F;
            matrix.push();
            matrix.translate(x, y, -200);
            blur.render(ShapeProperties.create(matrix, 0, 0, items.size() * 11, 11).round(3F).softness(1).thickness(2).outlineColor(ColorUtil.getOutline()).color(ColorUtil.getRect(0.6F)).build());
            for (ItemStack stack : items) Render2DUtil.defaultDrawStack(context, stack, itemX += 11, 0.5F, false, true, 0.5F);
            matrix.pop();
        }
    }

    private void drawUsingItem(DrawContext context, MatrixStack matrix) {
        animation.setDirection(lastTarget.isUsingItem() ? Direction.FORWARDS : Direction.BACKWARDS);
        if (!lastTarget.getActiveItem().isEmpty()) lastItem = lastTarget.getActiveItem().getItem();

        if (!animation.isFinished(Direction.BACKWARDS) && !lastItem.equals(Items.AIR)) {
            float anim = animation.getOutput().floatValue();
            float progress = (lastTarget.getItemUseTime() + tickCounter.getTickDelta(false)) / ItemUtil.maxUseTick(lastItem) * 360;
            float x = getX() - (29) * anim;
            float y = getY() + 6;

            ScissorManager scissorManager = Main.getInstance().getScissorManager();
            scissorManager.push(matrix.peek().getPositionMatrix(), getX() - 50, getY(), 50, getHeight());
            MathUtil.setAlpha(anim, () -> {
                blur.render(ShapeProperties.create(matrix, x, y, 24, 24).round(12).softness(1).thickness(2).outlineColor(ColorUtil.getOutline()).color(ColorUtil.getRect(0.6F)).build());
                arc.render(ShapeProperties.create(matrix, x, y, 24, 24).round(1F).thickness(0.2f).end(progress).color(ColorUtil.fade(0), ColorUtil.fade(200), ColorUtil.fade(0), ColorUtil.fade(200)).build());
                Render2DUtil.defaultDrawStack(context, lastItem.getDefaultStack(), x + 3, y + 3, false, false, 1);
            });
            scissorManager.pop();
        }
    }

    private void drawFace(DrawContext context) {
        EntityRenderer<? super LivingEntity, ?> baseRenderer = mc.getEntityRenderDispatcher().getRenderer(lastTarget);
        if (!(baseRenderer instanceof LivingEntityRenderer<?, ?, ?>)) return;

        LivingEntityRenderer<LivingEntity, LivingEntityRenderState, ?> renderer = (LivingEntityRenderer<LivingEntity, LivingEntityRenderState, ?>) baseRenderer;
        LivingEntityRenderState state = renderer.getAndUpdateRenderState(lastTarget, tickCounter.getTickDelta(false));
        Identifier texture = renderer.getTexture(state);

        float faceX = getX() + 5, faceY = getY() + 5.5F;
        blur.render(ShapeProperties.create(context.getMatrices(), getX() + 4.5F, getY() + 5F, 26, 26).round(7).thickness(0.5F).outlineColor(ColorUtil.getOutline()).color(ColorUtil.getRect(0.0F)).build());
        Render2DUtil.drawTexture(context, texture, faceX, faceY, 25, 3, 8, 8, 64, ColorUtil.getRect(1), ColorUtil.multRed(-1, 1 + lastTarget.hurtTime / 4F));
    }

    private static class HealingText {
        private final Animation animation;
        public final String text;

        public HealingText(String text) {
            this.text = text;
            this.animation = new DecelerateAnimation().setMs(600).setValue(1.0F);
            this.animation.setDirection(Direction.FORWARDS);
        }

        public float getAnimationValue() {
            return animation == null ? 0 : animation.getOutput().floatValue();
        }

        public boolean isFinished() {
            return animation == null || animation.isFinished(Direction.FORWARDS);
        }
    }
}
Посмотреть вложение 330965
Так это перезалив в чем прикол
 
Моя первая работа с таргет худом, если не красиво, сорян, /del принимаются

SS - прикрепил

DW - код
TargetHUD:
Expand Collapse Copy
package dev.silent.implement.features.draggables;

import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.render.entity.EntityRenderer;
import net.minecraft.client.render.entity.LivingEntityRenderer;
import net.minecraft.client.render.entity.state.LivingEntityRenderState;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.entity.LivingEntity;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.MathHelper;
import dev.silent.api.feature.draggable.AbstractDraggable;
import dev.silent.api.system.animation.Animation;
import dev.silent.api.system.animation.Direction;
import dev.silent.api.system.animation.implement.DecelerateAnimation;
import dev.silent.api.system.font.FontRenderer;
import dev.silent.api.system.font.Fonts;
import dev.silent.api.system.shape.ShapeProperties;
import dev.silent.common.util.color.ColorUtil;
import dev.silent.common.util.item.ItemUtil;
import dev.silent.common.util.math.MathUtil;
import dev.silent.common.util.other.StopWatch;
import dev.silent.common.util.entity.PlayerIntersectionUtil;
import dev.silent.common.util.render.Render2DUtil;
import dev.silent.common.util.render.ScissorManager;
import dev.silent.core.Main;
import dev.silent.implement.features.modules.combat.Aura;

import java.awt.Color;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.stream.StreamSupport;

public class TargetHud extends AbstractDraggable {

    private final Animation animation = new DecelerateAnimation().setMs(200).setValue(1);
    private final StopWatch stopWatch = new StopWatch();
    private LivingEntity lastTarget;
    private Item lastItem = Items.AIR;
    private float health;
    private float absorptionWidthSmooth;

    private float lastTotalHp = 0.0F;
    private final List<HealingText> healingTexts = new ArrayList<>();

    public TargetHud() {
        super("Target Hud", 10, 40, 100, 36, true);
    }

    @Override
    public boolean visible() {
        return scaleAnimation.isDirection(Direction.FORWARDS);
    }

    @Override
    public void tick() {
        LivingEntity auraTarget = Aura.getInstance().getTarget();

        if (auraTarget != null) {
            lastTarget = auraTarget;
            startAnimation();
        } else if (PlayerIntersectionUtil.isChat(mc.currentScreen)) {
            lastTarget = mc.player;
            startAnimation();
        } else if (stopWatch.finished(500)) {
            stopAnimation();
        }

        if (lastTarget != null) {
            float currentTotalHp = PlayerIntersectionUtil.getHealth(lastTarget);

            if (currentTotalHp > lastTotalHp && lastTotalHp != 0.0F) {
                float healedAmount = currentTotalHp - lastTotalHp;
                if (healedAmount > 0.01F) {
                    String healString = "+" + PlayerIntersectionUtil.getHealthString(healedAmount);
                    healingTexts.add(new HealingText(healString));
                }
            }
            lastTotalHp = currentTotalHp;
        } else {
            lastTotalHp = 0.0F;
        }
    }

    @Override
    public void drawDraggable(DrawContext context) {
        if (lastTarget != null) {
            MatrixStack matrix = context.getMatrices();
            drawUsingItem(context, matrix);
            drawMain(context, matrix);
            drawFace(context);
            drawArmor(context, matrix);
        }
    }

    private void drawMain(DrawContext context, MatrixStack matrix) {
        FontRenderer font = Fonts.getSize(16);
        FontRenderer smallFont = Fonts.getSize(14);

        float totalHp = PlayerIntersectionUtil.getHealth(lastTarget);
        float baseHp = lastTarget.getHealth();
        float absorptionHp = lastTarget.getAbsorptionAmount();
        float maxBaseHp = lastTarget.getMaxHealth();
        float widthHp = 58;

        float barY = getY() + 31F;
        float absorptionBarY = barY - 1F;
        float textY = getY() + 23;
        float nameY = getY() + 7;
        float contentX = getX() + 34;
        float alignedX = contentX + 2;
        float verticalDividerX = getX() + 32;
        float verticalDividerY = getY() + 2;
        float verticalDividerHeight = getHeight() - 3f;

        blur.render(ShapeProperties.create(matrix, getX(), getY(), getWidth(), getHeight()).round(7).softness(1)
                .thickness(2).outlineColor(ColorUtil.getOutline()).color(ColorUtil.getRect(0.6F)).build());

        rectangle.render(ShapeProperties.create(matrix, verticalDividerX, verticalDividerY, 0.7F, verticalDividerHeight)
                .color(ColorUtil.getOutline()).build());
        rectangle.render(ShapeProperties.create(matrix, contentX, getY() + 17F, widthHp, 0.7F)
                .color(ColorUtil.getOutline()).build());

        String mainHpText = PlayerIntersectionUtil.getHealthString(totalHp) + " хп";
        String absText = absorptionHp > 0 ? " + " + PlayerIntersectionUtil.getHealthString(absorptionHp) + " хп" : "";
        int targetColor = baseHp >= 10 ? ColorUtil.getColor(85, 255, 85) : ColorUtil.getColor(255, 85, 85);

        smallFont.drawGradientString(matrix, mainHpText, alignedX, textY, Color.WHITE.getRGB(), targetColor);

        if (!absText.isEmpty()) {
            float absX = alignedX + smallFont.getStringWidth(mainHpText);
            smallFont.drawString(matrix, absText, absX, textY, ColorUtil.getColor(255, 255, 0));
        }

        health = MathHelper.clamp(MathUtil.interpolateSmooth(1, health, Math.round(baseHp / maxBaseHp * widthHp)), 2, widthHp);

        String name = lastTarget.getName().getString();
        if (font.getStringWidth(name) > 60) {
            ScissorManager scissorManager = Main.getInstance().getScissorManager();
            scissorManager.push(matrix.peek().getPositionMatrix(), getX(), getY(), getWidth() - 2, getHeight());
            font.drawGradientString(matrix, name, alignedX, nameY, ColorUtil.getText(), ColorUtil.getText(0.6F));
            scissorManager.pop();
        } else font.drawString(matrix, name, alignedX, nameY, ColorUtil.getText());

        if (absorptionHp > 0 || absorptionWidthSmooth > 0.5) {
            float targetAbsWidth = MathHelper.clamp((absorptionHp / maxBaseHp) * widthHp, 0, widthHp);
            absorptionWidthSmooth = MathUtil.interpolateSmooth(0.1, absorptionWidthSmooth, targetAbsWidth);
            rectangle.render(ShapeProperties.create(matrix, contentX, absorptionBarY, absorptionWidthSmooth, 2F)
                    .round(0.75F).color(ColorUtil.getColor(255, 255, 0)).build());
        }

        rectangle.render(ShapeProperties.create(matrix, contentX, barY, widthHp, 2f).round(0.75F).color(0xFF060712).build());
        rectangle.render(ShapeProperties.create(matrix, contentX, barY, health, 2F).softness(4).round(1).color(ColorUtil.roundClientColor(0.6F)).build());
        rectangle.render(ShapeProperties.create(matrix, contentX, barY, health, 2F).round(0.75F).color(ColorUtil.roundClientColor(1)).build());

        float currentX = alignedX + smallFont.getStringWidth(mainHpText + absText) + 2;
        Iterator<HealingText> iterator = healingTexts.iterator();
        while (iterator.hasNext()) {
            HealingText text = iterator.next();
            if (text.isFinished()) {
                iterator.remove();
                continue;
            }
            float progress = text.getAnimationValue();
            float yOffset = 6 * progress;
            int alpha = (int) (255 * (1.0F - progress));
            int color = ColorUtil.getColor(85, 255, 85, Math.max(0, alpha));
            smallFont.drawString(matrix, text.text, currentX, textY - yOffset, color);
            currentX += smallFont.getStringWidth(text.text) + 2;
        }
    }

    private void drawArmor(DrawContext context, MatrixStack matrix) {
        List<ItemStack> items = StreamSupport.stream(lastTarget.getEquippedItems().spliterator(), false).filter(s -> !s.isEmpty()).toList();
        if (!items.isEmpty()) {
            float x = getX() + getWidth() / 2F - items.size() * 5.5F;
            float y = getY() + getHeight() - 1;
            float itemX = -10.5F;
            matrix.push();
            matrix.translate(x, y, -200);
            blur.render(ShapeProperties.create(matrix, 0, 0, items.size() * 11, 11).round(3F).softness(1).thickness(2).outlineColor(ColorUtil.getOutline()).color(ColorUtil.getRect(0.6F)).build());
            for (ItemStack stack : items) Render2DUtil.defaultDrawStack(context, stack, itemX += 11, 0.5F, false, true, 0.5F);
            matrix.pop();
        }
    }

    private void drawUsingItem(DrawContext context, MatrixStack matrix) {
        animation.setDirection(lastTarget.isUsingItem() ? Direction.FORWARDS : Direction.BACKWARDS);
        if (!lastTarget.getActiveItem().isEmpty()) lastItem = lastTarget.getActiveItem().getItem();

        if (!animation.isFinished(Direction.BACKWARDS) && !lastItem.equals(Items.AIR)) {
            float anim = animation.getOutput().floatValue();
            float progress = (lastTarget.getItemUseTime() + tickCounter.getTickDelta(false)) / ItemUtil.maxUseTick(lastItem) * 360;
            float x = getX() - (29) * anim;
            float y = getY() + 6;

            ScissorManager scissorManager = Main.getInstance().getScissorManager();
            scissorManager.push(matrix.peek().getPositionMatrix(), getX() - 50, getY(), 50, getHeight());
            MathUtil.setAlpha(anim, () -> {
                blur.render(ShapeProperties.create(matrix, x, y, 24, 24).round(12).softness(1).thickness(2).outlineColor(ColorUtil.getOutline()).color(ColorUtil.getRect(0.6F)).build());
                arc.render(ShapeProperties.create(matrix, x, y, 24, 24).round(1F).thickness(0.2f).end(progress).color(ColorUtil.fade(0), ColorUtil.fade(200), ColorUtil.fade(0), ColorUtil.fade(200)).build());
                Render2DUtil.defaultDrawStack(context, lastItem.getDefaultStack(), x + 3, y + 3, false, false, 1);
            });
            scissorManager.pop();
        }
    }

    private void drawFace(DrawContext context) {
        EntityRenderer<? super LivingEntity, ?> baseRenderer = mc.getEntityRenderDispatcher().getRenderer(lastTarget);
        if (!(baseRenderer instanceof LivingEntityRenderer<?, ?, ?>)) return;

        LivingEntityRenderer<LivingEntity, LivingEntityRenderState, ?> renderer = (LivingEntityRenderer<LivingEntity, LivingEntityRenderState, ?>) baseRenderer;
        LivingEntityRenderState state = renderer.getAndUpdateRenderState(lastTarget, tickCounter.getTickDelta(false));
        Identifier texture = renderer.getTexture(state);

        float faceX = getX() + 5, faceY = getY() + 5.5F;
        blur.render(ShapeProperties.create(context.getMatrices(), getX() + 4.5F, getY() + 5F, 26, 26).round(7).thickness(0.5F).outlineColor(ColorUtil.getOutline()).color(ColorUtil.getRect(0.0F)).build());
        Render2DUtil.drawTexture(context, texture, faceX, faceY, 25, 3, 8, 8, 64, ColorUtil.getRect(1), ColorUtil.multRed(-1, 1 + lastTarget.hurtTime / 4F));
    }

    private static class HealingText {
        private final Animation animation;
        public final String text;

        public HealingText(String text) {
            this.text = text;
            this.animation = new DecelerateAnimation().setMs(600).setValue(1.0F);
            this.animation.setDirection(Direction.FORWARDS);
        }

        public float getAnimationValue() {
            return animation == null ? 0 : animation.getOutput().floatValue();
        }

        public boolean isFinished() {
            return animation == null || animation.isFinished(Direction.FORWARDS);
        }
    }
}
Посмотреть вложение 330965
/del, удали инталку
 
Моя первая работа с таргет худом, если не красиво, сорян, /del принимаются

SS - прикрепил

DW - код
TargetHUD:
Expand Collapse Copy
package dev.silent.implement.features.draggables;

import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.render.entity.EntityRenderer;
import net.minecraft.client.render.entity.LivingEntityRenderer;
import net.minecraft.client.render.entity.state.LivingEntityRenderState;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.entity.LivingEntity;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.MathHelper;
import dev.silent.api.feature.draggable.AbstractDraggable;
import dev.silent.api.system.animation.Animation;
import dev.silent.api.system.animation.Direction;
import dev.silent.api.system.animation.implement.DecelerateAnimation;
import dev.silent.api.system.font.FontRenderer;
import dev.silent.api.system.font.Fonts;
import dev.silent.api.system.shape.ShapeProperties;
import dev.silent.common.util.color.ColorUtil;
import dev.silent.common.util.item.ItemUtil;
import dev.silent.common.util.math.MathUtil;
import dev.silent.common.util.other.StopWatch;
import dev.silent.common.util.entity.PlayerIntersectionUtil;
import dev.silent.common.util.render.Render2DUtil;
import dev.silent.common.util.render.ScissorManager;
import dev.silent.core.Main;
import dev.silent.implement.features.modules.combat.Aura;

import java.awt.Color;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.stream.StreamSupport;

public class TargetHud extends AbstractDraggable {

    private final Animation animation = new DecelerateAnimation().setMs(200).setValue(1);
    private final StopWatch stopWatch = new StopWatch();
    private LivingEntity lastTarget;
    private Item lastItem = Items.AIR;
    private float health;
    private float absorptionWidthSmooth;

    private float lastTotalHp = 0.0F;
    private final List<HealingText> healingTexts = new ArrayList<>();

    public TargetHud() {
        super("Target Hud", 10, 40, 100, 36, true);
    }

    @Override
    public boolean visible() {
        return scaleAnimation.isDirection(Direction.FORWARDS);
    }

    @Override
    public void tick() {
        LivingEntity auraTarget = Aura.getInstance().getTarget();

        if (auraTarget != null) {
            lastTarget = auraTarget;
            startAnimation();
        } else if (PlayerIntersectionUtil.isChat(mc.currentScreen)) {
            lastTarget = mc.player;
            startAnimation();
        } else if (stopWatch.finished(500)) {
            stopAnimation();
        }

        if (lastTarget != null) {
            float currentTotalHp = PlayerIntersectionUtil.getHealth(lastTarget);

            if (currentTotalHp > lastTotalHp && lastTotalHp != 0.0F) {
                float healedAmount = currentTotalHp - lastTotalHp;
                if (healedAmount > 0.01F) {
                    String healString = "+" + PlayerIntersectionUtil.getHealthString(healedAmount);
                    healingTexts.add(new HealingText(healString));
                }
            }
            lastTotalHp = currentTotalHp;
        } else {
            lastTotalHp = 0.0F;
        }
    }

    @Override
    public void drawDraggable(DrawContext context) {
        if (lastTarget != null) {
            MatrixStack matrix = context.getMatrices();
            drawUsingItem(context, matrix);
            drawMain(context, matrix);
            drawFace(context);
            drawArmor(context, matrix);
        }
    }

    private void drawMain(DrawContext context, MatrixStack matrix) {
        FontRenderer font = Fonts.getSize(16);
        FontRenderer smallFont = Fonts.getSize(14);

        float totalHp = PlayerIntersectionUtil.getHealth(lastTarget);
        float baseHp = lastTarget.getHealth();
        float absorptionHp = lastTarget.getAbsorptionAmount();
        float maxBaseHp = lastTarget.getMaxHealth();
        float widthHp = 58;

        float barY = getY() + 31F;
        float absorptionBarY = barY - 1F;
        float textY = getY() + 23;
        float nameY = getY() + 7;
        float contentX = getX() + 34;
        float alignedX = contentX + 2;
        float verticalDividerX = getX() + 32;
        float verticalDividerY = getY() + 2;
        float verticalDividerHeight = getHeight() - 3f;

        blur.render(ShapeProperties.create(matrix, getX(), getY(), getWidth(), getHeight()).round(7).softness(1)
                .thickness(2).outlineColor(ColorUtil.getOutline()).color(ColorUtil.getRect(0.6F)).build());

        rectangle.render(ShapeProperties.create(matrix, verticalDividerX, verticalDividerY, 0.7F, verticalDividerHeight)
                .color(ColorUtil.getOutline()).build());
        rectangle.render(ShapeProperties.create(matrix, contentX, getY() + 17F, widthHp, 0.7F)
                .color(ColorUtil.getOutline()).build());

        String mainHpText = PlayerIntersectionUtil.getHealthString(totalHp) + " хп";
        String absText = absorptionHp > 0 ? " + " + PlayerIntersectionUtil.getHealthString(absorptionHp) + " хп" : "";
        int targetColor = baseHp >= 10 ? ColorUtil.getColor(85, 255, 85) : ColorUtil.getColor(255, 85, 85);

        smallFont.drawGradientString(matrix, mainHpText, alignedX, textY, Color.WHITE.getRGB(), targetColor);

        if (!absText.isEmpty()) {
            float absX = alignedX + smallFont.getStringWidth(mainHpText);
            smallFont.drawString(matrix, absText, absX, textY, ColorUtil.getColor(255, 255, 0));
        }

        health = MathHelper.clamp(MathUtil.interpolateSmooth(1, health, Math.round(baseHp / maxBaseHp * widthHp)), 2, widthHp);

        String name = lastTarget.getName().getString();
        if (font.getStringWidth(name) > 60) {
            ScissorManager scissorManager = Main.getInstance().getScissorManager();
            scissorManager.push(matrix.peek().getPositionMatrix(), getX(), getY(), getWidth() - 2, getHeight());
            font.drawGradientString(matrix, name, alignedX, nameY, ColorUtil.getText(), ColorUtil.getText(0.6F));
            scissorManager.pop();
        } else font.drawString(matrix, name, alignedX, nameY, ColorUtil.getText());

        if (absorptionHp > 0 || absorptionWidthSmooth > 0.5) {
            float targetAbsWidth = MathHelper.clamp((absorptionHp / maxBaseHp) * widthHp, 0, widthHp);
            absorptionWidthSmooth = MathUtil.interpolateSmooth(0.1, absorptionWidthSmooth, targetAbsWidth);
            rectangle.render(ShapeProperties.create(matrix, contentX, absorptionBarY, absorptionWidthSmooth, 2F)
                    .round(0.75F).color(ColorUtil.getColor(255, 255, 0)).build());
        }

        rectangle.render(ShapeProperties.create(matrix, contentX, barY, widthHp, 2f).round(0.75F).color(0xFF060712).build());
        rectangle.render(ShapeProperties.create(matrix, contentX, barY, health, 2F).softness(4).round(1).color(ColorUtil.roundClientColor(0.6F)).build());
        rectangle.render(ShapeProperties.create(matrix, contentX, barY, health, 2F).round(0.75F).color(ColorUtil.roundClientColor(1)).build());

        float currentX = alignedX + smallFont.getStringWidth(mainHpText + absText) + 2;
        Iterator<HealingText> iterator = healingTexts.iterator();
        while (iterator.hasNext()) {
            HealingText text = iterator.next();
            if (text.isFinished()) {
                iterator.remove();
                continue;
            }
            float progress = text.getAnimationValue();
            float yOffset = 6 * progress;
            int alpha = (int) (255 * (1.0F - progress));
            int color = ColorUtil.getColor(85, 255, 85, Math.max(0, alpha));
            smallFont.drawString(matrix, text.text, currentX, textY - yOffset, color);
            currentX += smallFont.getStringWidth(text.text) + 2;
        }
    }

    private void drawArmor(DrawContext context, MatrixStack matrix) {
        List<ItemStack> items = StreamSupport.stream(lastTarget.getEquippedItems().spliterator(), false).filter(s -> !s.isEmpty()).toList();
        if (!items.isEmpty()) {
            float x = getX() + getWidth() / 2F - items.size() * 5.5F;
            float y = getY() + getHeight() - 1;
            float itemX = -10.5F;
            matrix.push();
            matrix.translate(x, y, -200);
            blur.render(ShapeProperties.create(matrix, 0, 0, items.size() * 11, 11).round(3F).softness(1).thickness(2).outlineColor(ColorUtil.getOutline()).color(ColorUtil.getRect(0.6F)).build());
            for (ItemStack stack : items) Render2DUtil.defaultDrawStack(context, stack, itemX += 11, 0.5F, false, true, 0.5F);
            matrix.pop();
        }
    }

    private void drawUsingItem(DrawContext context, MatrixStack matrix) {
        animation.setDirection(lastTarget.isUsingItem() ? Direction.FORWARDS : Direction.BACKWARDS);
        if (!lastTarget.getActiveItem().isEmpty()) lastItem = lastTarget.getActiveItem().getItem();

        if (!animation.isFinished(Direction.BACKWARDS) && !lastItem.equals(Items.AIR)) {
            float anim = animation.getOutput().floatValue();
            float progress = (lastTarget.getItemUseTime() + tickCounter.getTickDelta(false)) / ItemUtil.maxUseTick(lastItem) * 360;
            float x = getX() - (29) * anim;
            float y = getY() + 6;

            ScissorManager scissorManager = Main.getInstance().getScissorManager();
            scissorManager.push(matrix.peek().getPositionMatrix(), getX() - 50, getY(), 50, getHeight());
            MathUtil.setAlpha(anim, () -> {
                blur.render(ShapeProperties.create(matrix, x, y, 24, 24).round(12).softness(1).thickness(2).outlineColor(ColorUtil.getOutline()).color(ColorUtil.getRect(0.6F)).build());
                arc.render(ShapeProperties.create(matrix, x, y, 24, 24).round(1F).thickness(0.2f).end(progress).color(ColorUtil.fade(0), ColorUtil.fade(200), ColorUtil.fade(0), ColorUtil.fade(200)).build());
                Render2DUtil.defaultDrawStack(context, lastItem.getDefaultStack(), x + 3, y + 3, false, false, 1);
            });
            scissorManager.pop();
        }
    }

    private void drawFace(DrawContext context) {
        EntityRenderer<? super LivingEntity, ?> baseRenderer = mc.getEntityRenderDispatcher().getRenderer(lastTarget);
        if (!(baseRenderer instanceof LivingEntityRenderer<?, ?, ?>)) return;

        LivingEntityRenderer<LivingEntity, LivingEntityRenderState, ?> renderer = (LivingEntityRenderer<LivingEntity, LivingEntityRenderState, ?>) baseRenderer;
        LivingEntityRenderState state = renderer.getAndUpdateRenderState(lastTarget, tickCounter.getTickDelta(false));
        Identifier texture = renderer.getTexture(state);

        float faceX = getX() + 5, faceY = getY() + 5.5F;
        blur.render(ShapeProperties.create(context.getMatrices(), getX() + 4.5F, getY() + 5F, 26, 26).round(7).thickness(0.5F).outlineColor(ColorUtil.getOutline()).color(ColorUtil.getRect(0.0F)).build());
        Render2DUtil.drawTexture(context, texture, faceX, faceY, 25, 3, 8, 8, 64, ColorUtil.getRect(1), ColorUtil.multRed(-1, 1 + lastTarget.hurtTime / 4F));
    }

    private static class HealingText {
        private final Animation animation;
        public final String text;

        public HealingText(String text) {
            this.text = text;
            this.animation = new DecelerateAnimation().setMs(600).setValue(1.0F);
            this.animation.setDirection(Direction.FORWARDS);
        }

        public float getAnimationValue() {
            return animation == null ? 0 : animation.getOutput().floatValue();
        }

        public boolean isFinished() {
            return animation == null || animation.isFinished(Direction.FORWARDS);
        }
    }
}
Посмотреть вложение 330965
не кабута не вроде, кабута не красивый просто. но думаю если подделать чутка будет норме
 
Моя первая работа с таргет худом, если не красиво, сорян, /del принимаются

SS - прикрепил

DW - код
TargetHUD:
Expand Collapse Copy
package dev.silent.implement.features.draggables;

import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.render.entity.EntityRenderer;
import net.minecraft.client.render.entity.LivingEntityRenderer;
import net.minecraft.client.render.entity.state.LivingEntityRenderState;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.entity.LivingEntity;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.MathHelper;
import dev.silent.api.feature.draggable.AbstractDraggable;
import dev.silent.api.system.animation.Animation;
import dev.silent.api.system.animation.Direction;
import dev.silent.api.system.animation.implement.DecelerateAnimation;
import dev.silent.api.system.font.FontRenderer;
import dev.silent.api.system.font.Fonts;
import dev.silent.api.system.shape.ShapeProperties;
import dev.silent.common.util.color.ColorUtil;
import dev.silent.common.util.item.ItemUtil;
import dev.silent.common.util.math.MathUtil;
import dev.silent.common.util.other.StopWatch;
import dev.silent.common.util.entity.PlayerIntersectionUtil;
import dev.silent.common.util.render.Render2DUtil;
import dev.silent.common.util.render.ScissorManager;
import dev.silent.core.Main;
import dev.silent.implement.features.modules.combat.Aura;

import java.awt.Color;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.stream.StreamSupport;

public class TargetHud extends AbstractDraggable {

    private final Animation animation = new DecelerateAnimation().setMs(200).setValue(1);
    private final StopWatch stopWatch = new StopWatch();
    private LivingEntity lastTarget;
    private Item lastItem = Items.AIR;
    private float health;
    private float absorptionWidthSmooth;

    private float lastTotalHp = 0.0F;
    private final List<HealingText> healingTexts = new ArrayList<>();

    public TargetHud() {
        super("Target Hud", 10, 40, 100, 36, true);
    }

    @Override
    public boolean visible() {
        return scaleAnimation.isDirection(Direction.FORWARDS);
    }

    @Override
    public void tick() {
        LivingEntity auraTarget = Aura.getInstance().getTarget();

        if (auraTarget != null) {
            lastTarget = auraTarget;
            startAnimation();
        } else if (PlayerIntersectionUtil.isChat(mc.currentScreen)) {
            lastTarget = mc.player;
            startAnimation();
        } else if (stopWatch.finished(500)) {
            stopAnimation();
        }

        if (lastTarget != null) {
            float currentTotalHp = PlayerIntersectionUtil.getHealth(lastTarget);

            if (currentTotalHp > lastTotalHp && lastTotalHp != 0.0F) {
                float healedAmount = currentTotalHp - lastTotalHp;
                if (healedAmount > 0.01F) {
                    String healString = "+" + PlayerIntersectionUtil.getHealthString(healedAmount);
                    healingTexts.add(new HealingText(healString));
                }
            }
            lastTotalHp = currentTotalHp;
        } else {
            lastTotalHp = 0.0F;
        }
    }

    @Override
    public void drawDraggable(DrawContext context) {
        if (lastTarget != null) {
            MatrixStack matrix = context.getMatrices();
            drawUsingItem(context, matrix);
            drawMain(context, matrix);
            drawFace(context);
            drawArmor(context, matrix);
        }
    }

    private void drawMain(DrawContext context, MatrixStack matrix) {
        FontRenderer font = Fonts.getSize(16);
        FontRenderer smallFont = Fonts.getSize(14);

        float totalHp = PlayerIntersectionUtil.getHealth(lastTarget);
        float baseHp = lastTarget.getHealth();
        float absorptionHp = lastTarget.getAbsorptionAmount();
        float maxBaseHp = lastTarget.getMaxHealth();
        float widthHp = 58;

        float barY = getY() + 31F;
        float absorptionBarY = barY - 1F;
        float textY = getY() + 23;
        float nameY = getY() + 7;
        float contentX = getX() + 34;
        float alignedX = contentX + 2;
        float verticalDividerX = getX() + 32;
        float verticalDividerY = getY() + 2;
        float verticalDividerHeight = getHeight() - 3f;

        blur.render(ShapeProperties.create(matrix, getX(), getY(), getWidth(), getHeight()).round(7).softness(1)
                .thickness(2).outlineColor(ColorUtil.getOutline()).color(ColorUtil.getRect(0.6F)).build());

        rectangle.render(ShapeProperties.create(matrix, verticalDividerX, verticalDividerY, 0.7F, verticalDividerHeight)
                .color(ColorUtil.getOutline()).build());
        rectangle.render(ShapeProperties.create(matrix, contentX, getY() + 17F, widthHp, 0.7F)
                .color(ColorUtil.getOutline()).build());

        String mainHpText = PlayerIntersectionUtil.getHealthString(totalHp) + " хп";
        String absText = absorptionHp > 0 ? " + " + PlayerIntersectionUtil.getHealthString(absorptionHp) + " хп" : "";
        int targetColor = baseHp >= 10 ? ColorUtil.getColor(85, 255, 85) : ColorUtil.getColor(255, 85, 85);

        smallFont.drawGradientString(matrix, mainHpText, alignedX, textY, Color.WHITE.getRGB(), targetColor);

        if (!absText.isEmpty()) {
            float absX = alignedX + smallFont.getStringWidth(mainHpText);
            smallFont.drawString(matrix, absText, absX, textY, ColorUtil.getColor(255, 255, 0));
        }

        health = MathHelper.clamp(MathUtil.interpolateSmooth(1, health, Math.round(baseHp / maxBaseHp * widthHp)), 2, widthHp);

        String name = lastTarget.getName().getString();
        if (font.getStringWidth(name) > 60) {
            ScissorManager scissorManager = Main.getInstance().getScissorManager();
            scissorManager.push(matrix.peek().getPositionMatrix(), getX(), getY(), getWidth() - 2, getHeight());
            font.drawGradientString(matrix, name, alignedX, nameY, ColorUtil.getText(), ColorUtil.getText(0.6F));
            scissorManager.pop();
        } else font.drawString(matrix, name, alignedX, nameY, ColorUtil.getText());

        if (absorptionHp > 0 || absorptionWidthSmooth > 0.5) {
            float targetAbsWidth = MathHelper.clamp((absorptionHp / maxBaseHp) * widthHp, 0, widthHp);
            absorptionWidthSmooth = MathUtil.interpolateSmooth(0.1, absorptionWidthSmooth, targetAbsWidth);
            rectangle.render(ShapeProperties.create(matrix, contentX, absorptionBarY, absorptionWidthSmooth, 2F)
                    .round(0.75F).color(ColorUtil.getColor(255, 255, 0)).build());
        }

        rectangle.render(ShapeProperties.create(matrix, contentX, barY, widthHp, 2f).round(0.75F).color(0xFF060712).build());
        rectangle.render(ShapeProperties.create(matrix, contentX, barY, health, 2F).softness(4).round(1).color(ColorUtil.roundClientColor(0.6F)).build());
        rectangle.render(ShapeProperties.create(matrix, contentX, barY, health, 2F).round(0.75F).color(ColorUtil.roundClientColor(1)).build());

        float currentX = alignedX + smallFont.getStringWidth(mainHpText + absText) + 2;
        Iterator<HealingText> iterator = healingTexts.iterator();
        while (iterator.hasNext()) {
            HealingText text = iterator.next();
            if (text.isFinished()) {
                iterator.remove();
                continue;
            }
            float progress = text.getAnimationValue();
            float yOffset = 6 * progress;
            int alpha = (int) (255 * (1.0F - progress));
            int color = ColorUtil.getColor(85, 255, 85, Math.max(0, alpha));
            smallFont.drawString(matrix, text.text, currentX, textY - yOffset, color);
            currentX += smallFont.getStringWidth(text.text) + 2;
        }
    }

    private void drawArmor(DrawContext context, MatrixStack matrix) {
        List<ItemStack> items = StreamSupport.stream(lastTarget.getEquippedItems().spliterator(), false).filter(s -> !s.isEmpty()).toList();
        if (!items.isEmpty()) {
            float x = getX() + getWidth() / 2F - items.size() * 5.5F;
            float y = getY() + getHeight() - 1;
            float itemX = -10.5F;
            matrix.push();
            matrix.translate(x, y, -200);
            blur.render(ShapeProperties.create(matrix, 0, 0, items.size() * 11, 11).round(3F).softness(1).thickness(2).outlineColor(ColorUtil.getOutline()).color(ColorUtil.getRect(0.6F)).build());
            for (ItemStack stack : items) Render2DUtil.defaultDrawStack(context, stack, itemX += 11, 0.5F, false, true, 0.5F);
            matrix.pop();
        }
    }

    private void drawUsingItem(DrawContext context, MatrixStack matrix) {
        animation.setDirection(lastTarget.isUsingItem() ? Direction.FORWARDS : Direction.BACKWARDS);
        if (!lastTarget.getActiveItem().isEmpty()) lastItem = lastTarget.getActiveItem().getItem();

        if (!animation.isFinished(Direction.BACKWARDS) && !lastItem.equals(Items.AIR)) {
            float anim = animation.getOutput().floatValue();
            float progress = (lastTarget.getItemUseTime() + tickCounter.getTickDelta(false)) / ItemUtil.maxUseTick(lastItem) * 360;
            float x = getX() - (29) * anim;
            float y = getY() + 6;

            ScissorManager scissorManager = Main.getInstance().getScissorManager();
            scissorManager.push(matrix.peek().getPositionMatrix(), getX() - 50, getY(), 50, getHeight());
            MathUtil.setAlpha(anim, () -> {
                blur.render(ShapeProperties.create(matrix, x, y, 24, 24).round(12).softness(1).thickness(2).outlineColor(ColorUtil.getOutline()).color(ColorUtil.getRect(0.6F)).build());
                arc.render(ShapeProperties.create(matrix, x, y, 24, 24).round(1F).thickness(0.2f).end(progress).color(ColorUtil.fade(0), ColorUtil.fade(200), ColorUtil.fade(0), ColorUtil.fade(200)).build());
                Render2DUtil.defaultDrawStack(context, lastItem.getDefaultStack(), x + 3, y + 3, false, false, 1);
            });
            scissorManager.pop();
        }
    }

    private void drawFace(DrawContext context) {
        EntityRenderer<? super LivingEntity, ?> baseRenderer = mc.getEntityRenderDispatcher().getRenderer(lastTarget);
        if (!(baseRenderer instanceof LivingEntityRenderer<?, ?, ?>)) return;

        LivingEntityRenderer<LivingEntity, LivingEntityRenderState, ?> renderer = (LivingEntityRenderer<LivingEntity, LivingEntityRenderState, ?>) baseRenderer;
        LivingEntityRenderState state = renderer.getAndUpdateRenderState(lastTarget, tickCounter.getTickDelta(false));
        Identifier texture = renderer.getTexture(state);

        float faceX = getX() + 5, faceY = getY() + 5.5F;
        blur.render(ShapeProperties.create(context.getMatrices(), getX() + 4.5F, getY() + 5F, 26, 26).round(7).thickness(0.5F).outlineColor(ColorUtil.getOutline()).color(ColorUtil.getRect(0.0F)).build());
        Render2DUtil.drawTexture(context, texture, faceX, faceY, 25, 3, 8, 8, 64, ColorUtil.getRect(1), ColorUtil.multRed(-1, 1 + lastTarget.hurtTime / 4F));
    }

    private static class HealingText {
        private final Animation animation;
        public final String text;

        public HealingText(String text) {
            this.text = text;
            this.animation = new DecelerateAnimation().setMs(600).setValue(1.0F);
            this.animation.setDirection(Direction.FORWARDS);
        }

        public float getAnimationValue() {
            return animation == null ? 0 : animation.getOutput().floatValue();
        }

        public boolean isFinished() {
            return animation == null || animation.isFinished(Direction.FORWARDS);
        }
    }
}
Посмотреть вложение 330965
дерьмо брат
 
Моя первая работа с таргет худом, если не красиво, сорян, /del принимаются

SS - прикрепил

DW - код
TargetHUD:
Expand Collapse Copy
package dev.silent.implement.features.draggables;

import net.minecraft.client.gui.DrawContext;
import net.minecraft.client.render.entity.EntityRenderer;
import net.minecraft.client.render.entity.LivingEntityRenderer;
import net.minecraft.client.render.entity.state.LivingEntityRenderState;
import net.minecraft.client.util.math.MatrixStack;
import net.minecraft.entity.LivingEntity;
import net.minecraft.item.Item;
import net.minecraft.item.ItemStack;
import net.minecraft.item.Items;
import net.minecraft.util.Identifier;
import net.minecraft.util.math.MathHelper;
import dev.silent.api.feature.draggable.AbstractDraggable;
import dev.silent.api.system.animation.Animation;
import dev.silent.api.system.animation.Direction;
import dev.silent.api.system.animation.implement.DecelerateAnimation;
import dev.silent.api.system.font.FontRenderer;
import dev.silent.api.system.font.Fonts;
import dev.silent.api.system.shape.ShapeProperties;
import dev.silent.common.util.color.ColorUtil;
import dev.silent.common.util.item.ItemUtil;
import dev.silent.common.util.math.MathUtil;
import dev.silent.common.util.other.StopWatch;
import dev.silent.common.util.entity.PlayerIntersectionUtil;
import dev.silent.common.util.render.Render2DUtil;
import dev.silent.common.util.render.ScissorManager;
import dev.silent.core.Main;
import dev.silent.implement.features.modules.combat.Aura;

import java.awt.Color;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.stream.StreamSupport;

public class TargetHud extends AbstractDraggable {

    private final Animation animation = new DecelerateAnimation().setMs(200).setValue(1);
    private final StopWatch stopWatch = new StopWatch();
    private LivingEntity lastTarget;
    private Item lastItem = Items.AIR;
    private float health;
    private float absorptionWidthSmooth;

    private float lastTotalHp = 0.0F;
    private final List<HealingText> healingTexts = new ArrayList<>();

    public TargetHud() {
        super("Target Hud", 10, 40, 100, 36, true);
    }

    @Override
    public boolean visible() {
        return scaleAnimation.isDirection(Direction.FORWARDS);
    }

    @Override
    public void tick() {
        LivingEntity auraTarget = Aura.getInstance().getTarget();

        if (auraTarget != null) {
            lastTarget = auraTarget;
            startAnimation();
        } else if (PlayerIntersectionUtil.isChat(mc.currentScreen)) {
            lastTarget = mc.player;
            startAnimation();
        } else if (stopWatch.finished(500)) {
            stopAnimation();
        }

        if (lastTarget != null) {
            float currentTotalHp = PlayerIntersectionUtil.getHealth(lastTarget);

            if (currentTotalHp > lastTotalHp && lastTotalHp != 0.0F) {
                float healedAmount = currentTotalHp - lastTotalHp;
                if (healedAmount > 0.01F) {
                    String healString = "+" + PlayerIntersectionUtil.getHealthString(healedAmount);
                    healingTexts.add(new HealingText(healString));
                }
            }
            lastTotalHp = currentTotalHp;
        } else {
            lastTotalHp = 0.0F;
        }
    }

    @Override
    public void drawDraggable(DrawContext context) {
        if (lastTarget != null) {
            MatrixStack matrix = context.getMatrices();
            drawUsingItem(context, matrix);
            drawMain(context, matrix);
            drawFace(context);
            drawArmor(context, matrix);
        }
    }

    private void drawMain(DrawContext context, MatrixStack matrix) {
        FontRenderer font = Fonts.getSize(16);
        FontRenderer smallFont = Fonts.getSize(14);

        float totalHp = PlayerIntersectionUtil.getHealth(lastTarget);
        float baseHp = lastTarget.getHealth();
        float absorptionHp = lastTarget.getAbsorptionAmount();
        float maxBaseHp = lastTarget.getMaxHealth();
        float widthHp = 58;

        float barY = getY() + 31F;
        float absorptionBarY = barY - 1F;
        float textY = getY() + 23;
        float nameY = getY() + 7;
        float contentX = getX() + 34;
        float alignedX = contentX + 2;
        float verticalDividerX = getX() + 32;
        float verticalDividerY = getY() + 2;
        float verticalDividerHeight = getHeight() - 3f;

        blur.render(ShapeProperties.create(matrix, getX(), getY(), getWidth(), getHeight()).round(7).softness(1)
                .thickness(2).outlineColor(ColorUtil.getOutline()).color(ColorUtil.getRect(0.6F)).build());

        rectangle.render(ShapeProperties.create(matrix, verticalDividerX, verticalDividerY, 0.7F, verticalDividerHeight)
                .color(ColorUtil.getOutline()).build());
        rectangle.render(ShapeProperties.create(matrix, contentX, getY() + 17F, widthHp, 0.7F)
                .color(ColorUtil.getOutline()).build());

        String mainHpText = PlayerIntersectionUtil.getHealthString(totalHp) + " хп";
        String absText = absorptionHp > 0 ? " + " + PlayerIntersectionUtil.getHealthString(absorptionHp) + " хп" : "";
        int targetColor = baseHp >= 10 ? ColorUtil.getColor(85, 255, 85) : ColorUtil.getColor(255, 85, 85);

        smallFont.drawGradientString(matrix, mainHpText, alignedX, textY, Color.WHITE.getRGB(), targetColor);

        if (!absText.isEmpty()) {
            float absX = alignedX + smallFont.getStringWidth(mainHpText);
            smallFont.drawString(matrix, absText, absX, textY, ColorUtil.getColor(255, 255, 0));
        }

        health = MathHelper.clamp(MathUtil.interpolateSmooth(1, health, Math.round(baseHp / maxBaseHp * widthHp)), 2, widthHp);

        String name = lastTarget.getName().getString();
        if (font.getStringWidth(name) > 60) {
            ScissorManager scissorManager = Main.getInstance().getScissorManager();
            scissorManager.push(matrix.peek().getPositionMatrix(), getX(), getY(), getWidth() - 2, getHeight());
            font.drawGradientString(matrix, name, alignedX, nameY, ColorUtil.getText(), ColorUtil.getText(0.6F));
            scissorManager.pop();
        } else font.drawString(matrix, name, alignedX, nameY, ColorUtil.getText());

        if (absorptionHp > 0 || absorptionWidthSmooth > 0.5) {
            float targetAbsWidth = MathHelper.clamp((absorptionHp / maxBaseHp) * widthHp, 0, widthHp);
            absorptionWidthSmooth = MathUtil.interpolateSmooth(0.1, absorptionWidthSmooth, targetAbsWidth);
            rectangle.render(ShapeProperties.create(matrix, contentX, absorptionBarY, absorptionWidthSmooth, 2F)
                    .round(0.75F).color(ColorUtil.getColor(255, 255, 0)).build());
        }

        rectangle.render(ShapeProperties.create(matrix, contentX, barY, widthHp, 2f).round(0.75F).color(0xFF060712).build());
        rectangle.render(ShapeProperties.create(matrix, contentX, barY, health, 2F).softness(4).round(1).color(ColorUtil.roundClientColor(0.6F)).build());
        rectangle.render(ShapeProperties.create(matrix, contentX, barY, health, 2F).round(0.75F).color(ColorUtil.roundClientColor(1)).build());

        float currentX = alignedX + smallFont.getStringWidth(mainHpText + absText) + 2;
        Iterator<HealingText> iterator = healingTexts.iterator();
        while (iterator.hasNext()) {
            HealingText text = iterator.next();
            if (text.isFinished()) {
                iterator.remove();
                continue;
            }
            float progress = text.getAnimationValue();
            float yOffset = 6 * progress;
            int alpha = (int) (255 * (1.0F - progress));
            int color = ColorUtil.getColor(85, 255, 85, Math.max(0, alpha));
            smallFont.drawString(matrix, text.text, currentX, textY - yOffset, color);
            currentX += smallFont.getStringWidth(text.text) + 2;
        }
    }

    private void drawArmor(DrawContext context, MatrixStack matrix) {
        List<ItemStack> items = StreamSupport.stream(lastTarget.getEquippedItems().spliterator(), false).filter(s -> !s.isEmpty()).toList();
        if (!items.isEmpty()) {
            float x = getX() + getWidth() / 2F - items.size() * 5.5F;
            float y = getY() + getHeight() - 1;
            float itemX = -10.5F;
            matrix.push();
            matrix.translate(x, y, -200);
            blur.render(ShapeProperties.create(matrix, 0, 0, items.size() * 11, 11).round(3F).softness(1).thickness(2).outlineColor(ColorUtil.getOutline()).color(ColorUtil.getRect(0.6F)).build());
            for (ItemStack stack : items) Render2DUtil.defaultDrawStack(context, stack, itemX += 11, 0.5F, false, true, 0.5F);
            matrix.pop();
        }
    }

    private void drawUsingItem(DrawContext context, MatrixStack matrix) {
        animation.setDirection(lastTarget.isUsingItem() ? Direction.FORWARDS : Direction.BACKWARDS);
        if (!lastTarget.getActiveItem().isEmpty()) lastItem = lastTarget.getActiveItem().getItem();

        if (!animation.isFinished(Direction.BACKWARDS) && !lastItem.equals(Items.AIR)) {
            float anim = animation.getOutput().floatValue();
            float progress = (lastTarget.getItemUseTime() + tickCounter.getTickDelta(false)) / ItemUtil.maxUseTick(lastItem) * 360;
            float x = getX() - (29) * anim;
            float y = getY() + 6;

            ScissorManager scissorManager = Main.getInstance().getScissorManager();
            scissorManager.push(matrix.peek().getPositionMatrix(), getX() - 50, getY(), 50, getHeight());
            MathUtil.setAlpha(anim, () -> {
                blur.render(ShapeProperties.create(matrix, x, y, 24, 24).round(12).softness(1).thickness(2).outlineColor(ColorUtil.getOutline()).color(ColorUtil.getRect(0.6F)).build());
                arc.render(ShapeProperties.create(matrix, x, y, 24, 24).round(1F).thickness(0.2f).end(progress).color(ColorUtil.fade(0), ColorUtil.fade(200), ColorUtil.fade(0), ColorUtil.fade(200)).build());
                Render2DUtil.defaultDrawStack(context, lastItem.getDefaultStack(), x + 3, y + 3, false, false, 1);
            });
            scissorManager.pop();
        }
    }

    private void drawFace(DrawContext context) {
        EntityRenderer<? super LivingEntity, ?> baseRenderer = mc.getEntityRenderDispatcher().getRenderer(lastTarget);
        if (!(baseRenderer instanceof LivingEntityRenderer<?, ?, ?>)) return;

        LivingEntityRenderer<LivingEntity, LivingEntityRenderState, ?> renderer = (LivingEntityRenderer<LivingEntity, LivingEntityRenderState, ?>) baseRenderer;
        LivingEntityRenderState state = renderer.getAndUpdateRenderState(lastTarget, tickCounter.getTickDelta(false));
        Identifier texture = renderer.getTexture(state);

        float faceX = getX() + 5, faceY = getY() + 5.5F;
        blur.render(ShapeProperties.create(context.getMatrices(), getX() + 4.5F, getY() + 5F, 26, 26).round(7).thickness(0.5F).outlineColor(ColorUtil.getOutline()).color(ColorUtil.getRect(0.0F)).build());
        Render2DUtil.drawTexture(context, texture, faceX, faceY, 25, 3, 8, 8, 64, ColorUtil.getRect(1), ColorUtil.multRed(-1, 1 + lastTarget.hurtTime / 4F));
    }

    private static class HealingText {
        private final Animation animation;
        public final String text;

        public HealingText(String text) {
            this.text = text;
            this.animation = new DecelerateAnimation().setMs(600).setValue(1.0F);
            this.animation.setDirection(Direction.FORWARDS);
        }

        public float getAnimationValue() {
            return animation == null ? 0 : animation.getOutput().floatValue();
        }

        public boolean isFinished() {
            return animation == null || animation.isFinished(Direction.FORWARDS);
        }
    }
}
Посмотреть вложение 330965
/del долбаеб перезаливает
 
Назад
Сверху Снизу