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

Визуальная часть PotionRenderer

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
12 Мар 2026
Сообщения
19
Реакции
0
Выберите загрузчик игры
  1. Vanilla
  2. OptiFine
Жоске PotionRenderer, так криво, потому что делал своими клешнями, скидик с какого-то чита

SS -
1773571131937.png


Code -
PotionRenderer:
Expand Collapse Copy
package im.expensive.ui.display.impl;

import com.mojang.blaze3d.matrix.MatrixStack;
import im.expensive.events.EventDisplay;
import im.expensive.ui.display.ElementRenderer;
import im.expensive.utils.drag.Dragging;
import im.expensive.utils.render.ColorUtils;
import im.expensive.utils.render.DisplayUtils;
import im.expensive.utils.render.font.Fonts;
import lombok.AccessLevel;
import lombok.RequiredArgsConstructor;
import lombok.experimental.FieldDefaults;
import net.minecraft.client.gui.AbstractGui;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.resources.I18n;
import net.minecraft.potion.Effect;
import net.minecraft.potion.EffectInstance;
import net.minecraft.potion.EffectUtils;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;

@FieldDefaults(level = AccessLevel.PRIVATE)
@RequiredArgsConstructor
public class PotionRenderer implements ElementRenderer {

    final Dragging dragging;
    float width;
    float height;

    @Override
    public void render(EventDisplay eventDisplay) {
        MatrixStack ms = eventDisplay.getMatrixStack();
        float x = dragging.getX();
        float y = dragging.getY();

        List<EffectInstance> effects = new ArrayList<>(mc.player.getActivePotionEffects());
        if (effects.isEmpty()) return;

        effects.sort(Comparator.comparingInt(EffectInstance::getDuration).reversed());

        float currentY = y;
        float entryHeight = 23;
        float spacing = 3;
        float maxWidth = 0;

        for (EffectInstance ei : effects) {
            
            Effect effect = ei.getPotion();
            String name = I18n.format(effect.getName());
            String lvl = String.valueOf(ei.getAmplifier() + 1);
            String duration = EffectUtils.getPotionDurationString(ei, 1);

            float nameW = Fonts.sfui.getWidth(name, 7.5f);
            float lvlTagW = Fonts.sfui.getWidth("lvl", 6.5f);
            float lvlValW = Fonts.sfui.getWidth(lvl, 6.5f);
            float durW = Fonts.sfui.getWidth(duration, 7.5f);
            float infoWidth = nameW + lvlTagW + lvlValW + 25;
            float timerWidth = durW + 15;
            float totalWidth = (entryHeight - 6) + infoWidth + timerWidth + 12;

            if (totalWidth > maxWidth) maxWidth = totalWidth;

            int mainBg = ColorUtils.rgba(20, 20, 20, 180);
            int innerBg = ColorUtils.rgba(45, 45, 45, 220);
            int iconGlass = ColorUtils.rgba(255, 255, 255, 45);
            DisplayUtils.drawRoundedRect(x, currentY, totalWidth, entryHeight, 5, mainBg);
            float iconSize = entryHeight - 6;
            float iconX = x + 3;
            float iconY = currentY + 3;
            DisplayUtils.drawRoundedRect(iconX, iconY, iconSize, iconSize, 4, iconGlass);
            TextureAtlasSprite sprite = mc.getPotionSpriteUploader().getSprite(effect);
            mc.getTextureManager().bindTexture(sprite.getAtlasTexture().getTextureLocation());
            float s = iconSize - 4;
            AbstractGui.blit(ms, (int)(iconX + 2), (int)(iconY + 2), 0, (int)s, (int)s, sprite);
            float infoX = iconX + iconSize + 3;
            DisplayUtils.drawRoundedRect(infoX, currentY + 3, infoWidth, entryHeight - 6, 3, innerBg);
            int nameColor = effect.isBeneficial() ? -1 : ColorUtils.rgba(255, 90, 90, 255);
            Fonts.sfui.drawText(ms, name, infoX + 5, currentY + 7.5f, nameColor, 7.5f);
            float lvlX = infoX + infoWidth - lvlValW - lvlTagW - 8;
            Fonts.sfui.drawText(ms, "lvl", lvlX, currentY + 8.5f, ColorUtils.rgba(160, 160, 160, 255), 6.5f);
            Fonts.sfui.drawText(ms, lvl, lvlX + lvlTagW + 2, currentY + 8.5f, -1, 6.5f);
            float timerX = infoX + infoWidth + 3;
            DisplayUtils.drawRoundedRect(timerX, currentY + 3, timerWidth, entryHeight - 6, 3, innerBg);
            Fonts.sfui.drawText(ms, duration, timerX + (timerWidth - durW) / 2, currentY + 7.5f, ColorUtils.rgba(160, 190, 255, 255), 7.5f);

            currentY += entryHeight + spacing;
        }

        this.width = maxWidth;
        this.height = currentY - y;
        dragging.setWidth(width);
        dragging.setHeight(height);
    }
}
 
почти 1 в 1
 
Назад
Сверху Снизу