Начинающий
- Статус
- Оффлайн
- Регистрация
- 17 Июл 2024
- Сообщения
- 36
- Реакции
- 1
- Выберите загрузчик игры
- Vanilla
- OptiFine
- Прочие моды
Сделал за 15 минут, для пастеров сойдёт
SS -
AltWidget.java:
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);
}
}
}