Визуальная часть Отображение талов и сфер независимо от их названий.

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
25 Май 2021
Сообщения
45
Реакции
1
Выберите загрузчик игры
  1. Vanilla

Перед прочтением основного контента ниже, пожалуйста, обратите внимание на обновление внутри секции Майна на нашем форуме. У нас появились:

  • бесплатные читы для Майнкрафт — любое использование на свой страх и риск;
  • маркетплейс Майнкрафт — абсолютно любая коммерция, связанная с игрой, за исключением продажи читов (аккаунты, предоставления услуг, поиск кодеров читов и так далее);
  • приватные читы для Minecraft — в этом разделе только платные хаки для игры, покупайте группу "Продавец" и выставляйте на продажу свой софт;
  • обсуждения и гайды — всё тот же раздел с вопросами, но теперь модернизированный: поиск нужных хаков, пати с игроками-читерами и другая полезная информация.

Спасибо!

Играя с нурика, я заметил, что даже в нем талики отображаются чисто по их названию, из за чего типо могут просто поменять название и не понятно, что тал/сфера. Именно поэтому сливаю данную функцию. База - Excellent Upgrade.

ss снизу)

NameTags:
Expand Collapse Copy
package eva.ware.client.managers.module.impl.render;

import eva.ware.client.EvaWare;
import eva.ware.client.api.events.orbit.EventHandler;
import eva.ware.client.api.events.orbit.EventPriority;
import eva.ware.client.managers.component.impl.target.TargetComponent;
import eva.ware.client.managers.events.other.PacketEvent;
import eva.ware.client.managers.events.render.Render2DEvent;
import eva.ware.client.managers.events.render.RenderNameEvent;
import eva.ware.client.managers.module.Category;
import eva.ware.client.managers.module.Module;
import eva.ware.client.managers.module.ModuleInfo;
import eva.ware.client.managers.module.impl.combat.AntiBot;
import eva.ware.client.managers.module.impl.misc.Globals;
import eva.ware.client.managers.module.settings.impl.BooleanSetting;
import eva.ware.client.managers.module.settings.impl.MultiBooleanSetting;
import eva.ware.client.managers.module.settings.impl.SliderSetting;
import eva.ware.client.utils.other.Instance;
import eva.ware.client.utils.player.PlayerUtil;
import eva.ware.client.utils.render.color.ColorFormatting;
import eva.ware.client.utils.render.color.ColorUtil;
import eva.ware.client.utils.render.draw.GLUtil;
import eva.ware.client.utils.render.draw.Project;
import eva.ware.client.utils.render.draw.RectUtil;
import eva.ware.client.utils.render.draw.RenderUtil3D;
import eva.ware.client.utils.render.font.Font;
import eva.ware.client.utils.render.font.Fonts;
import eva.ware.common.impl.globals.ClientAPI;
import eva.ware.common.impl.globals.Converter;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.experimental.Accessors;
import lombok.experimental.FieldDefaults;
import net.minecraft.client.entity.player.AbstractClientPlayerEntity;
import net.minecraft.client.util.ITooltipFlag;
import net.minecraft.entity.Entity;
import net.minecraft.entity.MobEntity;
import net.minecraft.entity.item.ItemEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.network.IPacket;
import net.minecraft.network.play.server.SEntityStatusPacket;
import net.minecraft.potion.EffectInstance;
import net.minecraft.potion.Effects;
import net.minecraft.util.StringUtils;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.StringTextComponent;
import net.minecraft.util.text.TextFormatting;
import net.mojang.blaze3d.matrix.MatrixStack;
import net.mojang.blaze3d.systems.RenderSystem;
import org.joml.Vector2f;
import org.joml.Vector4f;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.stream.Collectors;

[USER=270918]@Getter[/USER]
@Accessors(fluent = true)
@FieldDefaults(level = AccessLevel.PRIVATE)
@ModuleInfo(name = "Nametags", category = Category.RENDER)
public class Nametags extends Module {
    public static Nametags getInstance() {
        return Instance.get(Nametags.class);
    }

    private final MultiBooleanSetting checks = new MultiBooleanSetting(this, "Элементы",
            BooleanSetting.of("Игроки", true),
            BooleanSetting.of("Предметы", false)
    );

    private final SliderSetting fontSize = new SliderSetting(this, "Размер шрифта", 8F, 6F, 12F, 0.1F);
    private final BooleanSetting optimized = new BooleanSetting(this, "Оптимизировать", true);
    private final BooleanSetting otobr_spheres = new BooleanSetting(this, "Отображать сферу", true);
    private final BooleanSetting otobr_talismans = new BooleanSetting(this, "Отображать талисман", true);
    private final BooleanSetting renderDonat = new BooleanSetting(this, "Отображать донат", true);
    private final BooleanSetting showArmor = new BooleanSetting(this, "Отображать броню", true);
    private final int black = ColorUtil.getColor(0, 128);
    private final Font font = Fonts.SF_MEDIUM;
    private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
    private final int timeTick = 600;

    [USER=1489798]@EventHandler[/USER]
    public void onRenderName(RenderNameEvent event) {
        if (event.getEntity() instanceof AbstractClientPlayerEntity) event.cancel();
    }

    [USER=1489798]@EventHandler[/USER]
    public void onPacket(PacketEvent e) {
        if (PlayerUtil.nullCheck()) return;
        IPacket<?> packet = e.getPacket();
        if (packet instanceof SEntityStatusPacket entityStatus) {
            Entity entity = entityStatus.getEntity(mc.world);
            if (entity instanceof PlayerEntity player && (entityStatus.getOpCode() == 2 || entityStatus.getOpCode() == 33)) {
                if (!(player.prevFallDistance > 3 && player.fallDistance == 0)) {
                    for (Entity ent : mc.world.getAllEntities()) {
                        if (ent instanceof MobEntity mob && mob.getLastAttackedEntity() == player && mob.getLastAttackedEntityTime() < 1000) {
                            return;
                        }
                    }
                    player.addPotionEffect(new EffectInstance(Effects.UNLUCK, timeTick, -1));
                }
            }
        }
    }

    @EventHandler(priority = EventPriority.LOWEST)
    public void onRender2D(Render2DEvent event) {
        float fontHeight = fontSize.getValue();

        TargetComponent.getTargets(128, this::isValid, false)
                .forEach(entity -> renderNametag(entity, event.getMatrix(), fontHeight));
        if (checks.getValue("Предметы")) {
            mc.world.loadedItemEntityList().forEach(entity -> renderNametag(entity, event.getMatrix(), fontHeight));
        }
    }

    private void renderNametag(Entity entity, MatrixStack matrix, float fontHeight) {
        Vector3d interpolated = RenderUtil3D.interpolate(entity, mc.getRenderPartialTicks());
        AxisAlignedBB aabb = getEntityBox(entity, interpolated);

        Vector2f min = new Vector2f(Float.MAX_VALUE, Float.MAX_VALUE);
        Vector2f max = new Vector2f(Float.MIN_VALUE, Float.MIN_VALUE);

        for (Vector3d vector : aabb.getCorners()) {
            Vector2f vec = Project.project2D(vector);
            if (vec.x != Float.MAX_VALUE && vec.y != Float.MAX_VALUE) {
                min.x = Math.min(min.x, vec.x);
                min.y = Math.min(min.y, vec.y);
                max.x = Math.max(max.x, vec.x);
                max.y = Math.max(max.y, vec.y);
            }
        }
        Vector4f position = new Vector4f(min.x, min.y, max.x, max.y);

        float x = position.x;
        float y = position.y - fontHeight;
        float width = position.z - x;
        float height = position.w - y;
        float centerX = x + (width / 2F);
        ITextComponent tagComponent = null;
        float nameWidth = 0;
        float scale = 0.5F;

        if (checks.getValue("Игроки") && entity instanceof PlayerEntity player) {
            tagComponent = createPlayerTagComponent(player);
            nameWidth = getWidth(tagComponent);

            if (showArmor().getValue()) {
                drawArmor(matrix, player, x, y, width, fontHeight);
            }
        } else if (checks.getValue("Предметы") && entity instanceof ItemEntity item) {
            tagComponent = new StringTextComponent("").append(item.getItem().getDisplayName());
            if (item.getItem().getCount() > 1) {
                String GRAY = ColorFormatting.getColor(TextFormatting.GRAY.getColor());
                tagComponent = tagComponent.deepCopy().appendString(GRAY + " " + item.getItem().getCount() + "x");
            }
            nameWidth = getWidth(tagComponent);
        }

        if (tagComponent != null) {
            drawTag(matrix, tagComponent, centerX, y, nameWidth, fontHeight, scale);

            if (checks.getValue("Игроки") && entity instanceof PlayerEntity player && Globals.getInstance().isEnabled()) {
                String client = ClientAPI.getClient(entity.getName().getString());
                if (client != null) {
                    String userImageURL = "https://rockstar.moscow/api/globals/" + client + ".png";
                    mc.getTextureManager().bindTexture(Converter.getResourceLocation(userImageURL));
                    float size = fontHeight + 1;
                    RectUtil.drawRect(matrix, centerX - nameWidth / 2F - size, y - 0.5f, size, size, -1, false, true);
                }
            }
        }
    }

    private ITextComponent createPlayerTagComponent(PlayerEntity player) {
        ItemStack offHandStack = player.getHeldItemOffhand();
        CompoundNBT offHandNBT = offHandStack.getTag();
        String RED = ColorFormatting.getColor(TextFormatting.RED.getColor());
        String GREEN = ColorFormatting.getColor(TextFormatting.GREEN.getColor());
        String DARK_RED = ColorFormatting.getColor(TextFormatting.DARK_RED.getColor());
        String GOLD = ColorFormatting.getColor(TextFormatting.GOLD.getColor());
        String WHITE = ColorFormatting.getColor(TextFormatting.WHITE.getColor());
        String sphere = "";
        String KT = "";
        for (EffectInstance potion : player.getActivePotionEffects()) {
            int duration = potion.getDuration();
            if (duration != 0 && potion.getPotion() == Effects.UNLUCK && potion.getAmplifier() == -1) {
                KT = " [" + RED + StringUtils.ticksToElapsedTime(duration).replace(duration >= 200 ? "0:" : "0:0", "") + WHITE + "]";
                break;
            }
        }
        ITextComponent playerName = renderDonat.getValue() ? player.getDisplayName() : player.getName();
        if (offHandNBT != null) {
            String itemName = getCustomItemName(offHandStack);

            if (offHandNBT.getInt("tslevel") != 0) {
                sphere = " [" + GOLD + itemName + RED + " " + offHandNBT.getInt("tslevel") + "/3" + WHITE + "]";
            } else if (otobr_spheres.getValue() && offHandStack.getItem().getTranslationKey().contains("player_head")) {
                sphere = " [" + GOLD + itemName + WHITE + "]";
            } else if (otobr_talismans.getValue() && offHandStack.getItem().getTranslationKey().contains("totem_of_undying")) {
                sphere = " [" + GOLD + itemName + WHITE + "]";
            }
        }

        String health = PlayerUtil.isFuntime() && player.getHealthFixed() == 1000 ? "" : " [" + RED + player.getHealthFixed() + " HP" + WHITE + "]";
        String round_health = PlayerUtil.isFuntime() && player.getHealthFixed() == 1000 ? "" : " [" + RED + Math.round(player.getHealthFixed()) + " HP" + WHITE + "]";
        String friend = EvaWare.inst().friendManager().isFriend(player.getGameProfile().getName()) ? GREEN + " [F]" + WHITE : "";
        String bot = (AntiBot.getInstance().isBot(player) ? DARK_RED + " [BOT]" + WHITE : "");

        if (optimized().getValue()) {
            if (PlayerUtil.isConnectedToServer("spookytime")) {
                return new StringTextComponent("").appendString(playerName.getString() + sphere + round_health + friend + bot);
            } else {
                return new StringTextComponent("").appendString(playerName.getString() + sphere + health + friend + bot + KT);
            }
        } else {
            return playerName.deepCopy().appendString(sphere + round_health + friend + bot);
        }
    }

    private String getCustomItemName(ItemStack stack) {
        List<String> tooltipStrings = stack.getTooltip(mc.player,
                        mc.gameSettings.advancedItemTooltips ? ITooltipFlag.TooltipFlags.ADVANCED : ITooltipFlag.TooltipFlags.NORMAL
                ).stream()
                .map(ITextComponent::getString)
                .collect(Collectors.toList());

        Map<List<String>, String> patternToName = new HashMap<>();
        // Талисманы
        patternToName.put(List.of("-4 Max Health", "+15% Speed", "+3 Attack Damage"), "Талисман Грани");
        patternToName.put(List.of("-4 Max Health", "+5 Attack Damage"), "Талисман Дедала");
        patternToName.put(List.of("-2 Armor Hardness", "+2 Armor", "+2 Max Health"), "Талисман Тритона  ");
        patternToName.put(List.of("+2 Max Health", "+2 Armor", "+2 Attack Damage"), "Талисман Гармонии");
        patternToName.put(List.of("+6 Max Health", "+10% Attack Speed"), "Талисман Феникса");
        patternToName.put(List.of("-2 Armor Hardness", "-2 Armor", "-4 Max Health", "+6 Damage"), "Талисман Ехидны");
        patternToName.put(List.of("+2 Armor Hardness", "+2 Armor", "+4 Max Health", "+3 Damage"), "Крушитель");
        patternToName.put(List.of("+7 Attack Damage", "+10% Speed", "-4 Max Health"), "Каратель");


        // Сферы
        patternToName.put(List.of("+2 Armor", "-4 Max Health", "+15% Speed", "+3 Damage"), "Сфера Андромеды");
        patternToName.put(List.of("-10% Armor", "+10% Speed", "+25% Damage"), "Сфера Пандоры");
        patternToName.put(List.of("+3 Armor Hardness", "+2 Armor", "-15% Speed"), "Сфера Фрика");
        patternToName.put(List.of("-10% Speed", "+4 Damage"), "Сфера Аполлона");
        patternToName.put(List.of("+4 Max Health", "-15% Attack Speed", "+3 Damage"), "Сфера Астрея");
        patternToName.put(List.of("-15% Knockback Attack", "-15% Knockback Resistance", "+2 Armor"), "Сфера Осириса");
        patternToName.put(List.of("-2 Max Health", "+15% Attack Speed", "+3 Damage"), "Сфера Химеры");

        for (Map.Entry<List<String>, String> entry : patternToName.entrySet()) {
            List<String> pattern = entry.getKey();
            boolean allMatch = pattern.stream().allMatch(effect -> tooltipStrings.stream().anyMatch(s -> s.contains(effect)));

            if (allMatch) {
                return entry.getValue();
            }
        }
//        System.out.println("[Debug]" + tooltipStrings);
        return stack.getDisplayName().getString().replaceFirst("^\\[[^]]+]\\s*", "");
    }

    private void drawArmor(MatrixStack matrix, PlayerEntity player, float x, float y, float width, float fontHeight) {
        List<ItemStack> items = new ArrayList<>();
        if (!player.getHeldItemOffhand().isEmpty()) items.add(player.getHeldItemOffhand());
        for (ItemStack itemStack : player.getArmorInventoryList()) {
            if (!itemStack.isEmpty()) items.add(itemStack.copy());
        }
        if (!player.getHeldItemMainhand().isEmpty()) items.add(player.getHeldItemMainhand());

        float posX = x + width / 2F + (-items.size() * 5) - 1;
        float posY = y - 12;
        float stackSize = 8;

        for (ItemStack item : items) {
            if (item.isEmpty()) continue;
            GLUtil.startScale(posX + (stackSize / 2F), posY + (stackSize / 2F), 0.5F);
            drawItemStack(matrix, item, posX, posY, true);
            GLUtil.endScale();
            posX += (stackSize + 2);
        }
    }

    public void drawItemStack(MatrixStack matrix, ItemStack stack, double x, double y, boolean drawRect) {
        matrix.push();
        RenderSystem.translated(x, y, 0);
        if (drawRect) RectUtil.drawRect(matrix, 0, 0, 16, 16, black);
        mc.getItemRenderer().renderItemAndEffectIntoGUI(stack, 0, 0);
        if (stack.getCount() > 1) {
            RenderSystem.translated(0, 0, 200);
            mc.fontRenderer.drawString(matrix, String.valueOf(stack.getCount()), (float) (16 - mc.fontRenderer.getStringWidth(String.valueOf(stack.getCount()))), 8, 0xFFFFFF);
        }
        RenderSystem.translated(-x, -y, 0);
        matrix.pop();
    }

    private void drawTag(MatrixStack matrix, ITextComponent tagComponent, float centerX, float y, float nameWidth, float fontHeight, float scale) {
        RectUtil.drawRect(matrix, centerX - (nameWidth / 2F) - 1, y - 0.5F, nameWidth + 2, fontHeight + 1, black);
        font.drawTextComponent(matrix, tagComponent, centerX - nameWidth / 2F, y, -1, false, fontHeight);
    }

    private AxisAlignedBB getEntityBox(Entity entity, Vector3d vec) {
        Vector3d size = new Vector3d(entity.getBoundingBox().maxX - entity.getBoundingBox().minX,
                entity.getBoundingBox().maxY - entity.getBoundingBox().minY,
                entity.getBoundingBox().maxZ - entity.getBoundingBox().minZ);

        return new AxisAlignedBB(vec.x - size.x / 2f, vec.y,
                vec.z - size.z / 2f, vec.x + size.x / 2f,
                vec.y + size.y + (0.2F - (entity.isSneaking() ? 0.1F : 0.0F)),
                vec.z + size.z / 2f);
    }

    private boolean isValid(final Entity entity) {
        if (!entity.isAlive()) {
            return false;
        }
        if (mc.renderViewEntity != null && entity == mc.renderViewEntity && mc.gameSettings.getPointOfView().firstPerson()) {
            return false;
        }
        return isInView(entity) && (entity instanceof PlayerEntity || entity instanceof ItemEntity);
    }

    public boolean isInView(Entity entity) {
        if (mc.getRenderViewEntity() == null || mc.worldRenderer.getClippinghelper() == null) {
            return false;
        }
        return mc.worldRenderer.getClippinghelper().isBoundingBoxInFrustum(entity.getBoundingBox()) || entity.ignoreFrustumCheck;
    }

    private float getWidth(ITextComponent text) {
        return font.getWidth(text, fontSize.getValue());
    }
}
1748584364064.png

Вторая попытка выложить тему
 
Одобрите тему ,суки
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Играя с нурика, я заметил, что даже в нем талики отображаются чисто по их названию, из за чего типо могут просто поменять название и не понятно, что тал/сфера. Именно поэтому сливаю данную функцию. База - Excellent Upgrade.

ss снизу)

NameTags:
Expand Collapse Copy
package eva.ware.client.managers.module.impl.render;

import eva.ware.client.EvaWare;
import eva.ware.client.api.events.orbit.EventHandler;
import eva.ware.client.api.events.orbit.EventPriority;
import eva.ware.client.managers.component.impl.target.TargetComponent;
import eva.ware.client.managers.events.other.PacketEvent;
import eva.ware.client.managers.events.render.Render2DEvent;
import eva.ware.client.managers.events.render.RenderNameEvent;
import eva.ware.client.managers.module.Category;
import eva.ware.client.managers.module.Module;
import eva.ware.client.managers.module.ModuleInfo;
import eva.ware.client.managers.module.impl.combat.AntiBot;
import eva.ware.client.managers.module.impl.misc.Globals;
import eva.ware.client.managers.module.settings.impl.BooleanSetting;
import eva.ware.client.managers.module.settings.impl.MultiBooleanSetting;
import eva.ware.client.managers.module.settings.impl.SliderSetting;
import eva.ware.client.utils.other.Instance;
import eva.ware.client.utils.player.PlayerUtil;
import eva.ware.client.utils.render.color.ColorFormatting;
import eva.ware.client.utils.render.color.ColorUtil;
import eva.ware.client.utils.render.draw.GLUtil;
import eva.ware.client.utils.render.draw.Project;
import eva.ware.client.utils.render.draw.RectUtil;
import eva.ware.client.utils.render.draw.RenderUtil3D;
import eva.ware.client.utils.render.font.Font;
import eva.ware.client.utils.render.font.Fonts;
import eva.ware.common.impl.globals.ClientAPI;
import eva.ware.common.impl.globals.Converter;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.experimental.Accessors;
import lombok.experimental.FieldDefaults;
import net.minecraft.client.entity.player.AbstractClientPlayerEntity;
import net.minecraft.client.util.ITooltipFlag;
import net.minecraft.entity.Entity;
import net.minecraft.entity.MobEntity;
import net.minecraft.entity.item.ItemEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.network.IPacket;
import net.minecraft.network.play.server.SEntityStatusPacket;
import net.minecraft.potion.EffectInstance;
import net.minecraft.potion.Effects;
import net.minecraft.util.StringUtils;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.StringTextComponent;
import net.minecraft.util.text.TextFormatting;
import net.mojang.blaze3d.matrix.MatrixStack;
import net.mojang.blaze3d.systems.RenderSystem;
import org.joml.Vector2f;
import org.joml.Vector4f;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.stream.Collectors;

[USER=270918]@Getter[/USER]
@Accessors(fluent = true)
@FieldDefaults(level = AccessLevel.PRIVATE)
@ModuleInfo(name = "Nametags", category = Category.RENDER)
public class Nametags extends Module {
    public static Nametags getInstance() {
        return Instance.get(Nametags.class);
    }

    private final MultiBooleanSetting checks = new MultiBooleanSetting(this, "Элементы",
            BooleanSetting.of("Игроки", true),
            BooleanSetting.of("Предметы", false)
    );

    private final SliderSetting fontSize = new SliderSetting(this, "Размер шрифта", 8F, 6F, 12F, 0.1F);
    private final BooleanSetting optimized = new BooleanSetting(this, "Оптимизировать", true);
    private final BooleanSetting otobr_spheres = new BooleanSetting(this, "Отображать сферу", true);
    private final BooleanSetting otobr_talismans = new BooleanSetting(this, "Отображать талисман", true);
    private final BooleanSetting renderDonat = new BooleanSetting(this, "Отображать донат", true);
    private final BooleanSetting showArmor = new BooleanSetting(this, "Отображать броню", true);
    private final int black = ColorUtil.getColor(0, 128);
    private final Font font = Fonts.SF_MEDIUM;
    private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
    private final int timeTick = 600;

    [USER=1489798]@EventHandler[/USER]
    public void onRenderName(RenderNameEvent event) {
        if (event.getEntity() instanceof AbstractClientPlayerEntity) event.cancel();
    }

    [USER=1489798]@EventHandler[/USER]
    public void onPacket(PacketEvent e) {
        if (PlayerUtil.nullCheck()) return;
        IPacket<?> packet = e.getPacket();
        if (packet instanceof SEntityStatusPacket entityStatus) {
            Entity entity = entityStatus.getEntity(mc.world);
            if (entity instanceof PlayerEntity player && (entityStatus.getOpCode() == 2 || entityStatus.getOpCode() == 33)) {
                if (!(player.prevFallDistance > 3 && player.fallDistance == 0)) {
                    for (Entity ent : mc.world.getAllEntities()) {
                        if (ent instanceof MobEntity mob && mob.getLastAttackedEntity() == player && mob.getLastAttackedEntityTime() < 1000) {
                            return;
                        }
                    }
                    player.addPotionEffect(new EffectInstance(Effects.UNLUCK, timeTick, -1));
                }
            }
        }
    }

    @EventHandler(priority = EventPriority.LOWEST)
    public void onRender2D(Render2DEvent event) {
        float fontHeight = fontSize.getValue();

        TargetComponent.getTargets(128, this::isValid, false)
                .forEach(entity -> renderNametag(entity, event.getMatrix(), fontHeight));
        if (checks.getValue("Предметы")) {
            mc.world.loadedItemEntityList().forEach(entity -> renderNametag(entity, event.getMatrix(), fontHeight));
        }
    }

    private void renderNametag(Entity entity, MatrixStack matrix, float fontHeight) {
        Vector3d interpolated = RenderUtil3D.interpolate(entity, mc.getRenderPartialTicks());
        AxisAlignedBB aabb = getEntityBox(entity, interpolated);

        Vector2f min = new Vector2f(Float.MAX_VALUE, Float.MAX_VALUE);
        Vector2f max = new Vector2f(Float.MIN_VALUE, Float.MIN_VALUE);

        for (Vector3d vector : aabb.getCorners()) {
            Vector2f vec = Project.project2D(vector);
            if (vec.x != Float.MAX_VALUE && vec.y != Float.MAX_VALUE) {
                min.x = Math.min(min.x, vec.x);
                min.y = Math.min(min.y, vec.y);
                max.x = Math.max(max.x, vec.x);
                max.y = Math.max(max.y, vec.y);
            }
        }
        Vector4f position = new Vector4f(min.x, min.y, max.x, max.y);

        float x = position.x;
        float y = position.y - fontHeight;
        float width = position.z - x;
        float height = position.w - y;
        float centerX = x + (width / 2F);
        ITextComponent tagComponent = null;
        float nameWidth = 0;
        float scale = 0.5F;

        if (checks.getValue("Игроки") && entity instanceof PlayerEntity player) {
            tagComponent = createPlayerTagComponent(player);
            nameWidth = getWidth(tagComponent);

            if (showArmor().getValue()) {
                drawArmor(matrix, player, x, y, width, fontHeight);
            }
        } else if (checks.getValue("Предметы") && entity instanceof ItemEntity item) {
            tagComponent = new StringTextComponent("").append(item.getItem().getDisplayName());
            if (item.getItem().getCount() > 1) {
                String GRAY = ColorFormatting.getColor(TextFormatting.GRAY.getColor());
                tagComponent = tagComponent.deepCopy().appendString(GRAY + " " + item.getItem().getCount() + "x");
            }
            nameWidth = getWidth(tagComponent);
        }

        if (tagComponent != null) {
            drawTag(matrix, tagComponent, centerX, y, nameWidth, fontHeight, scale);

            if (checks.getValue("Игроки") && entity instanceof PlayerEntity player && Globals.getInstance().isEnabled()) {
                String client = ClientAPI.getClient(entity.getName().getString());
                if (client != null) {
                    String userImageURL = "https://rockstar.moscow/api/globals/" + client + ".png";
                    mc.getTextureManager().bindTexture(Converter.getResourceLocation(userImageURL));
                    float size = fontHeight + 1;
                    RectUtil.drawRect(matrix, centerX - nameWidth / 2F - size, y - 0.5f, size, size, -1, false, true);
                }
            }
        }
    }

    private ITextComponent createPlayerTagComponent(PlayerEntity player) {
        ItemStack offHandStack = player.getHeldItemOffhand();
        CompoundNBT offHandNBT = offHandStack.getTag();
        String RED = ColorFormatting.getColor(TextFormatting.RED.getColor());
        String GREEN = ColorFormatting.getColor(TextFormatting.GREEN.getColor());
        String DARK_RED = ColorFormatting.getColor(TextFormatting.DARK_RED.getColor());
        String GOLD = ColorFormatting.getColor(TextFormatting.GOLD.getColor());
        String WHITE = ColorFormatting.getColor(TextFormatting.WHITE.getColor());
        String sphere = "";
        String KT = "";
        for (EffectInstance potion : player.getActivePotionEffects()) {
            int duration = potion.getDuration();
            if (duration != 0 && potion.getPotion() == Effects.UNLUCK && potion.getAmplifier() == -1) {
                KT = " [" + RED + StringUtils.ticksToElapsedTime(duration).replace(duration >= 200 ? "0:" : "0:0", "") + WHITE + "]";
                break;
            }
        }
        ITextComponent playerName = renderDonat.getValue() ? player.getDisplayName() : player.getName();
        if (offHandNBT != null) {
            String itemName = getCustomItemName(offHandStack);

            if (offHandNBT.getInt("tslevel") != 0) {
                sphere = " [" + GOLD + itemName + RED + " " + offHandNBT.getInt("tslevel") + "/3" + WHITE + "]";
            } else if (otobr_spheres.getValue() && offHandStack.getItem().getTranslationKey().contains("player_head")) {
                sphere = " [" + GOLD + itemName + WHITE + "]";
            } else if (otobr_talismans.getValue() && offHandStack.getItem().getTranslationKey().contains("totem_of_undying")) {
                sphere = " [" + GOLD + itemName + WHITE + "]";
            }
        }

        String health = PlayerUtil.isFuntime() && player.getHealthFixed() == 1000 ? "" : " [" + RED + player.getHealthFixed() + " HP" + WHITE + "]";
        String round_health = PlayerUtil.isFuntime() && player.getHealthFixed() == 1000 ? "" : " [" + RED + Math.round(player.getHealthFixed()) + " HP" + WHITE + "]";
        String friend = EvaWare.inst().friendManager().isFriend(player.getGameProfile().getName()) ? GREEN + " [F]" + WHITE : "";
        String bot = (AntiBot.getInstance().isBot(player) ? DARK_RED + " [BOT]" + WHITE : "");

        if (optimized().getValue()) {
            if (PlayerUtil.isConnectedToServer("spookytime")) {
                return new StringTextComponent("").appendString(playerName.getString() + sphere + round_health + friend + bot);
            } else {
                return new StringTextComponent("").appendString(playerName.getString() + sphere + health + friend + bot + KT);
            }
        } else {
            return playerName.deepCopy().appendString(sphere + round_health + friend + bot);
        }
    }

    private String getCustomItemName(ItemStack stack) {
        List<String> tooltipStrings = stack.getTooltip(mc.player,
                        mc.gameSettings.advancedItemTooltips ? ITooltipFlag.TooltipFlags.ADVANCED : ITooltipFlag.TooltipFlags.NORMAL
                ).stream()
                .map(ITextComponent::getString)
                .collect(Collectors.toList());

        Map<List<String>, String> patternToName = new HashMap<>();
        // Талисманы
        patternToName.put(List.of("-4 Max Health", "+15% Speed", "+3 Attack Damage"), "Талисман Грани");
        patternToName.put(List.of("-4 Max Health", "+5 Attack Damage"), "Талисман Дедала");
        patternToName.put(List.of("-2 Armor Hardness", "+2 Armor", "+2 Max Health"), "Талисман Тритона  ");
        patternToName.put(List.of("+2 Max Health", "+2 Armor", "+2 Attack Damage"), "Талисман Гармонии");
        patternToName.put(List.of("+6 Max Health", "+10% Attack Speed"), "Талисман Феникса");
        patternToName.put(List.of("-2 Armor Hardness", "-2 Armor", "-4 Max Health", "+6 Damage"), "Талисман Ехидны");
        patternToName.put(List.of("+2 Armor Hardness", "+2 Armor", "+4 Max Health", "+3 Damage"), "Крушитель");
        patternToName.put(List.of("+7 Attack Damage", "+10% Speed", "-4 Max Health"), "Каратель");


        // Сферы
        patternToName.put(List.of("+2 Armor", "-4 Max Health", "+15% Speed", "+3 Damage"), "Сфера Андромеды");
        patternToName.put(List.of("-10% Armor", "+10% Speed", "+25% Damage"), "Сфера Пандоры");
        patternToName.put(List.of("+3 Armor Hardness", "+2 Armor", "-15% Speed"), "Сфера Фрика");
        patternToName.put(List.of("-10% Speed", "+4 Damage"), "Сфера Аполлона");
        patternToName.put(List.of("+4 Max Health", "-15% Attack Speed", "+3 Damage"), "Сфера Астрея");
        patternToName.put(List.of("-15% Knockback Attack", "-15% Knockback Resistance", "+2 Armor"), "Сфера Осириса");
        patternToName.put(List.of("-2 Max Health", "+15% Attack Speed", "+3 Damage"), "Сфера Химеры");

        for (Map.Entry<List<String>, String> entry : patternToName.entrySet()) {
            List<String> pattern = entry.getKey();
            boolean allMatch = pattern.stream().allMatch(effect -> tooltipStrings.stream().anyMatch(s -> s.contains(effect)));

            if (allMatch) {
                return entry.getValue();
            }
        }
//        System.out.println("[Debug]" + tooltipStrings);
        return stack.getDisplayName().getString().replaceFirst("^\\[[^]]+]\\s*", "");
    }

    private void drawArmor(MatrixStack matrix, PlayerEntity player, float x, float y, float width, float fontHeight) {
        List<ItemStack> items = new ArrayList<>();
        if (!player.getHeldItemOffhand().isEmpty()) items.add(player.getHeldItemOffhand());
        for (ItemStack itemStack : player.getArmorInventoryList()) {
            if (!itemStack.isEmpty()) items.add(itemStack.copy());
        }
        if (!player.getHeldItemMainhand().isEmpty()) items.add(player.getHeldItemMainhand());

        float posX = x + width / 2F + (-items.size() * 5) - 1;
        float posY = y - 12;
        float stackSize = 8;

        for (ItemStack item : items) {
            if (item.isEmpty()) continue;
            GLUtil.startScale(posX + (stackSize / 2F), posY + (stackSize / 2F), 0.5F);
            drawItemStack(matrix, item, posX, posY, true);
            GLUtil.endScale();
            posX += (stackSize + 2);
        }
    }

    public void drawItemStack(MatrixStack matrix, ItemStack stack, double x, double y, boolean drawRect) {
        matrix.push();
        RenderSystem.translated(x, y, 0);
        if (drawRect) RectUtil.drawRect(matrix, 0, 0, 16, 16, black);
        mc.getItemRenderer().renderItemAndEffectIntoGUI(stack, 0, 0);
        if (stack.getCount() > 1) {
            RenderSystem.translated(0, 0, 200);
            mc.fontRenderer.drawString(matrix, String.valueOf(stack.getCount()), (float) (16 - mc.fontRenderer.getStringWidth(String.valueOf(stack.getCount()))), 8, 0xFFFFFF);
        }
        RenderSystem.translated(-x, -y, 0);
        matrix.pop();
    }

    private void drawTag(MatrixStack matrix, ITextComponent tagComponent, float centerX, float y, float nameWidth, float fontHeight, float scale) {
        RectUtil.drawRect(matrix, centerX - (nameWidth / 2F) - 1, y - 0.5F, nameWidth + 2, fontHeight + 1, black);
        font.drawTextComponent(matrix, tagComponent, centerX - nameWidth / 2F, y, -1, false, fontHeight);
    }

    private AxisAlignedBB getEntityBox(Entity entity, Vector3d vec) {
        Vector3d size = new Vector3d(entity.getBoundingBox().maxX - entity.getBoundingBox().minX,
                entity.getBoundingBox().maxY - entity.getBoundingBox().minY,
                entity.getBoundingBox().maxZ - entity.getBoundingBox().minZ);

        return new AxisAlignedBB(vec.x - size.x / 2f, vec.y,
                vec.z - size.z / 2f, vec.x + size.x / 2f,
                vec.y + size.y + (0.2F - (entity.isSneaking() ? 0.1F : 0.0F)),
                vec.z + size.z / 2f);
    }

    private boolean isValid(final Entity entity) {
        if (!entity.isAlive()) {
            return false;
        }
        if (mc.renderViewEntity != null && entity == mc.renderViewEntity && mc.gameSettings.getPointOfView().firstPerson()) {
            return false;
        }
        return isInView(entity) && (entity instanceof PlayerEntity || entity instanceof ItemEntity);
    }

    public boolean isInView(Entity entity) {
        if (mc.getRenderViewEntity() == null || mc.worldRenderer.getClippinghelper() == null) {
            return false;
        }
        return mc.worldRenderer.getClippinghelper().isBoundingBoxInFrustum(entity.getBoundingBox()) || entity.ignoreFrustumCheck;
    }

    private float getWidth(ITextComponent text) {
        return font.getWidth(text, fontSize.getValue());
    }
}
Посмотреть вложение 307512
Вторая попытка выложить тему
Имба брат работает 😝☢️☢️🌟 Залетел на варп пвп и вижу топера и показало что у него тал тритона🤑🤑Кинул ему дуэль он принял😀😀А оказалось что это тал круша😊😊😅🥺
 
Играя с нурика, я заметил, что даже в нем талики отображаются чисто по их названию, из за чего типо могут просто поменять название и не понятно, что тал/сфера. Именно поэтому сливаю данную функцию. База - Excellent Upgrade.

ss снизу)

NameTags:
Expand Collapse Copy
package eva.ware.client.managers.module.impl.render;

import eva.ware.client.EvaWare;
import eva.ware.client.api.events.orbit.EventHandler;
import eva.ware.client.api.events.orbit.EventPriority;
import eva.ware.client.managers.component.impl.target.TargetComponent;
import eva.ware.client.managers.events.other.PacketEvent;
import eva.ware.client.managers.events.render.Render2DEvent;
import eva.ware.client.managers.events.render.RenderNameEvent;
import eva.ware.client.managers.module.Category;
import eva.ware.client.managers.module.Module;
import eva.ware.client.managers.module.ModuleInfo;
import eva.ware.client.managers.module.impl.combat.AntiBot;
import eva.ware.client.managers.module.impl.misc.Globals;
import eva.ware.client.managers.module.settings.impl.BooleanSetting;
import eva.ware.client.managers.module.settings.impl.MultiBooleanSetting;
import eva.ware.client.managers.module.settings.impl.SliderSetting;
import eva.ware.client.utils.other.Instance;
import eva.ware.client.utils.player.PlayerUtil;
import eva.ware.client.utils.render.color.ColorFormatting;
import eva.ware.client.utils.render.color.ColorUtil;
import eva.ware.client.utils.render.draw.GLUtil;
import eva.ware.client.utils.render.draw.Project;
import eva.ware.client.utils.render.draw.RectUtil;
import eva.ware.client.utils.render.draw.RenderUtil3D;
import eva.ware.client.utils.render.font.Font;
import eva.ware.client.utils.render.font.Fonts;
import eva.ware.common.impl.globals.ClientAPI;
import eva.ware.common.impl.globals.Converter;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.experimental.Accessors;
import lombok.experimental.FieldDefaults;
import net.minecraft.client.entity.player.AbstractClientPlayerEntity;
import net.minecraft.client.util.ITooltipFlag;
import net.minecraft.entity.Entity;
import net.minecraft.entity.MobEntity;
import net.minecraft.entity.item.ItemEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.network.IPacket;
import net.minecraft.network.play.server.SEntityStatusPacket;
import net.minecraft.potion.EffectInstance;
import net.minecraft.potion.Effects;
import net.minecraft.util.StringUtils;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.StringTextComponent;
import net.minecraft.util.text.TextFormatting;
import net.mojang.blaze3d.matrix.MatrixStack;
import net.mojang.blaze3d.systems.RenderSystem;
import org.joml.Vector2f;
import org.joml.Vector4f;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.stream.Collectors;

[USER=270918]@Getter[/USER]
@Accessors(fluent = true)
@FieldDefaults(level = AccessLevel.PRIVATE)
@ModuleInfo(name = "Nametags", category = Category.RENDER)
public class Nametags extends Module {
    public static Nametags getInstance() {
        return Instance.get(Nametags.class);
    }

    private final MultiBooleanSetting checks = new MultiBooleanSetting(this, "Элементы",
            BooleanSetting.of("Игроки", true),
            BooleanSetting.of("Предметы", false)
    );

    private final SliderSetting fontSize = new SliderSetting(this, "Размер шрифта", 8F, 6F, 12F, 0.1F);
    private final BooleanSetting optimized = new BooleanSetting(this, "Оптимизировать", true);
    private final BooleanSetting otobr_spheres = new BooleanSetting(this, "Отображать сферу", true);
    private final BooleanSetting otobr_talismans = new BooleanSetting(this, "Отображать талисман", true);
    private final BooleanSetting renderDonat = new BooleanSetting(this, "Отображать донат", true);
    private final BooleanSetting showArmor = new BooleanSetting(this, "Отображать броню", true);
    private final int black = ColorUtil.getColor(0, 128);
    private final Font font = Fonts.SF_MEDIUM;
    private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
    private final int timeTick = 600;

    [USER=1489798]@EventHandler[/USER]
    public void onRenderName(RenderNameEvent event) {
        if (event.getEntity() instanceof AbstractClientPlayerEntity) event.cancel();
    }

    [USER=1489798]@EventHandler[/USER]
    public void onPacket(PacketEvent e) {
        if (PlayerUtil.nullCheck()) return;
        IPacket<?> packet = e.getPacket();
        if (packet instanceof SEntityStatusPacket entityStatus) {
            Entity entity = entityStatus.getEntity(mc.world);
            if (entity instanceof PlayerEntity player && (entityStatus.getOpCode() == 2 || entityStatus.getOpCode() == 33)) {
                if (!(player.prevFallDistance > 3 && player.fallDistance == 0)) {
                    for (Entity ent : mc.world.getAllEntities()) {
                        if (ent instanceof MobEntity mob && mob.getLastAttackedEntity() == player && mob.getLastAttackedEntityTime() < 1000) {
                            return;
                        }
                    }
                    player.addPotionEffect(new EffectInstance(Effects.UNLUCK, timeTick, -1));
                }
            }
        }
    }

    @EventHandler(priority = EventPriority.LOWEST)
    public void onRender2D(Render2DEvent event) {
        float fontHeight = fontSize.getValue();

        TargetComponent.getTargets(128, this::isValid, false)
                .forEach(entity -> renderNametag(entity, event.getMatrix(), fontHeight));
        if (checks.getValue("Предметы")) {
            mc.world.loadedItemEntityList().forEach(entity -> renderNametag(entity, event.getMatrix(), fontHeight));
        }
    }

    private void renderNametag(Entity entity, MatrixStack matrix, float fontHeight) {
        Vector3d interpolated = RenderUtil3D.interpolate(entity, mc.getRenderPartialTicks());
        AxisAlignedBB aabb = getEntityBox(entity, interpolated);

        Vector2f min = new Vector2f(Float.MAX_VALUE, Float.MAX_VALUE);
        Vector2f max = new Vector2f(Float.MIN_VALUE, Float.MIN_VALUE);

        for (Vector3d vector : aabb.getCorners()) {
            Vector2f vec = Project.project2D(vector);
            if (vec.x != Float.MAX_VALUE && vec.y != Float.MAX_VALUE) {
                min.x = Math.min(min.x, vec.x);
                min.y = Math.min(min.y, vec.y);
                max.x = Math.max(max.x, vec.x);
                max.y = Math.max(max.y, vec.y);
            }
        }
        Vector4f position = new Vector4f(min.x, min.y, max.x, max.y);

        float x = position.x;
        float y = position.y - fontHeight;
        float width = position.z - x;
        float height = position.w - y;
        float centerX = x + (width / 2F);
        ITextComponent tagComponent = null;
        float nameWidth = 0;
        float scale = 0.5F;

        if (checks.getValue("Игроки") && entity instanceof PlayerEntity player) {
            tagComponent = createPlayerTagComponent(player);
            nameWidth = getWidth(tagComponent);

            if (showArmor().getValue()) {
                drawArmor(matrix, player, x, y, width, fontHeight);
            }
        } else if (checks.getValue("Предметы") && entity instanceof ItemEntity item) {
            tagComponent = new StringTextComponent("").append(item.getItem().getDisplayName());
            if (item.getItem().getCount() > 1) {
                String GRAY = ColorFormatting.getColor(TextFormatting.GRAY.getColor());
                tagComponent = tagComponent.deepCopy().appendString(GRAY + " " + item.getItem().getCount() + "x");
            }
            nameWidth = getWidth(tagComponent);
        }

        if (tagComponent != null) {
            drawTag(matrix, tagComponent, centerX, y, nameWidth, fontHeight, scale);

            if (checks.getValue("Игроки") && entity instanceof PlayerEntity player && Globals.getInstance().isEnabled()) {
                String client = ClientAPI.getClient(entity.getName().getString());
                if (client != null) {
                    String userImageURL = "https://rockstar.moscow/api/globals/" + client + ".png";
                    mc.getTextureManager().bindTexture(Converter.getResourceLocation(userImageURL));
                    float size = fontHeight + 1;
                    RectUtil.drawRect(matrix, centerX - nameWidth / 2F - size, y - 0.5f, size, size, -1, false, true);
                }
            }
        }
    }

    private ITextComponent createPlayerTagComponent(PlayerEntity player) {
        ItemStack offHandStack = player.getHeldItemOffhand();
        CompoundNBT offHandNBT = offHandStack.getTag();
        String RED = ColorFormatting.getColor(TextFormatting.RED.getColor());
        String GREEN = ColorFormatting.getColor(TextFormatting.GREEN.getColor());
        String DARK_RED = ColorFormatting.getColor(TextFormatting.DARK_RED.getColor());
        String GOLD = ColorFormatting.getColor(TextFormatting.GOLD.getColor());
        String WHITE = ColorFormatting.getColor(TextFormatting.WHITE.getColor());
        String sphere = "";
        String KT = "";
        for (EffectInstance potion : player.getActivePotionEffects()) {
            int duration = potion.getDuration();
            if (duration != 0 && potion.getPotion() == Effects.UNLUCK && potion.getAmplifier() == -1) {
                KT = " [" + RED + StringUtils.ticksToElapsedTime(duration).replace(duration >= 200 ? "0:" : "0:0", "") + WHITE + "]";
                break;
            }
        }
        ITextComponent playerName = renderDonat.getValue() ? player.getDisplayName() : player.getName();
        if (offHandNBT != null) {
            String itemName = getCustomItemName(offHandStack);

            if (offHandNBT.getInt("tslevel") != 0) {
                sphere = " [" + GOLD + itemName + RED + " " + offHandNBT.getInt("tslevel") + "/3" + WHITE + "]";
            } else if (otobr_spheres.getValue() && offHandStack.getItem().getTranslationKey().contains("player_head")) {
                sphere = " [" + GOLD + itemName + WHITE + "]";
            } else if (otobr_talismans.getValue() && offHandStack.getItem().getTranslationKey().contains("totem_of_undying")) {
                sphere = " [" + GOLD + itemName + WHITE + "]";
            }
        }

        String health = PlayerUtil.isFuntime() && player.getHealthFixed() == 1000 ? "" : " [" + RED + player.getHealthFixed() + " HP" + WHITE + "]";
        String round_health = PlayerUtil.isFuntime() && player.getHealthFixed() == 1000 ? "" : " [" + RED + Math.round(player.getHealthFixed()) + " HP" + WHITE + "]";
        String friend = EvaWare.inst().friendManager().isFriend(player.getGameProfile().getName()) ? GREEN + " [F]" + WHITE : "";
        String bot = (AntiBot.getInstance().isBot(player) ? DARK_RED + " [BOT]" + WHITE : "");

        if (optimized().getValue()) {
            if (PlayerUtil.isConnectedToServer("spookytime")) {
                return new StringTextComponent("").appendString(playerName.getString() + sphere + round_health + friend + bot);
            } else {
                return new StringTextComponent("").appendString(playerName.getString() + sphere + health + friend + bot + KT);
            }
        } else {
            return playerName.deepCopy().appendString(sphere + round_health + friend + bot);
        }
    }

    private String getCustomItemName(ItemStack stack) {
        List<String> tooltipStrings = stack.getTooltip(mc.player,
                        mc.gameSettings.advancedItemTooltips ? ITooltipFlag.TooltipFlags.ADVANCED : ITooltipFlag.TooltipFlags.NORMAL
                ).stream()
                .map(ITextComponent::getString)
                .collect(Collectors.toList());

        Map<List<String>, String> patternToName = new HashMap<>();
        // Талисманы
        patternToName.put(List.of("-4 Max Health", "+15% Speed", "+3 Attack Damage"), "Талисман Грани");
        patternToName.put(List.of("-4 Max Health", "+5 Attack Damage"), "Талисман Дедала");
        patternToName.put(List.of("-2 Armor Hardness", "+2 Armor", "+2 Max Health"), "Талисман Тритона  ");
        patternToName.put(List.of("+2 Max Health", "+2 Armor", "+2 Attack Damage"), "Талисман Гармонии");
        patternToName.put(List.of("+6 Max Health", "+10% Attack Speed"), "Талисман Феникса");
        patternToName.put(List.of("-2 Armor Hardness", "-2 Armor", "-4 Max Health", "+6 Damage"), "Талисман Ехидны");
        patternToName.put(List.of("+2 Armor Hardness", "+2 Armor", "+4 Max Health", "+3 Damage"), "Крушитель");
        patternToName.put(List.of("+7 Attack Damage", "+10% Speed", "-4 Max Health"), "Каратель");


        // Сферы
        patternToName.put(List.of("+2 Armor", "-4 Max Health", "+15% Speed", "+3 Damage"), "Сфера Андромеды");
        patternToName.put(List.of("-10% Armor", "+10% Speed", "+25% Damage"), "Сфера Пандоры");
        patternToName.put(List.of("+3 Armor Hardness", "+2 Armor", "-15% Speed"), "Сфера Фрика");
        patternToName.put(List.of("-10% Speed", "+4 Damage"), "Сфера Аполлона");
        patternToName.put(List.of("+4 Max Health", "-15% Attack Speed", "+3 Damage"), "Сфера Астрея");
        patternToName.put(List.of("-15% Knockback Attack", "-15% Knockback Resistance", "+2 Armor"), "Сфера Осириса");
        patternToName.put(List.of("-2 Max Health", "+15% Attack Speed", "+3 Damage"), "Сфера Химеры");

        for (Map.Entry<List<String>, String> entry : patternToName.entrySet()) {
            List<String> pattern = entry.getKey();
            boolean allMatch = pattern.stream().allMatch(effect -> tooltipStrings.stream().anyMatch(s -> s.contains(effect)));

            if (allMatch) {
                return entry.getValue();
            }
        }
//        System.out.println("[Debug]" + tooltipStrings);
        return stack.getDisplayName().getString().replaceFirst("^\\[[^]]+]\\s*", "");
    }

    private void drawArmor(MatrixStack matrix, PlayerEntity player, float x, float y, float width, float fontHeight) {
        List<ItemStack> items = new ArrayList<>();
        if (!player.getHeldItemOffhand().isEmpty()) items.add(player.getHeldItemOffhand());
        for (ItemStack itemStack : player.getArmorInventoryList()) {
            if (!itemStack.isEmpty()) items.add(itemStack.copy());
        }
        if (!player.getHeldItemMainhand().isEmpty()) items.add(player.getHeldItemMainhand());

        float posX = x + width / 2F + (-items.size() * 5) - 1;
        float posY = y - 12;
        float stackSize = 8;

        for (ItemStack item : items) {
            if (item.isEmpty()) continue;
            GLUtil.startScale(posX + (stackSize / 2F), posY + (stackSize / 2F), 0.5F);
            drawItemStack(matrix, item, posX, posY, true);
            GLUtil.endScale();
            posX += (stackSize + 2);
        }
    }

    public void drawItemStack(MatrixStack matrix, ItemStack stack, double x, double y, boolean drawRect) {
        matrix.push();
        RenderSystem.translated(x, y, 0);
        if (drawRect) RectUtil.drawRect(matrix, 0, 0, 16, 16, black);
        mc.getItemRenderer().renderItemAndEffectIntoGUI(stack, 0, 0);
        if (stack.getCount() > 1) {
            RenderSystem.translated(0, 0, 200);
            mc.fontRenderer.drawString(matrix, String.valueOf(stack.getCount()), (float) (16 - mc.fontRenderer.getStringWidth(String.valueOf(stack.getCount()))), 8, 0xFFFFFF);
        }
        RenderSystem.translated(-x, -y, 0);
        matrix.pop();
    }

    private void drawTag(MatrixStack matrix, ITextComponent tagComponent, float centerX, float y, float nameWidth, float fontHeight, float scale) {
        RectUtil.drawRect(matrix, centerX - (nameWidth / 2F) - 1, y - 0.5F, nameWidth + 2, fontHeight + 1, black);
        font.drawTextComponent(matrix, tagComponent, centerX - nameWidth / 2F, y, -1, false, fontHeight);
    }

    private AxisAlignedBB getEntityBox(Entity entity, Vector3d vec) {
        Vector3d size = new Vector3d(entity.getBoundingBox().maxX - entity.getBoundingBox().minX,
                entity.getBoundingBox().maxY - entity.getBoundingBox().minY,
                entity.getBoundingBox().maxZ - entity.getBoundingBox().minZ);

        return new AxisAlignedBB(vec.x - size.x / 2f, vec.y,
                vec.z - size.z / 2f, vec.x + size.x / 2f,
                vec.y + size.y + (0.2F - (entity.isSneaking() ? 0.1F : 0.0F)),
                vec.z + size.z / 2f);
    }

    private boolean isValid(final Entity entity) {
        if (!entity.isAlive()) {
            return false;
        }
        if (mc.renderViewEntity != null && entity == mc.renderViewEntity && mc.gameSettings.getPointOfView().firstPerson()) {
            return false;
        }
        return isInView(entity) && (entity instanceof PlayerEntity || entity instanceof ItemEntity);
    }

    public boolean isInView(Entity entity) {
        if (mc.getRenderViewEntity() == null || mc.worldRenderer.getClippinghelper() == null) {
            return false;
        }
        return mc.worldRenderer.getClippinghelper().isBoundingBoxInFrustum(entity.getBoundingBox()) || entity.ignoreFrustumCheck;
    }

    private float getWidth(ITextComponent text) {
        return font.getWidth(text, fontSize.getValue());
    }
}
Посмотреть вложение 307512
Вторая попытка выложить тему
так это легко сделать, смысл форум засирать
 
Играя с нурика, я заметил, что даже в нем талики отображаются чисто по их названию, из за чего типо могут просто поменять название и не понятно, что тал/сфера. Именно поэтому сливаю данную функцию. База - Excellent Upgrade.

ss снизу)

NameTags:
Expand Collapse Copy
package eva.ware.client.managers.module.impl.render;

import eva.ware.client.EvaWare;
import eva.ware.client.api.events.orbit.EventHandler;
import eva.ware.client.api.events.orbit.EventPriority;
import eva.ware.client.managers.component.impl.target.TargetComponent;
import eva.ware.client.managers.events.other.PacketEvent;
import eva.ware.client.managers.events.render.Render2DEvent;
import eva.ware.client.managers.events.render.RenderNameEvent;
import eva.ware.client.managers.module.Category;
import eva.ware.client.managers.module.Module;
import eva.ware.client.managers.module.ModuleInfo;
import eva.ware.client.managers.module.impl.combat.AntiBot;
import eva.ware.client.managers.module.impl.misc.Globals;
import eva.ware.client.managers.module.settings.impl.BooleanSetting;
import eva.ware.client.managers.module.settings.impl.MultiBooleanSetting;
import eva.ware.client.managers.module.settings.impl.SliderSetting;
import eva.ware.client.utils.other.Instance;
import eva.ware.client.utils.player.PlayerUtil;
import eva.ware.client.utils.render.color.ColorFormatting;
import eva.ware.client.utils.render.color.ColorUtil;
import eva.ware.client.utils.render.draw.GLUtil;
import eva.ware.client.utils.render.draw.Project;
import eva.ware.client.utils.render.draw.RectUtil;
import eva.ware.client.utils.render.draw.RenderUtil3D;
import eva.ware.client.utils.render.font.Font;
import eva.ware.client.utils.render.font.Fonts;
import eva.ware.common.impl.globals.ClientAPI;
import eva.ware.common.impl.globals.Converter;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.experimental.Accessors;
import lombok.experimental.FieldDefaults;
import net.minecraft.client.entity.player.AbstractClientPlayerEntity;
import net.minecraft.client.util.ITooltipFlag;
import net.minecraft.entity.Entity;
import net.minecraft.entity.MobEntity;
import net.minecraft.entity.item.ItemEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.network.IPacket;
import net.minecraft.network.play.server.SEntityStatusPacket;
import net.minecraft.potion.EffectInstance;
import net.minecraft.potion.Effects;
import net.minecraft.util.StringUtils;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.StringTextComponent;
import net.minecraft.util.text.TextFormatting;
import net.mojang.blaze3d.matrix.MatrixStack;
import net.mojang.blaze3d.systems.RenderSystem;
import org.joml.Vector2f;
import org.joml.Vector4f;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.stream.Collectors;

[USER=270918]@Getter[/USER]
@Accessors(fluent = true)
@FieldDefaults(level = AccessLevel.PRIVATE)
@ModuleInfo(name = "Nametags", category = Category.RENDER)
public class Nametags extends Module {
    public static Nametags getInstance() {
        return Instance.get(Nametags.class);
    }

    private final MultiBooleanSetting checks = new MultiBooleanSetting(this, "Элементы",
            BooleanSetting.of("Игроки", true),
            BooleanSetting.of("Предметы", false)
    );

    private final SliderSetting fontSize = new SliderSetting(this, "Размер шрифта", 8F, 6F, 12F, 0.1F);
    private final BooleanSetting optimized = new BooleanSetting(this, "Оптимизировать", true);
    private final BooleanSetting otobr_spheres = new BooleanSetting(this, "Отображать сферу", true);
    private final BooleanSetting otobr_talismans = new BooleanSetting(this, "Отображать талисман", true);
    private final BooleanSetting renderDonat = new BooleanSetting(this, "Отображать донат", true);
    private final BooleanSetting showArmor = new BooleanSetting(this, "Отображать броню", true);
    private final int black = ColorUtil.getColor(0, 128);
    private final Font font = Fonts.SF_MEDIUM;
    private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
    private final int timeTick = 600;

    [USER=1489798]@EventHandler[/USER]
    public void onRenderName(RenderNameEvent event) {
        if (event.getEntity() instanceof AbstractClientPlayerEntity) event.cancel();
    }

    [USER=1489798]@EventHandler[/USER]
    public void onPacket(PacketEvent e) {
        if (PlayerUtil.nullCheck()) return;
        IPacket<?> packet = e.getPacket();
        if (packet instanceof SEntityStatusPacket entityStatus) {
            Entity entity = entityStatus.getEntity(mc.world);
            if (entity instanceof PlayerEntity player && (entityStatus.getOpCode() == 2 || entityStatus.getOpCode() == 33)) {
                if (!(player.prevFallDistance > 3 && player.fallDistance == 0)) {
                    for (Entity ent : mc.world.getAllEntities()) {
                        if (ent instanceof MobEntity mob && mob.getLastAttackedEntity() == player && mob.getLastAttackedEntityTime() < 1000) {
                            return;
                        }
                    }
                    player.addPotionEffect(new EffectInstance(Effects.UNLUCK, timeTick, -1));
                }
            }
        }
    }

    @EventHandler(priority = EventPriority.LOWEST)
    public void onRender2D(Render2DEvent event) {
        float fontHeight = fontSize.getValue();

        TargetComponent.getTargets(128, this::isValid, false)
                .forEach(entity -> renderNametag(entity, event.getMatrix(), fontHeight));
        if (checks.getValue("Предметы")) {
            mc.world.loadedItemEntityList().forEach(entity -> renderNametag(entity, event.getMatrix(), fontHeight));
        }
    }

    private void renderNametag(Entity entity, MatrixStack matrix, float fontHeight) {
        Vector3d interpolated = RenderUtil3D.interpolate(entity, mc.getRenderPartialTicks());
        AxisAlignedBB aabb = getEntityBox(entity, interpolated);

        Vector2f min = new Vector2f(Float.MAX_VALUE, Float.MAX_VALUE);
        Vector2f max = new Vector2f(Float.MIN_VALUE, Float.MIN_VALUE);

        for (Vector3d vector : aabb.getCorners()) {
            Vector2f vec = Project.project2D(vector);
            if (vec.x != Float.MAX_VALUE && vec.y != Float.MAX_VALUE) {
                min.x = Math.min(min.x, vec.x);
                min.y = Math.min(min.y, vec.y);
                max.x = Math.max(max.x, vec.x);
                max.y = Math.max(max.y, vec.y);
            }
        }
        Vector4f position = new Vector4f(min.x, min.y, max.x, max.y);

        float x = position.x;
        float y = position.y - fontHeight;
        float width = position.z - x;
        float height = position.w - y;
        float centerX = x + (width / 2F);
        ITextComponent tagComponent = null;
        float nameWidth = 0;
        float scale = 0.5F;

        if (checks.getValue("Игроки") && entity instanceof PlayerEntity player) {
            tagComponent = createPlayerTagComponent(player);
            nameWidth = getWidth(tagComponent);

            if (showArmor().getValue()) {
                drawArmor(matrix, player, x, y, width, fontHeight);
            }
        } else if (checks.getValue("Предметы") && entity instanceof ItemEntity item) {
            tagComponent = new StringTextComponent("").append(item.getItem().getDisplayName());
            if (item.getItem().getCount() > 1) {
                String GRAY = ColorFormatting.getColor(TextFormatting.GRAY.getColor());
                tagComponent = tagComponent.deepCopy().appendString(GRAY + " " + item.getItem().getCount() + "x");
            }
            nameWidth = getWidth(tagComponent);
        }

        if (tagComponent != null) {
            drawTag(matrix, tagComponent, centerX, y, nameWidth, fontHeight, scale);

            if (checks.getValue("Игроки") && entity instanceof PlayerEntity player && Globals.getInstance().isEnabled()) {
                String client = ClientAPI.getClient(entity.getName().getString());
                if (client != null) {
                    String userImageURL = "https://rockstar.moscow/api/globals/" + client + ".png";
                    mc.getTextureManager().bindTexture(Converter.getResourceLocation(userImageURL));
                    float size = fontHeight + 1;
                    RectUtil.drawRect(matrix, centerX - nameWidth / 2F - size, y - 0.5f, size, size, -1, false, true);
                }
            }
        }
    }

    private ITextComponent createPlayerTagComponent(PlayerEntity player) {
        ItemStack offHandStack = player.getHeldItemOffhand();
        CompoundNBT offHandNBT = offHandStack.getTag();
        String RED = ColorFormatting.getColor(TextFormatting.RED.getColor());
        String GREEN = ColorFormatting.getColor(TextFormatting.GREEN.getColor());
        String DARK_RED = ColorFormatting.getColor(TextFormatting.DARK_RED.getColor());
        String GOLD = ColorFormatting.getColor(TextFormatting.GOLD.getColor());
        String WHITE = ColorFormatting.getColor(TextFormatting.WHITE.getColor());
        String sphere = "";
        String KT = "";
        for (EffectInstance potion : player.getActivePotionEffects()) {
            int duration = potion.getDuration();
            if (duration != 0 && potion.getPotion() == Effects.UNLUCK && potion.getAmplifier() == -1) {
                KT = " [" + RED + StringUtils.ticksToElapsedTime(duration).replace(duration >= 200 ? "0:" : "0:0", "") + WHITE + "]";
                break;
            }
        }
        ITextComponent playerName = renderDonat.getValue() ? player.getDisplayName() : player.getName();
        if (offHandNBT != null) {
            String itemName = getCustomItemName(offHandStack);

            if (offHandNBT.getInt("tslevel") != 0) {
                sphere = " [" + GOLD + itemName + RED + " " + offHandNBT.getInt("tslevel") + "/3" + WHITE + "]";
            } else if (otobr_spheres.getValue() && offHandStack.getItem().getTranslationKey().contains("player_head")) {
                sphere = " [" + GOLD + itemName + WHITE + "]";
            } else if (otobr_talismans.getValue() && offHandStack.getItem().getTranslationKey().contains("totem_of_undying")) {
                sphere = " [" + GOLD + itemName + WHITE + "]";
            }
        }

        String health = PlayerUtil.isFuntime() && player.getHealthFixed() == 1000 ? "" : " [" + RED + player.getHealthFixed() + " HP" + WHITE + "]";
        String round_health = PlayerUtil.isFuntime() && player.getHealthFixed() == 1000 ? "" : " [" + RED + Math.round(player.getHealthFixed()) + " HP" + WHITE + "]";
        String friend = EvaWare.inst().friendManager().isFriend(player.getGameProfile().getName()) ? GREEN + " [F]" + WHITE : "";
        String bot = (AntiBot.getInstance().isBot(player) ? DARK_RED + " [BOT]" + WHITE : "");

        if (optimized().getValue()) {
            if (PlayerUtil.isConnectedToServer("spookytime")) {
                return new StringTextComponent("").appendString(playerName.getString() + sphere + round_health + friend + bot);
            } else {
                return new StringTextComponent("").appendString(playerName.getString() + sphere + health + friend + bot + KT);
            }
        } else {
            return playerName.deepCopy().appendString(sphere + round_health + friend + bot);
        }
    }

    private String getCustomItemName(ItemStack stack) {
        List<String> tooltipStrings = stack.getTooltip(mc.player,
                        mc.gameSettings.advancedItemTooltips ? ITooltipFlag.TooltipFlags.ADVANCED : ITooltipFlag.TooltipFlags.NORMAL
                ).stream()
                .map(ITextComponent::getString)
                .collect(Collectors.toList());

        Map<List<String>, String> patternToName = new HashMap<>();
        // Талисманы
        patternToName.put(List.of("-4 Max Health", "+15% Speed", "+3 Attack Damage"), "Талисман Грани");
        patternToName.put(List.of("-4 Max Health", "+5 Attack Damage"), "Талисман Дедала");
        patternToName.put(List.of("-2 Armor Hardness", "+2 Armor", "+2 Max Health"), "Талисман Тритона  ");
        patternToName.put(List.of("+2 Max Health", "+2 Armor", "+2 Attack Damage"), "Талисман Гармонии");
        patternToName.put(List.of("+6 Max Health", "+10% Attack Speed"), "Талисман Феникса");
        patternToName.put(List.of("-2 Armor Hardness", "-2 Armor", "-4 Max Health", "+6 Damage"), "Талисман Ехидны");
        patternToName.put(List.of("+2 Armor Hardness", "+2 Armor", "+4 Max Health", "+3 Damage"), "Крушитель");
        patternToName.put(List.of("+7 Attack Damage", "+10% Speed", "-4 Max Health"), "Каратель");


        // Сферы
        patternToName.put(List.of("+2 Armor", "-4 Max Health", "+15% Speed", "+3 Damage"), "Сфера Андромеды");
        patternToName.put(List.of("-10% Armor", "+10% Speed", "+25% Damage"), "Сфера Пандоры");
        patternToName.put(List.of("+3 Armor Hardness", "+2 Armor", "-15% Speed"), "Сфера Фрика");
        patternToName.put(List.of("-10% Speed", "+4 Damage"), "Сфера Аполлона");
        patternToName.put(List.of("+4 Max Health", "-15% Attack Speed", "+3 Damage"), "Сфера Астрея");
        patternToName.put(List.of("-15% Knockback Attack", "-15% Knockback Resistance", "+2 Armor"), "Сфера Осириса");
        patternToName.put(List.of("-2 Max Health", "+15% Attack Speed", "+3 Damage"), "Сфера Химеры");

        for (Map.Entry<List<String>, String> entry : patternToName.entrySet()) {
            List<String> pattern = entry.getKey();
            boolean allMatch = pattern.stream().allMatch(effect -> tooltipStrings.stream().anyMatch(s -> s.contains(effect)));

            if (allMatch) {
                return entry.getValue();
            }
        }
//        System.out.println("[Debug]" + tooltipStrings);
        return stack.getDisplayName().getString().replaceFirst("^\\[[^]]+]\\s*", "");
    }

    private void drawArmor(MatrixStack matrix, PlayerEntity player, float x, float y, float width, float fontHeight) {
        List<ItemStack> items = new ArrayList<>();
        if (!player.getHeldItemOffhand().isEmpty()) items.add(player.getHeldItemOffhand());
        for (ItemStack itemStack : player.getArmorInventoryList()) {
            if (!itemStack.isEmpty()) items.add(itemStack.copy());
        }
        if (!player.getHeldItemMainhand().isEmpty()) items.add(player.getHeldItemMainhand());

        float posX = x + width / 2F + (-items.size() * 5) - 1;
        float posY = y - 12;
        float stackSize = 8;

        for (ItemStack item : items) {
            if (item.isEmpty()) continue;
            GLUtil.startScale(posX + (stackSize / 2F), posY + (stackSize / 2F), 0.5F);
            drawItemStack(matrix, item, posX, posY, true);
            GLUtil.endScale();
            posX += (stackSize + 2);
        }
    }

    public void drawItemStack(MatrixStack matrix, ItemStack stack, double x, double y, boolean drawRect) {
        matrix.push();
        RenderSystem.translated(x, y, 0);
        if (drawRect) RectUtil.drawRect(matrix, 0, 0, 16, 16, black);
        mc.getItemRenderer().renderItemAndEffectIntoGUI(stack, 0, 0);
        if (stack.getCount() > 1) {
            RenderSystem.translated(0, 0, 200);
            mc.fontRenderer.drawString(matrix, String.valueOf(stack.getCount()), (float) (16 - mc.fontRenderer.getStringWidth(String.valueOf(stack.getCount()))), 8, 0xFFFFFF);
        }
        RenderSystem.translated(-x, -y, 0);
        matrix.pop();
    }

    private void drawTag(MatrixStack matrix, ITextComponent tagComponent, float centerX, float y, float nameWidth, float fontHeight, float scale) {
        RectUtil.drawRect(matrix, centerX - (nameWidth / 2F) - 1, y - 0.5F, nameWidth + 2, fontHeight + 1, black);
        font.drawTextComponent(matrix, tagComponent, centerX - nameWidth / 2F, y, -1, false, fontHeight);
    }

    private AxisAlignedBB getEntityBox(Entity entity, Vector3d vec) {
        Vector3d size = new Vector3d(entity.getBoundingBox().maxX - entity.getBoundingBox().minX,
                entity.getBoundingBox().maxY - entity.getBoundingBox().minY,
                entity.getBoundingBox().maxZ - entity.getBoundingBox().minZ);

        return new AxisAlignedBB(vec.x - size.x / 2f, vec.y,
                vec.z - size.z / 2f, vec.x + size.x / 2f,
                vec.y + size.y + (0.2F - (entity.isSneaking() ? 0.1F : 0.0F)),
                vec.z + size.z / 2f);
    }

    private boolean isValid(final Entity entity) {
        if (!entity.isAlive()) {
            return false;
        }
        if (mc.renderViewEntity != null && entity == mc.renderViewEntity && mc.gameSettings.getPointOfView().firstPerson()) {
            return false;
        }
        return isInView(entity) && (entity instanceof PlayerEntity || entity instanceof ItemEntity);
    }

    public boolean isInView(Entity entity) {
        if (mc.getRenderViewEntity() == null || mc.worldRenderer.getClippinghelper() == null) {
            return false;
        }
        return mc.worldRenderer.getClippinghelper().isBoundingBoxInFrustum(entity.getBoundingBox()) || entity.ignoreFrustumCheck;
    }

    private float getWidth(ITextComponent text) {
        return font.getWidth(text, fontSize.getValue());
    }
}
Посмотреть вложение 307512
Вторая попытка выложить тему
почему во второй руке сфера и пишет талисман грани?
 
у нпс сфера а показывает тал грани
 
Играя с нурика, я заметил, что даже в нем талики отображаются чисто по их названию, из за чего типо могут просто поменять название и не понятно, что тал/сфера. Именно поэтому сливаю данную функцию. База - Excellent Upgrade.

ss снизу)

NameTags:
Expand Collapse Copy
package eva.ware.client.managers.module.impl.render;

import eva.ware.client.EvaWare;
import eva.ware.client.api.events.orbit.EventHandler;
import eva.ware.client.api.events.orbit.EventPriority;
import eva.ware.client.managers.component.impl.target.TargetComponent;
import eva.ware.client.managers.events.other.PacketEvent;
import eva.ware.client.managers.events.render.Render2DEvent;
import eva.ware.client.managers.events.render.RenderNameEvent;
import eva.ware.client.managers.module.Category;
import eva.ware.client.managers.module.Module;
import eva.ware.client.managers.module.ModuleInfo;
import eva.ware.client.managers.module.impl.combat.AntiBot;
import eva.ware.client.managers.module.impl.misc.Globals;
import eva.ware.client.managers.module.settings.impl.BooleanSetting;
import eva.ware.client.managers.module.settings.impl.MultiBooleanSetting;
import eva.ware.client.managers.module.settings.impl.SliderSetting;
import eva.ware.client.utils.other.Instance;
import eva.ware.client.utils.player.PlayerUtil;
import eva.ware.client.utils.render.color.ColorFormatting;
import eva.ware.client.utils.render.color.ColorUtil;
import eva.ware.client.utils.render.draw.GLUtil;
import eva.ware.client.utils.render.draw.Project;
import eva.ware.client.utils.render.draw.RectUtil;
import eva.ware.client.utils.render.draw.RenderUtil3D;
import eva.ware.client.utils.render.font.Font;
import eva.ware.client.utils.render.font.Fonts;
import eva.ware.common.impl.globals.ClientAPI;
import eva.ware.common.impl.globals.Converter;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.experimental.Accessors;
import lombok.experimental.FieldDefaults;
import net.minecraft.client.entity.player.AbstractClientPlayerEntity;
import net.minecraft.client.util.ITooltipFlag;
import net.minecraft.entity.Entity;
import net.minecraft.entity.MobEntity;
import net.minecraft.entity.item.ItemEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.network.IPacket;
import net.minecraft.network.play.server.SEntityStatusPacket;
import net.minecraft.potion.EffectInstance;
import net.minecraft.potion.Effects;
import net.minecraft.util.StringUtils;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.StringTextComponent;
import net.minecraft.util.text.TextFormatting;
import net.mojang.blaze3d.matrix.MatrixStack;
import net.mojang.blaze3d.systems.RenderSystem;
import org.joml.Vector2f;
import org.joml.Vector4f;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.stream.Collectors;

[USER=270918]@Getter[/USER]
@Accessors(fluent = true)
@FieldDefaults(level = AccessLevel.PRIVATE)
@ModuleInfo(name = "Nametags", category = Category.RENDER)
public class Nametags extends Module {
    public static Nametags getInstance() {
        return Instance.get(Nametags.class);
    }

    private final MultiBooleanSetting checks = new MultiBooleanSetting(this, "Элементы",
            BooleanSetting.of("Игроки", true),
            BooleanSetting.of("Предметы", false)
    );

    private final SliderSetting fontSize = new SliderSetting(this, "Размер шрифта", 8F, 6F, 12F, 0.1F);
    private final BooleanSetting optimized = new BooleanSetting(this, "Оптимизировать", true);
    private final BooleanSetting otobr_spheres = new BooleanSetting(this, "Отображать сферу", true);
    private final BooleanSetting otobr_talismans = new BooleanSetting(this, "Отображать талисман", true);
    private final BooleanSetting renderDonat = new BooleanSetting(this, "Отображать донат", true);
    private final BooleanSetting showArmor = new BooleanSetting(this, "Отображать броню", true);
    private final int black = ColorUtil.getColor(0, 128);
    private final Font font = Fonts.SF_MEDIUM;
    private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
    private final int timeTick = 600;

    [USER=1489798]@EventHandler[/USER]
    public void onRenderName(RenderNameEvent event) {
        if (event.getEntity() instanceof AbstractClientPlayerEntity) event.cancel();
    }

    [USER=1489798]@EventHandler[/USER]
    public void onPacket(PacketEvent e) {
        if (PlayerUtil.nullCheck()) return;
        IPacket<?> packet = e.getPacket();
        if (packet instanceof SEntityStatusPacket entityStatus) {
            Entity entity = entityStatus.getEntity(mc.world);
            if (entity instanceof PlayerEntity player && (entityStatus.getOpCode() == 2 || entityStatus.getOpCode() == 33)) {
                if (!(player.prevFallDistance > 3 && player.fallDistance == 0)) {
                    for (Entity ent : mc.world.getAllEntities()) {
                        if (ent instanceof MobEntity mob && mob.getLastAttackedEntity() == player && mob.getLastAttackedEntityTime() < 1000) {
                            return;
                        }
                    }
                    player.addPotionEffect(new EffectInstance(Effects.UNLUCK, timeTick, -1));
                }
            }
        }
    }

    @EventHandler(priority = EventPriority.LOWEST)
    public void onRender2D(Render2DEvent event) {
        float fontHeight = fontSize.getValue();

        TargetComponent.getTargets(128, this::isValid, false)
                .forEach(entity -> renderNametag(entity, event.getMatrix(), fontHeight));
        if (checks.getValue("Предметы")) {
            mc.world.loadedItemEntityList().forEach(entity -> renderNametag(entity, event.getMatrix(), fontHeight));
        }
    }

    private void renderNametag(Entity entity, MatrixStack matrix, float fontHeight) {
        Vector3d interpolated = RenderUtil3D.interpolate(entity, mc.getRenderPartialTicks());
        AxisAlignedBB aabb = getEntityBox(entity, interpolated);

        Vector2f min = new Vector2f(Float.MAX_VALUE, Float.MAX_VALUE);
        Vector2f max = new Vector2f(Float.MIN_VALUE, Float.MIN_VALUE);

        for (Vector3d vector : aabb.getCorners()) {
            Vector2f vec = Project.project2D(vector);
            if (vec.x != Float.MAX_VALUE && vec.y != Float.MAX_VALUE) {
                min.x = Math.min(min.x, vec.x);
                min.y = Math.min(min.y, vec.y);
                max.x = Math.max(max.x, vec.x);
                max.y = Math.max(max.y, vec.y);
            }
        }
        Vector4f position = new Vector4f(min.x, min.y, max.x, max.y);

        float x = position.x;
        float y = position.y - fontHeight;
        float width = position.z - x;
        float height = position.w - y;
        float centerX = x + (width / 2F);
        ITextComponent tagComponent = null;
        float nameWidth = 0;
        float scale = 0.5F;

        if (checks.getValue("Игроки") && entity instanceof PlayerEntity player) {
            tagComponent = createPlayerTagComponent(player);
            nameWidth = getWidth(tagComponent);

            if (showArmor().getValue()) {
                drawArmor(matrix, player, x, y, width, fontHeight);
            }
        } else if (checks.getValue("Предметы") && entity instanceof ItemEntity item) {
            tagComponent = new StringTextComponent("").append(item.getItem().getDisplayName());
            if (item.getItem().getCount() > 1) {
                String GRAY = ColorFormatting.getColor(TextFormatting.GRAY.getColor());
                tagComponent = tagComponent.deepCopy().appendString(GRAY + " " + item.getItem().getCount() + "x");
            }
            nameWidth = getWidth(tagComponent);
        }

        if (tagComponent != null) {
            drawTag(matrix, tagComponent, centerX, y, nameWidth, fontHeight, scale);

            if (checks.getValue("Игроки") && entity instanceof PlayerEntity player && Globals.getInstance().isEnabled()) {
                String client = ClientAPI.getClient(entity.getName().getString());
                if (client != null) {
                    String userImageURL = "https://rockstar.moscow/api/globals/" + client + ".png";
                    mc.getTextureManager().bindTexture(Converter.getResourceLocation(userImageURL));
                    float size = fontHeight + 1;
                    RectUtil.drawRect(matrix, centerX - nameWidth / 2F - size, y - 0.5f, size, size, -1, false, true);
                }
            }
        }
    }

    private ITextComponent createPlayerTagComponent(PlayerEntity player) {
        ItemStack offHandStack = player.getHeldItemOffhand();
        CompoundNBT offHandNBT = offHandStack.getTag();
        String RED = ColorFormatting.getColor(TextFormatting.RED.getColor());
        String GREEN = ColorFormatting.getColor(TextFormatting.GREEN.getColor());
        String DARK_RED = ColorFormatting.getColor(TextFormatting.DARK_RED.getColor());
        String GOLD = ColorFormatting.getColor(TextFormatting.GOLD.getColor());
        String WHITE = ColorFormatting.getColor(TextFormatting.WHITE.getColor());
        String sphere = "";
        String KT = "";
        for (EffectInstance potion : player.getActivePotionEffects()) {
            int duration = potion.getDuration();
            if (duration != 0 && potion.getPotion() == Effects.UNLUCK && potion.getAmplifier() == -1) {
                KT = " [" + RED + StringUtils.ticksToElapsedTime(duration).replace(duration >= 200 ? "0:" : "0:0", "") + WHITE + "]";
                break;
            }
        }
        ITextComponent playerName = renderDonat.getValue() ? player.getDisplayName() : player.getName();
        if (offHandNBT != null) {
            String itemName = getCustomItemName(offHandStack);

            if (offHandNBT.getInt("tslevel") != 0) {
                sphere = " [" + GOLD + itemName + RED + " " + offHandNBT.getInt("tslevel") + "/3" + WHITE + "]";
            } else if (otobr_spheres.getValue() && offHandStack.getItem().getTranslationKey().contains("player_head")) {
                sphere = " [" + GOLD + itemName + WHITE + "]";
            } else if (otobr_talismans.getValue() && offHandStack.getItem().getTranslationKey().contains("totem_of_undying")) {
                sphere = " [" + GOLD + itemName + WHITE + "]";
            }
        }

        String health = PlayerUtil.isFuntime() && player.getHealthFixed() == 1000 ? "" : " [" + RED + player.getHealthFixed() + " HP" + WHITE + "]";
        String round_health = PlayerUtil.isFuntime() && player.getHealthFixed() == 1000 ? "" : " [" + RED + Math.round(player.getHealthFixed()) + " HP" + WHITE + "]";
        String friend = EvaWare.inst().friendManager().isFriend(player.getGameProfile().getName()) ? GREEN + " [F]" + WHITE : "";
        String bot = (AntiBot.getInstance().isBot(player) ? DARK_RED + " [BOT]" + WHITE : "");

        if (optimized().getValue()) {
            if (PlayerUtil.isConnectedToServer("spookytime")) {
                return new StringTextComponent("").appendString(playerName.getString() + sphere + round_health + friend + bot);
            } else {
                return new StringTextComponent("").appendString(playerName.getString() + sphere + health + friend + bot + KT);
            }
        } else {
            return playerName.deepCopy().appendString(sphere + round_health + friend + bot);
        }
    }

    private String getCustomItemName(ItemStack stack) {
        List<String> tooltipStrings = stack.getTooltip(mc.player,
                        mc.gameSettings.advancedItemTooltips ? ITooltipFlag.TooltipFlags.ADVANCED : ITooltipFlag.TooltipFlags.NORMAL
                ).stream()
                .map(ITextComponent::getString)
                .collect(Collectors.toList());

        Map<List<String>, String> patternToName = new HashMap<>();
        // Талисманы
        patternToName.put(List.of("-4 Max Health", "+15% Speed", "+3 Attack Damage"), "Талисман Грани");
        patternToName.put(List.of("-4 Max Health", "+5 Attack Damage"), "Талисман Дедала");
        patternToName.put(List.of("-2 Armor Hardness", "+2 Armor", "+2 Max Health"), "Талисман Тритона  ");
        patternToName.put(List.of("+2 Max Health", "+2 Armor", "+2 Attack Damage"), "Талисман Гармонии");
        patternToName.put(List.of("+6 Max Health", "+10% Attack Speed"), "Талисман Феникса");
        patternToName.put(List.of("-2 Armor Hardness", "-2 Armor", "-4 Max Health", "+6 Damage"), "Талисман Ехидны");
        patternToName.put(List.of("+2 Armor Hardness", "+2 Armor", "+4 Max Health", "+3 Damage"), "Крушитель");
        patternToName.put(List.of("+7 Attack Damage", "+10% Speed", "-4 Max Health"), "Каратель");


        // Сферы
        patternToName.put(List.of("+2 Armor", "-4 Max Health", "+15% Speed", "+3 Damage"), "Сфера Андромеды");
        patternToName.put(List.of("-10% Armor", "+10% Speed", "+25% Damage"), "Сфера Пандоры");
        patternToName.put(List.of("+3 Armor Hardness", "+2 Armor", "-15% Speed"), "Сфера Фрика");
        patternToName.put(List.of("-10% Speed", "+4 Damage"), "Сфера Аполлона");
        patternToName.put(List.of("+4 Max Health", "-15% Attack Speed", "+3 Damage"), "Сфера Астрея");
        patternToName.put(List.of("-15% Knockback Attack", "-15% Knockback Resistance", "+2 Armor"), "Сфера Осириса");
        patternToName.put(List.of("-2 Max Health", "+15% Attack Speed", "+3 Damage"), "Сфера Химеры");

        for (Map.Entry<List<String>, String> entry : patternToName.entrySet()) {
            List<String> pattern = entry.getKey();
            boolean allMatch = pattern.stream().allMatch(effect -> tooltipStrings.stream().anyMatch(s -> s.contains(effect)));

            if (allMatch) {
                return entry.getValue();
            }
        }
//        System.out.println("[Debug]" + tooltipStrings);
        return stack.getDisplayName().getString().replaceFirst("^\\[[^]]+]\\s*", "");
    }

    private void drawArmor(MatrixStack matrix, PlayerEntity player, float x, float y, float width, float fontHeight) {
        List<ItemStack> items = new ArrayList<>();
        if (!player.getHeldItemOffhand().isEmpty()) items.add(player.getHeldItemOffhand());
        for (ItemStack itemStack : player.getArmorInventoryList()) {
            if (!itemStack.isEmpty()) items.add(itemStack.copy());
        }
        if (!player.getHeldItemMainhand().isEmpty()) items.add(player.getHeldItemMainhand());

        float posX = x + width / 2F + (-items.size() * 5) - 1;
        float posY = y - 12;
        float stackSize = 8;

        for (ItemStack item : items) {
            if (item.isEmpty()) continue;
            GLUtil.startScale(posX + (stackSize / 2F), posY + (stackSize / 2F), 0.5F);
            drawItemStack(matrix, item, posX, posY, true);
            GLUtil.endScale();
            posX += (stackSize + 2);
        }
    }

    public void drawItemStack(MatrixStack matrix, ItemStack stack, double x, double y, boolean drawRect) {
        matrix.push();
        RenderSystem.translated(x, y, 0);
        if (drawRect) RectUtil.drawRect(matrix, 0, 0, 16, 16, black);
        mc.getItemRenderer().renderItemAndEffectIntoGUI(stack, 0, 0);
        if (stack.getCount() > 1) {
            RenderSystem.translated(0, 0, 200);
            mc.fontRenderer.drawString(matrix, String.valueOf(stack.getCount()), (float) (16 - mc.fontRenderer.getStringWidth(String.valueOf(stack.getCount()))), 8, 0xFFFFFF);
        }
        RenderSystem.translated(-x, -y, 0);
        matrix.pop();
    }

    private void drawTag(MatrixStack matrix, ITextComponent tagComponent, float centerX, float y, float nameWidth, float fontHeight, float scale) {
        RectUtil.drawRect(matrix, centerX - (nameWidth / 2F) - 1, y - 0.5F, nameWidth + 2, fontHeight + 1, black);
        font.drawTextComponent(matrix, tagComponent, centerX - nameWidth / 2F, y, -1, false, fontHeight);
    }

    private AxisAlignedBB getEntityBox(Entity entity, Vector3d vec) {
        Vector3d size = new Vector3d(entity.getBoundingBox().maxX - entity.getBoundingBox().minX,
                entity.getBoundingBox().maxY - entity.getBoundingBox().minY,
                entity.getBoundingBox().maxZ - entity.getBoundingBox().minZ);

        return new AxisAlignedBB(vec.x - size.x / 2f, vec.y,
                vec.z - size.z / 2f, vec.x + size.x / 2f,
                vec.y + size.y + (0.2F - (entity.isSneaking() ? 0.1F : 0.0F)),
                vec.z + size.z / 2f);
    }

    private boolean isValid(final Entity entity) {
        if (!entity.isAlive()) {
            return false;
        }
        if (mc.renderViewEntity != null && entity == mc.renderViewEntity && mc.gameSettings.getPointOfView().firstPerson()) {
            return false;
        }
        return isInView(entity) && (entity instanceof PlayerEntity || entity instanceof ItemEntity);
    }

    public boolean isInView(Entity entity) {
        if (mc.getRenderViewEntity() == null || mc.worldRenderer.getClippinghelper() == null) {
            return false;
        }
        return mc.worldRenderer.getClippinghelper().isBoundingBoxInFrustum(entity.getBoundingBox()) || entity.ignoreFrustumCheck;
    }

    private float getWidth(ITextComponent text) {
        return font.getWidth(text, fontSize.getValue());
    }
}
Посмотреть вложение 307512
Вторая попытка выложить тему
сфера анромеда это талисман грани понял
 
Играя с нурика, я заметил, что даже в нем талики отображаются чисто по их названию, из за чего типо могут просто поменять название и не понятно, что тал/сфера. Именно поэтому сливаю данную функцию. База - Excellent Upgrade.

ss снизу)

NameTags:
Expand Collapse Copy
package eva.ware.client.managers.module.impl.render;

import eva.ware.client.EvaWare;
import eva.ware.client.api.events.orbit.EventHandler;
import eva.ware.client.api.events.orbit.EventPriority;
import eva.ware.client.managers.component.impl.target.TargetComponent;
import eva.ware.client.managers.events.other.PacketEvent;
import eva.ware.client.managers.events.render.Render2DEvent;
import eva.ware.client.managers.events.render.RenderNameEvent;
import eva.ware.client.managers.module.Category;
import eva.ware.client.managers.module.Module;
import eva.ware.client.managers.module.ModuleInfo;
import eva.ware.client.managers.module.impl.combat.AntiBot;
import eva.ware.client.managers.module.impl.misc.Globals;
import eva.ware.client.managers.module.settings.impl.BooleanSetting;
import eva.ware.client.managers.module.settings.impl.MultiBooleanSetting;
import eva.ware.client.managers.module.settings.impl.SliderSetting;
import eva.ware.client.utils.other.Instance;
import eva.ware.client.utils.player.PlayerUtil;
import eva.ware.client.utils.render.color.ColorFormatting;
import eva.ware.client.utils.render.color.ColorUtil;
import eva.ware.client.utils.render.draw.GLUtil;
import eva.ware.client.utils.render.draw.Project;
import eva.ware.client.utils.render.draw.RectUtil;
import eva.ware.client.utils.render.draw.RenderUtil3D;
import eva.ware.client.utils.render.font.Font;
import eva.ware.client.utils.render.font.Fonts;
import eva.ware.common.impl.globals.ClientAPI;
import eva.ware.common.impl.globals.Converter;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.experimental.Accessors;
import lombok.experimental.FieldDefaults;
import net.minecraft.client.entity.player.AbstractClientPlayerEntity;
import net.minecraft.client.util.ITooltipFlag;
import net.minecraft.entity.Entity;
import net.minecraft.entity.MobEntity;
import net.minecraft.entity.item.ItemEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.network.IPacket;
import net.minecraft.network.play.server.SEntityStatusPacket;
import net.minecraft.potion.EffectInstance;
import net.minecraft.potion.Effects;
import net.minecraft.util.StringUtils;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.StringTextComponent;
import net.minecraft.util.text.TextFormatting;
import net.mojang.blaze3d.matrix.MatrixStack;
import net.mojang.blaze3d.systems.RenderSystem;
import org.joml.Vector2f;
import org.joml.Vector4f;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.stream.Collectors;

[USER=270918]@Getter[/USER]
@Accessors(fluent = true)
@FieldDefaults(level = AccessLevel.PRIVATE)
@ModuleInfo(name = "Nametags", category = Category.RENDER)
public class Nametags extends Module {
    public static Nametags getInstance() {
        return Instance.get(Nametags.class);
    }

    private final MultiBooleanSetting checks = new MultiBooleanSetting(this, "Элементы",
            BooleanSetting.of("Игроки", true),
            BooleanSetting.of("Предметы", false)
    );

    private final SliderSetting fontSize = new SliderSetting(this, "Размер шрифта", 8F, 6F, 12F, 0.1F);
    private final BooleanSetting optimized = new BooleanSetting(this, "Оптимизировать", true);
    private final BooleanSetting otobr_spheres = new BooleanSetting(this, "Отображать сферу", true);
    private final BooleanSetting otobr_talismans = new BooleanSetting(this, "Отображать талисман", true);
    private final BooleanSetting renderDonat = new BooleanSetting(this, "Отображать донат", true);
    private final BooleanSetting showArmor = new BooleanSetting(this, "Отображать броню", true);
    private final int black = ColorUtil.getColor(0, 128);
    private final Font font = Fonts.SF_MEDIUM;
    private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
    private final int timeTick = 600;

    [USER=1489798]@EventHandler[/USER]
    public void onRenderName(RenderNameEvent event) {
        if (event.getEntity() instanceof AbstractClientPlayerEntity) event.cancel();
    }

    [USER=1489798]@EventHandler[/USER]
    public void onPacket(PacketEvent e) {
        if (PlayerUtil.nullCheck()) return;
        IPacket<?> packet = e.getPacket();
        if (packet instanceof SEntityStatusPacket entityStatus) {
            Entity entity = entityStatus.getEntity(mc.world);
            if (entity instanceof PlayerEntity player && (entityStatus.getOpCode() == 2 || entityStatus.getOpCode() == 33)) {
                if (!(player.prevFallDistance > 3 && player.fallDistance == 0)) {
                    for (Entity ent : mc.world.getAllEntities()) {
                        if (ent instanceof MobEntity mob && mob.getLastAttackedEntity() == player && mob.getLastAttackedEntityTime() < 1000) {
                            return;
                        }
                    }
                    player.addPotionEffect(new EffectInstance(Effects.UNLUCK, timeTick, -1));
                }
            }
        }
    }

    @EventHandler(priority = EventPriority.LOWEST)
    public void onRender2D(Render2DEvent event) {
        float fontHeight = fontSize.getValue();

        TargetComponent.getTargets(128, this::isValid, false)
                .forEach(entity -> renderNametag(entity, event.getMatrix(), fontHeight));
        if (checks.getValue("Предметы")) {
            mc.world.loadedItemEntityList().forEach(entity -> renderNametag(entity, event.getMatrix(), fontHeight));
        }
    }

    private void renderNametag(Entity entity, MatrixStack matrix, float fontHeight) {
        Vector3d interpolated = RenderUtil3D.interpolate(entity, mc.getRenderPartialTicks());
        AxisAlignedBB aabb = getEntityBox(entity, interpolated);

        Vector2f min = new Vector2f(Float.MAX_VALUE, Float.MAX_VALUE);
        Vector2f max = new Vector2f(Float.MIN_VALUE, Float.MIN_VALUE);

        for (Vector3d vector : aabb.getCorners()) {
            Vector2f vec = Project.project2D(vector);
            if (vec.x != Float.MAX_VALUE && vec.y != Float.MAX_VALUE) {
                min.x = Math.min(min.x, vec.x);
                min.y = Math.min(min.y, vec.y);
                max.x = Math.max(max.x, vec.x);
                max.y = Math.max(max.y, vec.y);
            }
        }
        Vector4f position = new Vector4f(min.x, min.y, max.x, max.y);

        float x = position.x;
        float y = position.y - fontHeight;
        float width = position.z - x;
        float height = position.w - y;
        float centerX = x + (width / 2F);
        ITextComponent tagComponent = null;
        float nameWidth = 0;
        float scale = 0.5F;

        if (checks.getValue("Игроки") && entity instanceof PlayerEntity player) {
            tagComponent = createPlayerTagComponent(player);
            nameWidth = getWidth(tagComponent);

            if (showArmor().getValue()) {
                drawArmor(matrix, player, x, y, width, fontHeight);
            }
        } else if (checks.getValue("Предметы") && entity instanceof ItemEntity item) {
            tagComponent = new StringTextComponent("").append(item.getItem().getDisplayName());
            if (item.getItem().getCount() > 1) {
                String GRAY = ColorFormatting.getColor(TextFormatting.GRAY.getColor());
                tagComponent = tagComponent.deepCopy().appendString(GRAY + " " + item.getItem().getCount() + "x");
            }
            nameWidth = getWidth(tagComponent);
        }

        if (tagComponent != null) {
            drawTag(matrix, tagComponent, centerX, y, nameWidth, fontHeight, scale);

            if (checks.getValue("Игроки") && entity instanceof PlayerEntity player && Globals.getInstance().isEnabled()) {
                String client = ClientAPI.getClient(entity.getName().getString());
                if (client != null) {
                    String userImageURL = "https://rockstar.moscow/api/globals/" + client + ".png";
                    mc.getTextureManager().bindTexture(Converter.getResourceLocation(userImageURL));
                    float size = fontHeight + 1;
                    RectUtil.drawRect(matrix, centerX - nameWidth / 2F - size, y - 0.5f, size, size, -1, false, true);
                }
            }
        }
    }

    private ITextComponent createPlayerTagComponent(PlayerEntity player) {
        ItemStack offHandStack = player.getHeldItemOffhand();
        CompoundNBT offHandNBT = offHandStack.getTag();
        String RED = ColorFormatting.getColor(TextFormatting.RED.getColor());
        String GREEN = ColorFormatting.getColor(TextFormatting.GREEN.getColor());
        String DARK_RED = ColorFormatting.getColor(TextFormatting.DARK_RED.getColor());
        String GOLD = ColorFormatting.getColor(TextFormatting.GOLD.getColor());
        String WHITE = ColorFormatting.getColor(TextFormatting.WHITE.getColor());
        String sphere = "";
        String KT = "";
        for (EffectInstance potion : player.getActivePotionEffects()) {
            int duration = potion.getDuration();
            if (duration != 0 && potion.getPotion() == Effects.UNLUCK && potion.getAmplifier() == -1) {
                KT = " [" + RED + StringUtils.ticksToElapsedTime(duration).replace(duration >= 200 ? "0:" : "0:0", "") + WHITE + "]";
                break;
            }
        }
        ITextComponent playerName = renderDonat.getValue() ? player.getDisplayName() : player.getName();
        if (offHandNBT != null) {
            String itemName = getCustomItemName(offHandStack);

            if (offHandNBT.getInt("tslevel") != 0) {
                sphere = " [" + GOLD + itemName + RED + " " + offHandNBT.getInt("tslevel") + "/3" + WHITE + "]";
            } else if (otobr_spheres.getValue() && offHandStack.getItem().getTranslationKey().contains("player_head")) {
                sphere = " [" + GOLD + itemName + WHITE + "]";
            } else if (otobr_talismans.getValue() && offHandStack.getItem().getTranslationKey().contains("totem_of_undying")) {
                sphere = " [" + GOLD + itemName + WHITE + "]";
            }
        }

        String health = PlayerUtil.isFuntime() && player.getHealthFixed() == 1000 ? "" : " [" + RED + player.getHealthFixed() + " HP" + WHITE + "]";
        String round_health = PlayerUtil.isFuntime() && player.getHealthFixed() == 1000 ? "" : " [" + RED + Math.round(player.getHealthFixed()) + " HP" + WHITE + "]";
        String friend = EvaWare.inst().friendManager().isFriend(player.getGameProfile().getName()) ? GREEN + " [F]" + WHITE : "";
        String bot = (AntiBot.getInstance().isBot(player) ? DARK_RED + " [BOT]" + WHITE : "");

        if (optimized().getValue()) {
            if (PlayerUtil.isConnectedToServer("spookytime")) {
                return new StringTextComponent("").appendString(playerName.getString() + sphere + round_health + friend + bot);
            } else {
                return new StringTextComponent("").appendString(playerName.getString() + sphere + health + friend + bot + KT);
            }
        } else {
            return playerName.deepCopy().appendString(sphere + round_health + friend + bot);
        }
    }

    private String getCustomItemName(ItemStack stack) {
        List<String> tooltipStrings = stack.getTooltip(mc.player,
                        mc.gameSettings.advancedItemTooltips ? ITooltipFlag.TooltipFlags.ADVANCED : ITooltipFlag.TooltipFlags.NORMAL
                ).stream()
                .map(ITextComponent::getString)
                .collect(Collectors.toList());

        Map<List<String>, String> patternToName = new HashMap<>();
        // Талисманы
        patternToName.put(List.of("-4 Max Health", "+15% Speed", "+3 Attack Damage"), "Талисман Грани");
        patternToName.put(List.of("-4 Max Health", "+5 Attack Damage"), "Талисман Дедала");
        patternToName.put(List.of("-2 Armor Hardness", "+2 Armor", "+2 Max Health"), "Талисман Тритона  ");
        patternToName.put(List.of("+2 Max Health", "+2 Armor", "+2 Attack Damage"), "Талисман Гармонии");
        patternToName.put(List.of("+6 Max Health", "+10% Attack Speed"), "Талисман Феникса");
        patternToName.put(List.of("-2 Armor Hardness", "-2 Armor", "-4 Max Health", "+6 Damage"), "Талисман Ехидны");
        patternToName.put(List.of("+2 Armor Hardness", "+2 Armor", "+4 Max Health", "+3 Damage"), "Крушитель");
        patternToName.put(List.of("+7 Attack Damage", "+10% Speed", "-4 Max Health"), "Каратель");


        // Сферы
        patternToName.put(List.of("+2 Armor", "-4 Max Health", "+15% Speed", "+3 Damage"), "Сфера Андромеды");
        patternToName.put(List.of("-10% Armor", "+10% Speed", "+25% Damage"), "Сфера Пандоры");
        patternToName.put(List.of("+3 Armor Hardness", "+2 Armor", "-15% Speed"), "Сфера Фрика");
        patternToName.put(List.of("-10% Speed", "+4 Damage"), "Сфера Аполлона");
        patternToName.put(List.of("+4 Max Health", "-15% Attack Speed", "+3 Damage"), "Сфера Астрея");
        patternToName.put(List.of("-15% Knockback Attack", "-15% Knockback Resistance", "+2 Armor"), "Сфера Осириса");
        patternToName.put(List.of("-2 Max Health", "+15% Attack Speed", "+3 Damage"), "Сфера Химеры");

        for (Map.Entry<List<String>, String> entry : patternToName.entrySet()) {
            List<String> pattern = entry.getKey();
            boolean allMatch = pattern.stream().allMatch(effect -> tooltipStrings.stream().anyMatch(s -> s.contains(effect)));

            if (allMatch) {
                return entry.getValue();
            }
        }
//        System.out.println("[Debug]" + tooltipStrings);
        return stack.getDisplayName().getString().replaceFirst("^\\[[^]]+]\\s*", "");
    }

    private void drawArmor(MatrixStack matrix, PlayerEntity player, float x, float y, float width, float fontHeight) {
        List<ItemStack> items = new ArrayList<>();
        if (!player.getHeldItemOffhand().isEmpty()) items.add(player.getHeldItemOffhand());
        for (ItemStack itemStack : player.getArmorInventoryList()) {
            if (!itemStack.isEmpty()) items.add(itemStack.copy());
        }
        if (!player.getHeldItemMainhand().isEmpty()) items.add(player.getHeldItemMainhand());

        float posX = x + width / 2F + (-items.size() * 5) - 1;
        float posY = y - 12;
        float stackSize = 8;

        for (ItemStack item : items) {
            if (item.isEmpty()) continue;
            GLUtil.startScale(posX + (stackSize / 2F), posY + (stackSize / 2F), 0.5F);
            drawItemStack(matrix, item, posX, posY, true);
            GLUtil.endScale();
            posX += (stackSize + 2);
        }
    }

    public void drawItemStack(MatrixStack matrix, ItemStack stack, double x, double y, boolean drawRect) {
        matrix.push();
        RenderSystem.translated(x, y, 0);
        if (drawRect) RectUtil.drawRect(matrix, 0, 0, 16, 16, black);
        mc.getItemRenderer().renderItemAndEffectIntoGUI(stack, 0, 0);
        if (stack.getCount() > 1) {
            RenderSystem.translated(0, 0, 200);
            mc.fontRenderer.drawString(matrix, String.valueOf(stack.getCount()), (float) (16 - mc.fontRenderer.getStringWidth(String.valueOf(stack.getCount()))), 8, 0xFFFFFF);
        }
        RenderSystem.translated(-x, -y, 0);
        matrix.pop();
    }

    private void drawTag(MatrixStack matrix, ITextComponent tagComponent, float centerX, float y, float nameWidth, float fontHeight, float scale) {
        RectUtil.drawRect(matrix, centerX - (nameWidth / 2F) - 1, y - 0.5F, nameWidth + 2, fontHeight + 1, black);
        font.drawTextComponent(matrix, tagComponent, centerX - nameWidth / 2F, y, -1, false, fontHeight);
    }

    private AxisAlignedBB getEntityBox(Entity entity, Vector3d vec) {
        Vector3d size = new Vector3d(entity.getBoundingBox().maxX - entity.getBoundingBox().minX,
                entity.getBoundingBox().maxY - entity.getBoundingBox().minY,
                entity.getBoundingBox().maxZ - entity.getBoundingBox().minZ);

        return new AxisAlignedBB(vec.x - size.x / 2f, vec.y,
                vec.z - size.z / 2f, vec.x + size.x / 2f,
                vec.y + size.y + (0.2F - (entity.isSneaking() ? 0.1F : 0.0F)),
                vec.z + size.z / 2f);
    }

    private boolean isValid(final Entity entity) {
        if (!entity.isAlive()) {
            return false;
        }
        if (mc.renderViewEntity != null && entity == mc.renderViewEntity && mc.gameSettings.getPointOfView().firstPerson()) {
            return false;
        }
        return isInView(entity) && (entity instanceof PlayerEntity || entity instanceof ItemEntity);
    }

    public boolean isInView(Entity entity) {
        if (mc.getRenderViewEntity() == null || mc.worldRenderer.getClippinghelper() == null) {
            return false;
        }
        return mc.worldRenderer.getClippinghelper().isBoundingBoxInFrustum(entity.getBoundingBox()) || entity.ignoreFrustumCheck;
    }

    private float getWidth(ITextComponent text) {
        return font.getWidth(text, fontSize.getValue());
    }
}
Посмотреть вложение 307512
Вторая попытка выложить тему
хмм в руках сфера, пишет талик. Нихуя себе
 
Играя с нурика, я заметил, что даже в нем талики отображаются чисто по их названию, из за чего типо могут просто поменять название и не понятно, что тал/сфера. Именно поэтому сливаю данную функцию. База - Excellent Upgrade.

ss снизу)

NameTags:
Expand Collapse Copy
package eva.ware.client.managers.module.impl.render;

import eva.ware.client.EvaWare;
import eva.ware.client.api.events.orbit.EventHandler;
import eva.ware.client.api.events.orbit.EventPriority;
import eva.ware.client.managers.component.impl.target.TargetComponent;
import eva.ware.client.managers.events.other.PacketEvent;
import eva.ware.client.managers.events.render.Render2DEvent;
import eva.ware.client.managers.events.render.RenderNameEvent;
import eva.ware.client.managers.module.Category;
import eva.ware.client.managers.module.Module;
import eva.ware.client.managers.module.ModuleInfo;
import eva.ware.client.managers.module.impl.combat.AntiBot;
import eva.ware.client.managers.module.impl.misc.Globals;
import eva.ware.client.managers.module.settings.impl.BooleanSetting;
import eva.ware.client.managers.module.settings.impl.MultiBooleanSetting;
import eva.ware.client.managers.module.settings.impl.SliderSetting;
import eva.ware.client.utils.other.Instance;
import eva.ware.client.utils.player.PlayerUtil;
import eva.ware.client.utils.render.color.ColorFormatting;
import eva.ware.client.utils.render.color.ColorUtil;
import eva.ware.client.utils.render.draw.GLUtil;
import eva.ware.client.utils.render.draw.Project;
import eva.ware.client.utils.render.draw.RectUtil;
import eva.ware.client.utils.render.draw.RenderUtil3D;
import eva.ware.client.utils.render.font.Font;[ATTACH]307589[/ATTACH][ATTACH type="full"]307589[/ATTACH][ATTACH type="full"]307590[/ATTACH][ATTACH type="full"]307590[/ATTACH][ATTACH]307590[/ATTACH]
import eva.ware.client.utils.render.font.Fonts;
import eva.ware.common.impl.globals.ClientAPI;
import eva.ware.common.impl.globals.Converter;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.experimental.Accessors;
import lombok.experimental.FieldDefaults;
import net.minecraft.client.entity.player.AbstractClientPlayerEntity;
import net.minecraft.client.util.ITooltipFlag;
import net.minecraft.entity.Entity;
import net.minecraft.entity.MobEntity;
import net.minecraft.entity.item.ItemEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.network.IPacket;
import net.minecraft.network.play.server.SEntityStatusPacket;
import net.minecraft.potion.EffectInstance;
import net.minecraft.potion.Effects;
import net.minecraft.util.StringUtils;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.StringTextComponent;
import net.minecraft.util.text.TextFormatting;
import net.mojang.blaze3d.matrix.MatrixStack;
import net.mojang.blaze3d.systems.RenderSystem;
import org.joml.Vector2f;
import org.joml.Vector4f;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.stream.Collectors;

[USER=270918]@Getter[/USER]
@Accessors(fluent = true)
@FieldDefaults(level = AccessLevel.PRIVATE)
@ModuleInfo(name = "Nametags", category = Category.RENDER)
public class Nametags extends Module {
    public static Nametags getInstance() {
        return Instance.get(Nametags.class);
    }

    private final MultiBooleanSetting checks = new MultiBooleanSetting(this, "Элементы",
            BooleanSetting.of("Игроки", true),
            BooleanSetting.of("Предметы", false)
    );

    private final SliderSetting fontSize = new SliderSetting(this, "Размер шрифта", 8F, 6F, 12F, 0.1F);
    private final BooleanSetting optimized = new BooleanSetting(this, "Оптимизировать", true);
    private final BooleanSetting otobr_spheres = new BooleanSetting(this, "Отображать сферу", true);
    private final BooleanSetting otobr_talismans = new BooleanSetting(this, "Отображать талисман", true);
    private final BooleanSetting renderDonat = new BooleanSetting(this, "Отображать донат", true);
    private final BooleanSetting showArmor = new BooleanSetting(this, "Отображать броню", true);
    private final int black = ColorUtil.getColor(0, 128);
    private final Font font = Fonts.SF_MEDIUM;
    private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
    private final int timeTick = 600;

    [USER=1489798]@EventHandler[/USER]
    public void onRenderName(RenderNameEvent event) {
        if (event.getEntity() instanceof AbstractClientPlayerEntity) event.cancel();
    }

    [USER=1489798]@EventHandler[/USER]
    public void onPacket(PacketEvent e) {
        if (PlayerUtil.nullCheck()) return;
        IPacket<?> packet = e.getPacket();
        if (packet instanceof SEntityStatusPacket entityStatus) {
            Entity entity = entityStatus.getEntity(mc.world);
            if (entity instanceof PlayerEntity player && (entityStatus.getOpCode() == 2 || entityStatus.getOpCode() == 33)) {
                if (!(player.prevFallDistance > 3 && player.fallDistance == 0)) {
                    for (Entity ent : mc.world.getAllEntities()) {
                        if (ent instanceof MobEntity mob && mob.getLastAttackedEntity() == player && mob.getLastAttackedEntityTime() < 1000) {
                            return;
                        }
                    }
                    player.addPotionEffect(new EffectInstance(Effects.UNLUCK, timeTick, -1));
                }
            }
        }
    }

    @EventHandler(priority = EventPriority.LOWEST)
    public void onRender2D(Render2DEvent event) {
        float fontHeight = fontSize.getValue();

        TargetComponent.getTargets(128, this::isValid, false)
                .forEach(entity -> renderNametag(entity, event.getMatrix(), fontHeight));
        if (checks.getValue("Предметы")) {
            mc.world.loadedItemEntityList().forEach(entity -> renderNametag(entity, event.getMatrix(), fontHeight));
        }
    }

    private void renderNametag(Entity entity, MatrixStack matrix, float fontHeight) {
        Vector3d interpolated = RenderUtil3D.interpolate(entity, mc.getRenderPartialTicks());
        AxisAlignedBB aabb = getEntityBox(entity, interpolated);

        Vector2f min = new Vector2f(Float.MAX_VALUE, Float.MAX_VALUE);
        Vector2f max = new Vector2f(Float.MIN_VALUE, Float.MIN_VALUE);

        for (Vector3d vector : aabb.getCorners()) {
            Vector2f vec = Project.project2D(vector);
            if (vec.x != Float.MAX_VALUE && vec.y != Float.MAX_VALUE) {
                min.x = Math.min(min.x, vec.x);
                min.y = Math.min(min.y, vec.y);
                max.x = Math.max(max.x, vec.x);
                max.y = Math.max(max.y, vec.y);
            }
        }
        Vector4f position = new Vector4f(min.x, min.y, max.x, max.y);

        float x = position.x;
        float y = position.y - fontHeight;
        float width = position.z - x;
        float height = position.w - y;
        float centerX = x + (width / 2F);
        ITextComponent tagComponent = null;
        float nameWidth = 0;
        float scale = 0.5F;

        if (checks.getValue("Игроки") && entity instanceof PlayerEntity player) {
            tagComponent = createPlayerTagComponent(player);
            nameWidth = getWidth(tagComponent);

            if (showArmor().getValue()) {
                drawArmor(matrix, player, x, y, width, fontHeight);
            }
        } else if (checks.getValue("Предметы") && entity instanceof ItemEntity item) {
            tagComponent = new StringTextComponent("").append(item.getItem().getDisplayName());
            if (item.getItem().getCount() > 1) {
                String GRAY = ColorFormatting.getColor(TextFormatting.GRAY.getColor());
                tagComponent = tagComponent.deepCopy().appendString(GRAY + " " + item.getItem().getCount() + "x");
            }
            nameWidth = getWidth(tagComponent);
        }

        if (tagComponent != null) {
            drawTag(matrix, tagComponent, centerX, y, nameWidth, fontHeight, scale);

            if (checks.getValue("Игроки") && entity instanceof PlayerEntity player && Globals.getInstance().isEnabled()) {
                String client = ClientAPI.getClient(entity.getName().getString());
                if (client != null) {
                    String userImageURL = "https://rockstar.moscow/api/globals/" + client + ".png";
                    mc.getTextureManager().bindTexture(Converter.getResourceLocation(userImageURL));
                    float size = fontHeight + 1;
                    RectUtil.drawRect(matrix, centerX - nameWidth / 2F - size, y - 0.5f, size, size, -1, false, true);
                }
            }
        }
    }

    private ITextComponent createPlayerTagComponent(PlayerEntity player) {
        ItemStack offHandStack = player.getHeldItemOffhand();
        CompoundNBT offHandNBT = offHandStack.getTag();
        String RED = ColorFormatting.getColor(TextFormatting.RED.getColor());
        String GREEN = ColorFormatting.getColor(TextFormatting.GREEN.getColor());
        String DARK_RED = ColorFormatting.getColor(TextFormatting.DARK_RED.getColor());
        String GOLD = ColorFormatting.getColor(TextFormatting.GOLD.getColor());
        String WHITE = ColorFormatting.getColor(TextFormatting.WHITE.getColor());
        String sphere = "";
        String KT = "";
        for (EffectInstance potion : player.getActivePotionEffects()) {
            int duration = potion.getDuration();
            if (duration != 0 && potion.getPotion() == Effects.UNLUCK && potion.getAmplifier() == -1) {
                KT = " [" + RED + StringUtils.ticksToElapsedTime(duration).replace(duration >= 200 ? "0:" : "0:0", "") + WHITE + "]";
                break;
            }
        }
        ITextComponent playerName = renderDonat.getValue() ? player.getDisplayName() : player.getName();
        if (offHandNBT != null) {
            String itemName = getCustomItemName(offHandStack);

            if (offHandNBT.getInt("tslevel") != 0) {
                sphere = " [" + GOLD + itemName + RED + " " + offHandNBT.getInt("tslevel") + "/3" + WHITE + "]";
            } else if (otobr_spheres.getValue() && offHandStack.getItem().getTranslationKey().contains("player_head")) {
                sphere = " [" + GOLD + itemName + WHITE + "]";
            } else if (otobr_talismans.getValue() && offHandStack.getItem().getTranslationKey().contains("totem_of_undying")) {
                sphere = " [" + GOLD + itemName + WHITE + "]";
            }
        }

        String health = PlayerUtil.isFuntime() && player.getHealthFixed() == 1000 ? "" : " [" + RED + player.getHealthFixed() + " HP" + WHITE + "]";
        String round_health = PlayerUtil.isFuntime() && player.getHealthFixed() == 1000 ? "" : " [" + RED + Math.round(player.getHealthFixed()) + " HP" + WHITE + "]";
        String friend = EvaWare.inst().friendManager().isFriend(player.getGameProfile().getName()) ? GREEN + " [F]" + WHITE : "";
        String bot = (AntiBot.getInstance().isBot(player) ? DARK_RED + " [BOT]" + WHITE : "");

        if (optimized().getValue()) {
            if (PlayerUtil.isConnectedToServer("spookytime")) {
                return new StringTextComponent("").appendString(playerName.getString() + sphere + round_health + friend + bot);
            } else {
                return new StringTextComponent("").appendString(playerName.getString() + sphere + health + friend + bot + KT);
            }
        } else {
            return playerName.deepCopy().appendString(sphere + round_health + friend + bot);
        }
    }

    private String getCustomItemName(ItemStack stack) {
        List<String> tooltipStrings = stack.getTooltip(mc.player,
                        mc.gameSettings.advancedItemTooltips ? ITooltipFlag.TooltipFlags.ADVANCED : ITooltipFlag.TooltipFlags.NORMAL
                ).stream()
                .map(ITextComponent::getString)
                .collect(Collectors.toList());

        Map<List<String>, String> patternToName = new HashMap<>();
        // Талисманы
        patternToName.put(List.of("-4 Max Health", "+15% Speed", "+3 Attack Damage"), "Талисман Грани");
        patternToName.put(List.of("-4 Max Health", "+5 Attack Damage"), "Талисман Дедала");
        patternToName.put(List.of("-2 Armor Hardness", "+2 Armor", "+2 Max Health"), "Талисман Тритона  ");
        patternToName.put(List.of("+2 Max Health", "+2 Armor", "+2 Attack Damage"), "Талисман Гармонии");
        patternToName.put(List.of("+6 Max Health", "+10% Attack Speed"), "Талисман Феникса");
        patternToName.put(List.of("-2 Armor Hardness", "-2 Armor", "-4 Max Health", "+6 Damage"), "Талисман Ехидны");
        patternToName.put(List.of("+2 Armor Hardness", "+2 Armor", "+4 Max Health", "+3 Damage"), "Крушитель");
        patternToName.put(List.of("+7 Attack Damage", "+10% Speed", "-4 Max Health"), "Каратель");


        // Сферы
        patternToName.put(List.of("+2 Armor", "-4 Max Health", "+15% Speed", "+3 Damage"), "Сфера Андромеды");
        patternToName.put(List.of("-10% Armor", "+10% Speed", "+25% Damage"), "Сфера Пандоры");
        patternToName.put(List.of("+3 Armor Hardness", "+2 Armor", "-15% Speed"), "Сфера Фрика");
        patternToName.put(List.of("-10% Speed", "+4 Damage"), "Сфера Аполлона");
        patternToName.put(List.of("+4 Max Health", "-15% Attack Speed", "+3 Damage"), "Сфера Астрея");
        patternToName.put(List.of("-15% Knockback Attack", "-15% Knockback Resistance", "+2 Armor"), "Сфера Осириса");
        patternToName.put(List.of("-2 Max Health", "+15% Attack Speed", "+3 Damage"), "Сфера Химеры");

        for (Map.Entry<List<String>, String> entry : patternToName.entrySet()) {
            List<String> pattern = entry.getKey();
            boolean allMatch = pattern.stream().allMatch(effect -> tooltipStrings.stream().anyMatch(s -> s.contains(effect)));

            if (allMatch) {
                return entry.getValue();
            }
        }
//        System.out.println("[Debug]" + tooltipStrings);
        return stack.getDisplayName().getString().replaceFirst("^\\[[^]]+]\\s*", "");
    }

    private void drawArmor(MatrixStack matrix, PlayerEntity player, float x, float y, float width, float fontHeight) {
        List<ItemStack> items = new ArrayList<>();
        if (!player.getHeldItemOffhand().isEmpty()) items.add(player.getHeldItemOffhand());
        for (ItemStack itemStack : player.getArmorInventoryList()) {
            if (!itemStack.isEmpty()) items.add(itemStack.copy());
        }
        if (!player.getHeldItemMainhand().isEmpty()) items.add(player.getHeldItemMainhand());

        float posX = x + width / 2F + (-items.size() * 5) - 1;
        float posY = y - 12;
        float stackSize = 8;

        for (ItemStack item : items) {
            if (item.isEmpty()) continue;
            GLUtil.startScale(posX + (stackSize / 2F), posY + (stackSize / 2F), 0.5F);
            drawItemStack(matrix, item, posX, posY, true);
            GLUtil.endScale();
            posX += (stackSize + 2);
        }
    }

    public void drawItemStack(MatrixStack matrix, ItemStack stack, double x, double y, boolean drawRect) {
        matrix.push();
        RenderSystem.translated(x, y, 0);
        if (drawRect) RectUtil.drawRect(matrix, 0, 0, 16, 16, black);
        mc.getItemRenderer().renderItemAndEffectIntoGUI(stack, 0, 0);
        if (stack.getCount() > 1) {
            RenderSystem.translated(0, 0, 200);
            mc.fontRenderer.drawString(matrix, String.valueOf(stack.getCount()), (float) (16 - mc.fontRenderer.getStringWidth(String.valueOf(stack.getCount()))), 8, 0xFFFFFF);
        }
        RenderSystem.translated(-x, -y, 0);
        matrix.pop();
    }

    private void drawTag(MatrixStack matrix, ITextComponent tagComponent, float centerX, float y, float nameWidth, float fontHeight, float scale) {
        RectUtil.drawRect(matrix, centerX - (nameWidth / 2F) - 1, y - 0.5F, nameWidth + 2, fontHeight + 1, black);
        font.drawTextComponent(matrix, tagComponent, centerX - nameWidth / 2F, y, -1, false, fontHeight);
    }

    private AxisAlignedBB getEntityBox(Entity entity, Vector3d vec) {
        Vector3d size = new Vector3d(entity.getBoundingBox().maxX - entity.getBoundingBox().minX,
                entity.getBoundingBox().maxY - entity.getBoundingBox().minY,
                entity.getBoundingBox().maxZ - entity.getBoundingBox().minZ);

        return new AxisAlignedBB(vec.x - size.x / 2f, vec.y,
                vec.z - size.z / 2f, vec.x + size.x / 2f,
                vec.y + size.y + (0.2F - (entity.isSneaking() ? 0.1F : 0.0F)),
                vec.z + size.z / 2f);
    }

    private boolean isValid(final Entity entity) {
        if (!entity.isAlive()) {
            return false;
        }
        if (mc.renderViewEntity != null && entity == mc.renderViewEntity && mc.gameSettings.getPointOfView().firstPerson()) {
            return false;
        }
        return isInView(entity) && (entity instanceof PlayerEntity || entity instanceof ItemEntity);
    }

    public boolean isInView(Entity entity) {
        if (mc.getRenderViewEntity() == null || mc.worldRenderer.getClippinghelper() == null) {
            return false;
        }
        return mc.worldRenderer.getClippinghelper().isBoundingBoxInFrustum(entity.getBoundingBox()) || entity.ignoreFrustumCheck;
    }

    private float getWidth(ITextComponent text) {
        return font.getWidth(text, fontSize.getValue());
    }
}
Посмотреть вложение 307512
Вторая попытка выложить тему
1748687259762.png
 

Вложения

  • 1748687280251.png
    1748687280251.png
    8.6 KB · Просмотры: 66
Играя с нурика, я заметил, что даже в нем талики отображаются чисто по их названию, из за чего типо могут просто поменять название и не понятно, что тал/сфера. Именно поэтому сливаю данную функцию. База - Excellent Upgrade.

ss снизу)

NameTags:
Expand Collapse Copy
package eva.ware.client.managers.module.impl.render;

import eva.ware.client.EvaWare;
import eva.ware.client.api.events.orbit.EventHandler;
import eva.ware.client.api.events.orbit.EventPriority;
import eva.ware.client.managers.component.impl.target.TargetComponent;
import eva.ware.client.managers.events.other.PacketEvent;
import eva.ware.client.managers.events.render.Render2DEvent;
import eva.ware.client.managers.events.render.RenderNameEvent;
import eva.ware.client.managers.module.Category;
import eva.ware.client.managers.module.Module;
import eva.ware.client.managers.module.ModuleInfo;
import eva.ware.client.managers.module.impl.combat.AntiBot;
import eva.ware.client.managers.module.impl.misc.Globals;
import eva.ware.client.managers.module.settings.impl.BooleanSetting;
import eva.ware.client.managers.module.settings.impl.MultiBooleanSetting;
import eva.ware.client.managers.module.settings.impl.SliderSetting;
import eva.ware.client.utils.other.Instance;
import eva.ware.client.utils.player.PlayerUtil;
import eva.ware.client.utils.render.color.ColorFormatting;
import eva.ware.client.utils.render.color.ColorUtil;
import eva.ware.client.utils.render.draw.GLUtil;
import eva.ware.client.utils.render.draw.Project;
import eva.ware.client.utils.render.draw.RectUtil;
import eva.ware.client.utils.render.draw.RenderUtil3D;
import eva.ware.client.utils.render.font.Font;
import eva.ware.client.utils.render.font.Fonts;
import eva.ware.common.impl.globals.ClientAPI;
import eva.ware.common.impl.globals.Converter;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.experimental.Accessors;
import lombok.experimental.FieldDefaults;
import net.minecraft.client.entity.player.AbstractClientPlayerEntity;
import net.minecraft.client.util.ITooltipFlag;
import net.minecraft.entity.Entity;
import net.minecraft.entity.MobEntity;
import net.minecraft.entity.item.ItemEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.network.IPacket;
import net.minecraft.network.play.server.SEntityStatusPacket;
import net.minecraft.potion.EffectInstance;
import net.minecraft.potion.Effects;
import net.minecraft.util.StringUtils;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.StringTextComponent;
import net.minecraft.util.text.TextFormatting;
import net.mojang.blaze3d.matrix.MatrixStack;
import net.mojang.blaze3d.systems.RenderSystem;
import org.joml.Vector2f;
import org.joml.Vector4f;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.stream.Collectors;

[USER=270918]@Getter[/USER]
@Accessors(fluent = true)
@FieldDefaults(level = AccessLevel.PRIVATE)
@ModuleInfo(name = "Nametags", category = Category.RENDER)
public class Nametags extends Module {
    public static Nametags getInstance() {
        return Instance.get(Nametags.class);
    }

    private final MultiBooleanSetting checks = new MultiBooleanSetting(this, "Элементы",
            BooleanSetting.of("Игроки", true),
            BooleanSetting.of("Предметы", false)
    );

    private final SliderSetting fontSize = new SliderSetting(this, "Размер шрифта", 8F, 6F, 12F, 0.1F);
    private final BooleanSetting optimized = new BooleanSetting(this, "Оптимизировать", true);
    private final BooleanSetting otobr_spheres = new BooleanSetting(this, "Отображать сферу", true);
    private final BooleanSetting otobr_talismans = new BooleanSetting(this, "Отображать талисман", true);
    private final BooleanSetting renderDonat = new BooleanSetting(this, "Отображать донат", true);
    private final BooleanSetting showArmor = new BooleanSetting(this, "Отображать броню", true);
    private final int black = ColorUtil.getColor(0, 128);
    private final Font font = Fonts.SF_MEDIUM;
    private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
    private final int timeTick = 600;

    [USER=1489798]@EventHandler[/USER]
    public void onRenderName(RenderNameEvent event) {
        if (event.getEntity() instanceof AbstractClientPlayerEntity) event.cancel();
    }

    [USER=1489798]@EventHandler[/USER]
    public void onPacket(PacketEvent e) {
        if (PlayerUtil.nullCheck()) return;
        IPacket<?> packet = e.getPacket();
        if (packet instanceof SEntityStatusPacket entityStatus) {
            Entity entity = entityStatus.getEntity(mc.world);
            if (entity instanceof PlayerEntity player && (entityStatus.getOpCode() == 2 || entityStatus.getOpCode() == 33)) {
                if (!(player.prevFallDistance > 3 && player.fallDistance == 0)) {
                    for (Entity ent : mc.world.getAllEntities()) {
                        if (ent instanceof MobEntity mob && mob.getLastAttackedEntity() == player && mob.getLastAttackedEntityTime() < 1000) {
                            return;
                        }
                    }
                    player.addPotionEffect(new EffectInstance(Effects.UNLUCK, timeTick, -1));
                }
            }
        }
    }

    @EventHandler(priority = EventPriority.LOWEST)
    public void onRender2D(Render2DEvent event) {
        float fontHeight = fontSize.getValue();

        TargetComponent.getTargets(128, this::isValid, false)
                .forEach(entity -> renderNametag(entity, event.getMatrix(), fontHeight));
        if (checks.getValue("Предметы")) {
            mc.world.loadedItemEntityList().forEach(entity -> renderNametag(entity, event.getMatrix(), fontHeight));
        }
    }

    private void renderNametag(Entity entity, MatrixStack matrix, float fontHeight) {
        Vector3d interpolated = RenderUtil3D.interpolate(entity, mc.getRenderPartialTicks());
        AxisAlignedBB aabb = getEntityBox(entity, interpolated);

        Vector2f min = new Vector2f(Float.MAX_VALUE, Float.MAX_VALUE);
        Vector2f max = new Vector2f(Float.MIN_VALUE, Float.MIN_VALUE);

        for (Vector3d vector : aabb.getCorners()) {
            Vector2f vec = Project.project2D(vector);
            if (vec.x != Float.MAX_VALUE && vec.y != Float.MAX_VALUE) {
                min.x = Math.min(min.x, vec.x);
                min.y = Math.min(min.y, vec.y);
                max.x = Math.max(max.x, vec.x);
                max.y = Math.max(max.y, vec.y);
            }
        }
        Vector4f position = new Vector4f(min.x, min.y, max.x, max.y);

        float x = position.x;
        float y = position.y - fontHeight;
        float width = position.z - x;
        float height = position.w - y;
        float centerX = x + (width / 2F);
        ITextComponent tagComponent = null;
        float nameWidth = 0;
        float scale = 0.5F;

        if (checks.getValue("Игроки") && entity instanceof PlayerEntity player) {
            tagComponent = createPlayerTagComponent(player);
            nameWidth = getWidth(tagComponent);

            if (showArmor().getValue()) {
                drawArmor(matrix, player, x, y, width, fontHeight);
            }
        } else if (checks.getValue("Предметы") && entity instanceof ItemEntity item) {
            tagComponent = new StringTextComponent("").append(item.getItem().getDisplayName());
            if (item.getItem().getCount() > 1) {
                String GRAY = ColorFormatting.getColor(TextFormatting.GRAY.getColor());
                tagComponent = tagComponent.deepCopy().appendString(GRAY + " " + item.getItem().getCount() + "x");
            }
            nameWidth = getWidth(tagComponent);
        }

        if (tagComponent != null) {
            drawTag(matrix, tagComponent, centerX, y, nameWidth, fontHeight, scale);

            if (checks.getValue("Игроки") && entity instanceof PlayerEntity player && Globals.getInstance().isEnabled()) {
                String client = ClientAPI.getClient(entity.getName().getString());
                if (client != null) {
                    String userImageURL = "https://rockstar.moscow/api/globals/" + client + ".png";
                    mc.getTextureManager().bindTexture(Converter.getResourceLocation(userImageURL));
                    float size = fontHeight + 1;
                    RectUtil.drawRect(matrix, centerX - nameWidth / 2F - size, y - 0.5f, size, size, -1, false, true);
                }
            }
        }
    }

    private ITextComponent createPlayerTagComponent(PlayerEntity player) {
        ItemStack offHandStack = player.getHeldItemOffhand();
        CompoundNBT offHandNBT = offHandStack.getTag();
        String RED = ColorFormatting.getColor(TextFormatting.RED.getColor());
        String GREEN = ColorFormatting.getColor(TextFormatting.GREEN.getColor());
        String DARK_RED = ColorFormatting.getColor(TextFormatting.DARK_RED.getColor());
        String GOLD = ColorFormatting.getColor(TextFormatting.GOLD.getColor());
        String WHITE = ColorFormatting.getColor(TextFormatting.WHITE.getColor());
        String sphere = "";
        String KT = "";
        for (EffectInstance potion : player.getActivePotionEffects()) {
            int duration = potion.getDuration();
            if (duration != 0 && potion.getPotion() == Effects.UNLUCK && potion.getAmplifier() == -1) {
                KT = " [" + RED + StringUtils.ticksToElapsedTime(duration).replace(duration >= 200 ? "0:" : "0:0", "") + WHITE + "]";
                break;
            }
        }
        ITextComponent playerName = renderDonat.getValue() ? player.getDisplayName() : player.getName();
        if (offHandNBT != null) {
            String itemName = getCustomItemName(offHandStack);

            if (offHandNBT.getInt("tslevel") != 0) {
                sphere = " [" + GOLD + itemName + RED + " " + offHandNBT.getInt("tslevel") + "/3" + WHITE + "]";
            } else if (otobr_spheres.getValue() && offHandStack.getItem().getTranslationKey().contains("player_head")) {
                sphere = " [" + GOLD + itemName + WHITE + "]";
            } else if (otobr_talismans.getValue() && offHandStack.getItem().getTranslationKey().contains("totem_of_undying")) {
                sphere = " [" + GOLD + itemName + WHITE + "]";
            }
        }

        String health = PlayerUtil.isFuntime() && player.getHealthFixed() == 1000 ? "" : " [" + RED + player.getHealthFixed() + " HP" + WHITE + "]";
        String round_health = PlayerUtil.isFuntime() && player.getHealthFixed() == 1000 ? "" : " [" + RED + Math.round(player.getHealthFixed()) + " HP" + WHITE + "]";
        String friend = EvaWare.inst().friendManager().isFriend(player.getGameProfile().getName()) ? GREEN + " [F]" + WHITE : "";
        String bot = (AntiBot.getInstance().isBot(player) ? DARK_RED + " [BOT]" + WHITE : "");

        if (optimized().getValue()) {
            if (PlayerUtil.isConnectedToServer("spookytime")) {
                return new StringTextComponent("").appendString(playerName.getString() + sphere + round_health + friend + bot);
            } else {
                return new StringTextComponent("").appendString(playerName.getString() + sphere + health + friend + bot + KT);
            }
        } else {
            return playerName.deepCopy().appendString(sphere + round_health + friend + bot);
        }
    }

    private String getCustomItemName(ItemStack stack) {
        List<String> tooltipStrings = stack.getTooltip(mc.player,
                        mc.gameSettings.advancedItemTooltips ? ITooltipFlag.TooltipFlags.ADVANCED : ITooltipFlag.TooltipFlags.NORMAL
                ).stream()
                .map(ITextComponent::getString)
                .collect(Collectors.toList());

        Map<List<String>, String> patternToName = new HashMap<>();
        // Талисманы
        patternToName.put(List.of("-4 Max Health", "+15% Speed", "+3 Attack Damage"), "Талисман Грани");
        patternToName.put(List.of("-4 Max Health", "+5 Attack Damage"), "Талисман Дедала");
        patternToName.put(List.of("-2 Armor Hardness", "+2 Armor", "+2 Max Health"), "Талисман Тритона  ");
        patternToName.put(List.of("+2 Max Health", "+2 Armor", "+2 Attack Damage"), "Талисман Гармонии");
        patternToName.put(List.of("+6 Max Health", "+10% Attack Speed"), "Талисман Феникса");
        patternToName.put(List.of("-2 Armor Hardness", "-2 Armor", "-4 Max Health", "+6 Damage"), "Талисман Ехидны");
        patternToName.put(List.of("+2 Armor Hardness", "+2 Armor", "+4 Max Health", "+3 Damage"), "Крушитель");
        patternToName.put(List.of("+7 Attack Damage", "+10% Speed", "-4 Max Health"), "Каратель");


        // Сферы
        patternToName.put(List.of("+2 Armor", "-4 Max Health", "+15% Speed", "+3 Damage"), "Сфера Андромеды");
        patternToName.put(List.of("-10% Armor", "+10% Speed", "+25% Damage"), "Сфера Пандоры");
        patternToName.put(List.of("+3 Armor Hardness", "+2 Armor", "-15% Speed"), "Сфера Фрика");
        patternToName.put(List.of("-10% Speed", "+4 Damage"), "Сфера Аполлона");
        patternToName.put(List.of("+4 Max Health", "-15% Attack Speed", "+3 Damage"), "Сфера Астрея");
        patternToName.put(List.of("-15% Knockback Attack", "-15% Knockback Resistance", "+2 Armor"), "Сфера Осириса");
        patternToName.put(List.of("-2 Max Health", "+15% Attack Speed", "+3 Damage"), "Сфера Химеры");

        for (Map.Entry<List<String>, String> entry : patternToName.entrySet()) {
            List<String> pattern = entry.getKey();
            boolean allMatch = pattern.stream().allMatch(effect -> tooltipStrings.stream().anyMatch(s -> s.contains(effect)));

            if (allMatch) {
                return entry.getValue();
            }
        }
//        System.out.println("[Debug]" + tooltipStrings);
        return stack.getDisplayName().getString().replaceFirst("^\\[[^]]+]\\s*", "");
    }

    private void drawArmor(MatrixStack matrix, PlayerEntity player, float x, float y, float width, float fontHeight) {
        List<ItemStack> items = new ArrayList<>();
        if (!player.getHeldItemOffhand().isEmpty()) items.add(player.getHeldItemOffhand());
        for (ItemStack itemStack : player.getArmorInventoryList()) {
            if (!itemStack.isEmpty()) items.add(itemStack.copy());
        }
        if (!player.getHeldItemMainhand().isEmpty()) items.add(player.getHeldItemMainhand());

        float posX = x + width / 2F + (-items.size() * 5) - 1;
        float posY = y - 12;
        float stackSize = 8;

        for (ItemStack item : items) {
            if (item.isEmpty()) continue;
            GLUtil.startScale(posX + (stackSize / 2F), posY + (stackSize / 2F), 0.5F);
            drawItemStack(matrix, item, posX, posY, true);
            GLUtil.endScale();
            posX += (stackSize + 2);
        }
    }

    public void drawItemStack(MatrixStack matrix, ItemStack stack, double x, double y, boolean drawRect) {
        matrix.push();
        RenderSystem.translated(x, y, 0);
        if (drawRect) RectUtil.drawRect(matrix, 0, 0, 16, 16, black);
        mc.getItemRenderer().renderItemAndEffectIntoGUI(stack, 0, 0);
        if (stack.getCount() > 1) {
            RenderSystem.translated(0, 0, 200);
            mc.fontRenderer.drawString(matrix, String.valueOf(stack.getCount()), (float) (16 - mc.fontRenderer.getStringWidth(String.valueOf(stack.getCount()))), 8, 0xFFFFFF);
        }
        RenderSystem.translated(-x, -y, 0);
        matrix.pop();
    }

    private void drawTag(MatrixStack matrix, ITextComponent tagComponent, float centerX, float y, float nameWidth, float fontHeight, float scale) {
        RectUtil.drawRect(matrix, centerX - (nameWidth / 2F) - 1, y - 0.5F, nameWidth + 2, fontHeight + 1, black);
        font.drawTextComponent(matrix, tagComponent, centerX - nameWidth / 2F, y, -1, false, fontHeight);
    }

    private AxisAlignedBB getEntityBox(Entity entity, Vector3d vec) {
        Vector3d size = new Vector3d(entity.getBoundingBox().maxX - entity.getBoundingBox().minX,
                entity.getBoundingBox().maxY - entity.getBoundingBox().minY,
                entity.getBoundingBox().maxZ - entity.getBoundingBox().minZ);

        return new AxisAlignedBB(vec.x - size.x / 2f, vec.y,
                vec.z - size.z / 2f, vec.x + size.x / 2f,
                vec.y + size.y + (0.2F - (entity.isSneaking() ? 0.1F : 0.0F)),
                vec.z + size.z / 2f);
    }

    private boolean isValid(final Entity entity) {
        if (!entity.isAlive()) {
            return false;
        }
        if (mc.renderViewEntity != null && entity == mc.renderViewEntity && mc.gameSettings.getPointOfView().firstPerson()) {
            return false;
        }
        return isInView(entity) && (entity instanceof PlayerEntity || entity instanceof ItemEntity);
    }

    public boolean isInView(Entity entity) {
        if (mc.getRenderViewEntity() == null || mc.worldRenderer.getClippinghelper() == null) {
            return false;
        }
        return mc.worldRenderer.getClippinghelper().isBoundingBoxInFrustum(entity.getBoundingBox()) || entity.ignoreFrustumCheck;
    }

    private float getWidth(ITextComponent text) {
        return font.getWidth(text, fontSize.getValue());
    }
}
Посмотреть вложение 307512
Вторая попытка выложить тему
ужс почему не сделать получение головы в base64 и сделать сравнение с готовыми значениями???
 
Вот фикс
Код:
Expand Collapse Copy
private String getCustomItemName(ItemStack stack) {
        List<String> tooltipStrings = stack.getTooltip(mc.player,
                        mc.gameSettings.advancedItemTooltips ? ITooltipFlag.TooltipFlags.ADVANCED : ITooltipFlag.TooltipFlags.NORMAL
                ).stream()
                .map(ITextComponent::getString)
                .collect(Collectors.toList());

        Map<List<String>, Pair<Item, String>> patternToItemName = new HashMap<>();

        // талики
        patternToItemName.put(List.of("-4 Max Health", "+15% Speed", "+3 Attack Damage"), new Pair<>(Items.TOTEM_OF_UNDYING, "Талисман Грани"));
        patternToItemName.put(List.of("-4 Max Health", "+5 Attack Damage"), new Pair<>(Items.TOTEM_OF_UNDYING, "Талисман Дедала"));
        patternToItemName.put(List.of("-2 Armor Toughness", "+2 Armor", "+2 Max Health"), new Pair<>(Items.TOTEM_OF_UNDYING, "Талисман Тритона"));
        patternToItemName.put(List.of("+2 Max Health", "+2 Armor", "+2 Attack Damage"), new Pair<>(Items.TOTEM_OF_UNDYING, "Талисман Гармонии"));
        patternToItemName.put(List.of("+6 Max Health", "+10% Attack Speed"), new Pair<>(Items.TOTEM_OF_UNDYING, "Талисман Феникса"));
        patternToItemName.put(List.of("-2 Armor Toughness", "-2 Armor", "-4 Max Health", "+6 Attack Damage"), new Pair<>(Items.TOTEM_OF_UNDYING, "Талисман Ехидны"));
        patternToItemName.put(List.of("+2 Armor Toughness", "+2 Armor", "+4 Max Health", "+3 Attack Damage"), new Pair<>(Items.TOTEM_OF_UNDYING, "Крушитель"));
        patternToItemName.put(List.of("+7 Attack Damage", "+10% Speed", "-4 Max Health"), new Pair<>(Items.TOTEM_OF_UNDYING, "Каратель"));

        // сферы
        patternToItemName.put(List.of("+2 Armor", "-4 Max Health", "+15% Speed", "+3 Attack Damage"), new Pair<>(Items.PLAYER_HEAD, "Сфера Андромеды"));
        patternToItemName.put(List.of("-10% Armor", "+10% Speed", "+25% Attack Damage"), new Pair<>(Items.PLAYER_HEAD, "Сфера Пандоры"));
        patternToItemName.put(List.of("+3 Armor Toughness", "+2 Armor", "-15% Speed"), new Pair<>(Items.PLAYER_HEAD, "Сфера Фрика"));
        patternToItemName.put(List.of("-10% Speed", "+4 Attack Damage"), new Pair<>(Items.PLAYER_HEAD, "Сфера Аполлона"));
        patternToItemName.put(List.of("+4 Max Health", "-15% Attack Speed", "+3 Attack Damage"), new Pair<>(Items.PLAYER_HEAD, "Сфера Астрея"));
        patternToItemName.put(List.of("-15% Knockback Attack", "-15% Knockback Resistance", "+2 Armor"), new Pair<>(Items.PLAYER_HEAD, "Сфера Осириса"));
        patternToItemName.put(List.of("-2 Max Health", "+15% Attack Speed", "+3 Attack Damage"), new Pair<>(Items.PLAYER_HEAD, "Сфера Химеры"));

        for (Map.Entry<List<String>, Pair<Item, String>> entry : patternToItemName.entrySet()) {
            List<String> pattern = entry.getKey();
            boolean allMatch = pattern.stream().allMatch(effect -> tooltipStrings.stream().anyMatch(s -> s.contains(effect)));

            if (allMatch) {
                return entry.getValue().getSecond();
            }
        }
//        System.out.println("[Debug]" + tooltipStrings);
        return stack.getDisplayName().getString().replaceFirst("^\\[[^]]+]\\s*", "");
    }
 
Я голову ломал как это сделать, спасибо тебе
 
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Играя с нурика, я заметил, что даже в нем талики отображаются чисто по их названию, из за чего типо могут просто поменять название и не понятно, что тал/сфера. Именно поэтому сливаю данную функцию. База - Excellent Upgrade.

ss снизу)

NameTags:
Expand Collapse Copy
package eva.ware.client.managers.module.impl.render;

import eva.ware.client.EvaWare;
import eva.ware.client.api.events.orbit.EventHandler;
import eva.ware.client.api.events.orbit.EventPriority;
import eva.ware.client.managers.component.impl.target.TargetComponent;
import eva.ware.client.managers.events.other.PacketEvent;
import eva.ware.client.managers.events.render.Render2DEvent;
import eva.ware.client.managers.events.render.RenderNameEvent;
import eva.ware.client.managers.module.Category;
import eva.ware.client.managers.module.Module;
import eva.ware.client.managers.module.ModuleInfo;
import eva.ware.client.managers.module.impl.combat.AntiBot;
import eva.ware.client.managers.module.impl.misc.Globals;
import eva.ware.client.managers.module.settings.impl.BooleanSetting;
import eva.ware.client.managers.module.settings.impl.MultiBooleanSetting;
import eva.ware.client.managers.module.settings.impl.SliderSetting;
import eva.ware.client.utils.other.Instance;
import eva.ware.client.utils.player.PlayerUtil;
import eva.ware.client.utils.render.color.ColorFormatting;
import eva.ware.client.utils.render.color.ColorUtil;
import eva.ware.client.utils.render.draw.GLUtil;
import eva.ware.client.utils.render.draw.Project;
import eva.ware.client.utils.render.draw.RectUtil;
import eva.ware.client.utils.render.draw.RenderUtil3D;
import eva.ware.client.utils.render.font.Font;
import eva.ware.client.utils.render.font.Fonts;
import eva.ware.common.impl.globals.ClientAPI;
import eva.ware.common.impl.globals.Converter;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.experimental.Accessors;
import lombok.experimental.FieldDefaults;
import net.minecraft.client.entity.player.AbstractClientPlayerEntity;
import net.minecraft.client.util.ITooltipFlag;
import net.minecraft.entity.Entity;
import net.minecraft.entity.MobEntity;
import net.minecraft.entity.item.ItemEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.CompoundNBT;
import net.minecraft.network.IPacket;
import net.minecraft.network.play.server.SEntityStatusPacket;
import net.minecraft.potion.EffectInstance;
import net.minecraft.potion.Effects;
import net.minecraft.util.StringUtils;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.vector.Vector3d;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.StringTextComponent;
import net.minecraft.util.text.TextFormatting;
import net.mojang.blaze3d.matrix.MatrixStack;
import net.mojang.blaze3d.systems.RenderSystem;
import org.joml.Vector2f;
import org.joml.Vector4f;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.stream.Collectors;

[USER=270918]@Getter[/USER]
@Accessors(fluent = true)
@FieldDefaults(level = AccessLevel.PRIVATE)
@ModuleInfo(name = "Nametags", category = Category.RENDER)
public class Nametags extends Module {
    public static Nametags getInstance() {
        return Instance.get(Nametags.class);
    }

    private final MultiBooleanSetting checks = new MultiBooleanSetting(this, "Элементы",
            BooleanSetting.of("Игроки", true),
            BooleanSetting.of("Предметы", false)
    );

    private final SliderSetting fontSize = new SliderSetting(this, "Размер шрифта", 8F, 6F, 12F, 0.1F);
    private final BooleanSetting optimized = new BooleanSetting(this, "Оптимизировать", true);
    private final BooleanSetting otobr_spheres = new BooleanSetting(this, "Отображать сферу", true);
    private final BooleanSetting otobr_talismans = new BooleanSetting(this, "Отображать талисман", true);
    private final BooleanSetting renderDonat = new BooleanSetting(this, "Отображать донат", true);
    private final BooleanSetting showArmor = new BooleanSetting(this, "Отображать броню", true);
    private final int black = ColorUtil.getColor(0, 128);
    private final Font font = Fonts.SF_MEDIUM;
    private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
    private final int timeTick = 600;

    [USER=1489798]@EventHandler[/USER]
    public void onRenderName(RenderNameEvent event) {
        if (event.getEntity() instanceof AbstractClientPlayerEntity) event.cancel();
    }

    [USER=1489798]@EventHandler[/USER]
    public void onPacket(PacketEvent e) {
        if (PlayerUtil.nullCheck()) return;
        IPacket<?> packet = e.getPacket();
        if (packet instanceof SEntityStatusPacket entityStatus) {
            Entity entity = entityStatus.getEntity(mc.world);
            if (entity instanceof PlayerEntity player && (entityStatus.getOpCode() == 2 || entityStatus.getOpCode() == 33)) {
                if (!(player.prevFallDistance > 3 && player.fallDistance == 0)) {
                    for (Entity ent : mc.world.getAllEntities()) {
                        if (ent instanceof MobEntity mob && mob.getLastAttackedEntity() == player && mob.getLastAttackedEntityTime() < 1000) {
                            return;
                        }
                    }
                    player.addPotionEffect(new EffectInstance(Effects.UNLUCK, timeTick, -1));
                }
            }
        }
    }

    @EventHandler(priority = EventPriority.LOWEST)
    public void onRender2D(Render2DEvent event) {
        float fontHeight = fontSize.getValue();

        TargetComponent.getTargets(128, this::isValid, false)
                .forEach(entity -> renderNametag(entity, event.getMatrix(), fontHeight));
        if (checks.getValue("Предметы")) {
            mc.world.loadedItemEntityList().forEach(entity -> renderNametag(entity, event.getMatrix(), fontHeight));
        }
    }

    private void renderNametag(Entity entity, MatrixStack matrix, float fontHeight) {
        Vector3d interpolated = RenderUtil3D.interpolate(entity, mc.getRenderPartialTicks());
        AxisAlignedBB aabb = getEntityBox(entity, interpolated);

        Vector2f min = new Vector2f(Float.MAX_VALUE, Float.MAX_VALUE);
        Vector2f max = new Vector2f(Float.MIN_VALUE, Float.MIN_VALUE);

        for (Vector3d vector : aabb.getCorners()) {
            Vector2f vec = Project.project2D(vector);
            if (vec.x != Float.MAX_VALUE && vec.y != Float.MAX_VALUE) {
                min.x = Math.min(min.x, vec.x);
                min.y = Math.min(min.y, vec.y);
                max.x = Math.max(max.x, vec.x);
                max.y = Math.max(max.y, vec.y);
            }
        }
        Vector4f position = new Vector4f(min.x, min.y, max.x, max.y);

        float x = position.x;
        float y = position.y - fontHeight;
        float width = position.z - x;
        float height = position.w - y;
        float centerX = x + (width / 2F);
        ITextComponent tagComponent = null;
        float nameWidth = 0;
        float scale = 0.5F;

        if (checks.getValue("Игроки") && entity instanceof PlayerEntity player) {
            tagComponent = createPlayerTagComponent(player);
            nameWidth = getWidth(tagComponent);

            if (showArmor().getValue()) {
                drawArmor(matrix, player, x, y, width, fontHeight);
            }
        } else if (checks.getValue("Предметы") && entity instanceof ItemEntity item) {
            tagComponent = new StringTextComponent("").append(item.getItem().getDisplayName());
            if (item.getItem().getCount() > 1) {
                String GRAY = ColorFormatting.getColor(TextFormatting.GRAY.getColor());
                tagComponent = tagComponent.deepCopy().appendString(GRAY + " " + item.getItem().getCount() + "x");
            }
            nameWidth = getWidth(tagComponent);
        }

        if (tagComponent != null) {
            drawTag(matrix, tagComponent, centerX, y, nameWidth, fontHeight, scale);

            if (checks.getValue("Игроки") && entity instanceof PlayerEntity player && Globals.getInstance().isEnabled()) {
                String client = ClientAPI.getClient(entity.getName().getString());
                if (client != null) {
                    String userImageURL = "https://rockstar.moscow/api/globals/" + client + ".png";
                    mc.getTextureManager().bindTexture(Converter.getResourceLocation(userImageURL));
                    float size = fontHeight + 1;
                    RectUtil.drawRect(matrix, centerX - nameWidth / 2F - size, y - 0.5f, size, size, -1, false, true);
                }
            }
        }
    }

    private ITextComponent createPlayerTagComponent(PlayerEntity player) {
        ItemStack offHandStack = player.getHeldItemOffhand();
        CompoundNBT offHandNBT = offHandStack.getTag();
        String RED = ColorFormatting.getColor(TextFormatting.RED.getColor());
        String GREEN = ColorFormatting.getColor(TextFormatting.GREEN.getColor());
        String DARK_RED = ColorFormatting.getColor(TextFormatting.DARK_RED.getColor());
        String GOLD = ColorFormatting.getColor(TextFormatting.GOLD.getColor());
        String WHITE = ColorFormatting.getColor(TextFormatting.WHITE.getColor());
        String sphere = "";
        String KT = "";
        for (EffectInstance potion : player.getActivePotionEffects()) {
            int duration = potion.getDuration();
            if (duration != 0 && potion.getPotion() == Effects.UNLUCK && potion.getAmplifier() == -1) {
                KT = " [" + RED + StringUtils.ticksToElapsedTime(duration).replace(duration >= 200 ? "0:" : "0:0", "") + WHITE + "]";
                break;
            }
        }
        ITextComponent playerName = renderDonat.getValue() ? player.getDisplayName() : player.getName();
        if (offHandNBT != null) {
            String itemName = getCustomItemName(offHandStack);

            if (offHandNBT.getInt("tslevel") != 0) {
                sphere = " [" + GOLD + itemName + RED + " " + offHandNBT.getInt("tslevel") + "/3" + WHITE + "]";
            } else if (otobr_spheres.getValue() && offHandStack.getItem().getTranslationKey().contains("player_head")) {
                sphere = " [" + GOLD + itemName + WHITE + "]";
            } else if (otobr_talismans.getValue() && offHandStack.getItem().getTranslationKey().contains("totem_of_undying")) {
                sphere = " [" + GOLD + itemName + WHITE + "]";
            }
        }

        String health = PlayerUtil.isFuntime() && player.getHealthFixed() == 1000 ? "" : " [" + RED + player.getHealthFixed() + " HP" + WHITE + "]";
        String round_health = PlayerUtil.isFuntime() && player.getHealthFixed() == 1000 ? "" : " [" + RED + Math.round(player.getHealthFixed()) + " HP" + WHITE + "]";
        String friend = EvaWare.inst().friendManager().isFriend(player.getGameProfile().getName()) ? GREEN + " [F]" + WHITE : "";
        String bot = (AntiBot.getInstance().isBot(player) ? DARK_RED + " [BOT]" + WHITE : "");

        if (optimized().getValue()) {
            if (PlayerUtil.isConnectedToServer("spookytime")) {
                return new StringTextComponent("").appendString(playerName.getString() + sphere + round_health + friend + bot);
            } else {
                return new StringTextComponent("").appendString(playerName.getString() + sphere + health + friend + bot + KT);
            }
        } else {
            return playerName.deepCopy().appendString(sphere + round_health + friend + bot);
        }
    }

    private String getCustomItemName(ItemStack stack) {
        List<String> tooltipStrings = stack.getTooltip(mc.player,
                        mc.gameSettings.advancedItemTooltips ? ITooltipFlag.TooltipFlags.ADVANCED : ITooltipFlag.TooltipFlags.NORMAL
                ).stream()
                .map(ITextComponent::getString)
                .collect(Collectors.toList());

        Map<List<String>, String> patternToName = new HashMap<>();
        // Талисманы
        patternToName.put(List.of("-4 Max Health", "+15% Speed", "+3 Attack Damage"), "Талисман Грани");
        patternToName.put(List.of("-4 Max Health", "+5 Attack Damage"), "Талисман Дедала");
        patternToName.put(List.of("-2 Armor Hardness", "+2 Armor", "+2 Max Health"), "Талисман Тритона  ");
        patternToName.put(List.of("+2 Max Health", "+2 Armor", "+2 Attack Damage"), "Талисман Гармонии");
        patternToName.put(List.of("+6 Max Health", "+10% Attack Speed"), "Талисман Феникса");
        patternToName.put(List.of("-2 Armor Hardness", "-2 Armor", "-4 Max Health", "+6 Damage"), "Талисман Ехидны");
        patternToName.put(List.of("+2 Armor Hardness", "+2 Armor", "+4 Max Health", "+3 Damage"), "Крушитель");
        patternToName.put(List.of("+7 Attack Damage", "+10% Speed", "-4 Max Health"), "Каратель");


        // Сферы
        patternToName.put(List.of("+2 Armor", "-4 Max Health", "+15% Speed", "+3 Damage"), "Сфера Андромеды");
        patternToName.put(List.of("-10% Armor", "+10% Speed", "+25% Damage"), "Сфера Пандоры");
        patternToName.put(List.of("+3 Armor Hardness", "+2 Armor", "-15% Speed"), "Сфера Фрика");
        patternToName.put(List.of("-10% Speed", "+4 Damage"), "Сфера Аполлона");
        patternToName.put(List.of("+4 Max Health", "-15% Attack Speed", "+3 Damage"), "Сфера Астрея");
        patternToName.put(List.of("-15% Knockback Attack", "-15% Knockback Resistance", "+2 Armor"), "Сфера Осириса");
        patternToName.put(List.of("-2 Max Health", "+15% Attack Speed", "+3 Damage"), "Сфера Химеры");

        for (Map.Entry<List<String>, String> entry : patternToName.entrySet()) {
            List<String> pattern = entry.getKey();
            boolean allMatch = pattern.stream().allMatch(effect -> tooltipStrings.stream().anyMatch(s -> s.contains(effect)));

            if (allMatch) {
                return entry.getValue();
            }
        }
//        System.out.println("[Debug]" + tooltipStrings);
        return stack.getDisplayName().getString().replaceFirst("^\\[[^]]+]\\s*", "");
    }

    private void drawArmor(MatrixStack matrix, PlayerEntity player, float x, float y, float width, float fontHeight) {
        List<ItemStack> items = new ArrayList<>();
        if (!player.getHeldItemOffhand().isEmpty()) items.add(player.getHeldItemOffhand());
        for (ItemStack itemStack : player.getArmorInventoryList()) {
            if (!itemStack.isEmpty()) items.add(itemStack.copy());
        }
        if (!player.getHeldItemMainhand().isEmpty()) items.add(player.getHeldItemMainhand());

        float posX = x + width / 2F + (-items.size() * 5) - 1;
        float posY = y - 12;
        float stackSize = 8;

        for (ItemStack item : items) {
            if (item.isEmpty()) continue;
            GLUtil.startScale(posX + (stackSize / 2F), posY + (stackSize / 2F), 0.5F);
            drawItemStack(matrix, item, posX, posY, true);
            GLUtil.endScale();
            posX += (stackSize + 2);
        }
    }

    public void drawItemStack(MatrixStack matrix, ItemStack stack, double x, double y, boolean drawRect) {
        matrix.push();
        RenderSystem.translated(x, y, 0);
        if (drawRect) RectUtil.drawRect(matrix, 0, 0, 16, 16, black);
        mc.getItemRenderer().renderItemAndEffectIntoGUI(stack, 0, 0);
        if (stack.getCount() > 1) {
            RenderSystem.translated(0, 0, 200);
            mc.fontRenderer.drawString(matrix, String.valueOf(stack.getCount()), (float) (16 - mc.fontRenderer.getStringWidth(String.valueOf(stack.getCount()))), 8, 0xFFFFFF);
        }
        RenderSystem.translated(-x, -y, 0);
        matrix.pop();
    }

    private void drawTag(MatrixStack matrix, ITextComponent tagComponent, float centerX, float y, float nameWidth, float fontHeight, float scale) {
        RectUtil.drawRect(matrix, centerX - (nameWidth / 2F) - 1, y - 0.5F, nameWidth + 2, fontHeight + 1, black);
        font.drawTextComponent(matrix, tagComponent, centerX - nameWidth / 2F, y, -1, false, fontHeight);
    }

    private AxisAlignedBB getEntityBox(Entity entity, Vector3d vec) {
        Vector3d size = new Vector3d(entity.getBoundingBox().maxX - entity.getBoundingBox().minX,
                entity.getBoundingBox().maxY - entity.getBoundingBox().minY,
                entity.getBoundingBox().maxZ - entity.getBoundingBox().minZ);

        return new AxisAlignedBB(vec.x - size.x / 2f, vec.y,
                vec.z - size.z / 2f, vec.x + size.x / 2f,
                vec.y + size.y + (0.2F - (entity.isSneaking() ? 0.1F : 0.0F)),
                vec.z + size.z / 2f);
    }

    private boolean isValid(final Entity entity) {
        if (!entity.isAlive()) {
            return false;
        }
        if (mc.renderViewEntity != null && entity == mc.renderViewEntity && mc.gameSettings.getPointOfView().firstPerson()) {
            return false;
        }
        return isInView(entity) && (entity instanceof PlayerEntity || entity instanceof ItemEntity);
    }

    public boolean isInView(Entity entity) {
        if (mc.getRenderViewEntity() == null || mc.worldRenderer.getClippinghelper() == null) {
            return false;
        }
        return mc.worldRenderer.getClippinghelper().isBoundingBoxInFrustum(entity.getBoundingBox()) || entity.ignoreFrustumCheck;
    }

    private float getWidth(ITextComponent text) {
        return font.getWidth(text, fontSize.getValue());
    }
}
Посмотреть вложение 307512
Вторая попытка выложить тему
1748790961370.png

1748790966772.png
 
Вот фикс
Код:
Expand Collapse Copy
private String getCustomItemName(ItemStack stack) {
        List<String> tooltipStrings = stack.getTooltip(mc.player,
                        mc.gameSettings.advancedItemTooltips ? ITooltipFlag.TooltipFlags.ADVANCED : ITooltipFlag.TooltipFlags.NORMAL
                ).stream()
                .map(ITextComponent::getString)
                .collect(Collectors.toList());

        Map<List<String>, Pair<Item, String>> patternToItemName = new HashMap<>();

        // талики
        patternToItemName.put(List.of("-4 Max Health", "+15% Speed", "+3 Attack Damage"), new Pair<>(Items.TOTEM_OF_UNDYING, "Талисман Грани"));
        patternToItemName.put(List.of("-4 Max Health", "+5 Attack Damage"), new Pair<>(Items.TOTEM_OF_UNDYING, "Талисман Дедала"));
        patternToItemName.put(List.of("-2 Armor Toughness", "+2 Armor", "+2 Max Health"), new Pair<>(Items.TOTEM_OF_UNDYING, "Талисман Тритона"));
        patternToItemName.put(List.of("+2 Max Health", "+2 Armor", "+2 Attack Damage"), new Pair<>(Items.TOTEM_OF_UNDYING, "Талисман Гармонии"));
        patternToItemName.put(List.of("+6 Max Health", "+10% Attack Speed"), new Pair<>(Items.TOTEM_OF_UNDYING, "Талисман Феникса"));
        patternToItemName.put(List.of("-2 Armor Toughness", "-2 Armor", "-4 Max Health", "+6 Attack Damage"), new Pair<>(Items.TOTEM_OF_UNDYING, "Талисман Ехидны"));
        patternToItemName.put(List.of("+2 Armor Toughness", "+2 Armor", "+4 Max Health", "+3 Attack Damage"), new Pair<>(Items.TOTEM_OF_UNDYING, "Крушитель"));
        patternToItemName.put(List.of("+7 Attack Damage", "+10% Speed", "-4 Max Health"), new Pair<>(Items.TOTEM_OF_UNDYING, "Каратель"));

        // сферы
        patternToItemName.put(List.of("+2 Armor", "-4 Max Health", "+15% Speed", "+3 Attack Damage"), new Pair<>(Items.PLAYER_HEAD, "Сфера Андромеды"));
        patternToItemName.put(List.of("-10% Armor", "+10% Speed", "+25% Attack Damage"), new Pair<>(Items.PLAYER_HEAD, "Сфера Пандоры"));
        patternToItemName.put(List.of("+3 Armor Toughness", "+2 Armor", "-15% Speed"), new Pair<>(Items.PLAYER_HEAD, "Сфера Фрика"));
        patternToItemName.put(List.of("-10% Speed", "+4 Attack Damage"), new Pair<>(Items.PLAYER_HEAD, "Сфера Аполлона"));
        patternToItemName.put(List.of("+4 Max Health", "-15% Attack Speed", "+3 Attack Damage"), new Pair<>(Items.PLAYER_HEAD, "Сфера Астрея"));
        patternToItemName.put(List.of("-15% Knockback Attack", "-15% Knockback Resistance", "+2 Armor"), new Pair<>(Items.PLAYER_HEAD, "Сфера Осириса"));
        patternToItemName.put(List.of("-2 Max Health", "+15% Attack Speed", "+3 Attack Damage"), new Pair<>(Items.PLAYER_HEAD, "Сфера Химеры"));

        for (Map.Entry<List<String>, Pair<Item, String>> entry : patternToItemName.entrySet()) {
            List<String> pattern = entry.getKey();
            boolean allMatch = pattern.stream().allMatch(effect -> tooltipStrings.stream().anyMatch(s -> s.contains(effect)));

            if (allMatch) {
                return entry.getValue().getSecond();
            }
        }
//        System.out.println("[Debug]" + tooltipStrings);
        return stack.getDisplayName().getString().replaceFirst("^\\[[^]]+]\\s*", "");
    }
после твоих фиксов пошел с талом тритона дуэль там тал кары аутист
 
Назад
Сверху Снизу