• Ищем качественного (не новичок) разработчиков Xenforo для этого форума! В идеале, чтобы ты был фулл стек программистом. Если у тебя есть что показать, то свяжись с нами по контактным данным: https://t.me/DREDD

Визуальная часть AltWidget, exp 3.1

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
17 Июл 2024
Сообщения
36
Реакции
1
Выберите загрузчик игры
  1. Vanilla
  2. OptiFine
  3. Прочие моды
Сделал за 15 минут, для пастеров сойдёт
AltWidget.java:
Expand Collapse Copy
package im.expensive.ui.mainmenu;

import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.platform.GlStateManager;
import im.expensive.functions.impl.render.HUD;
import im.expensive.utils.client.IMinecraft;
import im.expensive.utils.math.MathUtil;
import im.expensive.utils.math.Vector4i;
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 net.minecraft.util.Session;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.vector.Vector4f;
import org.lwjgl.glfw.GLFW;
import ru.hogoshi.Animation;
import ru.hogoshi.util.Easings;

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

public class AltWidget implements IMinecraft {
    public final List<Alt> alts = new ArrayList<>();
    private boolean fullscreenMenuOpen;
    private String altName = "";
    private boolean typing;
    private int selectedAltIndex = -1;
    private float scroll;
    private boolean compactButtonHovered;

    // Анимации
    private final Animation scrollAnimation = new Animation();
    private final Animation openAnimation = new Animation();
    private float lastScroll;
    private float scrollVelocity;

    public void render(MatrixStack stack, int mouseX, int mouseY) {
        scrollAnimation.update();
        openAnimation.update();

        if (fullscreenMenuOpen) {
            renderFullscreenMenu(stack, mouseX, mouseY);
        } else {
            renderCompactWidget(stack, mouseX, mouseY);
        }
    }

    private void renderCompactWidget(MatrixStack stack, int mouseX, int mouseY) {
        float x = mc.getMainWindow().getScaledWidth() - 155;
        float y = 10;
        float width = 145;
        float height = 20;
        float cornerRadius = 6f;

        compactButtonHovered = MathUtil.isHovered(mouseX, mouseY, x, y, width, height);
        int bgColor = compactButtonHovered ? HUD.getColor(60) : HUD.getColor(80);
        int textColor = ColorUtils.rgba(255, 255, 255, 255);

        DisplayUtils.drawRoundedRect(x, y, width, height, cornerRadius, bgColor);
        fonts.montserrat.drawText(stack, "Alt Manager", x + 10, y + 6, textColor, 7);

        if (compactButtonHovered) {
            DisplayUtils.drawRoundedRectOutline(x, y, width, height, cornerRadius, 1, ColorUtils.rgba(255, 255, 255, 100));
        }
    }

    private void renderFullscreenMenu(MatrixStack stack, int mouseX, int mouseY) {
        int screenWidth = mc.getMainWindow().getScaledWidth();
        int screenHeight = mc.getMainWindow().getScaledHeight();
        float menuWidth = screenWidth * 0.8f;
        float menuHeight = screenHeight * 0.8f;
        float menuX = (screenWidth - menuWidth) / 2;
        float menuY = (screenHeight - menuHeight) / 2;
        float cornerRadius = 10f;

        // Анимация открытия
        float animProgress = (float) openAnimation.getValue();
        if (animProgress < 1.0) {
            float scale = 0.8f + animProgress * 0.2f;
            float alpha = animProgress;
            menuWidth *= scale;
            menuHeight *= scale;
            menuX = (screenWidth - menuWidth) / 2;
            menuY = (screenHeight - menuHeight) / 2;

            GlStateManager.pushMatrix();
            GlStateManager.translatef(menuX + menuWidth/2, menuY + menuHeight/2, 0);
            GlStateManager.scalef(scale, scale, 1);
            GlStateManager.translatef(-(menuX + menuWidth/2), -(menuY + menuHeight/2), 0);
        }

        // Основной фон
        DisplayUtils.drawRoundedRect(menuX, menuY, menuWidth, menuHeight, cornerRadius, ColorUtils.rgba(5, 5, 5, (int)(255 * animProgress)));

        // Заголовок
        fonts.montserrat.drawCenteredText(stack, "Alt Manager", menuX + menuWidth/2, menuY + 15,
                ColorUtils.rgba(255, 255, 255, (int)(255 * animProgress)), 10);

        // Текущий аккаунт
        fonts.montserrat.drawText(stack, "Current: " + mc.session.getUsername(),
                menuX + 15, menuY + 40, ColorUtils.rgba(255, 255, 255, (int)(200 * animProgress)), 8);

        // Фон списка альтов
        float listX = menuX + 15;
        float listY = menuY + 60;
        float listWidth = menuWidth - 30;
        float listHeight = menuHeight - 150;

        DisplayUtils.drawRoundedRect(listX, listY, listWidth, listHeight, cornerRadius, ColorUtils.rgba(40, 40, 40, (int)(200 * animProgress)));

        // Анимированный скролл
        float scrollValue = (float) scrollAnimation.getValue();
        float scrollDelta = scrollValue - lastScroll;
        lastScroll = scrollValue;
        scroll = scrollValue;

        // Список альтов с прокруткой
        Scissor.push();
        Scissor.setFromComponentCoordinates(listX, listY, listWidth, listHeight);

        float itemHeight = 25;
        float totalHeight = alts.size() * itemHeight;
        float maxScroll = Math.max(0, totalHeight - listHeight);

        scroll = MathHelper.clamp(scroll, 0, maxScroll);
        float yOffset = listY - scroll;

        for (int i = 0; i < alts.size(); i++) {
            Alt alt = alts.get(i);
            float itemY = yOffset + i * itemHeight;

            // Эффект инерции при скролле
            if (Math.abs(scrollDelta) > 0.1f) {
                float inertia = 1 - (i / (float)alts.size()) * 0.5f;
                itemY += scrollDelta * inertia * 0.8f;
            }

            boolean hovered = MathUtil.isHovered(mouseX, mouseY, listX, itemY, listWidth, itemHeight);
            boolean selected = i == selectedAltIndex;

            int bgColor = selected ? HUD.getColor(40) :
                    hovered ? ColorUtils.rgba(70, 70, 70, (int)(200 * animProgress)) :
                            ColorUtils.rgba(50, 50, 50, (int)(180 * animProgress));

            DisplayUtils.drawRoundedRect(listX, itemY, listWidth, itemHeight, cornerRadius, bgColor);
            fonts.montserrat.drawText(stack, alt.name, listX + 10, itemY + 8,
                    ColorUtils.rgba(255, 255, 255, (int)(255 * animProgress)), 7);
        }

        Scissor.pop();

        // Поле ввода
        float inputY = listY + listHeight + 15;
        DisplayUtils.drawRoundedRect(listX, inputY, listWidth, 30, cornerRadius,
                ColorUtils.rgba(50, 50, 50, (int)(200 * animProgress)));

        String displayText = typing ? altName + (System.currentTimeMillis() % 1000 > 500 ? "_" : "") :
                altName.isEmpty() ? "Enter nickname..." : altName;

        fonts.montserrat.drawText(stack, displayText, listX + 10, inputY + 10,
                ColorUtils.rgba(255, 255, 255, (int)((typing || !altName.isEmpty() ? 255 : 150) * animProgress)), 8);

        // Кнопки
        float buttonY = inputY + 40;
        float buttonWidth = (listWidth - 10) / 2;

        // Кнопка добавления
        boolean addHovered = MathUtil.isHovered(mouseX, mouseY, listX, buttonY, buttonWidth, 30);
        DisplayUtils.drawRoundedRect(listX, buttonY, buttonWidth, 30, cornerRadius,
                addHovered ? HUD.getColor(40) : HUD.getColor(60));
        fonts.montserrat.drawCenteredText(stack, "Add Alt", listX + buttonWidth/2, buttonY + 10,
                ColorUtils.rgba(255, 255, 255, (int)(255 * animProgress)), 8);

        // Кнопка входа
        boolean loginHovered = MathUtil.isHovered(mouseX, mouseY, listX + buttonWidth + 10, buttonY, buttonWidth, 30);
        boolean canLogin = selectedAltIndex >= 0;
        DisplayUtils.drawRoundedRect(listX + buttonWidth + 10, buttonY, buttonWidth, 30, cornerRadius,
                canLogin ? (loginHovered ? HUD.getColor(40) : HUD.getColor(60)) : ColorUtils.rgba(80, 80, 80, (int)(150 * animProgress)));
        fonts.montserrat.drawCenteredText(stack, "Login", listX + buttonWidth + 10 + buttonWidth/2, buttonY + 10,
                ColorUtils.rgba(255, 255, 255, (int)((canLogin ? 255 : 100) * animProgress)), 8);

        // Кнопка закрытия
      /*  float closeButtonSize = 20;
        float closeX = menuX + menuWidth - closeButtonSize - 10;
        float closeY = menuY + 10;
        boolean closeHovered = MathUtil.isHovered(mouseX, mouseY, closeX, closeY, closeButtonSize, closeButtonSize);
        DisplayUtils.drawRoundedRect(closeX, closeY, closeButtonSize, closeButtonSize, cornerRadius,
                closeHovered ? ColorUtils.rgba(200, 50, 50, (int)(200 * animProgress)) : ColorUtils.rgba(150, 40, 40, (int)(200 * animProgress)));
        fonts.montserrat.drawCenteredText(stack, "X", closeX + closeButtonSize/2, closeY + 6,
                ColorUtils.rgba(255, 255, 255, (int)(255 * animProgress)), 8);

        if (animProgress < 1.0) {
            GlStateManager.popMatrix();
        } */
    }

    public void onChar(char typed) {
        if (typing && fonts.montserrat.getWidth(altName, 8f) < mc.getMainWindow().getScaledWidth() * 0.7f - 100) {
            altName += typed;
        }
    }

    public void onKey(int key) {
        if (key == GLFW.GLFW_KEY_ESCAPE && fullscreenMenuOpen) {
            fullscreenMenuOpen = false;
            openAnimation.animate(0.0, 0.2, Easings.CIRC_OUT);
            return;
        }

        if (typing) {
            boolean ctrlDown = GLFW.glfwGetKey(mc.getMainWindow().getHandle(), GLFW.GLFW_KEY_LEFT_CONTROL) == GLFW.GLFW_PRESS ||
                    GLFW.glfwGetKey(mc.getMainWindow().getHandle(), GLFW.GLFW_KEY_RIGHT_CONTROL) == GLFW.GLFW_PRESS;

            if (ctrlDown && key == GLFW.GLFW_KEY_V) {
                try {
                    altName += GLFW.glfwGetClipboardString(mc.getMainWindow().getHandle());
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if (key == GLFW.GLFW_KEY_BACKSPACE && !altName.isEmpty()) {
                altName = altName.substring(0, altName.length() - 1);
            }
            if (key == GLFW.GLFW_KEY_ENTER && altName.length() >= 3) {
                alts.add(new Alt(altName));
                altName = "";
                typing = false;
            }
        }
    }

    public void updateScroll(int mouseX, int mouseY, float delta) {
        if (fullscreenMenuOpen) {
            float newScroll = MathHelper.clamp(scroll - delta * 20, 0,
                    Math.max(0, alts.size() * 25 - (mc.getMainWindow().getScaledHeight() * 0.8f - 150)));

            // Анимация скролла с эффектом инерции
            scrollAnimation.animate(newScroll, 0.4, Easings.CUBIC_OUT);
            scrollVelocity = delta;
        }
    }

    public void click(int mouseX, int mouseY, int button) {
        if (!fullscreenMenuOpen) {
            float x = mc.getMainWindow().getScaledWidth() - 155;
            float y = 10;
            float width = 145;

            if (MathUtil.isHovered(mouseX, mouseY, x, y, width, 20) && button == 0) {
                fullscreenMenuOpen = true;
                openAnimation.animate(1.0, 0.2, Easings.CIRC_OUT);
            }
            return;
        }

        int screenWidth = mc.getMainWindow().getScaledWidth();
        int screenHeight = mc.getMainWindow().getScaledHeight();
        float menuWidth = screenWidth * 0.8f;
        float menuHeight = screenHeight * 0.8f;
        float menuX = (screenWidth - menuWidth) / 2;
        float menuY = (screenHeight - menuHeight) / 2;

        // Кнопка закрытия
        float closeButtonSize = 20;
        float closeX = menuX + menuWidth - closeButtonSize - 10;
        float closeY = menuY + 10;

        if (MathUtil.isHovered(mouseX, mouseY, closeX, closeY, closeButtonSize, closeButtonSize)) {
            fullscreenMenuOpen = false;
            openAnimation.animate(0.0, 0.2, Easings.CIRC_OUT);
            return;
        }

        // Список альтов
        float listX = menuX + 15;
        float listY = menuY + 60;
        float listWidth = menuWidth - 30;
        float listHeight = menuHeight - 150;

        if (MathUtil.isHovered(mouseX, mouseY, listX, listY, listWidth, listHeight)) {
            float itemHeight = 25;
            int clickedIndex = (int) ((mouseY - listY + scroll) / itemHeight);

            if (clickedIndex >= 0 && clickedIndex < alts.size()) {
                selectedAltIndex = clickedIndex;

                if (button == 1) { // Правый клик для удаления
                    alts.remove(clickedIndex);
                    selectedAltIndex = -1;
                }
            }
        }

        // Поле ввода
        float inputY = listY + listHeight + 15;
        if (MathUtil.isHovered(mouseX, mouseY, listX, inputY, listWidth, 30)) {
            typing = true;
        } else {
            typing = false;
        }

        // Кнопки
        float buttonY = inputY + 40;
        float buttonWidth = (listWidth - 10) / 2;

        // Кнопка добавления
        if (MathUtil.isHovered(mouseX, mouseY, listX, buttonY, buttonWidth, 30) && !altName.isEmpty() && altName.length() >= 3) {
            alts.add(new Alt(altName));
            altName = "";
            typing = false;
        }

        // Кнопка входа
        if (MathUtil.isHovered(mouseX, mouseY, listX + buttonWidth + 10, buttonY, buttonWidth, 30) && selectedAltIndex >= 0) {
            Alt selectedAlt = alts.get(selectedAltIndex);
            mc.session = new Session(selectedAlt.name, UUID.randomUUID().toString(), "", "mojang");
        }
    }

    public void mouseScrolled(double delta) {
        if (fullscreenMenuOpen) {
            updateScroll(0, 0, (float)delta);
        }
    }
}
SS -
1752317425531.png
 
Сделал за 15 минут, для пастеров сойдёт
AltWidget.java:
Expand Collapse Copy
package im.expensive.ui.mainmenu;

import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.platform.GlStateManager;
import im.expensive.functions.impl.render.HUD;
import im.expensive.utils.client.IMinecraft;
import im.expensive.utils.math.MathUtil;
import im.expensive.utils.math.Vector4i;
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 net.minecraft.util.Session;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.vector.Vector4f;
import org.lwjgl.glfw.GLFW;
import ru.hogoshi.Animation;
import ru.hogoshi.util.Easings;

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

public class AltWidget implements IMinecraft {
    public final List<Alt> alts = new ArrayList<>();
    private boolean fullscreenMenuOpen;
    private String altName = "";
    private boolean typing;
    private int selectedAltIndex = -1;
    private float scroll;
    private boolean compactButtonHovered;

    // Анимации
    private final Animation scrollAnimation = new Animation();
    private final Animation openAnimation = new Animation();
    private float lastScroll;
    private float scrollVelocity;

    public void render(MatrixStack stack, int mouseX, int mouseY) {
        scrollAnimation.update();
        openAnimation.update();

        if (fullscreenMenuOpen) {
            renderFullscreenMenu(stack, mouseX, mouseY);
        } else {
            renderCompactWidget(stack, mouseX, mouseY);
        }
    }

    private void renderCompactWidget(MatrixStack stack, int mouseX, int mouseY) {
        float x = mc.getMainWindow().getScaledWidth() - 155;
        float y = 10;
        float width = 145;
        float height = 20;
        float cornerRadius = 6f;

        compactButtonHovered = MathUtil.isHovered(mouseX, mouseY, x, y, width, height);
        int bgColor = compactButtonHovered ? HUD.getColor(60) : HUD.getColor(80);
        int textColor = ColorUtils.rgba(255, 255, 255, 255);

        DisplayUtils.drawRoundedRect(x, y, width, height, cornerRadius, bgColor);
        fonts.montserrat.drawText(stack, "Alt Manager", x + 10, y + 6, textColor, 7);

        if (compactButtonHovered) {
            DisplayUtils.drawRoundedRectOutline(x, y, width, height, cornerRadius, 1, ColorUtils.rgba(255, 255, 255, 100));
        }
    }

    private void renderFullscreenMenu(MatrixStack stack, int mouseX, int mouseY) {
        int screenWidth = mc.getMainWindow().getScaledWidth();
        int screenHeight = mc.getMainWindow().getScaledHeight();
        float menuWidth = screenWidth * 0.8f;
        float menuHeight = screenHeight * 0.8f;
        float menuX = (screenWidth - menuWidth) / 2;
        float menuY = (screenHeight - menuHeight) / 2;
        float cornerRadius = 10f;

        // Анимация открытия
        float animProgress = (float) openAnimation.getValue();
        if (animProgress < 1.0) {
            float scale = 0.8f + animProgress * 0.2f;
            float alpha = animProgress;
            menuWidth *= scale;
            menuHeight *= scale;
            menuX = (screenWidth - menuWidth) / 2;
            menuY = (screenHeight - menuHeight) / 2;

            GlStateManager.pushMatrix();
            GlStateManager.translatef(menuX + menuWidth/2, menuY + menuHeight/2, 0);
            GlStateManager.scalef(scale, scale, 1);
            GlStateManager.translatef(-(menuX + menuWidth/2), -(menuY + menuHeight/2), 0);
        }

        // Основной фон
        DisplayUtils.drawRoundedRect(menuX, menuY, menuWidth, menuHeight, cornerRadius, ColorUtils.rgba(5, 5, 5, (int)(255 * animProgress)));

        // Заголовок
        fonts.montserrat.drawCenteredText(stack, "Alt Manager", menuX + menuWidth/2, menuY + 15,
                ColorUtils.rgba(255, 255, 255, (int)(255 * animProgress)), 10);

        // Текущий аккаунт
        fonts.montserrat.drawText(stack, "Current: " + mc.session.getUsername(),
                menuX + 15, menuY + 40, ColorUtils.rgba(255, 255, 255, (int)(200 * animProgress)), 8);

        // Фон списка альтов
        float listX = menuX + 15;
        float listY = menuY + 60;
        float listWidth = menuWidth - 30;
        float listHeight = menuHeight - 150;

        DisplayUtils.drawRoundedRect(listX, listY, listWidth, listHeight, cornerRadius, ColorUtils.rgba(40, 40, 40, (int)(200 * animProgress)));

        // Анимированный скролл
        float scrollValue = (float) scrollAnimation.getValue();
        float scrollDelta = scrollValue - lastScroll;
        lastScroll = scrollValue;
        scroll = scrollValue;

        // Список альтов с прокруткой
        Scissor.push();
        Scissor.setFromComponentCoordinates(listX, listY, listWidth, listHeight);

        float itemHeight = 25;
        float totalHeight = alts.size() * itemHeight;
        float maxScroll = Math.max(0, totalHeight - listHeight);

        scroll = MathHelper.clamp(scroll, 0, maxScroll);
        float yOffset = listY - scroll;

        for (int i = 0; i < alts.size(); i++) {
            Alt alt = alts.get(i);
            float itemY = yOffset + i * itemHeight;

            // Эффект инерции при скролле
            if (Math.abs(scrollDelta) > 0.1f) {
                float inertia = 1 - (i / (float)alts.size()) * 0.5f;
                itemY += scrollDelta * inertia * 0.8f;
            }

            boolean hovered = MathUtil.isHovered(mouseX, mouseY, listX, itemY, listWidth, itemHeight);
            boolean selected = i == selectedAltIndex;

            int bgColor = selected ? HUD.getColor(40) :
                    hovered ? ColorUtils.rgba(70, 70, 70, (int)(200 * animProgress)) :
                            ColorUtils.rgba(50, 50, 50, (int)(180 * animProgress));

            DisplayUtils.drawRoundedRect(listX, itemY, listWidth, itemHeight, cornerRadius, bgColor);
            fonts.montserrat.drawText(stack, alt.name, listX + 10, itemY + 8,
                    ColorUtils.rgba(255, 255, 255, (int)(255 * animProgress)), 7);
        }

        Scissor.pop();

        // Поле ввода
        float inputY = listY + listHeight + 15;
        DisplayUtils.drawRoundedRect(listX, inputY, listWidth, 30, cornerRadius,
                ColorUtils.rgba(50, 50, 50, (int)(200 * animProgress)));

        String displayText = typing ? altName + (System.currentTimeMillis() % 1000 > 500 ? "_" : "") :
                altName.isEmpty() ? "Enter nickname..." : altName;

        fonts.montserrat.drawText(stack, displayText, listX + 10, inputY + 10,
                ColorUtils.rgba(255, 255, 255, (int)((typing || !altName.isEmpty() ? 255 : 150) * animProgress)), 8);

        // Кнопки
        float buttonY = inputY + 40;
        float buttonWidth = (listWidth - 10) / 2;

        // Кнопка добавления
        boolean addHovered = MathUtil.isHovered(mouseX, mouseY, listX, buttonY, buttonWidth, 30);
        DisplayUtils.drawRoundedRect(listX, buttonY, buttonWidth, 30, cornerRadius,
                addHovered ? HUD.getColor(40) : HUD.getColor(60));
        fonts.montserrat.drawCenteredText(stack, "Add Alt", listX + buttonWidth/2, buttonY + 10,
                ColorUtils.rgba(255, 255, 255, (int)(255 * animProgress)), 8);

        // Кнопка входа
        boolean loginHovered = MathUtil.isHovered(mouseX, mouseY, listX + buttonWidth + 10, buttonY, buttonWidth, 30);
        boolean canLogin = selectedAltIndex >= 0;
        DisplayUtils.drawRoundedRect(listX + buttonWidth + 10, buttonY, buttonWidth, 30, cornerRadius,
                canLogin ? (loginHovered ? HUD.getColor(40) : HUD.getColor(60)) : ColorUtils.rgba(80, 80, 80, (int)(150 * animProgress)));
        fonts.montserrat.drawCenteredText(stack, "Login", listX + buttonWidth + 10 + buttonWidth/2, buttonY + 10,
                ColorUtils.rgba(255, 255, 255, (int)((canLogin ? 255 : 100) * animProgress)), 8);

        // Кнопка закрытия
      /*  float closeButtonSize = 20;
        float closeX = menuX + menuWidth - closeButtonSize - 10;
        float closeY = menuY + 10;
        boolean closeHovered = MathUtil.isHovered(mouseX, mouseY, closeX, closeY, closeButtonSize, closeButtonSize);
        DisplayUtils.drawRoundedRect(closeX, closeY, closeButtonSize, closeButtonSize, cornerRadius,
                closeHovered ? ColorUtils.rgba(200, 50, 50, (int)(200 * animProgress)) : ColorUtils.rgba(150, 40, 40, (int)(200 * animProgress)));
        fonts.montserrat.drawCenteredText(stack, "X", closeX + closeButtonSize/2, closeY + 6,
                ColorUtils.rgba(255, 255, 255, (int)(255 * animProgress)), 8);

        if (animProgress < 1.0) {
            GlStateManager.popMatrix();
        } */
    }

    public void onChar(char typed) {
        if (typing && fonts.montserrat.getWidth(altName, 8f) < mc.getMainWindow().getScaledWidth() * 0.7f - 100) {
            altName += typed;
        }
    }

    public void onKey(int key) {
        if (key == GLFW.GLFW_KEY_ESCAPE && fullscreenMenuOpen) {
            fullscreenMenuOpen = false;
            openAnimation.animate(0.0, 0.2, Easings.CIRC_OUT);
            return;
        }

        if (typing) {
            boolean ctrlDown = GLFW.glfwGetKey(mc.getMainWindow().getHandle(), GLFW.GLFW_KEY_LEFT_CONTROL) == GLFW.GLFW_PRESS ||
                    GLFW.glfwGetKey(mc.getMainWindow().getHandle(), GLFW.GLFW_KEY_RIGHT_CONTROL) == GLFW.GLFW_PRESS;

            if (ctrlDown && key == GLFW.GLFW_KEY_V) {
                try {
                    altName += GLFW.glfwGetClipboardString(mc.getMainWindow().getHandle());
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if (key == GLFW.GLFW_KEY_BACKSPACE && !altName.isEmpty()) {
                altName = altName.substring(0, altName.length() - 1);
            }
            if (key == GLFW.GLFW_KEY_ENTER && altName.length() >= 3) {
                alts.add(new Alt(altName));
                altName = "";
                typing = false;
            }
        }
    }

    public void updateScroll(int mouseX, int mouseY, float delta) {
        if (fullscreenMenuOpen) {
            float newScroll = MathHelper.clamp(scroll - delta * 20, 0,
                    Math.max(0, alts.size() * 25 - (mc.getMainWindow().getScaledHeight() * 0.8f - 150)));

            // Анимация скролла с эффектом инерции
            scrollAnimation.animate(newScroll, 0.4, Easings.CUBIC_OUT);
            scrollVelocity = delta;
        }
    }

    public void click(int mouseX, int mouseY, int button) {
        if (!fullscreenMenuOpen) {
            float x = mc.getMainWindow().getScaledWidth() - 155;
            float y = 10;
            float width = 145;

            if (MathUtil.isHovered(mouseX, mouseY, x, y, width, 20) && button == 0) {
                fullscreenMenuOpen = true;
                openAnimation.animate(1.0, 0.2, Easings.CIRC_OUT);
            }
            return;
        }

        int screenWidth = mc.getMainWindow().getScaledWidth();
        int screenHeight = mc.getMainWindow().getScaledHeight();
        float menuWidth = screenWidth * 0.8f;
        float menuHeight = screenHeight * 0.8f;
        float menuX = (screenWidth - menuWidth) / 2;
        float menuY = (screenHeight - menuHeight) / 2;

        // Кнопка закрытия
        float closeButtonSize = 20;
        float closeX = menuX + menuWidth - closeButtonSize - 10;
        float closeY = menuY + 10;

        if (MathUtil.isHovered(mouseX, mouseY, closeX, closeY, closeButtonSize, closeButtonSize)) {
            fullscreenMenuOpen = false;
            openAnimation.animate(0.0, 0.2, Easings.CIRC_OUT);
            return;
        }

        // Список альтов
        float listX = menuX + 15;
        float listY = menuY + 60;
        float listWidth = menuWidth - 30;
        float listHeight = menuHeight - 150;

        if (MathUtil.isHovered(mouseX, mouseY, listX, listY, listWidth, listHeight)) {
            float itemHeight = 25;
            int clickedIndex = (int) ((mouseY - listY + scroll) / itemHeight);

            if (clickedIndex >= 0 && clickedIndex < alts.size()) {
                selectedAltIndex = clickedIndex;

                if (button == 1) { // Правый клик для удаления
                    alts.remove(clickedIndex);
                    selectedAltIndex = -1;
                }
            }
        }

        // Поле ввода
        float inputY = listY + listHeight + 15;
        if (MathUtil.isHovered(mouseX, mouseY, listX, inputY, listWidth, 30)) {
            typing = true;
        } else {
            typing = false;
        }

        // Кнопки
        float buttonY = inputY + 40;
        float buttonWidth = (listWidth - 10) / 2;

        // Кнопка добавления
        if (MathUtil.isHovered(mouseX, mouseY, listX, buttonY, buttonWidth, 30) && !altName.isEmpty() && altName.length() >= 3) {
            alts.add(new Alt(altName));
            altName = "";
            typing = false;
        }

        // Кнопка входа
        if (MathUtil.isHovered(mouseX, mouseY, listX + buttonWidth + 10, buttonY, buttonWidth, 30) && selectedAltIndex >= 0) {
            Alt selectedAlt = alts.get(selectedAltIndex);
            mc.session = new Session(selectedAlt.name, UUID.randomUUID().toString(), "", "mojang");
        }
    }

    public void mouseScrolled(double delta) {
        if (fullscreenMenuOpen) {
            updateScroll(0, 0, (float)delta);
        }
    }
}
SS -
Посмотреть вложение 310864
/del фу блять лучше глаза вырвать
 
Сделал за 15 минут, для пастеров сойдёт
AltWidget.java:
Expand Collapse Copy
package im.expensive.ui.mainmenu;

import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.platform.GlStateManager;
import im.expensive.functions.impl.render.HUD;
import im.expensive.utils.client.IMinecraft;
import im.expensive.utils.math.MathUtil;
import im.expensive.utils.math.Vector4i;
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 net.minecraft.util.Session;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.vector.Vector4f;
import org.lwjgl.glfw.GLFW;
import ru.hogoshi.Animation;
import ru.hogoshi.util.Easings;

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

public class AltWidget implements IMinecraft {
    public final List<Alt> alts = new ArrayList<>();
    private boolean fullscreenMenuOpen;
    private String altName = "";
    private boolean typing;
    private int selectedAltIndex = -1;
    private float scroll;
    private boolean compactButtonHovered;

    // Анимации
    private final Animation scrollAnimation = new Animation();
    private final Animation openAnimation = new Animation();
    private float lastScroll;
    private float scrollVelocity;

    public void render(MatrixStack stack, int mouseX, int mouseY) {
        scrollAnimation.update();
        openAnimation.update();

        if (fullscreenMenuOpen) {
            renderFullscreenMenu(stack, mouseX, mouseY);
        } else {
            renderCompactWidget(stack, mouseX, mouseY);
        }
    }

    private void renderCompactWidget(MatrixStack stack, int mouseX, int mouseY) {
        float x = mc.getMainWindow().getScaledWidth() - 155;
        float y = 10;
        float width = 145;
        float height = 20;
        float cornerRadius = 6f;

        compactButtonHovered = MathUtil.isHovered(mouseX, mouseY, x, y, width, height);
        int bgColor = compactButtonHovered ? HUD.getColor(60) : HUD.getColor(80);
        int textColor = ColorUtils.rgba(255, 255, 255, 255);

        DisplayUtils.drawRoundedRect(x, y, width, height, cornerRadius, bgColor);
        fonts.montserrat.drawText(stack, "Alt Manager", x + 10, y + 6, textColor, 7);

        if (compactButtonHovered) {
            DisplayUtils.drawRoundedRectOutline(x, y, width, height, cornerRadius, 1, ColorUtils.rgba(255, 255, 255, 100));
        }
    }

    private void renderFullscreenMenu(MatrixStack stack, int mouseX, int mouseY) {
        int screenWidth = mc.getMainWindow().getScaledWidth();
        int screenHeight = mc.getMainWindow().getScaledHeight();
        float menuWidth = screenWidth * 0.8f;
        float menuHeight = screenHeight * 0.8f;
        float menuX = (screenWidth - menuWidth) / 2;
        float menuY = (screenHeight - menuHeight) / 2;
        float cornerRadius = 10f;

        // Анимация открытия
        float animProgress = (float) openAnimation.getValue();
        if (animProgress < 1.0) {
            float scale = 0.8f + animProgress * 0.2f;
            float alpha = animProgress;
            menuWidth *= scale;
            menuHeight *= scale;
            menuX = (screenWidth - menuWidth) / 2;
            menuY = (screenHeight - menuHeight) / 2;

            GlStateManager.pushMatrix();
            GlStateManager.translatef(menuX + menuWidth/2, menuY + menuHeight/2, 0);
            GlStateManager.scalef(scale, scale, 1);
            GlStateManager.translatef(-(menuX + menuWidth/2), -(menuY + menuHeight/2), 0);
        }

        // Основной фон
        DisplayUtils.drawRoundedRect(menuX, menuY, menuWidth, menuHeight, cornerRadius, ColorUtils.rgba(5, 5, 5, (int)(255 * animProgress)));

        // Заголовок
        fonts.montserrat.drawCenteredText(stack, "Alt Manager", menuX + menuWidth/2, menuY + 15,
                ColorUtils.rgba(255, 255, 255, (int)(255 * animProgress)), 10);

        // Текущий аккаунт
        fonts.montserrat.drawText(stack, "Current: " + mc.session.getUsername(),
                menuX + 15, menuY + 40, ColorUtils.rgba(255, 255, 255, (int)(200 * animProgress)), 8);

        // Фон списка альтов
        float listX = menuX + 15;
        float listY = menuY + 60;
        float listWidth = menuWidth - 30;
        float listHeight = menuHeight - 150;

        DisplayUtils.drawRoundedRect(listX, listY, listWidth, listHeight, cornerRadius, ColorUtils.rgba(40, 40, 40, (int)(200 * animProgress)));

        // Анимированный скролл
        float scrollValue = (float) scrollAnimation.getValue();
        float scrollDelta = scrollValue - lastScroll;
        lastScroll = scrollValue;
        scroll = scrollValue;

        // Список альтов с прокруткой
        Scissor.push();
        Scissor.setFromComponentCoordinates(listX, listY, listWidth, listHeight);

        float itemHeight = 25;
        float totalHeight = alts.size() * itemHeight;
        float maxScroll = Math.max(0, totalHeight - listHeight);

        scroll = MathHelper.clamp(scroll, 0, maxScroll);
        float yOffset = listY - scroll;

        for (int i = 0; i < alts.size(); i++) {
            Alt alt = alts.get(i);
            float itemY = yOffset + i * itemHeight;

            // Эффект инерции при скролле
            if (Math.abs(scrollDelta) > 0.1f) {
                float inertia = 1 - (i / (float)alts.size()) * 0.5f;
                itemY += scrollDelta * inertia * 0.8f;
            }

            boolean hovered = MathUtil.isHovered(mouseX, mouseY, listX, itemY, listWidth, itemHeight);
            boolean selected = i == selectedAltIndex;

            int bgColor = selected ? HUD.getColor(40) :
                    hovered ? ColorUtils.rgba(70, 70, 70, (int)(200 * animProgress)) :
                            ColorUtils.rgba(50, 50, 50, (int)(180 * animProgress));

            DisplayUtils.drawRoundedRect(listX, itemY, listWidth, itemHeight, cornerRadius, bgColor);
            fonts.montserrat.drawText(stack, alt.name, listX + 10, itemY + 8,
                    ColorUtils.rgba(255, 255, 255, (int)(255 * animProgress)), 7);
        }

        Scissor.pop();

        // Поле ввода
        float inputY = listY + listHeight + 15;
        DisplayUtils.drawRoundedRect(listX, inputY, listWidth, 30, cornerRadius,
                ColorUtils.rgba(50, 50, 50, (int)(200 * animProgress)));

        String displayText = typing ? altName + (System.currentTimeMillis() % 1000 > 500 ? "_" : "") :
                altName.isEmpty() ? "Enter nickname..." : altName;

        fonts.montserrat.drawText(stack, displayText, listX + 10, inputY + 10,
                ColorUtils.rgba(255, 255, 255, (int)((typing || !altName.isEmpty() ? 255 : 150) * animProgress)), 8);

        // Кнопки
        float buttonY = inputY + 40;
        float buttonWidth = (listWidth - 10) / 2;

        // Кнопка добавления
        boolean addHovered = MathUtil.isHovered(mouseX, mouseY, listX, buttonY, buttonWidth, 30);
        DisplayUtils.drawRoundedRect(listX, buttonY, buttonWidth, 30, cornerRadius,
                addHovered ? HUD.getColor(40) : HUD.getColor(60));
        fonts.montserrat.drawCenteredText(stack, "Add Alt", listX + buttonWidth/2, buttonY + 10,
                ColorUtils.rgba(255, 255, 255, (int)(255 * animProgress)), 8);

        // Кнопка входа
        boolean loginHovered = MathUtil.isHovered(mouseX, mouseY, listX + buttonWidth + 10, buttonY, buttonWidth, 30);
        boolean canLogin = selectedAltIndex >= 0;
        DisplayUtils.drawRoundedRect(listX + buttonWidth + 10, buttonY, buttonWidth, 30, cornerRadius,
                canLogin ? (loginHovered ? HUD.getColor(40) : HUD.getColor(60)) : ColorUtils.rgba(80, 80, 80, (int)(150 * animProgress)));
        fonts.montserrat.drawCenteredText(stack, "Login", listX + buttonWidth + 10 + buttonWidth/2, buttonY + 10,
                ColorUtils.rgba(255, 255, 255, (int)((canLogin ? 255 : 100) * animProgress)), 8);

        // Кнопка закрытия
      /*  float closeButtonSize = 20;
        float closeX = menuX + menuWidth - closeButtonSize - 10;
        float closeY = menuY + 10;
        boolean closeHovered = MathUtil.isHovered(mouseX, mouseY, closeX, closeY, closeButtonSize, closeButtonSize);
        DisplayUtils.drawRoundedRect(closeX, closeY, closeButtonSize, closeButtonSize, cornerRadius,
                closeHovered ? ColorUtils.rgba(200, 50, 50, (int)(200 * animProgress)) : ColorUtils.rgba(150, 40, 40, (int)(200 * animProgress)));
        fonts.montserrat.drawCenteredText(stack, "X", closeX + closeButtonSize/2, closeY + 6,
                ColorUtils.rgba(255, 255, 255, (int)(255 * animProgress)), 8);

        if (animProgress < 1.0) {
            GlStateManager.popMatrix();
        } */
    }

    public void onChar(char typed) {
        if (typing && fonts.montserrat.getWidth(altName, 8f) < mc.getMainWindow().getScaledWidth() * 0.7f - 100) {
            altName += typed;
        }
    }

    public void onKey(int key) {
        if (key == GLFW.GLFW_KEY_ESCAPE && fullscreenMenuOpen) {
            fullscreenMenuOpen = false;
            openAnimation.animate(0.0, 0.2, Easings.CIRC_OUT);
            return;
        }

        if (typing) {
            boolean ctrlDown = GLFW.glfwGetKey(mc.getMainWindow().getHandle(), GLFW.GLFW_KEY_LEFT_CONTROL) == GLFW.GLFW_PRESS ||
                    GLFW.glfwGetKey(mc.getMainWindow().getHandle(), GLFW.GLFW_KEY_RIGHT_CONTROL) == GLFW.GLFW_PRESS;

            if (ctrlDown && key == GLFW.GLFW_KEY_V) {
                try {
                    altName += GLFW.glfwGetClipboardString(mc.getMainWindow().getHandle());
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if (key == GLFW.GLFW_KEY_BACKSPACE && !altName.isEmpty()) {
                altName = altName.substring(0, altName.length() - 1);
            }
            if (key == GLFW.GLFW_KEY_ENTER && altName.length() >= 3) {
                alts.add(new Alt(altName));
                altName = "";
                typing = false;
            }
        }
    }

    public void updateScroll(int mouseX, int mouseY, float delta) {
        if (fullscreenMenuOpen) {
            float newScroll = MathHelper.clamp(scroll - delta * 20, 0,
                    Math.max(0, alts.size() * 25 - (mc.getMainWindow().getScaledHeight() * 0.8f - 150)));

            // Анимация скролла с эффектом инерции
            scrollAnimation.animate(newScroll, 0.4, Easings.CUBIC_OUT);
            scrollVelocity = delta;
        }
    }

    public void click(int mouseX, int mouseY, int button) {
        if (!fullscreenMenuOpen) {
            float x = mc.getMainWindow().getScaledWidth() - 155;
            float y = 10;
            float width = 145;

            if (MathUtil.isHovered(mouseX, mouseY, x, y, width, 20) && button == 0) {
                fullscreenMenuOpen = true;
                openAnimation.animate(1.0, 0.2, Easings.CIRC_OUT);
            }
            return;
        }

        int screenWidth = mc.getMainWindow().getScaledWidth();
        int screenHeight = mc.getMainWindow().getScaledHeight();
        float menuWidth = screenWidth * 0.8f;
        float menuHeight = screenHeight * 0.8f;
        float menuX = (screenWidth - menuWidth) / 2;
        float menuY = (screenHeight - menuHeight) / 2;

        // Кнопка закрытия
        float closeButtonSize = 20;
        float closeX = menuX + menuWidth - closeButtonSize - 10;
        float closeY = menuY + 10;

        if (MathUtil.isHovered(mouseX, mouseY, closeX, closeY, closeButtonSize, closeButtonSize)) {
            fullscreenMenuOpen = false;
            openAnimation.animate(0.0, 0.2, Easings.CIRC_OUT);
            return;
        }

        // Список альтов
        float listX = menuX + 15;
        float listY = menuY + 60;
        float listWidth = menuWidth - 30;
        float listHeight = menuHeight - 150;

        if (MathUtil.isHovered(mouseX, mouseY, listX, listY, listWidth, listHeight)) {
            float itemHeight = 25;
            int clickedIndex = (int) ((mouseY - listY + scroll) / itemHeight);

            if (clickedIndex >= 0 && clickedIndex < alts.size()) {
                selectedAltIndex = clickedIndex;

                if (button == 1) { // Правый клик для удаления
                    alts.remove(clickedIndex);
                    selectedAltIndex = -1;
                }
            }
        }

        // Поле ввода
        float inputY = listY + listHeight + 15;
        if (MathUtil.isHovered(mouseX, mouseY, listX, inputY, listWidth, 30)) {
            typing = true;
        } else {
            typing = false;
        }

        // Кнопки
        float buttonY = inputY + 40;
        float buttonWidth = (listWidth - 10) / 2;

        // Кнопка добавления
        if (MathUtil.isHovered(mouseX, mouseY, listX, buttonY, buttonWidth, 30) && !altName.isEmpty() && altName.length() >= 3) {
            alts.add(new Alt(altName));
            altName = "";
            typing = false;
        }

        // Кнопка входа
        if (MathUtil.isHovered(mouseX, mouseY, listX + buttonWidth + 10, buttonY, buttonWidth, 30) && selectedAltIndex >= 0) {
            Alt selectedAlt = alts.get(selectedAltIndex);
            mc.session = new Session(selectedAlt.name, UUID.randomUUID().toString(), "", "mojang");
        }
    }

    public void mouseScrolled(double delta) {
        if (fullscreenMenuOpen) {
            updateScroll(0, 0, (float)delta);
        }
    }
}
SS -
Посмотреть вложение 310864
ЭТО ЧТО БЛЯЯЯЯЯЯТЬ
 
фу, удали
 
Сделал за 15 минут, для пастеров сойдёт
AltWidget.java:
Expand Collapse Copy
package im.expensive.ui.mainmenu;

import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.platform.GlStateManager;
import im.expensive.functions.impl.render.HUD;
import im.expensive.utils.client.IMinecraft;
import im.expensive.utils.math.MathUtil;
import im.expensive.utils.math.Vector4i;
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 net.minecraft.util.Session;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.vector.Vector4f;
import org.lwjgl.glfw.GLFW;
import ru.hogoshi.Animation;
import ru.hogoshi.util.Easings;

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

public class AltWidget implements IMinecraft {
    public final List<Alt> alts = new ArrayList<>();
    private boolean fullscreenMenuOpen;
    private String altName = "";
    private boolean typing;
    private int selectedAltIndex = -1;
    private float scroll;
    private boolean compactButtonHovered;

    // Анимации
    private final Animation scrollAnimation = new Animation();
    private final Animation openAnimation = new Animation();
    private float lastScroll;
    private float scrollVelocity;

    public void render(MatrixStack stack, int mouseX, int mouseY) {
        scrollAnimation.update();
        openAnimation.update();

        if (fullscreenMenuOpen) {
            renderFullscreenMenu(stack, mouseX, mouseY);
        } else {
            renderCompactWidget(stack, mouseX, mouseY);
        }
    }

    private void renderCompactWidget(MatrixStack stack, int mouseX, int mouseY) {
        float x = mc.getMainWindow().getScaledWidth() - 155;
        float y = 10;
        float width = 145;
        float height = 20;
        float cornerRadius = 6f;

        compactButtonHovered = MathUtil.isHovered(mouseX, mouseY, x, y, width, height);
        int bgColor = compactButtonHovered ? HUD.getColor(60) : HUD.getColor(80);
        int textColor = ColorUtils.rgba(255, 255, 255, 255);

        DisplayUtils.drawRoundedRect(x, y, width, height, cornerRadius, bgColor);
        fonts.montserrat.drawText(stack, "Alt Manager", x + 10, y + 6, textColor, 7);

        if (compactButtonHovered) {
            DisplayUtils.drawRoundedRectOutline(x, y, width, height, cornerRadius, 1, ColorUtils.rgba(255, 255, 255, 100));
        }
    }

    private void renderFullscreenMenu(MatrixStack stack, int mouseX, int mouseY) {
        int screenWidth = mc.getMainWindow().getScaledWidth();
        int screenHeight = mc.getMainWindow().getScaledHeight();
        float menuWidth = screenWidth * 0.8f;
        float menuHeight = screenHeight * 0.8f;
        float menuX = (screenWidth - menuWidth) / 2;
        float menuY = (screenHeight - menuHeight) / 2;
        float cornerRadius = 10f;

        // Анимация открытия
        float animProgress = (float) openAnimation.getValue();
        if (animProgress < 1.0) {
            float scale = 0.8f + animProgress * 0.2f;
            float alpha = animProgress;
            menuWidth *= scale;
            menuHeight *= scale;
            menuX = (screenWidth - menuWidth) / 2;
            menuY = (screenHeight - menuHeight) / 2;

            GlStateManager.pushMatrix();
            GlStateManager.translatef(menuX + menuWidth/2, menuY + menuHeight/2, 0);
            GlStateManager.scalef(scale, scale, 1);
            GlStateManager.translatef(-(menuX + menuWidth/2), -(menuY + menuHeight/2), 0);
        }

        // Основной фон
        DisplayUtils.drawRoundedRect(menuX, menuY, menuWidth, menuHeight, cornerRadius, ColorUtils.rgba(5, 5, 5, (int)(255 * animProgress)));

        // Заголовок
        fonts.montserrat.drawCenteredText(stack, "Alt Manager", menuX + menuWidth/2, menuY + 15,
                ColorUtils.rgba(255, 255, 255, (int)(255 * animProgress)), 10);

        // Текущий аккаунт
        fonts.montserrat.drawText(stack, "Current: " + mc.session.getUsername(),
                menuX + 15, menuY + 40, ColorUtils.rgba(255, 255, 255, (int)(200 * animProgress)), 8);

        // Фон списка альтов
        float listX = menuX + 15;
        float listY = menuY + 60;
        float listWidth = menuWidth - 30;
        float listHeight = menuHeight - 150;

        DisplayUtils.drawRoundedRect(listX, listY, listWidth, listHeight, cornerRadius, ColorUtils.rgba(40, 40, 40, (int)(200 * animProgress)));

        // Анимированный скролл
        float scrollValue = (float) scrollAnimation.getValue();
        float scrollDelta = scrollValue - lastScroll;
        lastScroll = scrollValue;
        scroll = scrollValue;

        // Список альтов с прокруткой
        Scissor.push();
        Scissor.setFromComponentCoordinates(listX, listY, listWidth, listHeight);

        float itemHeight = 25;
        float totalHeight = alts.size() * itemHeight;
        float maxScroll = Math.max(0, totalHeight - listHeight);

        scroll = MathHelper.clamp(scroll, 0, maxScroll);
        float yOffset = listY - scroll;

        for (int i = 0; i < alts.size(); i++) {
            Alt alt = alts.get(i);
            float itemY = yOffset + i * itemHeight;

            // Эффект инерции при скролле
            if (Math.abs(scrollDelta) > 0.1f) {
                float inertia = 1 - (i / (float)alts.size()) * 0.5f;
                itemY += scrollDelta * inertia * 0.8f;
            }

            boolean hovered = MathUtil.isHovered(mouseX, mouseY, listX, itemY, listWidth, itemHeight);
            boolean selected = i == selectedAltIndex;

            int bgColor = selected ? HUD.getColor(40) :
                    hovered ? ColorUtils.rgba(70, 70, 70, (int)(200 * animProgress)) :
                            ColorUtils.rgba(50, 50, 50, (int)(180 * animProgress));

            DisplayUtils.drawRoundedRect(listX, itemY, listWidth, itemHeight, cornerRadius, bgColor);
            fonts.montserrat.drawText(stack, alt.name, listX + 10, itemY + 8,
                    ColorUtils.rgba(255, 255, 255, (int)(255 * animProgress)), 7);
        }

        Scissor.pop();

        // Поле ввода
        float inputY = listY + listHeight + 15;
        DisplayUtils.drawRoundedRect(listX, inputY, listWidth, 30, cornerRadius,
                ColorUtils.rgba(50, 50, 50, (int)(200 * animProgress)));

        String displayText = typing ? altName + (System.currentTimeMillis() % 1000 > 500 ? "_" : "") :
                altName.isEmpty() ? "Enter nickname..." : altName;

        fonts.montserrat.drawText(stack, displayText, listX + 10, inputY + 10,
                ColorUtils.rgba(255, 255, 255, (int)((typing || !altName.isEmpty() ? 255 : 150) * animProgress)), 8);

        // Кнопки
        float buttonY = inputY + 40;
        float buttonWidth = (listWidth - 10) / 2;

        // Кнопка добавления
        boolean addHovered = MathUtil.isHovered(mouseX, mouseY, listX, buttonY, buttonWidth, 30);
        DisplayUtils.drawRoundedRect(listX, buttonY, buttonWidth, 30, cornerRadius,
                addHovered ? HUD.getColor(40) : HUD.getColor(60));
        fonts.montserrat.drawCenteredText(stack, "Add Alt", listX + buttonWidth/2, buttonY + 10,
                ColorUtils.rgba(255, 255, 255, (int)(255 * animProgress)), 8);

        // Кнопка входа
        boolean loginHovered = MathUtil.isHovered(mouseX, mouseY, listX + buttonWidth + 10, buttonY, buttonWidth, 30);
        boolean canLogin = selectedAltIndex >= 0;
        DisplayUtils.drawRoundedRect(listX + buttonWidth + 10, buttonY, buttonWidth, 30, cornerRadius,
                canLogin ? (loginHovered ? HUD.getColor(40) : HUD.getColor(60)) : ColorUtils.rgba(80, 80, 80, (int)(150 * animProgress)));
        fonts.montserrat.drawCenteredText(stack, "Login", listX + buttonWidth + 10 + buttonWidth/2, buttonY + 10,
                ColorUtils.rgba(255, 255, 255, (int)((canLogin ? 255 : 100) * animProgress)), 8);

        // Кнопка закрытия
      /*  float closeButtonSize = 20;
        float closeX = menuX + menuWidth - closeButtonSize - 10;
        float closeY = menuY + 10;
        boolean closeHovered = MathUtil.isHovered(mouseX, mouseY, closeX, closeY, closeButtonSize, closeButtonSize);
        DisplayUtils.drawRoundedRect(closeX, closeY, closeButtonSize, closeButtonSize, cornerRadius,
                closeHovered ? ColorUtils.rgba(200, 50, 50, (int)(200 * animProgress)) : ColorUtils.rgba(150, 40, 40, (int)(200 * animProgress)));
        fonts.montserrat.drawCenteredText(stack, "X", closeX + closeButtonSize/2, closeY + 6,
                ColorUtils.rgba(255, 255, 255, (int)(255 * animProgress)), 8);

        if (animProgress < 1.0) {
            GlStateManager.popMatrix();
        } */
    }

    public void onChar(char typed) {
        if (typing && fonts.montserrat.getWidth(altName, 8f) < mc.getMainWindow().getScaledWidth() * 0.7f - 100) {
            altName += typed;
        }
    }

    public void onKey(int key) {
        if (key == GLFW.GLFW_KEY_ESCAPE && fullscreenMenuOpen) {
            fullscreenMenuOpen = false;
            openAnimation.animate(0.0, 0.2, Easings.CIRC_OUT);
            return;
        }

        if (typing) {
            boolean ctrlDown = GLFW.glfwGetKey(mc.getMainWindow().getHandle(), GLFW.GLFW_KEY_LEFT_CONTROL) == GLFW.GLFW_PRESS ||
                    GLFW.glfwGetKey(mc.getMainWindow().getHandle(), GLFW.GLFW_KEY_RIGHT_CONTROL) == GLFW.GLFW_PRESS;

            if (ctrlDown && key == GLFW.GLFW_KEY_V) {
                try {
                    altName += GLFW.glfwGetClipboardString(mc.getMainWindow().getHandle());
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if (key == GLFW.GLFW_KEY_BACKSPACE && !altName.isEmpty()) {
                altName = altName.substring(0, altName.length() - 1);
            }
            if (key == GLFW.GLFW_KEY_ENTER && altName.length() >= 3) {
                alts.add(new Alt(altName));
                altName = "";
                typing = false;
            }
        }
    }

    public void updateScroll(int mouseX, int mouseY, float delta) {
        if (fullscreenMenuOpen) {
            float newScroll = MathHelper.clamp(scroll - delta * 20, 0,
                    Math.max(0, alts.size() * 25 - (mc.getMainWindow().getScaledHeight() * 0.8f - 150)));

            // Анимация скролла с эффектом инерции
            scrollAnimation.animate(newScroll, 0.4, Easings.CUBIC_OUT);
            scrollVelocity = delta;
        }
    }

    public void click(int mouseX, int mouseY, int button) {
        if (!fullscreenMenuOpen) {
            float x = mc.getMainWindow().getScaledWidth() - 155;
            float y = 10;
            float width = 145;

            if (MathUtil.isHovered(mouseX, mouseY, x, y, width, 20) && button == 0) {
                fullscreenMenuOpen = true;
                openAnimation.animate(1.0, 0.2, Easings.CIRC_OUT);
            }
            return;
        }

        int screenWidth = mc.getMainWindow().getScaledWidth();
        int screenHeight = mc.getMainWindow().getScaledHeight();
        float menuWidth = screenWidth * 0.8f;
        float menuHeight = screenHeight * 0.8f;
        float menuX = (screenWidth - menuWidth) / 2;
        float menuY = (screenHeight - menuHeight) / 2;

        // Кнопка закрытия
        float closeButtonSize = 20;
        float closeX = menuX + menuWidth - closeButtonSize - 10;
        float closeY = menuY + 10;

        if (MathUtil.isHovered(mouseX, mouseY, closeX, closeY, closeButtonSize, closeButtonSize)) {
            fullscreenMenuOpen = false;
            openAnimation.animate(0.0, 0.2, Easings.CIRC_OUT);
            return;
        }

        // Список альтов
        float listX = menuX + 15;
        float listY = menuY + 60;
        float listWidth = menuWidth - 30;
        float listHeight = menuHeight - 150;

        if (MathUtil.isHovered(mouseX, mouseY, listX, listY, listWidth, listHeight)) {
            float itemHeight = 25;
            int clickedIndex = (int) ((mouseY - listY + scroll) / itemHeight);

            if (clickedIndex >= 0 && clickedIndex < alts.size()) {
                selectedAltIndex = clickedIndex;

                if (button == 1) { // Правый клик для удаления
                    alts.remove(clickedIndex);
                    selectedAltIndex = -1;
                }
            }
        }

        // Поле ввода
        float inputY = listY + listHeight + 15;
        if (MathUtil.isHovered(mouseX, mouseY, listX, inputY, listWidth, 30)) {
            typing = true;
        } else {
            typing = false;
        }

        // Кнопки
        float buttonY = inputY + 40;
        float buttonWidth = (listWidth - 10) / 2;

        // Кнопка добавления
        if (MathUtil.isHovered(mouseX, mouseY, listX, buttonY, buttonWidth, 30) && !altName.isEmpty() && altName.length() >= 3) {
            alts.add(new Alt(altName));
            altName = "";
            typing = false;
        }

        // Кнопка входа
        if (MathUtil.isHovered(mouseX, mouseY, listX + buttonWidth + 10, buttonY, buttonWidth, 30) && selectedAltIndex >= 0) {
            Alt selectedAlt = alts.get(selectedAltIndex);
            mc.session = new Session(selectedAlt.name, UUID.randomUUID().toString(), "", "mojang");
        }
    }

    public void mouseScrolled(double delta) {
        if (fullscreenMenuOpen) {
            updateScroll(0, 0, (float)delta);
        }
    }
}
SS -
Посмотреть вложение 310864
норм но он СЛИШКОМ большой
 
Сделал за 15 минут, для пастеров сойдёт
AltWidget.java:
Expand Collapse Copy
package im.expensive.ui.mainmenu;

import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.platform.GlStateManager;
import im.expensive.functions.impl.render.HUD;
import im.expensive.utils.client.IMinecraft;
import im.expensive.utils.math.MathUtil;
import im.expensive.utils.math.Vector4i;
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 net.minecraft.util.Session;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.vector.Vector4f;
import org.lwjgl.glfw.GLFW;
import ru.hogoshi.Animation;
import ru.hogoshi.util.Easings;

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

public class AltWidget implements IMinecraft {
    public final List<Alt> alts = new ArrayList<>();
    private boolean fullscreenMenuOpen;
    private String altName = "";
    private boolean typing;
    private int selectedAltIndex = -1;
    private float scroll;
    private boolean compactButtonHovered;

    // Анимации
    private final Animation scrollAnimation = new Animation();
    private final Animation openAnimation = new Animation();
    private float lastScroll;
    private float scrollVelocity;

    public void render(MatrixStack stack, int mouseX, int mouseY) {
        scrollAnimation.update();
        openAnimation.update();

        if (fullscreenMenuOpen) {
            renderFullscreenMenu(stack, mouseX, mouseY);
        } else {
            renderCompactWidget(stack, mouseX, mouseY);
        }
    }

    private void renderCompactWidget(MatrixStack stack, int mouseX, int mouseY) {
        float x = mc.getMainWindow().getScaledWidth() - 155;
        float y = 10;
        float width = 145;
        float height = 20;
        float cornerRadius = 6f;

        compactButtonHovered = MathUtil.isHovered(mouseX, mouseY, x, y, width, height);
        int bgColor = compactButtonHovered ? HUD.getColor(60) : HUD.getColor(80);
        int textColor = ColorUtils.rgba(255, 255, 255, 255);

        DisplayUtils.drawRoundedRect(x, y, width, height, cornerRadius, bgColor);
        fonts.montserrat.drawText(stack, "Alt Manager", x + 10, y + 6, textColor, 7);

        if (compactButtonHovered) {
            DisplayUtils.drawRoundedRectOutline(x, y, width, height, cornerRadius, 1, ColorUtils.rgba(255, 255, 255, 100));
        }
    }

    private void renderFullscreenMenu(MatrixStack stack, int mouseX, int mouseY) {
        int screenWidth = mc.getMainWindow().getScaledWidth();
        int screenHeight = mc.getMainWindow().getScaledHeight();
        float menuWidth = screenWidth * 0.8f;
        float menuHeight = screenHeight * 0.8f;
        float menuX = (screenWidth - menuWidth) / 2;
        float menuY = (screenHeight - menuHeight) / 2;
        float cornerRadius = 10f;

        // Анимация открытия
        float animProgress = (float) openAnimation.getValue();
        if (animProgress < 1.0) {
            float scale = 0.8f + animProgress * 0.2f;
            float alpha = animProgress;
            menuWidth *= scale;
            menuHeight *= scale;
            menuX = (screenWidth - menuWidth) / 2;
            menuY = (screenHeight - menuHeight) / 2;

            GlStateManager.pushMatrix();
            GlStateManager.translatef(menuX + menuWidth/2, menuY + menuHeight/2, 0);
            GlStateManager.scalef(scale, scale, 1);
            GlStateManager.translatef(-(menuX + menuWidth/2), -(menuY + menuHeight/2), 0);
        }

        // Основной фон
        DisplayUtils.drawRoundedRect(menuX, menuY, menuWidth, menuHeight, cornerRadius, ColorUtils.rgba(5, 5, 5, (int)(255 * animProgress)));

        // Заголовок
        fonts.montserrat.drawCenteredText(stack, "Alt Manager", menuX + menuWidth/2, menuY + 15,
                ColorUtils.rgba(255, 255, 255, (int)(255 * animProgress)), 10);

        // Текущий аккаунт
        fonts.montserrat.drawText(stack, "Current: " + mc.session.getUsername(),
                menuX + 15, menuY + 40, ColorUtils.rgba(255, 255, 255, (int)(200 * animProgress)), 8);

        // Фон списка альтов
        float listX = menuX + 15;
        float listY = menuY + 60;
        float listWidth = menuWidth - 30;
        float listHeight = menuHeight - 150;

        DisplayUtils.drawRoundedRect(listX, listY, listWidth, listHeight, cornerRadius, ColorUtils.rgba(40, 40, 40, (int)(200 * animProgress)));

        // Анимированный скролл
        float scrollValue = (float) scrollAnimation.getValue();
        float scrollDelta = scrollValue - lastScroll;
        lastScroll = scrollValue;
        scroll = scrollValue;

        // Список альтов с прокруткой
        Scissor.push();
        Scissor.setFromComponentCoordinates(listX, listY, listWidth, listHeight);

        float itemHeight = 25;
        float totalHeight = alts.size() * itemHeight;
        float maxScroll = Math.max(0, totalHeight - listHeight);

        scroll = MathHelper.clamp(scroll, 0, maxScroll);
        float yOffset = listY - scroll;

        for (int i = 0; i < alts.size(); i++) {
            Alt alt = alts.get(i);
            float itemY = yOffset + i * itemHeight;

            // Эффект инерции при скролле
            if (Math.abs(scrollDelta) > 0.1f) {
                float inertia = 1 - (i / (float)alts.size()) * 0.5f;
                itemY += scrollDelta * inertia * 0.8f;
            }

            boolean hovered = MathUtil.isHovered(mouseX, mouseY, listX, itemY, listWidth, itemHeight);
            boolean selected = i == selectedAltIndex;

            int bgColor = selected ? HUD.getColor(40) :
                    hovered ? ColorUtils.rgba(70, 70, 70, (int)(200 * animProgress)) :
                            ColorUtils.rgba(50, 50, 50, (int)(180 * animProgress));

            DisplayUtils.drawRoundedRect(listX, itemY, listWidth, itemHeight, cornerRadius, bgColor);
            fonts.montserrat.drawText(stack, alt.name, listX + 10, itemY + 8,
                    ColorUtils.rgba(255, 255, 255, (int)(255 * animProgress)), 7);
        }

        Scissor.pop();

        // Поле ввода
        float inputY = listY + listHeight + 15;
        DisplayUtils.drawRoundedRect(listX, inputY, listWidth, 30, cornerRadius,
                ColorUtils.rgba(50, 50, 50, (int)(200 * animProgress)));

        String displayText = typing ? altName + (System.currentTimeMillis() % 1000 > 500 ? "_" : "") :
                altName.isEmpty() ? "Enter nickname..." : altName;

        fonts.montserrat.drawText(stack, displayText, listX + 10, inputY + 10,
                ColorUtils.rgba(255, 255, 255, (int)((typing || !altName.isEmpty() ? 255 : 150) * animProgress)), 8);

        // Кнопки
        float buttonY = inputY + 40;
        float buttonWidth = (listWidth - 10) / 2;

        // Кнопка добавления
        boolean addHovered = MathUtil.isHovered(mouseX, mouseY, listX, buttonY, buttonWidth, 30);
        DisplayUtils.drawRoundedRect(listX, buttonY, buttonWidth, 30, cornerRadius,
                addHovered ? HUD.getColor(40) : HUD.getColor(60));
        fonts.montserrat.drawCenteredText(stack, "Add Alt", listX + buttonWidth/2, buttonY + 10,
                ColorUtils.rgba(255, 255, 255, (int)(255 * animProgress)), 8);

        // Кнопка входа
        boolean loginHovered = MathUtil.isHovered(mouseX, mouseY, listX + buttonWidth + 10, buttonY, buttonWidth, 30);
        boolean canLogin = selectedAltIndex >= 0;
        DisplayUtils.drawRoundedRect(listX + buttonWidth + 10, buttonY, buttonWidth, 30, cornerRadius,
                canLogin ? (loginHovered ? HUD.getColor(40) : HUD.getColor(60)) : ColorUtils.rgba(80, 80, 80, (int)(150 * animProgress)));
        fonts.montserrat.drawCenteredText(stack, "Login", listX + buttonWidth + 10 + buttonWidth/2, buttonY + 10,
                ColorUtils.rgba(255, 255, 255, (int)((canLogin ? 255 : 100) * animProgress)), 8);

        // Кнопка закрытия
      /*  float closeButtonSize = 20;
        float closeX = menuX + menuWidth - closeButtonSize - 10;
        float closeY = menuY + 10;
        boolean closeHovered = MathUtil.isHovered(mouseX, mouseY, closeX, closeY, closeButtonSize, closeButtonSize);
        DisplayUtils.drawRoundedRect(closeX, closeY, closeButtonSize, closeButtonSize, cornerRadius,
                closeHovered ? ColorUtils.rgba(200, 50, 50, (int)(200 * animProgress)) : ColorUtils.rgba(150, 40, 40, (int)(200 * animProgress)));
        fonts.montserrat.drawCenteredText(stack, "X", closeX + closeButtonSize/2, closeY + 6,
                ColorUtils.rgba(255, 255, 255, (int)(255 * animProgress)), 8);

        if (animProgress < 1.0) {
            GlStateManager.popMatrix();
        } */
    }

    public void onChar(char typed) {
        if (typing && fonts.montserrat.getWidth(altName, 8f) < mc.getMainWindow().getScaledWidth() * 0.7f - 100) {
            altName += typed;
        }
    }

    public void onKey(int key) {
        if (key == GLFW.GLFW_KEY_ESCAPE && fullscreenMenuOpen) {
            fullscreenMenuOpen = false;
            openAnimation.animate(0.0, 0.2, Easings.CIRC_OUT);
            return;
        }

        if (typing) {
            boolean ctrlDown = GLFW.glfwGetKey(mc.getMainWindow().getHandle(), GLFW.GLFW_KEY_LEFT_CONTROL) == GLFW.GLFW_PRESS ||
                    GLFW.glfwGetKey(mc.getMainWindow().getHandle(), GLFW.GLFW_KEY_RIGHT_CONTROL) == GLFW.GLFW_PRESS;

            if (ctrlDown && key == GLFW.GLFW_KEY_V) {
                try {
                    altName += GLFW.glfwGetClipboardString(mc.getMainWindow().getHandle());
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if (key == GLFW.GLFW_KEY_BACKSPACE && !altName.isEmpty()) {
                altName = altName.substring(0, altName.length() - 1);
            }
            if (key == GLFW.GLFW_KEY_ENTER && altName.length() >= 3) {
                alts.add(new Alt(altName));
                altName = "";
                typing = false;
            }
        }
    }

    public void updateScroll(int mouseX, int mouseY, float delta) {
        if (fullscreenMenuOpen) {
            float newScroll = MathHelper.clamp(scroll - delta * 20, 0,
                    Math.max(0, alts.size() * 25 - (mc.getMainWindow().getScaledHeight() * 0.8f - 150)));

            // Анимация скролла с эффектом инерции
            scrollAnimation.animate(newScroll, 0.4, Easings.CUBIC_OUT);
            scrollVelocity = delta;
        }
    }

    public void click(int mouseX, int mouseY, int button) {
        if (!fullscreenMenuOpen) {
            float x = mc.getMainWindow().getScaledWidth() - 155;
            float y = 10;
            float width = 145;

            if (MathUtil.isHovered(mouseX, mouseY, x, y, width, 20) && button == 0) {
                fullscreenMenuOpen = true;
                openAnimation.animate(1.0, 0.2, Easings.CIRC_OUT);
            }
            return;
        }

        int screenWidth = mc.getMainWindow().getScaledWidth();
        int screenHeight = mc.getMainWindow().getScaledHeight();
        float menuWidth = screenWidth * 0.8f;
        float menuHeight = screenHeight * 0.8f;
        float menuX = (screenWidth - menuWidth) / 2;
        float menuY = (screenHeight - menuHeight) / 2;

        // Кнопка закрытия
        float closeButtonSize = 20;
        float closeX = menuX + menuWidth - closeButtonSize - 10;
        float closeY = menuY + 10;

        if (MathUtil.isHovered(mouseX, mouseY, closeX, closeY, closeButtonSize, closeButtonSize)) {
            fullscreenMenuOpen = false;
            openAnimation.animate(0.0, 0.2, Easings.CIRC_OUT);
            return;
        }

        // Список альтов
        float listX = menuX + 15;
        float listY = menuY + 60;
        float listWidth = menuWidth - 30;
        float listHeight = menuHeight - 150;

        if (MathUtil.isHovered(mouseX, mouseY, listX, listY, listWidth, listHeight)) {
            float itemHeight = 25;
            int clickedIndex = (int) ((mouseY - listY + scroll) / itemHeight);

            if (clickedIndex >= 0 && clickedIndex < alts.size()) {
                selectedAltIndex = clickedIndex;

                if (button == 1) { // Правый клик для удаления
                    alts.remove(clickedIndex);
                    selectedAltIndex = -1;
                }
            }
        }

        // Поле ввода
        float inputY = listY + listHeight + 15;
        if (MathUtil.isHovered(mouseX, mouseY, listX, inputY, listWidth, 30)) {
            typing = true;
        } else {
            typing = false;
        }

        // Кнопки
        float buttonY = inputY + 40;
        float buttonWidth = (listWidth - 10) / 2;

        // Кнопка добавления
        if (MathUtil.isHovered(mouseX, mouseY, listX, buttonY, buttonWidth, 30) && !altName.isEmpty() && altName.length() >= 3) {
            alts.add(new Alt(altName));
            altName = "";
            typing = false;
        }

        // Кнопка входа
        if (MathUtil.isHovered(mouseX, mouseY, listX + buttonWidth + 10, buttonY, buttonWidth, 30) && selectedAltIndex >= 0) {
            Alt selectedAlt = alts.get(selectedAltIndex);
            mc.session = new Session(selectedAlt.name, UUID.randomUUID().toString(), "", "mojang");
        }
    }

    public void mouseScrolled(double delta) {
        if (fullscreenMenuOpen) {
            updateScroll(0, 0, (float)delta);
        }
    }
}
SS -
Посмотреть вложение 310864
Это пиздец
 
Сделал за 15 минут, для пастеров сойдёт
AltWidget.java:
Expand Collapse Copy
package im.expensive.ui.mainmenu;

import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.platform.GlStateManager;
import im.expensive.functions.impl.render.HUD;
import im.expensive.utils.client.IMinecraft;
import im.expensive.utils.math.MathUtil;
import im.expensive.utils.math.Vector4i;
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 net.minecraft.util.Session;
import net.minecraft.util.math.MathHelper;
import net.minecraft.util.math.vector.Vector4f;
import org.lwjgl.glfw.GLFW;
import ru.hogoshi.Animation;
import ru.hogoshi.util.Easings;

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

public class AltWidget implements IMinecraft {
    public final List<Alt> alts = new ArrayList<>();
    private boolean fullscreenMenuOpen;
    private String altName = "";
    private boolean typing;
    private int selectedAltIndex = -1;
    private float scroll;
    private boolean compactButtonHovered;

    // Анимации
    private final Animation scrollAnimation = new Animation();
    private final Animation openAnimation = new Animation();
    private float lastScroll;
    private float scrollVelocity;

    public void render(MatrixStack stack, int mouseX, int mouseY) {
        scrollAnimation.update();
        openAnimation.update();

        if (fullscreenMenuOpen) {
            renderFullscreenMenu(stack, mouseX, mouseY);
        } else {
            renderCompactWidget(stack, mouseX, mouseY);
        }
    }

    private void renderCompactWidget(MatrixStack stack, int mouseX, int mouseY) {
        float x = mc.getMainWindow().getScaledWidth() - 155;
        float y = 10;
        float width = 145;
        float height = 20;
        float cornerRadius = 6f;

        compactButtonHovered = MathUtil.isHovered(mouseX, mouseY, x, y, width, height);
        int bgColor = compactButtonHovered ? HUD.getColor(60) : HUD.getColor(80);
        int textColor = ColorUtils.rgba(255, 255, 255, 255);

        DisplayUtils.drawRoundedRect(x, y, width, height, cornerRadius, bgColor);
        fonts.montserrat.drawText(stack, "Alt Manager", x + 10, y + 6, textColor, 7);

        if (compactButtonHovered) {
            DisplayUtils.drawRoundedRectOutline(x, y, width, height, cornerRadius, 1, ColorUtils.rgba(255, 255, 255, 100));
        }
    }

    private void renderFullscreenMenu(MatrixStack stack, int mouseX, int mouseY) {
        int screenWidth = mc.getMainWindow().getScaledWidth();
        int screenHeight = mc.getMainWindow().getScaledHeight();
        float menuWidth = screenWidth * 0.8f;
        float menuHeight = screenHeight * 0.8f;
        float menuX = (screenWidth - menuWidth) / 2;
        float menuY = (screenHeight - menuHeight) / 2;
        float cornerRadius = 10f;

        // Анимация открытия
        float animProgress = (float) openAnimation.getValue();
        if (animProgress < 1.0) {
            float scale = 0.8f + animProgress * 0.2f;
            float alpha = animProgress;
            menuWidth *= scale;
            menuHeight *= scale;
            menuX = (screenWidth - menuWidth) / 2;
            menuY = (screenHeight - menuHeight) / 2;

            GlStateManager.pushMatrix();
            GlStateManager.translatef(menuX + menuWidth/2, menuY + menuHeight/2, 0);
            GlStateManager.scalef(scale, scale, 1);
            GlStateManager.translatef(-(menuX + menuWidth/2), -(menuY + menuHeight/2), 0);
        }

        // Основной фон
        DisplayUtils.drawRoundedRect(menuX, menuY, menuWidth, menuHeight, cornerRadius, ColorUtils.rgba(5, 5, 5, (int)(255 * animProgress)));

        // Заголовок
        fonts.montserrat.drawCenteredText(stack, "Alt Manager", menuX + menuWidth/2, menuY + 15,
                ColorUtils.rgba(255, 255, 255, (int)(255 * animProgress)), 10);

        // Текущий аккаунт
        fonts.montserrat.drawText(stack, "Current: " + mc.session.getUsername(),
                menuX + 15, menuY + 40, ColorUtils.rgba(255, 255, 255, (int)(200 * animProgress)), 8);

        // Фон списка альтов
        float listX = menuX + 15;
        float listY = menuY + 60;
        float listWidth = menuWidth - 30;
        float listHeight = menuHeight - 150;

        DisplayUtils.drawRoundedRect(listX, listY, listWidth, listHeight, cornerRadius, ColorUtils.rgba(40, 40, 40, (int)(200 * animProgress)));

        // Анимированный скролл
        float scrollValue = (float) scrollAnimation.getValue();
        float scrollDelta = scrollValue - lastScroll;
        lastScroll = scrollValue;
        scroll = scrollValue;

        // Список альтов с прокруткой
        Scissor.push();
        Scissor.setFromComponentCoordinates(listX, listY, listWidth, listHeight);

        float itemHeight = 25;
        float totalHeight = alts.size() * itemHeight;
        float maxScroll = Math.max(0, totalHeight - listHeight);

        scroll = MathHelper.clamp(scroll, 0, maxScroll);
        float yOffset = listY - scroll;

        for (int i = 0; i < alts.size(); i++) {
            Alt alt = alts.get(i);
            float itemY = yOffset + i * itemHeight;

            // Эффект инерции при скролле
            if (Math.abs(scrollDelta) > 0.1f) {
                float inertia = 1 - (i / (float)alts.size()) * 0.5f;
                itemY += scrollDelta * inertia * 0.8f;
            }

            boolean hovered = MathUtil.isHovered(mouseX, mouseY, listX, itemY, listWidth, itemHeight);
            boolean selected = i == selectedAltIndex;

            int bgColor = selected ? HUD.getColor(40) :
                    hovered ? ColorUtils.rgba(70, 70, 70, (int)(200 * animProgress)) :
                            ColorUtils.rgba(50, 50, 50, (int)(180 * animProgress));

            DisplayUtils.drawRoundedRect(listX, itemY, listWidth, itemHeight, cornerRadius, bgColor);
            fonts.montserrat.drawText(stack, alt.name, listX + 10, itemY + 8,
                    ColorUtils.rgba(255, 255, 255, (int)(255 * animProgress)), 7);
        }

        Scissor.pop();

        // Поле ввода
        float inputY = listY + listHeight + 15;
        DisplayUtils.drawRoundedRect(listX, inputY, listWidth, 30, cornerRadius,
                ColorUtils.rgba(50, 50, 50, (int)(200 * animProgress)));

        String displayText = typing ? altName + (System.currentTimeMillis() % 1000 > 500 ? "_" : "") :
                altName.isEmpty() ? "Enter nickname..." : altName;

        fonts.montserrat.drawText(stack, displayText, listX + 10, inputY + 10,
                ColorUtils.rgba(255, 255, 255, (int)((typing || !altName.isEmpty() ? 255 : 150) * animProgress)), 8);

        // Кнопки
        float buttonY = inputY + 40;
        float buttonWidth = (listWidth - 10) / 2;

        // Кнопка добавления
        boolean addHovered = MathUtil.isHovered(mouseX, mouseY, listX, buttonY, buttonWidth, 30);
        DisplayUtils.drawRoundedRect(listX, buttonY, buttonWidth, 30, cornerRadius,
                addHovered ? HUD.getColor(40) : HUD.getColor(60));
        fonts.montserrat.drawCenteredText(stack, "Add Alt", listX + buttonWidth/2, buttonY + 10,
                ColorUtils.rgba(255, 255, 255, (int)(255 * animProgress)), 8);

        // Кнопка входа
        boolean loginHovered = MathUtil.isHovered(mouseX, mouseY, listX + buttonWidth + 10, buttonY, buttonWidth, 30);
        boolean canLogin = selectedAltIndex >= 0;
        DisplayUtils.drawRoundedRect(listX + buttonWidth + 10, buttonY, buttonWidth, 30, cornerRadius,
                canLogin ? (loginHovered ? HUD.getColor(40) : HUD.getColor(60)) : ColorUtils.rgba(80, 80, 80, (int)(150 * animProgress)));
        fonts.montserrat.drawCenteredText(stack, "Login", listX + buttonWidth + 10 + buttonWidth/2, buttonY + 10,
                ColorUtils.rgba(255, 255, 255, (int)((canLogin ? 255 : 100) * animProgress)), 8);

        // Кнопка закрытия
      /*  float closeButtonSize = 20;
        float closeX = menuX + menuWidth - closeButtonSize - 10;
        float closeY = menuY + 10;
        boolean closeHovered = MathUtil.isHovered(mouseX, mouseY, closeX, closeY, closeButtonSize, closeButtonSize);
        DisplayUtils.drawRoundedRect(closeX, closeY, closeButtonSize, closeButtonSize, cornerRadius,
                closeHovered ? ColorUtils.rgba(200, 50, 50, (int)(200 * animProgress)) : ColorUtils.rgba(150, 40, 40, (int)(200 * animProgress)));
        fonts.montserrat.drawCenteredText(stack, "X", closeX + closeButtonSize/2, closeY + 6,
                ColorUtils.rgba(255, 255, 255, (int)(255 * animProgress)), 8);

        if (animProgress < 1.0) {
            GlStateManager.popMatrix();
        } */
    }

    public void onChar(char typed) {
        if (typing && fonts.montserrat.getWidth(altName, 8f) < mc.getMainWindow().getScaledWidth() * 0.7f - 100) {
            altName += typed;
        }
    }

    public void onKey(int key) {
        if (key == GLFW.GLFW_KEY_ESCAPE && fullscreenMenuOpen) {
            fullscreenMenuOpen = false;
            openAnimation.animate(0.0, 0.2, Easings.CIRC_OUT);
            return;
        }

        if (typing) {
            boolean ctrlDown = GLFW.glfwGetKey(mc.getMainWindow().getHandle(), GLFW.GLFW_KEY_LEFT_CONTROL) == GLFW.GLFW_PRESS ||
                    GLFW.glfwGetKey(mc.getMainWindow().getHandle(), GLFW.GLFW_KEY_RIGHT_CONTROL) == GLFW.GLFW_PRESS;

            if (ctrlDown && key == GLFW.GLFW_KEY_V) {
                try {
                    altName += GLFW.glfwGetClipboardString(mc.getMainWindow().getHandle());
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
            if (key == GLFW.GLFW_KEY_BACKSPACE && !altName.isEmpty()) {
                altName = altName.substring(0, altName.length() - 1);
            }
            if (key == GLFW.GLFW_KEY_ENTER && altName.length() >= 3) {
                alts.add(new Alt(altName));
                altName = "";
                typing = false;
            }
        }
    }

    public void updateScroll(int mouseX, int mouseY, float delta) {
        if (fullscreenMenuOpen) {
            float newScroll = MathHelper.clamp(scroll - delta * 20, 0,
                    Math.max(0, alts.size() * 25 - (mc.getMainWindow().getScaledHeight() * 0.8f - 150)));

            // Анимация скролла с эффектом инерции
            scrollAnimation.animate(newScroll, 0.4, Easings.CUBIC_OUT);
            scrollVelocity = delta;
        }
    }

    public void click(int mouseX, int mouseY, int button) {
        if (!fullscreenMenuOpen) {
            float x = mc.getMainWindow().getScaledWidth() - 155;
            float y = 10;
            float width = 145;

            if (MathUtil.isHovered(mouseX, mouseY, x, y, width, 20) && button == 0) {
                fullscreenMenuOpen = true;
                openAnimation.animate(1.0, 0.2, Easings.CIRC_OUT);
            }
            return;
        }

        int screenWidth = mc.getMainWindow().getScaledWidth();
        int screenHeight = mc.getMainWindow().getScaledHeight();
        float menuWidth = screenWidth * 0.8f;
        float menuHeight = screenHeight * 0.8f;
        float menuX = (screenWidth - menuWidth) / 2;
        float menuY = (screenHeight - menuHeight) / 2;

        // Кнопка закрытия
        float closeButtonSize = 20;
        float closeX = menuX + menuWidth - closeButtonSize - 10;
        float closeY = menuY + 10;

        if (MathUtil.isHovered(mouseX, mouseY, closeX, closeY, closeButtonSize, closeButtonSize)) {
            fullscreenMenuOpen = false;
            openAnimation.animate(0.0, 0.2, Easings.CIRC_OUT);
            return;
        }

        // Список альтов
        float listX = menuX + 15;
        float listY = menuY + 60;
        float listWidth = menuWidth - 30;
        float listHeight = menuHeight - 150;

        if (MathUtil.isHovered(mouseX, mouseY, listX, listY, listWidth, listHeight)) {
            float itemHeight = 25;
            int clickedIndex = (int) ((mouseY - listY + scroll) / itemHeight);

            if (clickedIndex >= 0 && clickedIndex < alts.size()) {
                selectedAltIndex = clickedIndex;

                if (button == 1) { // Правый клик для удаления
                    alts.remove(clickedIndex);
                    selectedAltIndex = -1;
                }
            }
        }

        // Поле ввода
        float inputY = listY + listHeight + 15;
        if (MathUtil.isHovered(mouseX, mouseY, listX, inputY, listWidth, 30)) {
            typing = true;
        } else {
            typing = false;
        }

        // Кнопки
        float buttonY = inputY + 40;
        float buttonWidth = (listWidth - 10) / 2;

        // Кнопка добавления
        if (MathUtil.isHovered(mouseX, mouseY, listX, buttonY, buttonWidth, 30) && !altName.isEmpty() && altName.length() >= 3) {
            alts.add(new Alt(altName));
            altName = "";
            typing = false;
        }

        // Кнопка входа
        if (MathUtil.isHovered(mouseX, mouseY, listX + buttonWidth + 10, buttonY, buttonWidth, 30) && selectedAltIndex >= 0) {
            Alt selectedAlt = alts.get(selectedAltIndex);
            mc.session = new Session(selectedAlt.name, UUID.randomUUID().toString(), "", "mojang");
        }
    }

    public void mouseScrolled(double delta) {
        if (fullscreenMenuOpen) {
            updateScroll(0, 0, (float)delta);
        }
    }
}
SS -
Посмотреть вложение 310864
Еба что это говно
 
/del удали пжжж
 
chat gpt solutions /del
 
Назад
Сверху Снизу