Начинающий
- Статус
- Оффлайн
- Регистрация
- 12 Мар 2026
- Сообщения
- 19
- Реакции
- 0
- Выберите загрузчик игры
- Vanilla
- OptiFine
Жоске PotionRenderer, так криво, потому что делал своими клешнями, скидик с какого-то чита
SS -
Code -
SS -
Code -
PotionRenderer:
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);
}
}