-
Автор темы
- #1
Перед прочтением основного контента ниже, пожалуйста, обратите внимание на обновление внутри секции Майна на нашем форуме. У нас появились:
- бесплатные читы для Майнкрафт — любое использование на свой страх и риск;
- маркетплейс Майнкрафт — абсолютно любая коммерция, связанная с игрой, за исключением продажи читов (аккаунты, предоставления услуг, поиск кодеров читов и так далее);
- приватные читы для 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();
}
}