Войти или зарегистрироваться

Туториал [1.7.10-1.8] [Vanilla + Forge] Minecraft Coder Pack. Как сделать красивые прозрачные кнопки.

EvilEnginer

Активный участник
Пользователь
Баллы
88
Имя в Minecraft
EvilEnginer
Эта модификация совместима с Optifine и BetterFonts на версии 1.7.10, и с Optifine на версии 1.8 скриншоты в конце темы. :good:
Здравствуйте господа в этом гайде я вам расскажу как сделать красивые прозрачные кнопки как на скриншотах. Кнопки становятся такими в главном меню игры, паузы, выбора сервера, одиночной игры и в настройках. Цвет текста при наведении мыши на кнопку может быть абсолютно любым, а так же можно регулировать прозрачность кнопки до и после наведения мыши на неё и толщину границы.

Итак начнём:
Предисловие: Если вы не любите ванильный MCP, то можете использовать ForgeGradle :nerd:. Как ставить ForgeGradle я учить не буду - гугл научит.
Пункт I. Установка кодерпака (ванильная версия Minecraft).
1) Скачиваем Minecraft Coder Pack для Minecraft 1.7.10
2) Скачиваем Eclipse отсюда
3) Распаковываем скачанный архив c кодерпаком в любую папку запускаем скрипт decompile.bat
Перед запуском скрипта decompile.bat убедитесь что у вас скачан и установлен лицензионный minecraft в папку
C:\Users\[ваше имя пользователя Windows]\AppData\Roaming\.minecraft
В имени пользователя НЕ ДОЛЖНО быть русских букв.
4) Как декомпиляция завершится запускаем Eclipse, а в качестве рабочей области указываем папку Eclipse из архива с кодерпаком. Всё, кодер пак уставлен.
Пункт II. Кодинг.
a) Делаем кнопки прозрачными

1) В Eclipse в Proejct Explorer ищем пакет net.minecraft.client.gui из него открываем файл GuiButton.java
2) Едем вниз и видим метод public void drawButton. Заменяем этот метод целиком на этот
Код:
public void drawButton(Minecraft mc, int mouseX, int mouseY)
    {
        if (this.visible)
        {
            FontRenderer var4 = mc.fontRendererObj;
            mc.getTextureManager().bindTexture(buttonTextures);
            GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);
            boolean flag = mouseX >= this.xPosition && mouseY >= this.yPosition && mouseX < this.xPosition + this.width && mouseY < this.yPosition + this.height; //Flag, tells if your mouse is hovering the button
            int var5 = this.getHoverState(this.hovered);
            GlStateManager.enableBlend();
            GlStateManager.tryBlendFuncSeparate(770, 771, 1, 0);
            GlStateManager.blendFunc(770, 771);
            if (flag) // Mouse hovering button
            {
                drawBorderedRect(this.xPosition, this.yPosition, this.xPosition + this.width, this.yPosition + this.height, 1, 0x90FFFFFF, 0x90000000); //Here 0x(some numbers and letters) Html color code - google it
                this.drawCenteredString(var4, this.displayString, this.xPosition + this.width / 2, this.yPosition + (this.height - 8) / 2, 0x00FF00);
            }
            else //Mouse not hovering button
            {
                drawBorderedRect(this.xPosition, this.yPosition, this.xPosition + this.width, this.yPosition + this.height, 1, 0x90FFFFFF, 0x60000000);
                drawCenteredString(var4, displayString, this.xPosition + this.width / 2, this.yPosition + (this.height - 8) / 2, 0xFFCCCC);
            }
            this.mouseDragged(mc, mouseX, mouseY);
        }
    }
Код:
public void drawButton(Minecraft mc, int mx, int my)
{
  if (this.visible)
  {
  GL11.glColor4f(1F, 1F, 1F, 1F);
  boolean changed = mx >= this.xPosition && my >= this.yPosition && mx < this.xPosition + this.width && my < this.yPosition + this.height;
  GL11.glEnable(GL11.GL_BLEND);
  OpenGlHelper.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, 1, 0);
  int color = changed ? 0x90000000 : 0x60000000; // changed;not_changed
  this.drawBorderedRect(this.xPosition, this.yPosition, this.xPosition + this.width, this.yPosition + this.height, 1, 0x90FFFFFF, color);
  color = this.enabled ? (changed ? 0x00FF00 : 0xFFCCCC) : 0xFF0000; // changed;not_changed;not_enabled
  this.drawCenteredString(mc.fontRenderer, this.displayString, this.xPosition + this.width / 2, this.yPosition + (this.height - 8) / 2, color);
  this.mouseDragged(mc, mx, my);
  }
}
Код:
public void drawButton(Minecraft mc, int mx, int my)
{
  if (this.visible)
  {
  GL11.glColor4f(1F, 1F, 1F, 1F);
  boolean changed = mx >= this.xPosition && my >= this.yPosition && mx < this.xPosition + this.width && my < this.yPosition + this.height;
  GL11.glEnable(GL11.GL_BLEND);
  OpenGlHelper.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, 1, 0);
  int color = changed ? 0x90000000 : 0x60000000; // changed;not_changed
  this.drawBorderedRect(this.xPosition, this.yPosition, this.xPosition + this.width, this.yPosition + this.height, 1, 0x90FFFFFF, color);
  color = this.enabled ? (changed ? 0x00FF00 : 0xFFCCCC) : 0xFF0000; // changed;not_changed;not_enabled
  this.drawCenteredString(mc.fontRenderer, this.displayString, this.xPosition + this.width / 2, this.yPosition + (this.height - 8) / 2, color);
  this.mouseDragged(mc, mx, my);
  }
}
и сохраняем результат... Видим ошибку метод drawBorderedRect не определён.
3) Открываем файл Gui.java из этого же пакета после строки 16 вставляем следующий код
Код:
public void drawBorderedRect(int x, int y, int x1, int y1, int size, int borderC, int insideC)
{
drawRect(x + size, y + size, x1 - size, y1 - size, insideC);
drawRect(x + size, y + size, x1, y, borderC);
drawRect(x, y, x + size, y1 - 1, borderC);
drawRect(x1, y1 - 1, x1 - size, y + size, borderC);
drawRect(x, y1 - size, x1, y1, borderC);
}
ошибки нет :) запускаем нашу работу и любуемся результатом.
4) Поясняю как изменить цвет текста при наведении мыши на кнопку и прозрачность.
Блок Код (Text). Файл GuiButton.java. Коды цветов HTML
Рассмотрим случай - мышь наведена на кнопку.
Строка 15 из блока с кодом параметр 0x90FFFFFF - толщина границы. 0x90000000 - прозрачность.
Строка 16 параметр 0x00FF00 цвет текста в данном случае зелёный.
Если мышь не наведена на кнопку
То аналогично строки 20 и 21 отвечают за начальный вид кнопки

б) Двигаем кнопки влево и рисуем прямоугольник.
1)
Для того, чтобы нарисовать прямоугольник с градиентом, ищем метод drawScreen в файле GuiMainMenu.java и вставляем после Tessellator var4 = Tessellator.instance код
Код:
drawRect(0, 1000, 155, 0, Integer.MIN_VALUE);
this.drawGradientRect(0, 0, this.width, this.height, -2130706433, 16777215);
this.drawGradientRect(0, 0, this.width, this.height, 0, Integer.MIN_VALUE);

2) Чтобы сделать расположение кнопок таким же как на скриншоте ищем метод addSingleplayerMultiplayerButtons в файле GuiMainMenu.java удаляем его и заменяем на этот:
Код:
private void addSingleplayerMultiplayerButtons(int p_73969_1_, int p_73969_2_)
    {
        this.buttonList.add(new GuiButton(1, this.width / - 200 + 15, p_73969_1_ - 30, 130, 20, I18n.format("menu.singleplayer", new Object[0])));
        this.buttonList.add(new GuiButton(2, this.width / -200 + 15, p_73969_1_ - 5 , 130, 20, I18n.format("menu.multiplayer", new Object[0])));
        this.buttonList.add(this.field_175372_K = new GuiButton(14, this.width / - 200 + 15, p_73969_1_ + 20, 130, 20, I18n.format("menu.online", new Object[0])));
    }
Код:
private void addSingleplayerMultiplayerButtons(int var3, int p_73969_2_)
    {
        this.buttonList.add(new GuiButton(1, this.width / - 200 + 15, var3 - 30, 130, 20, I18n.format("menu.singleplayer", new Object[0])));
        this.buttonList.add(new GuiButton(2, this.width / -200 + 15, var3 - 5 , 130, 20, I18n.format("menu.multiplayer", new Object[0])));
        this.buttonList.add(new GuiButton(6, this.width / - 200 + 15, var3 + 20, 130, 20, I18n.format("Mods", new Object[0])));
    }
Ищём код выше
this.buttonList.add(..."menu.options"...);
this.buttonList.add(..."menu.quit"...);
и заменяем его на этот
Код:
this.buttonList.add(new GuiButton(0, this.width / - 200 + 15, var3 + 45, 130, 20, I18n.format("menu.options", new Object[0])));
this.buttonList.add(new GuiButton(4, this.width / - 200 + 15, var3 + 70, 130, 20, I18n.format("menu.quit", new Object[0])));
Код:
this.buttonList.add(new GuiButton(0, this.width / -200 + 15, i + 45, 130, 20, I18n.format("menu.options", new Object[0])));
this.buttonList.add(new GuiButton(4, this.width / -200 + 15, i + 70, 130, 20, I18n.format("menu.quit", new Object[0])));

в) Делаем слайдер в опциях и в музыке красивым (fix oт gamerforEA):
1) Открываем GuiOptionsSlider.java из пакета net/minecraft/client/gui
2) Ищем this.drawTexturedModalRect этих строк ровно две в этом файле
3) Комментируем их и заменяем на эту:
Код:
this.drawBorderedRect(this.xPosition + (int)(this.sliderValue * (float)(this.width - 8)), this.yPosition, this.xPosition + (int)(this.sliderValue * (float)(this.width - 8)) + 8, this.yPosition + this.height, 1, 0x90FFFFFF, 0x90000000);
Код:
this.drawBorderedRect(this.xPosition + (int)(this.field_146156_o * (float)(this.width - 8)), this.yPosition, this.xPosition + (int)(this.field_146156_o * (float)(this.width - 8)) + 8, this.yPosition + this.height, 1, 0x90FFFFFF, 0x90000000);
4) Открываем GuiScreenOptionsSounds.java из пакета net/minecraft/client/gui
5) Ищем this.drawTexturedModalRect этих строк ровно две в этом файле
6) Комментируем их и заменяем на эту:
Код:
this.drawBorderedRect(this.xPosition + (int)(this.field_146156_o * (float)(this.width - 8)), this.yPosition, this.xPosition + (int)(this.field_146156_o * (float)(this.width - 8)) + 8, this.yPosition + this.height, 1, 0x90FFFFFF, 0x90000000);
Код:
this.drawBorderedRect(this.xPosition + (int)(this.field_146156_o * (float)(this.width - 8)), this.yPosition, this.xPosition + (int)(this.field_146156_o * (float)(this.width - 8)) + 8, this.yPosition + this.height, 1, 0x90FFFFFF, 0x90000000);

г) Фикс кнопки "блокировать сложность" от MrGiperCreeper


д) И напоследок...
Демонстрация работоспособности на лицензии на версии 1.7.10 с Minecraft Forge, Optifine, и Better Fonts и на версии 1.8 с Optifine.
a8f19a78ce8e32052c6819abe1d1a073.png


9f1ca02734bc98c82f4292a5fcdb40ed.png


Для того чтобы получилось так же как у меня используйте этот гайд от skoniks
Там всё по аналогии.
По поводу различных версий Майна. Для Vanilla например тут:
Код:
if (flag) // Mouse hovering button
            {
                drawBorderedRect(this.field_146128_h, this.field_146129_i, this.field_146128_h + this.field_146120_f, this.field_146129_i + this.field_146121_g, 1, 0x90FFFFFF, 0x90000000); //Here 0x(some numbers and letters) Html color code - google it
                this.drawCenteredString(var4, this.displayString, this.field_146128_h + this.field_146120_f / 2, this.field_146129_i + (this.field_146121_g - 8) / 2, 0x00FF00);
            }
            else //Mouse not hovering button
            {
                drawBorderedRect(this.field_146128_h, this.field_146129_i, this.field_146128_h + this.field_146120_f, this.field_146129_i + this.field_146121_g, 1, 0x90FFFFFF, 0x60000000);
                drawCenteredString(var4, displayString, this.field_146128_h + this.field_146120_f / 2, this.field_146129_i + (this.field_146121_g - 8) / 2, 0xFFCCCC);
            }
            this.mouseDragged(mc, mx, my);
код может различаться лишь переменными, this.field_146128_h например. В свою очередь, код для Minecraft Forge одинаковый. Так как разрабочики Forge их деобусцировали заранее, во всех версиях кодерпаков дабы не путаться.

Собственно вот и всё. Прошу вас поставить мне лойс если этот гайд оказался для вас полезным :).
 
Последнее редактирование:
Да было, но старая тема потеряла свою актуальность, плюс там было куча недоработок, поэтому я создал новую.
 
Последнее редактирование:
Здравствуйте господа в этом гайде я вам расскажу как сделать красивые прозрачные кнопки как на скриншоте. Кнопки становятся такими в главном меню игры, паузы, выбора сервера, одиночной игры и в настройках. Цвет текста при наведении мыши на кнопку может быть абсолютно любым, а так же можно регулировать прозрачность кнопки до и после наведения мыши на неё и толщину границы.

827da7930658797b1345cb103e5acf87.png

Итак начнём:
Пункт I. Установка кодерпака.
1) Скачиваем Minecraft Coder Pack для Minecraft 1.7.10 прямая ссылка
2) Скачиваем Eclipse отсюда
3) Распаковываем скачанный архив c кодерпаком в любую папку запускаем скрипт decompile.bat
4) Как декомпиляция завершится запускаем Eclipse, а в качестве рабочей области указываем папку
Eclipse из архива с кодерпаком. Всё, кодер пак уставлен.
Пункт II. Кодинг.
1) В Eclipse в Proejct Explorer ищем пакет net.minecraft.client.gui из него открываем файл GuiButton.java
2) Едем вниз и видим метод public void drawButton. Заменяем этот метод целиком на этот
Код:
public void drawButton(Minecraft mc, int mx, int my)
    {
        if (this.field_146125_m)
        {
            FontRenderer var4 = mc.fontRenderer;
            mc.getTextureManager().bindTexture(field_146122_a);
            GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
            boolean flag = mx >= this.field_146128_h && my >= this.field_146129_i && mx < this.field_146128_h + this.field_146120_f && my < this.field_146129_i + this.field_146121_g; //Flag, tells if your mouse is hovering the button
            int var5 = this.getHoverState(this.field_146123_n);
            GL11.glEnable(GL11.GL_BLEND);
            OpenGlHelper.glBlendFunc(770, 771, 1, 0);
            GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
            if (flag) // Mouse hovering button
            {
                drawBorderedRect(this.field_146128_h, this.field_146129_i, this.field_146128_h + this.field_146120_f, this.field_146129_i + this.field_146121_g, 1, 0x90FFFFFF, 0x90000000); //Here 0x(some numbers and letters) Html color code - google it
                this.drawCenteredString(var4, this.displayString, this.field_146128_h + this.field_146120_f / 2, this.field_146129_i + (this.field_146121_g - 8) / 2, 0x00FF00);
            }
            else //Mouse not hovering button
            {
                drawBorderedRect(this.field_146128_h, this.field_146129_i, this.field_146128_h + this.field_146120_f, this.field_146129_i + this.field_146121_g, 1, 0x90FFFFFF, 0x60000000);
                drawCenteredString(var4, displayString, this.field_146128_h + this.field_146120_f / 2, this.field_146129_i + (this.field_146121_g - 8) / 2, 0xFFCCCC);
            }
            this.mouseDragged(mc, mx, my);        
        }
    }

и сохраняем результат... Видим ошибку метод drawBorderedRect не определён.
3) Открываем файл Gui.java из этого же пакета после строки 16 вставляем следующий код
Код:
public void drawBorderedRect(int x, int y, int x1, int y1, int size, int borderC, int insideC)
    {
        drawRect(x + size, y + size, x1 - size, y1 - size, insideC);
        drawRect(x + size, y + size, x1, y, borderC);
        drawRect(x, y, x + size, y1, borderC);
        drawRect(x1, y1, x1 - size, y + size, borderC);
        drawRect(x, y1 - size, x1, y1, borderC);
    }
ошибки нет :) запускаем нашу работу и любуемся результатом.
4) Поясняю как изменить цвет текста при наведении мыши на кнопку и прозрачность.
Блок Код (Text). Файл GuiButton.java. Коды цветов HTML
Рассмотрим случай - мышь наведена на кнопку.
Строка 15 из блока с кодом параметр 0x90FFFFFF - толщина границы. 0x90000000 - прозрачность.
Строка 16 параметр 0x00FF00 цвет текста в данном случае зелёный.
Если мышь не наведена на кнопку
То аналогично строки 20 и 21 отвечают за начальный вид кнопки

Собственно вот и всё. Прошу вас поставить мне лойс если этот гайд оказался для вас полезным :).
PS: По поводу этой модификации - это действительно не самое удачное решение. Гораздо удобнее написать мод - но моды я пока писать не умею, так что, если получится, я доработаю этот мод со временем до идеала.
У меня вопрос,можно ли такое сделать в minecraft 1.6.4?
 
Подскажите как?
Руками.
Попробуйте данный метод и на этой версии, я не уверен что там что-то изменилось в плане кнопок.
А вообще можно самому сделать прозрачность просто редактируя gui.png.
 
Пункт III. Бонус. Красивый русский ширифт как на скриншоте.
В общем я оживил мод отсюда, теперь он работает на 1.7.10.
1) Скачайте мой файл FontRenderer.java, и залейте его в пакет net.minecraft.client.gui с заменой.
2) Используйте ресурс пак с пофикшеными текстурами русского шрифта в качестве стандарта. Если вдруг глюкнуло, ну например текстуры шрифта не поменялись, то перезапустите майн в Eclipse.

Собственно вот и всё. Прошу вас поставить мне лойс если этот гайд оказался для вас полезным :).
PS: По поводу этой модификации - это действительно не самое удачное решение. Гораздо удобнее написать мод - но моды я пока писать не умею, так что, если получится, я доработаю этот мод со временем до идеала.

Скинь пожалуйста готовый .class, отвечающий за шрифт.
 
Скинь пожалуйста готовый .class, отвечающий за шрифт.
Этот фикс глючный для русского шрифта, не работает цветной текст и я, пока что, не придумал как поправить это, поэтому скидывать полуфабрикат своего рода я не буду.
 
Этот фикс глючный для русского шрифта, не работает цветной текст и я, пока что, не придумал как поправить это, поэтому скидывать полуфабрикат своего рода я не буду.
BetterFonts. Profit.
 
а какой код для 1.7.2
 
Добавил пояснение как отличается код в различных версиях майна, дабы было меньше вопросов.
 
привет скинь код на 1.6.4
Привет. Кода на 1.6.4 у меня нет. Похимичь с переменными с этим флагом
Код:
boolean flag = mx >= this.xPosition && my >= this.yPosition && mx < this.xPosition + this.width && my < this.yPosition + this.height;
и в этом блоке
Код:
if (flag) // Mouse hovering button
            {
                drawBorderedRect(this.xPosition, this.yPosition, this.xPosition + this.width, this.yPosition + this.height, 1, 0x90FFFFFF, 0x90000000); //Here 0x(some numbers and letters) Html color code - google it
                this.drawCenteredString(var4, this.displayString, this.xPosition + this.width / 2, this.yPosition + (this.height - 8) / 2, 0x00FF00);
            }
            else //Mouse not hovering button
            {
                drawBorderedRect(this.xPosition, this.yPosition, this.xPosition + this.width, this.yPosition + this.height, 1, 0x90FFFFFF, 0x60000000);
                drawCenteredString(var4, displayString, this.xPosition + this.width / 2, this.yPosition + (this.height - 8) / 2, 0xFFCCCC);
            }
и у тебя всё получится.
Просто проследи логику. Тут всё просто.
Выложил фикс ползунков. Жду идеи как сделать их ещё лучше.
 
Назад
Верх