Начинающий
- Статус
- Оффлайн
- Регистрация
- 7 Дек 2025
- Сообщения
- 68
- Реакции
- 1
- Выберите загрузчик игры
- Прочие моды
Моя первая работа с таргет худом, если не красиво, сорян, /del принимаются
SS - прикрепил
DW - код
SS - прикрепил
DW - код
TargetHUD:
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);
}
}
}
Последнее редактирование: