package im.expensive.ui.mainmenu;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.platform.GlStateManager;
import im.expensive.Expensive;
import im.expensive.utils.client.ClientUtil;
import im.expensive.utils.client.IMinecraft;
import im.expensive.utils.client.Vec2i;
import im.expensive.utils.math.MathUtil;
import im.expensive.utils.render.ColorUtils;
import im.expensive.utils.render.DisplayUtils;
import im.expensive.utils.render.KawaseBlur;
import im.expensive.utils.render.Stencil;
import im.expensive.utils.render.font.Fonts;
import lombok.AllArgsConstructor;
import lombok.Getter;
import net.minecraft.client.MainWindow;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.screen.MultiplayerScreen;
import net.minecraft.client.gui.screen.OptionsScreen;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.gui.screen.WorldSelectionScreen;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.text.ITextComponent;
import java.util.ArrayList;
import java.util.List;
public class MainScreen extends Screen implements IMinecraft {
private final ResourceLocation backmenu = new ResourceLocation("expensive/images/backmenu.png");
private final List<Button> buttons = new ArrayList<>();
public MainScreen() {
super(ITextComponent.getTextComponentOrEmpty(""));
}
@Override
public void init(Minecraft minecraft, int width, int height) {
super.init(minecraft, width, height);
buttons.clear();
float buttonWidth = 130;
float buttonHeight = 30;
float spacing = 6;
MainWindow window = mc.getMainWindow();
int w = ClientUtil.calc(window.getScaledWidth());
int h = ClientUtil.calc(window.getScaledHeight());
float x = w - buttonWidth - 16;
float y = h - (buttonHeight + spacing) * 4 - 16;
buttons.add(new Button(x, y, buttonWidth, buttonHeight, "Singleplayer", () -> mc.displayGuiScreen(new WorldSelectionScreen(this))));
y += buttonHeight + spacing;
buttons.add(new Button(x, y, buttonWidth, buttonHeight, "Multiplayer", () -> mc.displayGuiScreen(new MultiplayerScreen(this))));
y += buttonHeight + spacing;
buttons.add(new Button(x, y, buttonWidth, buttonHeight, "Options", () -> mc.displayGuiScreen(new OptionsScreen(this, mc.gameSettings))));
y += buttonHeight + spacing;
buttons.add(new Button(x, y, buttonWidth, buttonHeight, "Exit", mc::shutdownMinecraftApplet));
}
@Override
public void render(MatrixStack matrixStack, int mouseX, int mouseY, float partialTicks) {
MainWindow window = mc.getMainWindow();
int w = ClientUtil.calc(window.getScaledWidth());
int h = ClientUtil.calc(window.getScaledHeight());
DisplayUtils.drawImage(backmenu, 0, 0, w, h, -1);
KawaseBlur.blur.updateBlur(5.0f, 3);
for (Button button : buttons) {
button.render(matrixStack, mouseX, mouseY);
}
Expensive.getInstance().getAltWidget().render(matrixStack, mouseX, mouseY);
}
@Override
public boolean mouseClicked(double mouseX, double mouseY, int button) {
Vec2i fixed = ClientUtil.getMouse((int) mouseX, (int) mouseY);
buttons.forEach(b -> b.click(fixed.getX(), fixed.getY(), button));
Expensive.getInstance().getAltWidget().click(fixed.getX(), fixed.getY(), button);
return true;
}
@Override
public boolean mouseScrolled(double mouseX, double mouseY, double delta) {
Expensive.getInstance().getAltWidget().updateScroll((int) mouseX, (int) mouseY, (float) delta);
return true;
}
@Override
public boolean charTyped(char codePoint, int modifiers) {
Expensive.getInstance().getAltWidget().onChar(codePoint);
return true;
}
@Override
public boolean keyPressed(int keyCode, int scanCode, int modifiers) {
Expensive.getInstance().getAltWidget().onKey(keyCode);
return true;
}
@AllArgsConstructor
private class Button {
@Getter private final float x, y, width, height;
private final String text;
private final Runnable action;
public void render(MatrixStack stack, int mouseX, int mouseY) {
boolean hovered = MathUtil.isHovered(mouseX, mouseY, x, y, width, height);
Stencil.initStencilToWrite();
DisplayUtils.drawRoundedRect(x, y, width, height, 5, ColorUtils.rgb(255, 255, 255));
Stencil.readStencilBuffer(1);
KawaseBlur.blur.BLURRED.draw();
Stencil.uninitStencilBuffer();
DisplayUtils.drawRoundedRect(x, y, width, height, 5, ColorUtils.rgba(0, 0, 0, hovered ? 210 : 180));
int color = hovered ? ColorUtils.rgb(255, 255, 255) : ColorUtils.rgb(210, 210, 210);
Fonts.montserrat.drawCenteredText(stack, text, x + width / 2f, y + height / 2f - 4.5f, color, 9f);
}
public void click(int mouseX, int mouseY, int button) {
if (MathUtil.isHovered(mouseX, mouseY, x, y, width, height)) {
action.run();
}
}
}
}