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

Визуальная часть KeyBindRenderer | exp 3.1

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
12 Мар 2026
Сообщения
19
Реакции
0
Выберите загрузчик игры
  1. Vanilla
  2. OptiFine
Сделал ультра мега супер крутые Keybinds для МухосранскClient:catjam:

Уже жду, как меня будут закидывать палками!!!

SS -
1773569915424.png


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

import com.mojang.blaze3d.matrix.MatrixStack;
import im.expensive.Expensive;
import im.expensive.events.EventDisplay;
import im.expensive.functions.api.Function;
import im.expensive.ui.display.ElementRenderer;
import im.expensive.utils.client.KeyStorage;
import im.expensive.utils.drag.Dragging;
import im.expensive.utils.render.ColorUtils;
import im.expensive.utils.render.DisplayUtils;
import im.expensive.utils.render.Scissor;
import im.expensive.utils.render.font.Fonts;
import lombok.AccessLevel;
import lombok.RequiredArgsConstructor;
import lombok.experimental.FieldDefaults;
import net.minecraft.util.ResourceLocation;

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

    final Dragging dragging;
    float width;
    float height;

    final ResourceLocation keyboardIcon = new ResourceLocation("expensive/images/hud/keyboard.png");

    @Override
    public void render(EventDisplay eventDisplay) {
        MatrixStack ms = eventDisplay.getMatrixStack();

        float posX = dragging.getX();
        float posY = dragging.getY();
        float fontSize = 6.5f;
        float padding = 5;
        float innerPadding = 4;
        int blurBgColor = ColorUtils.rgba(10, 10, 10, 120);
        int pillBgColor = ColorUtils.rgba(30, 30, 35, 220);
        int headerBgColor = ColorUtils.rgba(30, 30, 35, 160);
        float totalItemsHeight = 0;
        float maxNameWidth = 40;
        float keyBoxWidth = 26;

        for (Function f : Expensive.getInstance().getFunctionRegistry().getFunctions()) {
            f.getAnimation().update();
            float anim = (float) f.getAnimation().getValue();
            if (anim > 0 && f.getBind() != 0) {
                totalItemsHeight += (fontSize + padding) * anim;
                float nameWidth = Fonts.sfMedium.getWidth(f.getName(), fontSize);
                if (nameWidth > maxNameWidth) {
                    maxNameWidth = nameWidth;
                }
            }
        }

        float headerFontSize = 8.0f;
        float headerBoxHeight = headerFontSize + padding * 2;
        float innerBoxHeight = 0;

        if (totalItemsHeight > 0) {
            innerBoxHeight = padding + totalItemsHeight;
        }

        float calculatedWidth = maxNameWidth + keyBoxWidth + (innerPadding * 3) + (padding * 4) + 5;
        width = Math.max(calculatedWidth, 90f);

        if (totalItemsHeight > 0) {
            height = innerPadding + headerBoxHeight + innerPadding + innerBoxHeight + innerPadding;
        } else {
            height = innerPadding + headerBoxHeight + innerPadding;
        }

        dragging.setWidth(width);
        dragging.setHeight(height);

        DisplayUtils.drawShadow(posX, posY, width, height, 15, blurBgColor, blurBgColor);
        DisplayUtils.drawRoundedRect(posX, posY, width, height, 6, blurBgColor);
        Scissor.push();
        Scissor.setFromComponentCoordinates(posX, posY, width, height);

        float topBoxX = posX + innerPadding;
        float topBoxY = posY + innerPadding;
        float topBoxWidth = width - (innerPadding * 2);

        DisplayUtils.drawRoundedRect(topBoxX, topBoxY, topBoxWidth, headerBoxHeight, 4, headerBgColor);
        Fonts.sfMedium.drawText(ms, "Binds", topBoxX + padding, topBoxY + (headerBoxHeight / 2f) - (headerFontSize / 2f) + 1, -1, headerFontSize);

        float iconSize = 10f;
        float iconX = topBoxX + topBoxWidth - padding - iconSize;
        float iconY = topBoxY + (headerBoxHeight / 2f) - (iconSize / 2f);
        DisplayUtils.drawImage(keyboardIcon, iconX, iconY, iconSize, iconSize, -1);

        if (totalItemsHeight > 0) {

            float listPosY = topBoxY + headerBoxHeight + innerPadding;
            float leftBoxX = posX + innerPadding;
            float leftBoxWidth = width - (innerPadding * 3) - keyBoxWidth;
            DisplayUtils.drawRoundedRect(leftBoxX, listPosY, leftBoxWidth, innerBoxHeight, 4, pillBgColor);
            float rightBoxX = posX + width - innerPadding - keyBoxWidth;
            DisplayUtils.drawRoundedRect(rightBoxX, listPosY, keyBoxWidth, innerBoxHeight, 4, pillBgColor);
            float currentY = listPosY + padding;

            for (Function f : Expensive.getInstance().getFunctionRegistry().getFunctions()) {
                float anim = (float) f.getAnimation().getValue();
                if (!(anim > 0) || f.getBind() == 0) continue;
                String nameText = f.getName();
                String bindText = KeyStorage.getKey(f.getBind());
                if (bindText == null) bindText = "NONE";
                int textColor = ColorUtils.rgba(230, 230, 230, (int) (255 * anim));
                int dynamicAccentColor = ColorUtils.rgba(115, 144, 234, (int) (255 * anim));

                DisplayUtils.drawRoundedRect(leftBoxX + padding, currentY + 0.5f, 1.5f, fontSize, 0.5f, dynamicAccentColor);
                Fonts.sfMedium.drawText(ms, nameText, leftBoxX + padding + 5, currentY + 0.5f, textColor, fontSize);

                float bindWidth = Fonts.sfMedium.getWidth(bindText, fontSize);
                float bindX = rightBoxX + (keyBoxWidth / 2f) - (bindWidth / 2f);
                Fonts.sfMedium.drawText(ms, bindText, bindX, currentY + 0.5f, dynamicAccentColor, fontSize);

                currentY += (fontSize + padding) * anim;
            }
        }

        Scissor.unset();
        Scissor.pop();
    }
}
 
идея: 10/10
реализация: для чего это создано
Для пастеров, которые хотят сделай свой красивый СвинтусКлиент, мне кажется реализация не плохая, но можно куда лучше было сделать
 
Для пастеров, которые хотят сделай свой красивый СвинтусКлиент, мне кажется реализация не плохая, но можно куда лучше было сделать
шрифты хотяб по лучше мог сделать, и иконки засунуть адекватные, а не с вроде Exo Client
 
Назад
Сверху Снизу