Подпишитесь на наш Telegram-канал, чтобы всегда быть в курсе важных обновлений! Перейти

Вопрос Кто может помочь с красивым ALt manger (этот написал клод опус)

Начинающий
Начинающий
Статус
Оффлайн
Регистрация
17 Май 2024
Сообщения
6
Реакции
0
Заранее спасибо.

Код ниже

package im.expensive.ui.mainmenu;
import com.mojang.blaze3d.matrix.MatrixStack;
import im.expensive.ui.mainmenu.AltConfig;
import im.expensive.utils.math.MathUtil;
import im.expensive.utils.render.ColorUtils;
import im.expensive.utils.render.DisplayUtils;
import im.expensive.utils.render.font.Fonts;
import lombok.AccessLevel;
import lombok.experimental.FieldDefaults;
import net.minecraft.client.Minecraft;
import org.lwjgl.glfw.GLFW;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ThreadLocalRandom;
@FieldDefaults(level = AccessLevel.PUBLIC)
public class AltWidget {
public final List<Alt> alts = new ArrayList<>();
public boolean open = false;

private final Minecraft mc = Minecraft.getInstance();

// UI параметры
private float x = 100;
private float y = 100;
private float width = 300;
private float height = 400;
private float scrollOffset = 0;
private int selectedAlt = -1;

// Состояние ввода
private String inputText = "";
private boolean showAddDialog = false;
private String statusMessage = "";

public void render(MatrixStack ms, float mouseX, float mouseY) {
if (!open) return;

// Фон окна
DisplayUtils.drawRoundedRect(x, y, width, height, 10, ColorUtils.rgba(30, 30, 30, 230));

// Заголовок
Fonts.sfui.drawText(ms, "Менеджер аккаунтов", x + 10, y + 10, ColorUtils.rgba(255, 255, 255, 255), 16f);

// Кнопка закрытия
float closeX = x + width - 25;
float closeY = y + 10;
boolean isCloseHovered = MathUtil.isHovered(mouseX, mouseY, closeX, closeY, 15, 15);
DisplayUtils.drawRoundedRect(closeX, closeY, 15, 15, 3,
isCloseHovered ? ColorUtils.rgba(200, 50, 50, 255) : ColorUtils.rgba(150, 50, 50, 255));
Fonts.sfui.drawText(ms, "×", closeX + 4, closeY + 2, ColorUtils.rgba(255, 255, 255, 255), 12f);

// Список аккаунтов
float listY = y + 40;
float listHeight = height - 120;

for (int i = 0; i < alts.size(); i++) {
float itemY = listY + i * 25 - scrollOffset;
if (itemY > listY + listHeight || itemY + 20 < listY) continue;

boolean isHovered = MathUtil.isHovered(mouseX, mouseY, x + 10, itemY, width - 20, 20);
boolean isSelected = i == selectedAlt;
boolean isLogged = mc.getSession() != null && alts.get(i).name.equals(mc.getSession().getUsername());

// Фон элемента
int bgColor = isSelected ? ColorUtils.rgba(60, 60, 120, 255) :
isHovered ? ColorUtils.rgba(50, 50, 50, 255) : ColorUtils.rgba(40, 40, 40, 255);
DisplayUtils.drawRoundedRect(x + 10, itemY, width - 20, 20, 5, bgColor);

// Текст аккаунта
Fonts.sfui.drawText(ms, alts.get(i).name, x + 15, itemY + 5, ColorUtils.rgba(255, 255, 255, 255), 12f);

// бейдж залогинен
if (isLogged) {
float badgeWidth = 60;
float badgeHeight = 14;
float badgeX = x + width - 20 - badgeWidth - 5;
float badgeY = itemY + 3;
DisplayUtils.drawRoundedRect(badgeX, badgeY, badgeWidth, badgeHeight, 4, ColorUtils.rgba(60, 140, 60, 200));
Fonts.sfui.drawText(ms, "Залогинен", badgeX + 6, badgeY + 3, ColorUtils.rgba(255, 255, 255, 230), 9f);
}
}

// Панель действий
float actionsY = y + height - 70;
float actionBtnHeight = 20;
float actionSpacing = 8;
float actionWidth = (width - 20 - actionSpacing * 2) / 3f;
boolean hasSelection = selectedAlt >= 0 && selectedAlt < alts.size();
boolean isSelectedLogged = hasSelection && mc.getSession() != null && alts.get(selectedAlt).name.equals(mc.getSession().getUsername());

// Кнопка логина
int loginColor = isSelectedLogged ? ColorUtils.rgba(60, 120, 60, 200) :
(hasSelection ? ColorUtils.rgba(50, 100, 50, 255) : ColorUtils.rgba(40, 70, 40, 150));
DisplayUtils.drawRoundedRect(x + 10, actionsY, actionWidth, actionBtnHeight, 5, loginColor);
Fonts.sfui.drawText(ms, isSelectedLogged ? "Уже в игре" : "Войти", x + 10 + 8, actionsY + 5, ColorUtils.rgba(255, 255, 255, 220), 11f);

// Кнопка удалить
int delColor = hasSelection ? ColorUtils.rgba(120, 50, 50, 240) : ColorUtils.rgba(90, 40, 40, 160);
DisplayUtils.drawRoundedRect(x + 10 + actionWidth + actionSpacing, actionsY, actionWidth, actionBtnHeight, 5, delColor);
Fonts.sfui.drawText(ms, "Удалить", x + 10 + actionWidth + actionSpacing + 10, actionsY + 5, ColorUtils.rgba(255, 255, 255, 220), 11f);

// Кнопка рандом ника
DisplayUtils.drawRoundedRect(x + 10 + (actionWidth + actionSpacing) * 2, actionsY, actionWidth, actionBtnHeight, 5,
ColorUtils.rgba(70, 70, 120, 230));
Fonts.sfui.drawText(ms, "Рандом ник", x + 10 + (actionWidth + actionSpacing) * 2 + 6, actionsY + 5, ColorUtils.rgba(255, 255, 255, 220), 11f);

// Кнопка добавления
float addButtonY = y + height - 30;
boolean isAddHovered = MathUtil.isHovered(mouseX, mouseY, x + 10, addButtonY, width - 20, 20);
DisplayUtils.drawRoundedRect(x + 10, addButtonY, width - 20, 20, 5,
isAddHovered ? ColorUtils.rgba(50, 100, 50, 255) : ColorUtils.rgba(40, 80, 40, 255));
Fonts.sfui.drawText(ms, "+ Добавить аккаунт", x + 20, addButtonY + 5, ColorUtils.rgba(255, 255, 255, 255), 12f);

// статус
if (!statusMessage.isEmpty()) {
Fonts.sfui.drawText(ms, statusMessage, x + 15, y + height - 50, ColorUtils.rgba(180, 180, 180, 220), 10f);
}

// Диалог добавления
if (showAddDialog) {
float dialogWidth = 250;
float dialogHeight = 120;
float dialogX = x + (width - dialogWidth) / 2;
float dialogY = y + (height - dialogHeight) / 2;

DisplayUtils.drawRoundedRect(dialogX, dialogY, dialogWidth, dialogHeight, 10, ColorUtils.rgba(50, 50, 50, 255));
Fonts.sfui.drawText(ms, "Добавить аккаунт", dialogX + 10, dialogY + 10, ColorUtils.rgba(255, 255, 255, 255), 14f);

// Поле ввода
DisplayUtils.drawRoundedRect(dialogX + 10, dialogY + 35, dialogWidth - 20, 25, 5, ColorUtils.rgba(30, 30, 30, 255));
Fonts.sfui.drawText(ms, inputText, dialogX + 15, dialogY + 40, ColorUtils.rgba(255, 255, 255, 255), 12f);

// Кнопка рандом ника
float randomX = dialogX + 10;
float randomY = dialogY + 65;
float randomW = 80;
float randomH = 18;
boolean randomHover = MathUtil.isHovered(mouseX, mouseY, randomX, randomY, randomW, randomH);
DisplayUtils.drawRoundedRect(randomX, randomY, randomW, randomH, 4,
randomHover ? ColorUtils.rgba(80, 80, 140, 240) : ColorUtils.rgba(70, 70, 120, 220));
Fonts.sfui.drawText(ms, "Рандом", randomX + 10, randomY + 4, ColorUtils.rgba(255, 255, 255, 230), 10f);

// Кнопки
float buttonWidth = 80;
float buttonHeight = 20;
float buttonSpacing = 20;

// Кнопка ОК
float okX = dialogX + dialogWidth/2 - buttonWidth - buttonSpacing/2;
float okY = dialogY + 70;
boolean isOkHovered = MathUtil.isHovered(mouseX, mouseY, okX, okY, buttonWidth, buttonHeight);
DisplayUtils.drawRoundedRect(okX, okY, buttonWidth, buttonHeight, 5,
isOkHovered ? ColorUtils.rgba(50, 100, 50, 255) : ColorUtils.rgba(40, 80, 40, 255));
Fonts.sfui.drawText(ms, "ОК", okX + 30, okY + 5, ColorUtils.rgba(255, 255, 255, 255), 12f);

// Кнопка Отмена
float cancelX = dialogX + dialogWidth/2 + buttonSpacing/2;
float cancelY = dialogY + 70;
boolean isCancelHovered = MathUtil.isHovered(mouseX, mouseY, cancelX, cancelY, buttonWidth, buttonHeight);
DisplayUtils.drawRoundedRect(cancelX, cancelY, buttonWidth, buttonHeight, 5,
isCancelHovered ? ColorUtils.rgba(100, 50, 50, 255) : ColorUtils.rgba(80, 40, 40, 255));
Fonts.sfui.drawText(ms, "Отмена", cancelX + 20, cancelY + 5, ColorUtils.rgba(255, 255, 255, 255), 12f);
}
}

public void click(int mouseX, int mouseY, int button) {
if (!open) return;

if (showAddDialog) {
// Обработка кликов в диалоге
float dialogWidth = 250;
float dialogHeight = 120;
float dialogX = x + (width - dialogWidth) / 2;
float dialogY = y + (height - dialogHeight) / 2;

float buttonWidth = 80;
float buttonHeight = 20;
float buttonSpacing = 20;

// Кнопка ОК
float okX = dialogX + dialogWidth/2 - buttonWidth - buttonSpacing/2;
float okY = dialogY + 70;
if (MathUtil.isHovered(mouseX, mouseY, okX, okY, buttonWidth, buttonHeight)) {
if (!inputText.isEmpty() && inputText.length() >= 3) {
alts.add(new Alt(inputText));
inputText = "";
AltConfig.updateFile();
statusMessage = "Добавлен аккаунт";
}
showAddDialog = false;
return;
}

// Кнопка Отмена
float cancelX = dialogX + dialogWidth/2 + buttonSpacing/2;
float cancelY = dialogY + 70;
if (MathUtil.isHovered(mouseX, mouseY, cancelX, cancelY, buttonWidth, buttonHeight)) {
inputText = "";
showAddDialog = false;
return;
}

// Кнопка рандом
float randomX = dialogX + 10;
float randomY = dialogY + 65;
float randomW = 80;
float randomH = 18;
if (MathUtil.isHovered(mouseX, mouseY, randomX, randomY, randomW, randomH)) {
inputText = generateRandomNick();
}

return;
}

// Кнопка закрытия
float closeX = x + width - 25;
float closeY = y + 10;
if (MathUtil.isHovered(mouseX, mouseY, closeX, closeY, 15, 15)) {
open = false;
AltConfig.updateFile();
return;
}

// Панель действий
float actionsY = y + height - 70;
float actionBtnHeight = 20;
float actionSpacing = 8;
float actionWidth = (width - 20 - actionSpacing * 2) / 3f;
boolean hasSelection = selectedAlt >= 0 && selectedAlt < alts.size();
boolean isSelectedLogged = hasSelection && mc.getSession() != null && alts.get(selectedAlt).name.equals(mc.getSession().getUsername());

// Войти
if (MathUtil.isHovered(mouseX, mouseY, x + 10, actionsY, actionWidth, actionBtnHeight) && hasSelection && !isSelectedLogged) {
String name = alts.get(selectedAlt).name;
mc.session = new net.minecraft.util.Session(name, java.util.UUID.randomUUID().toString(), "", "mojang");
AltConfig.updateFile();
statusMessage = "Залогинен как " + name;
return;
}
// Удалить
if (MathUtil.isHovered(mouseX, mouseY, x + 10 + actionWidth + actionSpacing, actionsY, actionWidth, actionBtnHeight) && hasSelection) {
Alt removed = alts.remove(selectedAlt);
selectedAlt = -1;
AltConfig.updateFile();
statusMessage = "Удалён " + removed.name;
return;
}
// Рандом ник
if (MathUtil.isHovered(mouseX, mouseY, x + 10 + (actionWidth + actionSpacing) * 2, actionsY, actionWidth, actionBtnHeight)) {
inputText = generateRandomNick();
showAddDialog = true;
return;
}

// Кнопка добавления
float addButtonY = y + height - 30;
if (MathUtil.isHovered(mouseX, mouseY, x + 10, addButtonY, width - 20, 20)) {
showAddDialog = true;
inputText = "";
return;
}

// Выбор аккаунта
float listY = y + 40;
float listHeight = height - 80;

for (int i = 0; i < alts.size(); i++) {
float itemY = listY + i * 25 - scrollOffset;
if (MathUtil.isHovered(mouseX, mouseY, x + 10, itemY, width - 20, 20)) {
selectedAlt = i;
// Здесь можно добавить логику входа в аккаунт
return;
}
}
}

public void updateScroll(int mouseX, int mouseY, float delta) {
if (!open) return;

float listY = y + 40;
float listHeight = height - 120;

if (MathUtil.isHovered(mouseX, mouseY, x + 10, listY, width - 20, listHeight)) {
scrollOffset -= delta * 10;
scrollOffset = Math.max(0, Math.min(scrollOffset, Math.max(0, alts.size() * 25 - listHeight)));
}
}

public void onChar(char codePoint) {
if (!open || !showAddDialog) return;

if (!Character.isISOControl(codePoint) && inputText.length() < 16) {
inputText += codePoint;
}
}

public void onKey(int keyCode) {
if (!open) return;

if (showAddDialog) {
if (keyCode == GLFW.GLFW_KEY_ENTER) {
if (!inputText.isEmpty() && inputText.length() >= 3) {
alts.add(new Alt(inputText));
inputText = "";
AltConfig.updateFile();
statusMessage = "Добавлен аккаунт";
}
showAddDialog = false;
} else if (keyCode == GLFW.GLFW_KEY_ESCAPE) {
inputText = "";
showAddDialog = false;
} else if (keyCode == GLFW.GLFW_KEY_BACKSPACE) {
if (!inputText.isEmpty()) {
inputText = inputText.substring(0, inputText.length() - 1);
}
}
} else if (keyCode == GLFW.GLFW_KEY_ESCAPE) {
open = false;
AltConfig.updateFile();
}
}

private String generateRandomNick() {
String letters = "abcdefghijklmnopqrstuvwxyz";
StringBuilder sb = new StringBuilder();
ThreadLocalRandom r = ThreadLocalRandom.current();
sb.append(Character.toUpperCase(letters.charAt(r.nextInt(letters.length()))));
for (int i = 0; i < 5; i++) {
if (r.nextBoolean()) {
sb.append(letters.charAt(r.nextInt(letters.length())));
} else {
sb.append(r.nextInt(0, 10));
}
}
return sb.toString();
}
}
 
говоришь сделай минимализм с хорошими имепнения кроме цвета и т.д
Слушай еще такая проблема есть, а как заблидить проект? он просто майн мне запускет, вместо билда
 
Назад
Сверху Снизу