/*
* Dungeons Guide - The most intelligent Hypixel Skyblock Dungeons Mod
* Copyright (C) 2021 cyoung06
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published
* by the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see .
*/
package kr.syeyoung.dungeonsguide.gui;
import kr.syeyoung.dungeonsguide.gui.elements.MRootPanel;
import kr.syeyoung.dungeonsguide.utils.cursor.EnumCursor;
import kr.syeyoung.dungeonsguide.utils.cursor.GLCursors;
import lombok.Getter;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.gui.ScaledResolution;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.util.Tuple;
import org.lwjgl.LWJGLException;
import org.lwjgl.input.Keyboard;
import org.lwjgl.input.Mouse;
import org.lwjgl.opengl.GL11;
import java.awt.*;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class MGui extends GuiScreen {
@Getter
private final MRootPanel mainPanel = new MRootPanel();
private boolean isOpen = false;
public MGui(){
try {
Mouse.setNativeCursor(GLCursors.getCursor(EnumCursor.DEFAULT));
} catch (Throwable e) {
e.printStackTrace();
}
}
@Override
public void initGui() {
super.initGui();
isOpen = true;
ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft());
mainPanel.setBounds(new Rectangle(0,0,Minecraft.getMinecraft().displayWidth,Minecraft.getMinecraft().displayHeight));
}
@Override
public void drawScreen(int mouseX, int mouseY, float partialTicks) {
try {
int i = Mouse.getEventX();
int j = this.mc.displayHeight - Mouse.getEventY();
ScaledResolution scaledResolution = new ScaledResolution(Minecraft.getMinecraft());
GlStateManager.pushMatrix();
GlStateManager.disableDepth();
GlStateManager.enableBlend();
GlStateManager.enableAlpha();
GlStateManager.tryBlendFuncSeparate(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA, 1, 0);
GlStateManager.color(1, 1, 1, 1);
GlStateManager.scale(1.0/scaledResolution.getScaleFactor(), 1.0/scaledResolution.getScaleFactor(), 1.0d);
mainPanel.render0(1, new Point(0,0), new Rectangle(0,0,Minecraft.getMinecraft().displayWidth, Minecraft.getMinecraft().displayHeight), i, j, i, j, partialTicks);
GlStateManager.popMatrix();
GlStateManager.enableBlend();
GlStateManager.enableDepth();
} catch (Throwable e) {
e.printStackTrace();
}
GL11.glDisable(GL11.GL_SCISSOR_TEST);
}
@Override
public void keyTyped(char typedChar, int keyCode) throws IOException {
try {
mainPanel.keyPressed0(typedChar, keyCode);
super.keyTyped(typedChar, keyCode);
} catch (Throwable e) {
if (e.getMessage() == null || !e.getMessage().contains("hack to stop"))
e.printStackTrace();
}
}
public void keyHeld(int keyCode, char typedChar, long heldMS) throws IOException {
try {
mainPanel.keyHeld0(typedChar, keyCode, heldMS);
} catch (Throwable e) {
if (e.getMessage() == null || !e.getMessage().contains("hack to stop"))
e.printStackTrace();
}
}
public void keyReleased(int keyCode, char typedChar,long heldMS) throws IOException {
try {
mainPanel.keyReleased0(typedChar, keyCode, heldMS);
} catch (Throwable e) {
if (e.getMessage() == null || !e.getMessage().contains("hack to stop"))
e.printStackTrace();
}
}
@Override
public void mouseClicked(int mouseX, int mouseY, int mouseButton) throws IOException {
try {
super.mouseClicked(mouseX, mouseY, mouseButton);
mainPanel.mouseClicked0(mouseX, mouseY
,mouseX, mouseY, mouseButton);
} catch (Throwable e) {
if (e.getMessage() == null || !e.getMessage().contains("hack to stop"))
e.printStackTrace();
}
}
@Override
public void onGuiClosed() {
super.onGuiClosed();
isOpen = false;
keyLastPressed.clear();
try {
Mouse.setNativeCursor(null);
mainPanel.setCursor(EnumCursor.DEFAULT);
} catch (LWJGLException e) {
e.printStackTrace();
}
}
@Override
public void mouseReleased(int mouseX, int mouseY, int state) {
try {
mainPanel.mouseReleased0(mouseX, mouseY
,mouseX,mouseY , state);
} catch (Throwable e) {
if (e.getMessage() == null || !e.getMessage().contains("hack to stop"))
e.printStackTrace();
}
}
@Override
public void mouseClickMove(int mouseX, int mouseY, int clickedMouseButton, long timeSinceLastClick) {
try {
mainPanel.mouseClickMove0(mouseX, mouseY
,mouseX ,mouseY, clickedMouseButton, timeSinceLastClick);
} catch (Throwable e) {
if (e.getMessage() == null || !e.getMessage().contains("hack to stop"))
e.printStackTrace();
}
}
public void mouseMove(int mouseX, int mouseY) {
try {
mainPanel.mouseMoved0(mouseX, mouseY
,mouseX ,mouseY);
} catch (Throwable e) {
if (e.getMessage() == null || !e.getMessage().contains("hack to stop"))
e.printStackTrace();
}
}
private int touchValue;
private int eventButton;
private long lastMouseEvent;
private int lastX, lastY;
@Override
public void handleMouseInput() throws IOException {
if (!isOpen) return;
try {
int i = Mouse.getEventX();
int j = this.mc.displayHeight - Mouse.getEventY();
int k = Mouse.getEventButton();
if (Mouse.getEventButtonState())
{
if (this.mc.gameSettings.touchscreen && this.touchValue++ > 0)
{
return;
}
this.eventButton = k;
this.lastMouseEvent = Minecraft.getSystemTime();
this.mouseClicked(i, j, this.eventButton);
}
else if (k != -1)
{
if (this.mc.gameSettings.touchscreen && --this.touchValue > 0)
{
return;
}
this.eventButton = -1;
this.mouseReleased(i, j, k);
}
else if (this.eventButton != -1 && this.lastMouseEvent > 0L)
{
long l = Minecraft.getSystemTime() - this.lastMouseEvent;
this.mouseClickMove(i, j, this.eventButton, l);
}
if (lastX != i || lastY != j) {
try {
EnumCursor prevCursor = mainPanel.getCurrentCursor();
mainPanel.setCursor(EnumCursor.DEFAULT);
this.mouseMove(i, j);
EnumCursor newCursor = mainPanel.getCurrentCursor();
if (prevCursor != newCursor) Mouse.setNativeCursor(GLCursors.getCursor(newCursor));
} catch (Throwable e) {
if (e.getMessage() == null || !e.getMessage().contains("hack to stop"))
e.printStackTrace();
}
}
int wheel = Mouse.getEventDWheel();
if (wheel != 0) {
mainPanel.mouseScrolled0(i, j,i,j, wheel);
}
lastX = i;
lastY = j;
} catch (Throwable e) {
e.printStackTrace();
}
}
private Map> keyLastPressed = new HashMap<>();
public void handleKeyboardInput() throws IOException
{
if (!isOpen) return;
if (Keyboard.getEventKeyState())
{
keyLastPressed.put(Keyboard.getEventKey(), new Tuple<>(Keyboard.getEventCharacter(), System.currentTimeMillis()));
this.keyTyped(Keyboard.getEventCharacter(), Keyboard.getEventKey());
} else {
Tuple val = keyLastPressed.remove(Keyboard.getEventKey());
if (val != null) this.keyReleased(Keyboard.getEventKey(), val.getFirst(), val.getSecond());
}
this.mc.dispatchKeypresses();
}
@Override
public void handleInput() throws IOException {
super.handleInput();
long currentTime = System.currentTimeMillis();
for (Map.Entry> integerLongEntry : keyLastPressed.entrySet()) {
this.keyHeld(integerLongEntry.getKey(), integerLongEntry.getValue().getFirst(), integerLongEntry.getValue().getSecond());
}
}
}