Вопрос Вопрос по GUI | Forge 1.16.5

Начинающий
Статус
Оффлайн
Регистрация
30 Июл 2023
Сообщения
52
Реакции[?]
0
Поинты[?]
1K

Перед прочтением основного контента ниже, пожалуйста, обратите внимание на обновление внутри секции Майна на нашем форуме. У нас появились:

  • бесплатные читы для Майнкрафт — любое использование на свой страх и риск;
  • маркетплейс Майнкрафт — абсолютно любая коммерция, связанная с игрой, за исключением продажи читов (аккаунты, предоставления услуг, поиск кодеров читов и так далее);
  • приватные читы для Minecraft — в этом разделе только платные хаки для игры, покупайте группу "Продавец" и выставляйте на продажу свой софт;
  • обсуждения и гайды — всё тот же раздел с вопросами, но теперь модернизированный: поиск нужных хаков, пати с игроками-читерами и другая полезная информация.

Спасибо!

Всем гениям форума привет! Я решил написать свой ClickGUI для форджа, прогнал через нейросеть пару раз, и вышло что-то такое(на дизайн не обращайте внимание, мне главное было изучить как это все работает):

Список функций работает норм, они листаются и вкл/выкл при нажатии, но настройки функций вообще на клик не реагируют, сотню раз просил нейронку пофиксить, но она даже сама ничего не смогла. Так как в таких случаях лучше воспользоваться советом тех, кто знает, пишу сюда. Вот собственно код:
Код:
public class NewGUIScreen extends Screen {
    private final List<Module> modules; // Список модулей
    private Module selectedModule; // Выбранный модуль
    private NumberSetting draggingSetting; // Настройка, которую перетаскиваем

    public NewGUIScreen(List<Module> modules) {
        super(new StringTextComponent("XVisuals FREE"));
        this.modules = modules;
    }

    @Override
    protected void init() {
        int centerX = this.width / 2;
        int centerY = this.height / 2;
    }

    private int darkenColor(int color, float factor) {
        int alpha = (color >> 24) & 0xFF;
        int red = (int)(((color >> 16) & 0xFF) * factor);
        int green = (int)(((color >> 8) & 0xFF) * factor);
        int blue = (int)((color & 0xFF) * factor);
        return (alpha << 24) | (red << 16) | (green << 8) | blue;
    }

    private int scrollOffset = 0; // Смещение по оси Y для прокрутки
    private int moduleHeight = 30; // Высота каждого модуля

    @Override
    public void render(MatrixStack matrixStack, int mouseX, int mouseY, float partialTicks) {
        // Определяем размеры окна
        int windowWidth = this.width / 2;
        int windowHeight = this.height / 2;

        // Определяем позиции для центра экрана
        int startX = (this.width - windowWidth) / 2;
        int startY = (this.height - windowHeight) / 2;

        // Рисуем фон как сплошной цвет, половина экрана
        drawColoredRectWithOpenGL(matrixStack, startX, startY, windowWidth, windowHeight, 0xFF1E1E1E);

        // Рисуем заголовок по центру верхней части окна
        drawCenteredString(matrixStack, this.font, "XVisuals FREE", startX + windowWidth / 2, startY + 10, 0xFFFFFF);

        // Рисуем центральную линию сверху вниз
        drawLineWithOpenGL(matrixStack, startX + windowWidth / 2, startY + 25, startX + windowWidth / 2, startY + windowHeight - 5, 0xFFFFFFFF);

        // Рисуем модули как прямоугольники с цветом, с учётом прокрутки
        int moduleWidth = windowWidth / 2 - 20; // Половина ширины окна минус отступы
        int yPosition = startY + 30 + scrollOffset;

        for (Module module : modules) {
            // Проверяем, находится ли модуль в видимой области
            if (yPosition + moduleHeight > startY + 30 && yPosition < startY + windowHeight) {
                int moduleColor = module.isToggled() ? darkenColor(0xFF00FF00, 0.7f) : 0xFFFF0000;  // Если модуль включен, затемняем зеленый цвет

                // Располагаем модули слева от центральной линии, занимая половину ширины окна
                int moduleX = startX + 10; // Отступ 10 пикселей от левого края окна
                drawColoredRectWithOpenGL(matrixStack, moduleX, yPosition, moduleWidth, 20, moduleColor);

                // Рисуем имя модуля
                drawString(matrixStack, this.font, module.getName(), moduleX + 10, yPosition + 6, 0xFFFFFFFF);
            }
            yPosition += moduleHeight;
        }

        // Рисуем настройки выбранного модуля
        // Рисуем настройки выбранного модуля
        if (selectedModule != null) {
            int settingsStartY = startY + 30;
            int settingsWidth = windowWidth / 2 - 20;
            int settingsX = startX + windowWidth / 2 + 10;

            // Рисуем название выбранного модуля
            drawString(matrixStack, this.font, selectedModule.getName(), settingsX, settingsStartY, 0xAAAAAA);

            // Рисуем настройки
            int settingY = settingsStartY + 20;
            for (Setting setting : selectedModule.settingList) {
                // Рисуем фон для настройки
                drawColoredRectWithOpenGL(matrixStack, settingsX, settingY, settingsWidth, 40, 0xFF2E2E2E); // 40 — высота каждой настройки

                if (setting instanceof ModeSetting) {
                    ModeSetting modeSetting = (ModeSetting) setting;
                    drawString(matrixStack, this.font, modeSetting.getName(), settingsX, settingY + 6, 0xFFFFFF);
                    drawString(matrixStack, this.font, modeSetting.getMode(), settingsX + settingsWidth - this.font.width(modeSetting.getMode()), settingY + 6, 0xFFFFFF);
                } else if (setting instanceof BooleanSetting) {
                    BooleanSetting booleanSetting = (BooleanSetting) setting;
                    drawString(matrixStack, this.font, booleanSetting.getName(), settingsX, settingY + 6, 0xFFFFFF);
                    drawString(matrixStack, this.font, booleanSetting.isEnabled() ? "Enabled" : "Disabled", settingsX + settingsWidth - this.font.width(booleanSetting.isEnabled() ? "Enabled" : "Disabled"), settingY + 6, 0xFFFFFF);
                } else if (setting instanceof NumberSetting) {
                    NumberSetting numberSetting = (NumberSetting) setting;
                    drawString(matrixStack, this.font, numberSetting.getName(), settingsX, settingY + 6, 0xFFFFFF);

                    // Рисуем слайдер
                    int sliderWidth = settingsWidth - 20;
                    int sliderX = settingsX + 10;
                    int sliderY = settingY + 20;
                    drawColoredRectWithOpenGL(matrixStack, sliderX, sliderY, sliderWidth, 5, 0xFF888888);

                    // Рисуем ползунок слайдера
                    double sliderValue = (numberSetting.getValue() - numberSetting.getMin()) / (numberSetting.getMax() - numberSetting.getMin());
                    int knobX = (int) (sliderX + sliderValue * sliderWidth);
                    drawColoredRectWithOpenGL(matrixStack, knobX - 5, sliderY - 5, 10, 15, 0xFF00FF00);
                }
                settingY += 40; // Увеличиваем на 40, чтобы учесть высоту слайдера
            }
        }

        // Рисуем разделительную линию вверху окна
        drawLineWithOpenGL(matrixStack, startX + 15, startY + 25, startX + windowWidth - 15, startY + 25, 0xFFFFFFFF);

        super.render(matrixStack, mouseX, mouseY, partialTicks);
    }

    @Override
    public boolean mouseClicked(double mouseX, double mouseY, int button) {
        System.out.println("Mouse clicked at: " + mouseX + ", " + mouseY);

        int startX = (this.width - this.width / 2) / 2;
        int startY = (this.height - this.height / 2) / 2;
        int moduleWidth = this.width / 4 - 10;
        int yPosition = startY + 30 + scrollOffset;

        for (Module module : modules) {
            if (yPosition + moduleHeight > startY + 30 && yPosition < startY + this.height / 2) {
                int moduleX = startX + 10;
                if (mouseX > moduleX && mouseX < moduleX + moduleWidth && mouseY > yPosition && mouseY < yPosition + 20) {
                    System.out.println("Module clicked: " + module.getName());
                    module.toggle();
                    selectedModule = module;
                    return true;
                }
            }
            yPosition += moduleHeight;
        }

        if (selectedModule != null) {
            int settingsStartY = startY + 30;
            int settingsWidth = this.width / 4 - 10;
            int settingsX = startX + this.width / 2 + 10;

            int settingY = settingsStartY + 20;
            for (Setting setting : selectedModule.settingList) {
                // Отладочные сообщения
                System.out.println("Checking setting at: " + settingY + ", " + settingsX + ", " + settingsWidth + ", 40");

                if (mouseY > settingY && mouseY < settingY + 40) { // 40 — высота модуля настройки
                    if (mouseX > settingsX && mouseX < settingsX + settingsWidth) {
                        System.out.println("Clicked inside settings module area");
                        if (setting instanceof ModeSetting) {
                            ModeSetting modeSetting = (ModeSetting) setting;
                            System.out.println("Mode setting clicked: " + modeSetting.getName());
                            modeSetting.cycle();
                            return true;
                        } else if (setting instanceof BooleanSetting) {
                            BooleanSetting booleanSetting = (BooleanSetting) setting;
                            booleanSetting.toggle();
                            return true;
                        } else if (setting instanceof NumberSetting) {
                            NumberSetting numberSetting = (NumberSetting) setting;
                            int sliderX = settingsX + 10;
                            int sliderY = settingY + 20;
                            int sliderWidth = settingsWidth - 20;
                            if (mouseY > sliderY - 5 && mouseY < sliderY + 15) {
                                if (mouseX > sliderX && mouseX < sliderX + sliderWidth) {
                                    draggingSetting = numberSetting;
                                    updateSliderValue(numberSetting, mouseX, sliderX, sliderWidth);
                                    return true;
                                }
                            }
                        }
                    }
                }
                settingY += 40; // Увеличиваем на 40, чтобы учесть высоту настройки
            }
        }

        return super.mouseClicked(mouseX, mouseY, button);
    }

    @Override
    public boolean mouseDragged(double mouseX, double mouseY, int button, double deltaX, double deltaY) {
        if (draggingSetting != null) {
            int startX = (this.width - this.width / 2) / 2;
            int startY = (this.height - this.height / 2) / 2;
            int settingsWidth = this.width / 4 - 10;
            int settingsX = startX + this.width / 2 + 10;

            int sliderX = settingsX + 10;
            int sliderWidth = settingsWidth - 20;
            updateSliderValue(draggingSetting, mouseX, sliderX, sliderWidth);
            return true;
        }
        return super.mouseDragged(mouseX, mouseY, button, deltaX, deltaY);
    }


    @Override
    public boolean mouseReleased(double mouseX, double mouseY, int button) {
        draggingSetting = null;
        return super.mouseReleased(mouseX, mouseY, button);
    }

    private void updateSliderValue(NumberSetting numberSetting, double mouseX, int sliderX, int sliderWidth) {
        double sliderValue = (mouseX - sliderX) / sliderWidth;
        sliderValue = Math.max(0, Math.min(1, sliderValue));
        double newValue = numberSetting.getMin() + sliderValue * (numberSetting.getMax() - numberSetting.getMin());
        numberSetting.setValue(newValue);
    }

    @Override
    public boolean mouseScrolled(double mouseX, double mouseY, double delta) {
        // Меняем смещение прокрутки при прокрутке колесика мыши
        scrollOffset += delta * moduleHeight;

        // Ограничиваем прокрутку, чтобы не было лишнего прокручивания
        int maxScroll = Math.max(0, modules.size() * moduleHeight - (this.height / 2 - 60));
        scrollOffset = Math.max(-(maxScroll), Math.min(0, scrollOffset));

        return true;
    }

    @Override
    public boolean isPauseScreen() {
        return false; // Если false, игра не будет ставиться на паузу
    }

    private void drawColoredRectWithOpenGL(MatrixStack matrixStack, int x, int y, int width, int height, int color) {
        // Извлечение цветовых компонентов из цвета
        float alpha = (color >> 24 & 255) / 255.0F;
        float red = (color >> 16 & 255) / 255.0F;
        float green = (color >> 8 & 255) / 255.0F;
        float blue = (color & 255) / 255.0F;

        // Включаем смешивание
        RenderSystem.enableBlend();
        RenderSystem.disableTexture();
        RenderSystem.defaultBlendFunc();
        RenderSystem.color4f(red, green, blue, alpha);

        // Рисуем прямоугольник
        Tessellator tesselator = Tessellator.getInstance();
        BufferBuilder bufferbuilder = tesselator.getBuilder();
        bufferbuilder.begin(7, DefaultVertexFormats.POSITION);

        bufferbuilder.vertex(matrixStack.last().pose(), x, y + height, 0.0F).endVertex();
        bufferbuilder.vertex(matrixStack.last().pose(), x + width, y + height, 0.0F).endVertex();
        bufferbuilder.vertex(matrixStack.last().pose(), x + width, y, 0.0F).endVertex();
        bufferbuilder.vertex(matrixStack.last().pose(), x, y, 0.0F).endVertex();

        tesselator.end();

        // Восстанавливаем состояние
        RenderSystem.enableTexture();
        RenderSystem.disableBlend();
    }

    private void drawLineWithOpenGL(MatrixStack matrixStack, int startX, int startY, int endX, int endY, int color) {
        // Извлечение цветовых компонентов из цвета
        float alpha = (color >> 24 & 255) / 255.0F;
        float red = (color >> 16 & 255) / 255.0F;
        float green = (color >> 8 & 255) / 255.0F;
        float blue = (color & 255) / 255.0F;

        // Включаем смешивание
        RenderSystem.enableBlend();
        RenderSystem.disableTexture();
        RenderSystem.defaultBlendFunc();
        RenderSystem.lineWidth(2.0F); // Ширина линии
        RenderSystem.color4f(red, green, blue, alpha);

        // Рисуем линию
        Tessellator tesselator = Tessellator.getInstance();
        BufferBuilder bufferbuilder = tesselator.getBuilder();
        bufferbuilder.begin(3, DefaultVertexFormats.POSITION);

        bufferbuilder.vertex(matrixStack.last().pose(), startX, startY, 0.0F).endVertex();
        bufferbuilder.vertex(matrixStack.last().pose(), endX, endY, 0.0F).endVertex();

        tesselator.end();

        // Восстанавливаем состояние
        RenderSystem.lineWidth(1.0F);
        RenderSystem.enableTexture();
        RenderSystem.disableBlend();
    }
}
 
Начинающий
Статус
Оффлайн
Регистрация
22 Ноя 2020
Сообщения
52
Реакции[?]
0
Поинты[?]
0
if (mouseY > settingY && mouseY < settingY + 40) { // 40 — высота модуля настройки if (mouseX > settingsX && mouseX < settingsX + settingsWidth)
ну начнем с того, что у тебя выполняеться if, только если икс мышки больше чем икс настройки, и тоже самое с игриком. тебе нужно добавить к "<" ">" знак равно - =. + ты можешь сделать эту проверку в одну строчку, не разбивая ее на части,
Код:
mouseX >= x && mouseX < x + width && mouseY >= y && mouseY < y + height
тоже самое со всеми проверками на ховер мышки.
 
Начинающий
Статус
Оффлайн
Регистрация
30 Июл 2023
Сообщения
52
Реакции[?]
0
Поинты[?]
1K
ну начнем с того, что у тебя выполняеться if, только если икс мышки больше чем икс настройки, и тоже самое с игриком. тебе нужно добавить к "<" ">" знак равно - =. + ты можешь сделать эту проверку в одну строчку, не разбивая ее на части,
Код:
mouseX >= x && mouseX < x + width && mouseY >= y && mouseY < y + height
тоже самое со всеми проверками на ховер мышки.
Спасибо, думаю ты решил проблему, просто я уже переписал.
 
Сверху Снизу