Tags I exp 3.1

Начинающий
Статус
Оффлайн
Регистрация
22 Сен 2024
Сообщения
114
Реакции[?]
0
Поинты[?]
0
2025-01-18_14-59-41.png
Код:
package im.expensive.functions.impl.render;

import com.google.common.eventbus.Subscribe;
import com.mojang.blaze3d.matrix.MatrixStack;
import im.expensive.command.friends.FriendStorage;
import im.expensive.events.EventDisplay;
import im.expensive.functions.api.Category;
import im.expensive.functions.api.Function;
import im.expensive.functions.api.FunctionRegister;
import im.expensive.functions.settings.impl.BooleanSetting;
import im.expensive.utils.projections.ProjectionUtil;
import im.expensive.utils.render.DisplayUtils;
import im.expensive.utils.render.font.Fonts;
import net.minecraft.entity.Entity;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.item.ItemEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.vector.Vector2f;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.TextComponent;
import net.minecraft.util.text.TextFormatting;
import org.lwjgl.opengl.GL11;

import java.util.HashMap;

import static org.lwjgl.opengl.GL11.glScalef;
import static org.lwjgl.opengl.GL11.glTranslatef;

@FunctionRegister(name = "Tags", type = Category.Render)
public class Tags extends Function {
    private final HashMap<Entity, Vector4i> positions = new HashMap<>();
    private final BooleanSetting showHealth = new BooleanSetting("Показывать ХП", true);
    private final BooleanSetting showArmor = new BooleanSetting("Показывать броню", true); // Переключатель для отображения брони
    private final BooleanSetting hideNametagNearPlayer = new BooleanSetting("Убирать неймтег рядом", true); // New setting to control this behavior
    private final BooleanSetting showItemName = new BooleanSetting("Показывать имя предмета", true); // Переключатель для отображения имени предмета

    public Tags() {
        addSettings(showHealth, showArmor, hideNametagNearPlayer, showItemName);
    }


    @Subscribe
    public void onDisplay(EventDisplay e) {
        if (mc.world == null || e.getType() != EventDisplay.Type.PRE) return;

        positions.clear();

        // Отображаем неймтеги для игроков
        for (Entity entity : mc.world.getAllEntities()) {
            if (!(entity instanceof PlayerEntity)) continue;

            // Check if the player is a bot (to skip rendering)
            if (isBot(entity)) {
                continue;
            }

            double x = entity.getPosX();
            double y = entity.getPosY() + entity.getHeight() + 0.5; // Adjust position
            double z = entity.getPosZ();

            AxisAlignedBB aabb = entity.getBoundingBox();
            Vector4i position = projectAABB(aabb, x, y, z);

            if (position != null) {
                positions.put(entity, position);
            }
        }

        // Отображаем неймтеги для предметов
        for (Entity entity : mc.world.getAllEntities()) {
            if (!(entity instanceof ItemEntity)) continue;

            double x = entity.getPosX();
            double y = entity.getPosY() + entity.getHeight() + 0.5; // Adjust position
            double z = entity.getPosZ();

            AxisAlignedBB aabb = entity.getBoundingBox();
            Vector4i position = projectAABB(aabb, x, y, z);

            if (position != null) {
                positions.put(entity, position);
            }
        }

        // Рендеринг игроков
        for (Entity entity : positions.keySet()) {
            if (entity instanceof LivingEntity living) {
                // Calculate distance from the player
                double distance = mc.player.getDistanceSq(entity);

                // Only render the nametag if we are far enough away (6 blocks = 36 squared)
                if (hideNametagNearPlayer.get() && distance < 36.0) { // 36 is the squared distance for 6 blocks
                    continue; // Skip rendering nametag if too close
                }

                // Render armor first (above HP)
                if (showArmor.get()) {
                    renderArmor(e.getMatrixStack(), living, positions.get(entity));
                }

                // Then render name and health
                renderNametag(e.getMatrixStack(), living, positions.get(entity));
            }
        }

        // Рендеринг предметов
        for (Entity entity : positions.keySet()) {
            if (entity instanceof ItemEntity itemEntity) {
                // Отображаем неймтег предмета, если активирован соответствующий параметр
                if (showItemName.get()) {
                    renderItemNametag(e.getMatrixStack(), itemEntity, positions.get(entity));
                }
            }
        }
    }

    private boolean isBot(Entity entity) {
        // Simple check to determine if the player is a bot
        return entity.getName().getString().equals("NPC") || entity instanceof PlayerEntity && ((PlayerEntity) entity).isSpectator();
    }

    private Vector4i projectAABB(AxisAlignedBB aabb, double x, double y, double z) {
        Vector4i position = null;
        for (int i = 0; i < 8; i++) {
            Vector2f vector = ProjectionUtil.project(
                    (i & 1) == 0 ? aabb.minX : aabb.maxX,
                    (i & 2) == 0 ? aabb.minY : aabb.maxY,
                    (i & 4) == 0 ? aabb.minZ : aabb.maxZ
            );

            if (position == null) {
                position = new Vector4i(vector.x, vector.y, vector.x, vector.y);
            } else {
                position.x = Math.min(position.x, vector.x);
                position.y = Math.min(position.y, vector.y);
                position.z = Math.max(position.z, vector.x);
                position.w = Math.max(position.w, vector.y);
            }
        }
        return position;
    }

    private void renderNametag(MatrixStack stack, LivingEntity entity, Vector4i position) {
        String puk = entity.getName().getString();
        float health = entity.getHealth();
        String kaka = FriendStorage.isFriend(entity.getName().getString()) ?  "[F] " : "";
        String healthText = String.format("HP: %.1f", health);

        // Объединяем никнейм и здоровье в одну строку
        String combinedText = String.format("%s | %s  %s", puk,healthText,kaka);

        float midX = (position.x + position.z) / 2f;
        float yOffset = position.y;

        // Вычисляем ширину текста
        float nameWidth = Fonts.montserrat.getWidth(combinedText, 8);
        // Рендеринг фона для имени и здоровья
        GL11.glPushMatrix();
        DisplayUtils.drawRect(stack, midX - nameWidth / 2f - 1, yOffset - 10,
                midX + nameWidth / 2f + 1, yOffset + 2, 0x90000000); // Меньше отступы
        GL11.glPopMatrix();

        // Рендеринг текста никнейма и здоровья
        Fonts.montserrat.drawText(stack, combinedText, midX - nameWidth / 2f, yOffset - 8, -1, 8, 0.05f);

    }


    private void renderArmor(MatrixStack stack, LivingEntity entity, Vector4i position) {
        float midX = (position.x + position.z) / 2f;
        float yOffset = position.y - 20; // Move armor rendering higher than HP

        int size = 10;
        int padding = 4;

        float posX = midX - (size * 4 + padding * 3) / 2f; // Start from the leftmost position

        for (ItemStack armorItem : entity.getArmorInventoryList()) {
            if (armorItem.isEmpty()) continue;

            GL11.glPushMatrix();
            glCenteredScale(posX, yOffset, size, size, 0.5f);
            mc.getItemRenderer().renderItemAndEffectIntoGUI(armorItem, (int) posX, (int) yOffset);
            mc.getItemRenderer().renderItemOverlayIntoGUI(mc.fontRenderer, armorItem, (int) posX, (int) yOffset, null);
            GL11.glPopMatrix();

            posX += size + padding; // Move to the next armor slot
        }
    }

    private void renderItemNametag(MatrixStack stack, ItemEntity itemEntity, Vector4i position) {
        String name = itemEntity.getItem().getDisplayName().getString(); // Получаем имя предмета
        float midX = (position.x + position.z) / 2f;
        float yOffset = position.y;

        // Уменьшаем размер фона для имени предмета
        float nameWidth = Fonts.montserrat.getWidth(name, 8);
        GL11.glPushMatrix();
        DisplayUtils.drawRect(stack, midX - nameWidth / 2f - 1, yOffset - 10, // Меньше отступы
                midX + nameWidth / 2f + 1, yOffset + 2, 0x90000000); // Меньше отступы
        GL11.glPopMatrix();

        // Увеличиваем размер шрифта для имени предмета
        Fonts.montserrat.drawText(stack, name, midX - nameWidth / 2f, yOffset - 8, -1, 8, 0.05f);
    }

    private static class Vector4i {
        public float x, y, z, w;

        public Vector4i(float x, float y, float z, float w) {
            this.x = x;
            this.y = y;
            this.z = z;
            this.w = w;
        }
    }

    // Helper function for scaling and centering
    public void glCenteredScale(final float x, final float y, final float w, final float h, final float f) {
        glTranslatef(x + w / 2, y + h / 2, 0);
        glScalef(f, f, 1);
        glTranslatef(-x - w / 2, -y - h / 2, 0);
    }
}
 
Начинающий
Статус
Оффлайн
Регистрация
24 Фев 2024
Сообщения
258
Реакции[?]
5
Поинты[?]
4K
Посмотреть вложение 296318
Код:
package im.expensive.functions.impl.render;

import com.google.common.eventbus.Subscribe;
import com.mojang.blaze3d.matrix.MatrixStack;
import im.expensive.command.friends.FriendStorage;
import im.expensive.events.EventDisplay;
import im.expensive.functions.api.Category;
import im.expensive.functions.api.Function;
import im.expensive.functions.api.FunctionRegister;
import im.expensive.functions.settings.impl.BooleanSetting;
import im.expensive.utils.projections.ProjectionUtil;
import im.expensive.utils.render.DisplayUtils;
import im.expensive.utils.render.font.Fonts;
import net.minecraft.entity.Entity;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.item.ItemEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.vector.Vector2f;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.TextComponent;
import net.minecraft.util.text.TextFormatting;
import org.lwjgl.opengl.GL11;

import java.util.HashMap;

import static org.lwjgl.opengl.GL11.glScalef;
import static org.lwjgl.opengl.GL11.glTranslatef;

@FunctionRegister(name = "Tags", type = Category.Render)
public class Tags extends Function {
    private final HashMap<Entity, Vector4i> positions = new HashMap<>();
    private final BooleanSetting showHealth = new BooleanSetting("Показывать ХП", true);
    private final BooleanSetting showArmor = new BooleanSetting("Показывать броню", true); // Переключатель для отображения брони
    private final BooleanSetting hideNametagNearPlayer = new BooleanSetting("Убирать неймтег рядом", true); // New setting to control this behavior
    private final BooleanSetting showItemName = new BooleanSetting("Показывать имя предмета", true); // Переключатель для отображения имени предмета

    public Tags() {
        addSettings(showHealth, showArmor, hideNametagNearPlayer, showItemName);
    }


    @Subscribe
    public void onDisplay(EventDisplay e) {
        if (mc.world == null || e.getType() != EventDisplay.Type.PRE) return;

        positions.clear();

        // Отображаем неймтеги для игроков
        for (Entity entity : mc.world.getAllEntities()) {
            if (!(entity instanceof PlayerEntity)) continue;

            // Check if the player is a bot (to skip rendering)
            if (isBot(entity)) {
                continue;
            }

            double x = entity.getPosX();
            double y = entity.getPosY() + entity.getHeight() + 0.5; // Adjust position
            double z = entity.getPosZ();

            AxisAlignedBB aabb = entity.getBoundingBox();
            Vector4i position = projectAABB(aabb, x, y, z);

            if (position != null) {
                positions.put(entity, position);
            }
        }

        // Отображаем неймтеги для предметов
        for (Entity entity : mc.world.getAllEntities()) {
            if (!(entity instanceof ItemEntity)) continue;

            double x = entity.getPosX();
            double y = entity.getPosY() + entity.getHeight() + 0.5; // Adjust position
            double z = entity.getPosZ();

            AxisAlignedBB aabb = entity.getBoundingBox();
            Vector4i position = projectAABB(aabb, x, y, z);

            if (position != null) {
                positions.put(entity, position);
            }
        }

        // Рендеринг игроков
        for (Entity entity : positions.keySet()) {
            if (entity instanceof LivingEntity living) {
                // Calculate distance from the player
                double distance = mc.player.getDistanceSq(entity);

                // Only render the nametag if we are far enough away (6 blocks = 36 squared)
                if (hideNametagNearPlayer.get() && distance < 36.0) { // 36 is the squared distance for 6 blocks
                    continue; // Skip rendering nametag if too close
                }

                // Render armor first (above HP)
                if (showArmor.get()) {
                    renderArmor(e.getMatrixStack(), living, positions.get(entity));
                }

                // Then render name and health
                renderNametag(e.getMatrixStack(), living, positions.get(entity));
            }
        }

        // Рендеринг предметов
        for (Entity entity : positions.keySet()) {
            if (entity instanceof ItemEntity itemEntity) {
                // Отображаем неймтег предмета, если активирован соответствующий параметр
                if (showItemName.get()) {
                    renderItemNametag(e.getMatrixStack(), itemEntity, positions.get(entity));
                }
            }
        }
    }

    private boolean isBot(Entity entity) {
        // Simple check to determine if the player is a bot
        return entity.getName().getString().equals("NPC") || entity instanceof PlayerEntity && ((PlayerEntity) entity).isSpectator();
    }

    private Vector4i projectAABB(AxisAlignedBB aabb, double x, double y, double z) {
        Vector4i position = null;
        for (int i = 0; i < 8; i++) {
            Vector2f vector = ProjectionUtil.project(
                    (i & 1) == 0 ? aabb.minX : aabb.maxX,
                    (i & 2) == 0 ? aabb.minY : aabb.maxY,
                    (i & 4) == 0 ? aabb.minZ : aabb.maxZ
            );

            if (position == null) {
                position = new Vector4i(vector.x, vector.y, vector.x, vector.y);
            } else {
                position.x = Math.min(position.x, vector.x);
                position.y = Math.min(position.y, vector.y);
                position.z = Math.max(position.z, vector.x);
                position.w = Math.max(position.w, vector.y);
            }
        }
        return position;
    }

    private void renderNametag(MatrixStack stack, LivingEntity entity, Vector4i position) {
        String puk = entity.getName().getString();
        float health = entity.getHealth();
        String kaka = FriendStorage.isFriend(entity.getName().getString()) ?  "[F] " : "";
        String healthText = String.format("HP: %.1f", health);

        // Объединяем никнейм и здоровье в одну строку
        String combinedText = String.format("%s | %s  %s", puk,healthText,kaka);

        float midX = (position.x + position.z) / 2f;
        float yOffset = position.y;

        // Вычисляем ширину текста
        float nameWidth = Fonts.montserrat.getWidth(combinedText, 8);
        // Рендеринг фона для имени и здоровья
        GL11.glPushMatrix();
        DisplayUtils.drawRect(stack, midX - nameWidth / 2f - 1, yOffset - 10,
                midX + nameWidth / 2f + 1, yOffset + 2, 0x90000000); // Меньше отступы
        GL11.glPopMatrix();

        // Рендеринг текста никнейма и здоровья
        Fonts.montserrat.drawText(stack, combinedText, midX - nameWidth / 2f, yOffset - 8, -1, 8, 0.05f);

    }


    private void renderArmor(MatrixStack stack, LivingEntity entity, Vector4i position) {
        float midX = (position.x + position.z) / 2f;
        float yOffset = position.y - 20; // Move armor rendering higher than HP

        int size = 10;
        int padding = 4;

        float posX = midX - (size * 4 + padding * 3) / 2f; // Start from the leftmost position

        for (ItemStack armorItem : entity.getArmorInventoryList()) {
            if (armorItem.isEmpty()) continue;

            GL11.glPushMatrix();
            glCenteredScale(posX, yOffset, size, size, 0.5f);
            mc.getItemRenderer().renderItemAndEffectIntoGUI(armorItem, (int) posX, (int) yOffset);
            mc.getItemRenderer().renderItemOverlayIntoGUI(mc.fontRenderer, armorItem, (int) posX, (int) yOffset, null);
            GL11.glPopMatrix();

            posX += size + padding; // Move to the next armor slot
        }
    }

    private void renderItemNametag(MatrixStack stack, ItemEntity itemEntity, Vector4i position) {
        String name = itemEntity.getItem().getDisplayName().getString(); // Получаем имя предмета
        float midX = (position.x + position.z) / 2f;
        float yOffset = position.y;

        // Уменьшаем размер фона для имени предмета
        float nameWidth = Fonts.montserrat.getWidth(name, 8);
        GL11.glPushMatrix();
        DisplayUtils.drawRect(stack, midX - nameWidth / 2f - 1, yOffset - 10, // Меньше отступы
                midX + nameWidth / 2f + 1, yOffset + 2, 0x90000000); // Меньше отступы
        GL11.glPopMatrix();

        // Увеличиваем размер шрифта для имени предмета
        Fonts.montserrat.drawText(stack, name, midX - nameWidth / 2f, yOffset - 8, -1, 8, 0.05f);
    }

    private static class Vector4i {
        public float x, y, z, w;

        public Vector4i(float x, float y, float z, float w) {
            this.x = x;
            this.y = y;
            this.z = z;
            this.w = w;
        }
    }

    // Helper function for scaling and centering
    public void glCenteredScale(final float x, final float y, final float w, final float h, final float f) {
        glTranslatef(x + w / 2, y + h / 2, 0);
        glScalef(f, f, 1);
        glTranslatef(-x - w / 2, -y - h / 2, 0);
    }
}
это пиздец
 
Начинающий
Статус
Оффлайн
Регистрация
26 Дек 2023
Сообщения
1,145
Реакции[?]
12
Поинты[?]
5K
Посмотреть вложение 296318
Код:
package im.expensive.functions.impl.render;

import com.google.common.eventbus.Subscribe;
import com.mojang.blaze3d.matrix.MatrixStack;
import im.expensive.command.friends.FriendStorage;
import im.expensive.events.EventDisplay;
import im.expensive.functions.api.Category;
import im.expensive.functions.api.Function;
import im.expensive.functions.api.FunctionRegister;
import im.expensive.functions.settings.impl.BooleanSetting;
import im.expensive.utils.projections.ProjectionUtil;
import im.expensive.utils.render.DisplayUtils;
import im.expensive.utils.render.font.Fonts;
import net.minecraft.entity.Entity;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.item.ItemEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.vector.Vector2f;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.TextComponent;
import net.minecraft.util.text.TextFormatting;
import org.lwjgl.opengl.GL11;

import java.util.HashMap;

import static org.lwjgl.opengl.GL11.glScalef;
import static org.lwjgl.opengl.GL11.glTranslatef;

@FunctionRegister(name = "Tags", type = Category.Render)
public class Tags extends Function {
    private final HashMap<Entity, Vector4i> positions = new HashMap<>();
    private final BooleanSetting showHealth = new BooleanSetting("Показывать ХП", true);
    private final BooleanSetting showArmor = new BooleanSetting("Показывать броню", true); // Переключатель для отображения брони
    private final BooleanSetting hideNametagNearPlayer = new BooleanSetting("Убирать неймтег рядом", true); // New setting to control this behavior
    private final BooleanSetting showItemName = new BooleanSetting("Показывать имя предмета", true); // Переключатель для отображения имени предмета

    public Tags() {
        addSettings(showHealth, showArmor, hideNametagNearPlayer, showItemName);
    }


    @Subscribe
    public void onDisplay(EventDisplay e) {
        if (mc.world == null || e.getType() != EventDisplay.Type.PRE) return;

        positions.clear();

        // Отображаем неймтеги для игроков
        for (Entity entity : mc.world.getAllEntities()) {
            if (!(entity instanceof PlayerEntity)) continue;

            // Check if the player is a bot (to skip rendering)
            if (isBot(entity)) {
                continue;
            }

            double x = entity.getPosX();
            double y = entity.getPosY() + entity.getHeight() + 0.5; // Adjust position
            double z = entity.getPosZ();

            AxisAlignedBB aabb = entity.getBoundingBox();
            Vector4i position = projectAABB(aabb, x, y, z);

            if (position != null) {
                positions.put(entity, position);
            }
        }

        // Отображаем неймтеги для предметов
        for (Entity entity : mc.world.getAllEntities()) {
            if (!(entity instanceof ItemEntity)) continue;

            double x = entity.getPosX();
            double y = entity.getPosY() + entity.getHeight() + 0.5; // Adjust position
            double z = entity.getPosZ();

            AxisAlignedBB aabb = entity.getBoundingBox();
            Vector4i position = projectAABB(aabb, x, y, z);

            if (position != null) {
                positions.put(entity, position);
            }
        }

        // Рендеринг игроков
        for (Entity entity : positions.keySet()) {
            if (entity instanceof LivingEntity living) {
                // Calculate distance from the player
                double distance = mc.player.getDistanceSq(entity);

                // Only render the nametag if we are far enough away (6 blocks = 36 squared)
                if (hideNametagNearPlayer.get() && distance < 36.0) { // 36 is the squared distance for 6 blocks
                    continue; // Skip rendering nametag if too close
                }

                // Render armor first (above HP)
                if (showArmor.get()) {
                    renderArmor(e.getMatrixStack(), living, positions.get(entity));
                }

                // Then render name and health
                renderNametag(e.getMatrixStack(), living, positions.get(entity));
            }
        }

        // Рендеринг предметов
        for (Entity entity : positions.keySet()) {
            if (entity instanceof ItemEntity itemEntity) {
                // Отображаем неймтег предмета, если активирован соответствующий параметр
                if (showItemName.get()) {
                    renderItemNametag(e.getMatrixStack(), itemEntity, positions.get(entity));
                }
            }
        }
    }

    private boolean isBot(Entity entity) {
        // Simple check to determine if the player is a bot
        return entity.getName().getString().equals("NPC") || entity instanceof PlayerEntity && ((PlayerEntity) entity).isSpectator();
    }

    private Vector4i projectAABB(AxisAlignedBB aabb, double x, double y, double z) {
        Vector4i position = null;
        for (int i = 0; i < 8; i++) {
            Vector2f vector = ProjectionUtil.project(
                    (i & 1) == 0 ? aabb.minX : aabb.maxX,
                    (i & 2) == 0 ? aabb.minY : aabb.maxY,
                    (i & 4) == 0 ? aabb.minZ : aabb.maxZ
            );

            if (position == null) {
                position = new Vector4i(vector.x, vector.y, vector.x, vector.y);
            } else {
                position.x = Math.min(position.x, vector.x);
                position.y = Math.min(position.y, vector.y);
                position.z = Math.max(position.z, vector.x);
                position.w = Math.max(position.w, vector.y);
            }
        }
        return position;
    }

    private void renderNametag(MatrixStack stack, LivingEntity entity, Vector4i position) {
        String puk = entity.getName().getString();
        float health = entity.getHealth();
        String kaka = FriendStorage.isFriend(entity.getName().getString()) ?  "[F] " : "";
        String healthText = String.format("HP: %.1f", health);

        // Объединяем никнейм и здоровье в одну строку
        String combinedText = String.format("%s | %s  %s", puk,healthText,kaka);

        float midX = (position.x + position.z) / 2f;
        float yOffset = position.y;

        // Вычисляем ширину текста
        float nameWidth = Fonts.montserrat.getWidth(combinedText, 8);
        // Рендеринг фона для имени и здоровья
        GL11.glPushMatrix();
        DisplayUtils.drawRect(stack, midX - nameWidth / 2f - 1, yOffset - 10,
                midX + nameWidth / 2f + 1, yOffset + 2, 0x90000000); // Меньше отступы
        GL11.glPopMatrix();

        // Рендеринг текста никнейма и здоровья
        Fonts.montserrat.drawText(stack, combinedText, midX - nameWidth / 2f, yOffset - 8, -1, 8, 0.05f);

    }


    private void renderArmor(MatrixStack stack, LivingEntity entity, Vector4i position) {
        float midX = (position.x + position.z) / 2f;
        float yOffset = position.y - 20; // Move armor rendering higher than HP

        int size = 10;
        int padding = 4;

        float posX = midX - (size * 4 + padding * 3) / 2f; // Start from the leftmost position

        for (ItemStack armorItem : entity.getArmorInventoryList()) {
            if (armorItem.isEmpty()) continue;

            GL11.glPushMatrix();
            glCenteredScale(posX, yOffset, size, size, 0.5f);
            mc.getItemRenderer().renderItemAndEffectIntoGUI(armorItem, (int) posX, (int) yOffset);
            mc.getItemRenderer().renderItemOverlayIntoGUI(mc.fontRenderer, armorItem, (int) posX, (int) yOffset, null);
            GL11.glPopMatrix();

            posX += size + padding; // Move to the next armor slot
        }
    }

    private void renderItemNametag(MatrixStack stack, ItemEntity itemEntity, Vector4i position) {
        String name = itemEntity.getItem().getDisplayName().getString(); // Получаем имя предмета
        float midX = (position.x + position.z) / 2f;
        float yOffset = position.y;

        // Уменьшаем размер фона для имени предмета
        float nameWidth = Fonts.montserrat.getWidth(name, 8);
        GL11.glPushMatrix();
        DisplayUtils.drawRect(stack, midX - nameWidth / 2f - 1, yOffset - 10, // Меньше отступы
                midX + nameWidth / 2f + 1, yOffset + 2, 0x90000000); // Меньше отступы
        GL11.glPopMatrix();

        // Увеличиваем размер шрифта для имени предмета
        Fonts.montserrat.drawText(stack, name, midX - nameWidth / 2f, yOffset - 8, -1, 8, 0.05f);
    }

    private static class Vector4i {
        public float x, y, z, w;

        public Vector4i(float x, float y, float z, float w) {
            this.x = x;
            this.y = y;
            this.z = z;
            this.w = w;
        }
    }

    // Helper function for scaling and centering
    public void glCenteredScale(final float x, final float y, final float w, final float h, final float f) {
        glTranslatef(x + w / 2, y + h / 2, 0);
        glScalef(f, f, 1);
        glTranslatef(-x - w / 2, -y - h / 2, 0);
    }
}
фу блять, лютый чатгпт код, еще на норм тему пиздел, что не спастил
/del
 
Начинающий
Статус
Оффлайн
Регистрация
25 Янв 2024
Сообщения
455
Реакции[?]
1
Поинты[?]
3K
Посмотреть вложение 296318
Код:
package im.expensive.functions.impl.render;

import com.google.common.eventbus.Subscribe;
import com.mojang.blaze3d.matrix.MatrixStack;
import im.expensive.command.friends.FriendStorage;
import im.expensive.events.EventDisplay;
import im.expensive.functions.api.Category;
import im.expensive.functions.api.Function;
import im.expensive.functions.api.FunctionRegister;
import im.expensive.functions.settings.impl.BooleanSetting;
import im.expensive.utils.projections.ProjectionUtil;
import im.expensive.utils.render.DisplayUtils;
import im.expensive.utils.render.font.Fonts;
import net.minecraft.entity.Entity;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.item.ItemEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.vector.Vector2f;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.TextComponent;
import net.minecraft.util.text.TextFormatting;
import org.lwjgl.opengl.GL11;

import java.util.HashMap;

import static org.lwjgl.opengl.GL11.glScalef;
import static org.lwjgl.opengl.GL11.glTranslatef;

@FunctionRegister(name = "Tags", type = Category.Render)
public class Tags extends Function {
    private final HashMap<Entity, Vector4i> positions = new HashMap<>();
    private final BooleanSetting showHealth = new BooleanSetting("Показывать ХП", true);
    private final BooleanSetting showArmor = new BooleanSetting("Показывать броню", true); // Переключатель для отображения брони
    private final BooleanSetting hideNametagNearPlayer = new BooleanSetting("Убирать неймтег рядом", true); // New setting to control this behavior
    private final BooleanSetting showItemName = new BooleanSetting("Показывать имя предмета", true); // Переключатель для отображения имени предмета

    public Tags() {
        addSettings(showHealth, showArmor, hideNametagNearPlayer, showItemName);
    }


    @Subscribe
    public void onDisplay(EventDisplay e) {
        if (mc.world == null || e.getType() != EventDisplay.Type.PRE) return;

        positions.clear();

        // Отображаем неймтеги для игроков
        for (Entity entity : mc.world.getAllEntities()) {
            if (!(entity instanceof PlayerEntity)) continue;

            // Check if the player is a bot (to skip rendering)
            if (isBot(entity)) {
                continue;
            }

            double x = entity.getPosX();
            double y = entity.getPosY() + entity.getHeight() + 0.5; // Adjust position
            double z = entity.getPosZ();

            AxisAlignedBB aabb = entity.getBoundingBox();
            Vector4i position = projectAABB(aabb, x, y, z);

            if (position != null) {
                positions.put(entity, position);
            }
        }

        // Отображаем неймтеги для предметов
        for (Entity entity : mc.world.getAllEntities()) {
            if (!(entity instanceof ItemEntity)) continue;

            double x = entity.getPosX();
            double y = entity.getPosY() + entity.getHeight() + 0.5; // Adjust position
            double z = entity.getPosZ();

            AxisAlignedBB aabb = entity.getBoundingBox();
            Vector4i position = projectAABB(aabb, x, y, z);

            if (position != null) {
                positions.put(entity, position);
            }
        }

        // Рендеринг игроков
        for (Entity entity : positions.keySet()) {
            if (entity instanceof LivingEntity living) {
                // Calculate distance from the player
                double distance = mc.player.getDistanceSq(entity);

                // Only render the nametag if we are far enough away (6 blocks = 36 squared)
                if (hideNametagNearPlayer.get() && distance < 36.0) { // 36 is the squared distance for 6 blocks
                    continue; // Skip rendering nametag if too close
                }

                // Render armor first (above HP)
                if (showArmor.get()) {
                    renderArmor(e.getMatrixStack(), living, positions.get(entity));
                }

                // Then render name and health
                renderNametag(e.getMatrixStack(), living, positions.get(entity));
            }
        }

        // Рендеринг предметов
        for (Entity entity : positions.keySet()) {
            if (entity instanceof ItemEntity itemEntity) {
                // Отображаем неймтег предмета, если активирован соответствующий параметр
                if (showItemName.get()) {
                    renderItemNametag(e.getMatrixStack(), itemEntity, positions.get(entity));
                }
            }
        }
    }

    private boolean isBot(Entity entity) {
        // Simple check to determine if the player is a bot
        return entity.getName().getString().equals("NPC") || entity instanceof PlayerEntity && ((PlayerEntity) entity).isSpectator();
    }

    private Vector4i projectAABB(AxisAlignedBB aabb, double x, double y, double z) {
        Vector4i position = null;
        for (int i = 0; i < 8; i++) {
            Vector2f vector = ProjectionUtil.project(
                    (i & 1) == 0 ? aabb.minX : aabb.maxX,
                    (i & 2) == 0 ? aabb.minY : aabb.maxY,
                    (i & 4) == 0 ? aabb.minZ : aabb.maxZ
            );

            if (position == null) {
                position = new Vector4i(vector.x, vector.y, vector.x, vector.y);
            } else {
                position.x = Math.min(position.x, vector.x);
                position.y = Math.min(position.y, vector.y);
                position.z = Math.max(position.z, vector.x);
                position.w = Math.max(position.w, vector.y);
            }
        }
        return position;
    }

    private void renderNametag(MatrixStack stack, LivingEntity entity, Vector4i position) {
        String puk = entity.getName().getString();
        float health = entity.getHealth();
        String kaka = FriendStorage.isFriend(entity.getName().getString()) ?  "[F] " : "";
        String healthText = String.format("HP: %.1f", health);

        // Объединяем никнейм и здоровье в одну строку
        String combinedText = String.format("%s | %s  %s", puk,healthText,kaka);

        float midX = (position.x + position.z) / 2f;
        float yOffset = position.y;

        // Вычисляем ширину текста
        float nameWidth = Fonts.montserrat.getWidth(combinedText, 8);
        // Рендеринг фона для имени и здоровья
        GL11.glPushMatrix();
        DisplayUtils.drawRect(stack, midX - nameWidth / 2f - 1, yOffset - 10,
                midX + nameWidth / 2f + 1, yOffset + 2, 0x90000000); // Меньше отступы
        GL11.glPopMatrix();

        // Рендеринг текста никнейма и здоровья
        Fonts.montserrat.drawText(stack, combinedText, midX - nameWidth / 2f, yOffset - 8, -1, 8, 0.05f);

    }


    private void renderArmor(MatrixStack stack, LivingEntity entity, Vector4i position) {
        float midX = (position.x + position.z) / 2f;
        float yOffset = position.y - 20; // Move armor rendering higher than HP

        int size = 10;
        int padding = 4;

        float posX = midX - (size * 4 + padding * 3) / 2f; // Start from the leftmost position

        for (ItemStack armorItem : entity.getArmorInventoryList()) {
            if (armorItem.isEmpty()) continue;

            GL11.glPushMatrix();
            glCenteredScale(posX, yOffset, size, size, 0.5f);
            mc.getItemRenderer().renderItemAndEffectIntoGUI(armorItem, (int) posX, (int) yOffset);
            mc.getItemRenderer().renderItemOverlayIntoGUI(mc.fontRenderer, armorItem, (int) posX, (int) yOffset, null);
            GL11.glPopMatrix();

            posX += size + padding; // Move to the next armor slot
        }
    }

    private void renderItemNametag(MatrixStack stack, ItemEntity itemEntity, Vector4i position) {
        String name = itemEntity.getItem().getDisplayName().getString(); // Получаем имя предмета
        float midX = (position.x + position.z) / 2f;
        float yOffset = position.y;

        // Уменьшаем размер фона для имени предмета
        float nameWidth = Fonts.montserrat.getWidth(name, 8);
        GL11.glPushMatrix();
        DisplayUtils.drawRect(stack, midX - nameWidth / 2f - 1, yOffset - 10, // Меньше отступы
                midX + nameWidth / 2f + 1, yOffset + 2, 0x90000000); // Меньше отступы
        GL11.glPopMatrix();

        // Увеличиваем размер шрифта для имени предмета
        Fonts.montserrat.drawText(stack, name, midX - nameWidth / 2f, yOffset - 8, -1, 8, 0.05f);
    }

    private static class Vector4i {
        public float x, y, z, w;

        public Vector4i(float x, float y, float z, float w) {
            this.x = x;
            this.y = y;
            this.z = z;
            this.w = w;
        }
    }

    // Helper function for scaling and centering
    public void glCenteredScale(final float x, final float y, final float w, final float h, final float f) {
        glTranslatef(x + w / 2, y + h / 2, 0);
        glScalef(f, f, 1);
        glTranslatef(-x - w / 2, -y - h / 2, 0);
    }
}
вы заебали со своей экспой
 
Начинающий
Статус
Оффлайн
Регистрация
25 Янв 2024
Сообщения
37
Реакции[?]
0
Поинты[?]
0
/del chatgpt + где блять хоть какие-то цвета закругление и т.д? /del 100%
 
Начинающий
Статус
Оффлайн
Регистрация
10 Окт 2024
Сообщения
2
Реакции[?]
0
Поинты[?]
0
Посмотреть вложение 296318
Код:
package im.expensive.functions.impl.render;

import com.google.common.eventbus.Subscribe;
import com.mojang.blaze3d.matrix.MatrixStack;
import im.expensive.command.friends.FriendStorage;
import im.expensive.events.EventDisplay;
import im.expensive.functions.api.Category;
import im.expensive.functions.api.Function;
import im.expensive.functions.api.FunctionRegister;
import im.expensive.functions.settings.impl.BooleanSetting;
import im.expensive.utils.projections.ProjectionUtil;
import im.expensive.utils.render.DisplayUtils;
import im.expensive.utils.render.font.Fonts;
import net.minecraft.entity.Entity;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.item.ItemEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.vector.Vector2f;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.TextComponent;
import net.minecraft.util.text.TextFormatting;
import org.lwjgl.opengl.GL11;

import java.util.HashMap;

import static org.lwjgl.opengl.GL11.glScalef;
import static org.lwjgl.opengl.GL11.glTranslatef;

@FunctionRegister(name = "Tags", type = Category.Render)
public class Tags extends Function {
    private final HashMap<Entity, Vector4i> positions = new HashMap<>();
    private final BooleanSetting showHealth = new BooleanSetting("Показывать ХП", true);
    private final BooleanSetting showArmor = new BooleanSetting("Показывать броню", true); // Переключатель для отображения брони
    private final BooleanSetting hideNametagNearPlayer = new BooleanSetting("Убирать неймтег рядом", true); // New setting to control this behavior
    private final BooleanSetting showItemName = new BooleanSetting("Показывать имя предмета", true); // Переключатель для отображения имени предмета

    public Tags() {
        addSettings(showHealth, showArmor, hideNametagNearPlayer, showItemName);
    }


    @Subscribe
    public void onDisplay(EventDisplay e) {
        if (mc.world == null || e.getType() != EventDisplay.Type.PRE) return;

        positions.clear();

        // Отображаем неймтеги для игроков
        for (Entity entity : mc.world.getAllEntities()) {
            if (!(entity instanceof PlayerEntity)) continue;

            // Check if the player is a bot (to skip rendering)
            if (isBot(entity)) {
                continue;
            }

            double x = entity.getPosX();
            double y = entity.getPosY() + entity.getHeight() + 0.5; // Adjust position
            double z = entity.getPosZ();

            AxisAlignedBB aabb = entity.getBoundingBox();
            Vector4i position = projectAABB(aabb, x, y, z);

            if (position != null) {
                positions.put(entity, position);
            }
        }

        // Отображаем неймтеги для предметов
        for (Entity entity : mc.world.getAllEntities()) {
            if (!(entity instanceof ItemEntity)) continue;

            double x = entity.getPosX();
            double y = entity.getPosY() + entity.getHeight() + 0.5; // Adjust position
            double z = entity.getPosZ();

            AxisAlignedBB aabb = entity.getBoundingBox();
            Vector4i position = projectAABB(aabb, x, y, z);

            if (position != null) {
                positions.put(entity, position);
            }
        }

        // Рендеринг игроков
        for (Entity entity : positions.keySet()) {
            if (entity instanceof LivingEntity living) {
                // Calculate distance from the player
                double distance = mc.player.getDistanceSq(entity);

                // Only render the nametag if we are far enough away (6 blocks = 36 squared)
                if (hideNametagNearPlayer.get() && distance < 36.0) { // 36 is the squared distance for 6 blocks
                    continue; // Skip rendering nametag if too close
                }

                // Render armor first (above HP)
                if (showArmor.get()) {
                    renderArmor(e.getMatrixStack(), living, positions.get(entity));
                }

                // Then render name and health
                renderNametag(e.getMatrixStack(), living, positions.get(entity));
            }
        }

        // Рендеринг предметов
        for (Entity entity : positions.keySet()) {
            if (entity instanceof ItemEntity itemEntity) {
                // Отображаем неймтег предмета, если активирован соответствующий параметр
                if (showItemName.get()) {
                    renderItemNametag(e.getMatrixStack(), itemEntity, positions.get(entity));
                }
            }
        }
    }

    private boolean isBot(Entity entity) {
        // Simple check to determine if the player is a bot
        return entity.getName().getString().equals("NPC") || entity instanceof PlayerEntity && ((PlayerEntity) entity).isSpectator();
    }

    private Vector4i projectAABB(AxisAlignedBB aabb, double x, double y, double z) {
        Vector4i position = null;
        for (int i = 0; i < 8; i++) {
            Vector2f vector = ProjectionUtil.project(
                    (i & 1) == 0 ? aabb.minX : aabb.maxX,
                    (i & 2) == 0 ? aabb.minY : aabb.maxY,
                    (i & 4) == 0 ? aabb.minZ : aabb.maxZ
            );

            if (position == null) {
                position = new Vector4i(vector.x, vector.y, vector.x, vector.y);
            } else {
                position.x = Math.min(position.x, vector.x);
                position.y = Math.min(position.y, vector.y);
                position.z = Math.max(position.z, vector.x);
                position.w = Math.max(position.w, vector.y);
            }
        }
        return position;
    }

    private void renderNametag(MatrixStack stack, LivingEntity entity, Vector4i position) {
        String puk = entity.getName().getString();
        float health = entity.getHealth();
        String kaka = FriendStorage.isFriend(entity.getName().getString()) ?  "[F] " : "";
        String healthText = String.format("HP: %.1f", health);

        // Объединяем никнейм и здоровье в одну строку
        String combinedText = String.format("%s | %s  %s", puk,healthText,kaka);

        float midX = (position.x + position.z) / 2f;
        float yOffset = position.y;

        // Вычисляем ширину текста
        float nameWidth = Fonts.montserrat.getWidth(combinedText, 8);
        // Рендеринг фона для имени и здоровья
        GL11.glPushMatrix();
        DisplayUtils.drawRect(stack, midX - nameWidth / 2f - 1, yOffset - 10,
                midX + nameWidth / 2f + 1, yOffset + 2, 0x90000000); // Меньше отступы
        GL11.glPopMatrix();

        // Рендеринг текста никнейма и здоровья
        Fonts.montserrat.drawText(stack, combinedText, midX - nameWidth / 2f, yOffset - 8, -1, 8, 0.05f);

    }


    private void renderArmor(MatrixStack stack, LivingEntity entity, Vector4i position) {
        float midX = (position.x + position.z) / 2f;
        float yOffset = position.y - 20; // Move armor rendering higher than HP

        int size = 10;
        int padding = 4;

        float posX = midX - (size * 4 + padding * 3) / 2f; // Start from the leftmost position

        for (ItemStack armorItem : entity.getArmorInventoryList()) {
            if (armorItem.isEmpty()) continue;

            GL11.glPushMatrix();
            glCenteredScale(posX, yOffset, size, size, 0.5f);
            mc.getItemRenderer().renderItemAndEffectIntoGUI(armorItem, (int) posX, (int) yOffset);
            mc.getItemRenderer().renderItemOverlayIntoGUI(mc.fontRenderer, armorItem, (int) posX, (int) yOffset, null);
            GL11.glPopMatrix();

            posX += size + padding; // Move to the next armor slot
        }
    }

    private void renderItemNametag(MatrixStack stack, ItemEntity itemEntity, Vector4i position) {
        String name = itemEntity.getItem().getDisplayName().getString(); // Получаем имя предмета
        float midX = (position.x + position.z) / 2f;
        float yOffset = position.y;

        // Уменьшаем размер фона для имени предмета
        float nameWidth = Fonts.montserrat.getWidth(name, 8);
        GL11.glPushMatrix();
        DisplayUtils.drawRect(stack, midX - nameWidth / 2f - 1, yOffset - 10, // Меньше отступы
                midX + nameWidth / 2f + 1, yOffset + 2, 0x90000000); // Меньше отступы
        GL11.glPopMatrix();

        // Увеличиваем размер шрифта для имени предмета
        Fonts.montserrat.drawText(stack, name, midX - nameWidth / 2f, yOffset - 8, -1, 8, 0.05f);
    }

    private static class Vector4i {
        public float x, y, z, w;

        public Vector4i(float x, float y, float z, float w) {
            this.x = x;
            this.y = y;
            this.z = z;
            this.w = w;
        }
    }

    // Helper function for scaling and centering
    public void glCenteredScale(final float x, final float y, final float w, final float h, final float f) {
        glTranslatef(x + w / 2, y + h / 2, 0);
        glScalef(f, f, 1);
        glTranslatef(-x - w / 2, -y - h / 2, 0);
    }
}
пастер мияги
 
Начинающий
Статус
Оффлайн
Регистрация
21 Янв 2025
Сообщения
6
Реакции[?]
0
Поинты[?]
0
:disrelieved: вот пастеры код без ошибок
Java:
package ru.shiyeno.functions.impl.player;

import com.google.common.eventbus.Subscribe;
import com.mojang.blaze3d.matrix.MatrixStack;
import ru.shiyeno.command.friends.FriendStorage;
import ru.shiyeno.events.EventDisplay;
import ru.shiyeno.functions.api.Category;
import ru.shiyeno.functions.api.Function;
import ru.shiyeno.functions.api.FunctionRegister;
import ru.shiyeno.functions.settings.impl.BooleanSetting;
import ru.shiyeno.utils.projections.ProjectionUtil;
import ru.shiyeno.utils.render.DisplayUtils;
import ru.shiyeno.utils.render.font.Fonts;
import net.minecraft.entity.Entity;
import net.minecraft.entity.LivingEntity;
import net.minecraft.entity.item.ItemEntity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.util.math.AxisAlignedBB;
import net.minecraft.util.math.vector.Vector2f;
import net.minecraft.util.text.ITextComponent;
import net.minecraft.util.text.TextComponent;
import net.minecraft.util.text.TextFormatting;
import org.lwjgl.opengl.GL11;

import java.util.HashMap;

import static org.lwjgl.opengl.GL11.glScalef;
import static org.lwjgl.opengl.GL11.glTranslatef;

@FunctionRegister(name = "Tags", type = Category.Render)
public class Tags extends Function {
    private final HashMap<Entity, Vector4i> positions = new HashMap<>();
    private final BooleanSetting showHealth = new BooleanSetting("Показывать ХП", true);
    private final BooleanSetting showArmor = new BooleanSetting("Показывать броню", true); // Переключатель для отображения брони
    private final BooleanSetting hideNametagNearPlayer = new BooleanSetting("Убирать неймтег рядом", true); // New setting to control this behavior
    private final BooleanSetting showItemName = new BooleanSetting("Показывать имя предмета", true); // Переключатель для отображения имени предмета

    public Tags() {
        addSettings(showHealth, showArmor, hideNametagNearPlayer, showItemName);
    }


    @Subscribe
    public void onDisplay(EventDisplay e) {
        if (mc.world == null || e.getType() != EventDisplay.Type.PRE) return;

        positions.clear();

        // Отображаем неймтеги для игроков
        for (Entity entity : mc.world.getAllEntities()) {
            if (!(entity instanceof PlayerEntity)) continue;

            // Check if the player is a bot (to skip rendering)
            if (isBot(entity)) {
                continue;
            }

            double x = entity.getPosX();
            double y = entity.getPosY() + entity.getHeight() + 0.5; // Adjust position
            double z = entity.getPosZ();

            AxisAlignedBB aabb = entity.getBoundingBox();
            Vector4i position = projectAABB(aabb, x, y, z);

            if (position != null) {
                positions.put(entity, position);
            }
        }

        // Отображаем неймтеги для предметов
        for (Entity entity : mc.world.getAllEntities()) {
            if (!(entity instanceof ItemEntity)) continue;

            double x = entity.getPosX();
            double y = entity.getPosY() + entity.getHeight() + 0.5; // Adjust position
            double z = entity.getPosZ();

            AxisAlignedBB aabb = entity.getBoundingBox();
            Vector4i position = projectAABB(aabb, x, y, z);

            if (position != null) {
                positions.put(entity, position);
            }
        }

        // Рендеринг игроков
        for (Entity entity : positions.keySet()) {
            if (entity instanceof LivingEntity living) {
                // Calculate distance from the player
                double distance = mc.player.getDistanceSq(entity);

                // Only render the nametag if we are far enough away (6 blocks = 36 squared)
                if (hideNametagNearPlayer.get() && distance < 36.0) { // 36 is the squared distance for 6 blocks
                    continue; // Skip rendering nametag if too close
                }

                // Render armor first (above HP)
                if (showArmor.get()) {
                    renderArmor(e.getMatrixStack(), living, positions.get(entity));
                }

                // Then render name and health
                renderNametag(e.getMatrixStack(), living, positions.get(entity));
            }
        }

        // Рендеринг предметов
        for (Entity entity : positions.keySet()) {
            if (entity instanceof ItemEntity itemEntity) {
                // Отображаем неймтег предмета, если активирован соответствующий параметр
                if (showItemName.get()) {
                    renderItemNametag(e.getMatrixStack(), itemEntity, positions.get(entity));
                }
            }
        }
    }

    private boolean isBot(Entity entity) {
        // Simple check to determine if the player is a bot
        return entity.getName().getString().equals("NPC") || entity instanceof PlayerEntity && ((PlayerEntity) entity).isSpectator();
    }

    private Vector4i projectAABB(AxisAlignedBB aabb, double x, double y, double z) {
        Vector4i position = null;
        for (int i = 0; i < 8; i++) {
            Vector2f vector = ProjectionUtil.project(
                    (i & 1) == 0 ? aabb.minX : aabb.maxX,
                    (i & 2) == 0 ? aabb.minY : aabb.maxY,
                    (i & 4) == 0 ? aabb.minZ : aabb.maxZ
            );

            if (position == null) {
                position = new Vector4i(vector.x, vector.y, vector.x, vector.y);
            } else {
                position.x = Math.min(position.x, vector.x);
                position.y = Math.min(position.y, vector.y);
                position.z = Math.max(position.z, vector.x);
                position.w = Math.max(position.w, vector.y);
            }
        }
        return position;
    }

    private void renderNametag(MatrixStack stack, LivingEntity entity, Vector4i position) {
        String puk = entity.getName().getString();
        float health = entity.getHealth();
        String kaka = FriendStorage.isFriend(entity.getName().getString()) ?  "[F] " : "";
        String healthText = String.format("HP: %.1f", health);

        // Объединяем никнейм и здоровье в одну строку
        String combinedText = String.format("%s | %s  %s", puk,healthText,kaka);

        float midX = (position.x + position.z) / 2f;
        float yOffset = position.y;

        // Вычисляем ширину текста
        float nameWidth = Fonts.montserrat.getWidth(combinedText, 8);
        // Рендеринг фона для имени и здоровья
        GL11.glPushMatrix();
        DisplayUtils.drawRect(midX - nameWidth / 2f - 1, yOffset - 10,
                midX + nameWidth / 2f + 1, yOffset + 2, 0x90000000); // Меньше отступы
        GL11.glPopMatrix();

        // Рендеринг текста никнейма и здоровья
        Fonts.montserrat.drawText(stack, combinedText, midX - nameWidth / 2f, yOffset - 8, -1, 8, 0.05f);

    }


    private void renderArmor(MatrixStack stack, LivingEntity entity, Vector4i position) {
        float midX = (position.x + position.z) / 2f;
        float yOffset = position.y - 20; // Move armor rendering higher than HP

        int size = 10;
        int padding = 4;

        float posX = midX - (size * 4 + padding * 3) / 2f; // Start from the leftmost position

        for (ItemStack armorItem : entity.getArmorInventoryList()) {
            if (armorItem.isEmpty()) continue;

            GL11.glPushMatrix();
            glCenteredScale(posX, yOffset, size, size, 0.5f);
            mc.getItemRenderer().renderItemAndEffectIntoGUI(armorItem, (int) posX, (int) yOffset);
            mc.getItemRenderer().renderItemOverlayIntoGUI(mc.fontRenderer, armorItem, (int) posX, (int) yOffset, null);
            GL11.glPopMatrix();

            posX += size + padding; // Move to the next armor slot
        }
    }

    private void renderItemNametag(MatrixStack stack, ItemEntity itemEntity, Vector4i position) {
        String name = itemEntity.getItem().getDisplayName().getString(); // Получаем имя предмета
        float midX = (position.x + position.z) / 2f;
        float yOffset = position.y;

        // Уменьшаем размер фона для имени предмета
        float nameWidth = Fonts.montserrat.getWidth(name, 8);
        GL11.glPushMatrix();
        DisplayUtils.drawRect(midX - nameWidth / 2f - 1, yOffset - 10, // Меньше отступы
                midX + nameWidth / 2f + 1, yOffset + 2, 0x90000000); // Меньше отступы
        GL11.glPopMatrix();

        // Увеличиваем размер шрифта для имени предмета
        Fonts.montserrat.drawText(stack, name, midX - nameWidth / 2f, yOffset - 8, -1, 8, 0.05f);
    }

    private static class Vector4i {
        public float x, y, z, w;

        public Vector4i(float x, float y, float z, float w) {
            this.x = x;
            this.y = y;
            this.z = z;
            this.w = w;
        }
    }

    // Helper function for scaling and centering
    public void glCenteredScale(final float x, final float y, final float w, final float h, final float f) {
        glTranslatef(x + w / 2, y + h / 2, 0);
        glScalef(f, f, 1);
        glTranslatef(-x - w / 2, -y - h / 2, 0);
    }
}
 
Сверху Снизу