From 7cd51b3d8a77346c797041750e4ad455a03939a2 Mon Sep 17 00:00:00 2001 From: bigguy345 Date: Tue, 6 Aug 2024 21:46:07 +0300 Subject: [PATCH] Fixed bugs that happen on SubGUI closing --- .../npcs/client/gui/util/GuiNPCInterface.java | 545 +++++++++--------- 1 file changed, 285 insertions(+), 260 deletions(-) diff --git a/src/main/java/noppes/npcs/client/gui/util/GuiNPCInterface.java b/src/main/java/noppes/npcs/client/gui/util/GuiNPCInterface.java index a19586e6a..04cceb311 100644 --- a/src/main/java/noppes/npcs/client/gui/util/GuiNPCInterface.java +++ b/src/main/java/noppes/npcs/client/gui/util/GuiNPCInterface.java @@ -23,59 +23,61 @@ import java.net.URI; import java.util.ArrayList; import java.util.HashMap; -public abstract class GuiNPCInterface extends GuiScreen -{ - public EntityClientPlayerMP player; - public boolean drawDefaultBackground = true; - public EntityNPCInterface npc; - protected HashMap buttons = new HashMap(); - protected HashMap topbuttons = new HashMap(); - protected HashMap sidebuttons = new HashMap(); - protected HashMap textfields = new HashMap(); - protected HashMap labels = new HashMap(); - protected HashMap scrolls = new HashMap(); - protected HashMap sliders = new HashMap(); - protected HashMap extra = new HashMap(); +public abstract class GuiNPCInterface extends GuiScreen { + public EntityClientPlayerMP player; + public boolean drawDefaultBackground = true; + public EntityNPCInterface npc; + protected HashMap buttons = new HashMap(); + protected HashMap topbuttons = new HashMap(); + protected HashMap sidebuttons = new HashMap(); + protected HashMap textfields = new HashMap(); + protected HashMap labels = new HashMap(); + protected HashMap scrolls = new HashMap(); + protected HashMap sliders = new HashMap(); + protected HashMap extra = new HashMap(); protected HashMap scrollWindows = new HashMap<>(); - public String title; - private ResourceLocation background = null; - public boolean closeOnEsc = false; - public int guiLeft,guiTop,xSize,ySize; - private SubGuiInterface subgui; - public int mouseX, mouseY, mouseScroll; - public float bgScale = 1; - public float bgScaleX = 1; - public float bgScaleY = 1; - public float bgScaleZ = 1; + public String title; + private ResourceLocation background = null; + public boolean closeOnEsc = false; + public int guiLeft, guiTop, xSize, ySize; + private SubGuiInterface subgui; + public int mouseX, mouseY, mouseScroll; + public float bgScale = 1; + public float bgScaleX = 1; + public float bgScaleY = 1; + public float bgScaleZ = 1; + public long timeClosedSubGui; - public GuiNPCInterface(EntityNPCInterface npc) - { - this.player = Minecraft.getMinecraft().thePlayer; - this.npc = npc; - title = ""; - xSize = 200; - ySize = 222; + public GuiNPCInterface(EntityNPCInterface npc) { + this.player = Minecraft.getMinecraft().thePlayer; + this.npc = npc; + title = ""; + xSize = 200; + ySize = 222; } - public GuiNPCInterface() - { - this(null); + + public GuiNPCInterface() { + this(null); } - public void setBackground(String texture){ - background = new ResourceLocation("customnpcs","textures/gui/" + texture); + + public void setBackground(String texture) { + background = new ResourceLocation("customnpcs", "textures/gui/" + texture); } - public ResourceLocation getResource(String texture){ - return new ResourceLocation("customnpcs","textures/gui/" + texture); + + public ResourceLocation getResource(String texture) { + return new ResourceLocation("customnpcs", "textures/gui/" + texture); } + @Override - public void initGui(){ - super.initGui(); - GuiNpcTextField.unfocus(); - if(subgui != null){ - subgui.setWorldAndResolution(mc, width, height); - subgui.initGui(); - } - guiLeft = (width- xSize)/2; + public void initGui() { + super.initGui(); + GuiNpcTextField.unfocus(); + if (subgui != null) { + subgui.setWorldAndResolution(mc, width, height); + subgui.initGui(); + } + guiLeft = (width - xSize) / 2; guiTop = (height - ySize) / 2; buttonList.clear(); labels.clear(); @@ -88,329 +90,352 @@ public abstract class GuiNPCInterface extends GuiScreen scrollWindows.clear(); Keyboard.enableRepeatEvents(true); } + @Override - public void updateScreen(){ - if(subgui != null) - subgui.updateScreen(); - else{ - for(GuiNpcTextField tf : textfields.values()){ - if(tf.enabled) - tf.updateCursorCounter(); - } - super.updateScreen(); - } + public void updateScreen() { + if (subgui != null) + subgui.updateScreen(); + else { + for (GuiNpcTextField tf : textfields.values()) { + if (tf.enabled) + tf.updateCursorCounter(); + } + super.updateScreen(); + } } - public void addExtra(GuiHoverText gui) { - gui.setWorldAndResolution(mc, 350, 250); - extra.put(gui.id, gui); - } + public void addExtra(GuiHoverText gui) { + gui.setWorldAndResolution(mc, 350, 250); + extra.put(gui.id, gui); + } - public void addScrollableGui(int id, GuiScrollWindow gui){ + public void addScrollableGui(int id, GuiScrollWindow gui) { gui.setWorldAndResolution(mc, width, height); gui.initGui(); scrollWindows.put(id, gui); } - public void mouseClicked(int i, int j, int k) - { - if(subgui != null) - subgui.mouseClicked(i,j,k); - else{ - for(GuiNpcTextField tf : new ArrayList(textfields.values())) - if(tf.enabled) - tf.mouseClicked(i, j, k); + public void mouseClicked(int i, int j, int k) { + if (subgui != null) + subgui.mouseClicked(i, j, k); + else { + for (GuiNpcTextField tf : new ArrayList(textfields.values())) + if (tf.enabled) + tf.mouseClicked(i, j, k); - for(GuiScrollWindow guiScrollableComponent : scrollWindows.values()) { - if(guiScrollableComponent.isMouseOver(i, j)) + for (GuiScrollWindow guiScrollableComponent : scrollWindows.values()) { + if (guiScrollableComponent.isMouseOver(i, j)) guiScrollableComponent.mouseClicked(i, j, k); } - if (k == 0){ - for(GuiCustomScroll scroll : new ArrayList(scrolls.values())){ - scroll.mouseClicked(i, j, k); - } - } - mouseEvent(i,j,k); - super.mouseClicked(i, j, k); - } + if (k == 0) { + for (GuiCustomScroll scroll : new ArrayList(scrolls.values())) { + scroll.mouseClicked(i, j, k); + } + } + mouseEvent(i, j, k); + super.mouseClicked(i, j, k); + } } - public void mouseEvent(int i, int j, int k){}; + public void mouseEvent(int i, int j, int k){} @Override - protected void actionPerformed(GuiButton guibutton) { - if(subgui != null) - subgui.buttonEvent(guibutton); - else{ - buttonEvent(guibutton); - } - } - public void buttonEvent(GuiButton guibutton){}; + protected void actionPerformed(GuiButton guibutton) { + if (subgui != null) + subgui.buttonEvent(guibutton); + else { + buttonEvent(guibutton); + } + } + + public void buttonEvent(GuiButton guibutton){} @Override - public void keyTyped(char c, int i){ - if(subgui != null) - subgui.keyTyped(c,i); - for(GuiNpcTextField tf : textfields.values()) - tf.textboxKeyTyped(c, i); + public void keyTyped(char c, int i) { + if (subgui != null) + subgui.keyTyped(c, i); + for (GuiNpcTextField tf : textfields.values()) + tf.textboxKeyTyped(c, i); - for(GuiScrollWindow guiScrollableComponent : scrollWindows.values()) { + for (GuiScrollWindow guiScrollableComponent : scrollWindows.values()) { guiScrollableComponent.keyTyped(c, i); } - if (closeOnEsc && (i == 1 || !GuiNpcTextField.isFieldActive() && isInventoryKey(i))){ - close(); + //Fixes closing sub with escape closes all of it's parents + boolean enoughTimeSinceSubClosed = Minecraft.getSystemTime() - timeClosedSubGui > 50; + + if (closeOnEsc && enoughTimeSinceSubClosed && (i == 1 || !GuiNpcTextField.isFieldActive() && isInventoryKey(i))) { + close(); } } - public void onGuiClosed(){ - GuiNpcTextField.unfocus(); + + public void onGuiClosed() { + GuiNpcTextField.unfocus(); } - public void close(){ - Keyboard.enableRepeatEvents(false); + + public void close() { + Keyboard.enableRepeatEvents(false); displayGuiScreen(null); mc.setIngameFocus(); save(); } - public void addButton(GuiNpcButton button){ - buttons.put(button.id,button); - buttonList.add(button); + + public void addButton(GuiNpcButton button) { + buttons.put(button.id, button); + buttonList.add(button); } - public void addTopButton(GuiMenuTopButton button){ - topbuttons.put(button.id,button); - buttonList.add(button); + + public void addTopButton(GuiMenuTopButton button) { + topbuttons.put(button.id, button); + buttonList.add(button); } - public void addSideButton(GuiMenuSideButton button){ - sidebuttons.put(button.id,button); - buttonList.add(button); + + public void addSideButton(GuiMenuSideButton button) { + sidebuttons.put(button.id, button); + buttonList.add(button); } - public GuiNpcButton getButton(int i) { - return buttons.get(i); - } - public GuiMenuSideButton getSideButton(int i) { - return sidebuttons.get(i); - } - public GuiMenuTopButton getTopButton(int i) { - return topbuttons.get(i); - } - public void addTextField(GuiNpcTextField tf){ - textfields.put(tf.id,tf); + + public GuiNpcButton getButton(int i) { + return buttons.get(i); } - public GuiNpcTextField getTextField(int i){ - return textfields.get(i); + + public GuiMenuSideButton getSideButton(int i) { + return sidebuttons.get(i); } + + public GuiMenuTopButton getTopButton(int i) { + return topbuttons.get(i); + } + + public void addTextField(GuiNpcTextField tf) { + textfields.put(tf.id, tf); + } + + public GuiNpcTextField getTextField(int i) { + return textfields.get(i); + } + public void addLabel(GuiNpcLabel label) { - labels.put(label.id, label); - } - public GuiNpcLabel getLabel(int i){ - return labels.get(i); + labels.put(label.id, label); + } + + public GuiNpcLabel getLabel(int i) { + return labels.get(i); } public GuiScrollWindow getScrollableGui(int i) { return scrollWindows.get(i); } - public void addSlider(GuiNpcSlider slider){ - sliders.put(slider.id,slider); - buttonList.add(slider); + public void addSlider(GuiNpcSlider slider) { + sliders.put(slider.id, slider); + buttonList.add(slider); } - public GuiNpcSlider getSlider(int i) { - return sliders.get(i); - } - public void addScroll(GuiCustomScroll scroll) { + + public GuiNpcSlider getSlider(int i) { + return sliders.get(i); + } + + public void addScroll(GuiCustomScroll scroll) { scroll.setWorldAndResolution(mc, 350, 250); scrolls.put(scroll.id, scroll); - } - public GuiCustomScroll getScroll(int id){ - return scrolls.get(id); - } + } + + public GuiCustomScroll getScroll(int id) { + return scrolls.get(id); + } public abstract void save(); @Override - public void drawScreen(int i, int j, float f){ - mouseX = i; - mouseY = j; - if(drawDefaultBackground && subgui == null) - drawDefaultBackground(); + public void drawScreen(int i, int j, float f) { + mouseX = i; + mouseY = j; + if (drawDefaultBackground && subgui == null) + drawDefaultBackground(); - if(background != null && mc.renderEngine != null){ - drawBackground(); - } + if (background != null && mc.renderEngine != null) { + drawBackground(); + } boolean subGui = hasSubGui(); drawCenteredString(fontRendererObj, title, width / 2, guiTop + 4, 0xffffff); - for(GuiNpcLabel label : labels.values()) - label.drawLabel(this,fontRendererObj); - for(GuiNpcTextField tf : textfields.values()){ - tf.drawTextBox(i, j); - } - for(GuiCustomScroll scroll : scrolls.values()){ - scroll.updateSubGUI(subGui); - scroll.drawScreen(i, j, f, !subGui && scroll.isMouseOver(i, j)? Mouse.getDWheel():0); + for (GuiNpcLabel label : labels.values()) + label.drawLabel(this, fontRendererObj); + for (GuiNpcTextField tf : textfields.values()) { + tf.drawTextBox(i, j); } - for(GuiScreen gui : extra.values()) - gui.drawScreen(i, j, f); + for (GuiCustomScroll scroll : scrolls.values()) { + scroll.updateSubGUI(subGui); + scroll.drawScreen(i, j, f, !subGui && scroll.isMouseOver(i, j) ? Mouse.getDWheel() : 0); + } + for (GuiScreen gui : extra.values()) + gui.drawScreen(i, j, f); super.drawScreen(i, j, f); - for(GuiCustomScroll scroll : scrolls.values()) - if(scroll.hoverableText){ - scroll.drawHover(i, j); - } - for(GuiNpcButton button : buttons.values()){ + for (GuiCustomScroll scroll : scrolls.values()) + if (scroll.hoverableText) { + scroll.drawHover(i, j); + } + for (GuiNpcButton button : buttons.values()) { button.updateSubGUI(subGui); - if(!button.hoverableText.isEmpty()){ + if (!button.hoverableText.isEmpty()) { button.drawHover(i, j, subGui); } } - for(GuiScrollWindow guiScrollableComponent : scrollWindows.values()){ - guiScrollableComponent.drawScreen(i, j, f, !subGui && guiScrollableComponent.isMouseOver(i,j)?Mouse.getDWheel():0); + for (GuiScrollWindow guiScrollableComponent : scrollWindows.values()) { + guiScrollableComponent.drawScreen(i, j, f, !subGui && guiScrollableComponent.isMouseOver(i, j) ? Mouse.getDWheel() : 0); } - if(subgui != null){ - subgui.drawScreen(i,j,f); + if (subgui != null) { + subgui.drawScreen(i, j, f); } } - protected void drawBackground() { - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - GL11.glPushMatrix(); - GL11.glTranslatef(guiLeft, guiTop, 0); - GL11.glScalef(bgScale*bgScaleX, bgScale*bgScaleY, bgScale*bgScaleZ); - mc.renderEngine.bindTexture(background); - if(xSize > 256){ - drawTexturedModalRect(0, 0, 0, 0, 250, ySize); - drawTexturedModalRect(250, 0, 256 - (xSize - 250), 0, xSize - 250, ySize); - } - else - drawTexturedModalRect(0, 0, 0, 0, xSize, ySize); - GL11.glPopMatrix(); - } + protected void drawBackground() { + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + GL11.glPushMatrix(); + GL11.glTranslatef(guiLeft, guiTop, 0); + GL11.glScalef(bgScale * bgScaleX, bgScale * bgScaleY, bgScale * bgScaleZ); + mc.renderEngine.bindTexture(background); + if (xSize > 256) { + drawTexturedModalRect(0, 0, 0, 0, 250, ySize); + drawTexturedModalRect(250, 0, 256 - (xSize - 250), 0, xSize - 250, ySize); + } else + drawTexturedModalRect(0, 0, 0, 0, xSize, ySize); + GL11.glPopMatrix(); + } protected void drawTextBlock(String text, int x, int y, int lineWidth) { TextBlockClient block = new TextBlockClient(StatCollector.translateToLocal(text), lineWidth, true, player); - for(int line = 0; line < block.lines.size(); line++){ + for (int line = 0; line < block.lines.size(); line++) { String lineText = block.lines.get(line).getFormattedText(); fontRendererObj.drawString(lineText, x, y + (line * fontRendererObj.FONT_HEIGHT), CustomNpcResourceListener.DefaultTextColor); } } - public FontRenderer getFontRenderer() { - return this.fontRendererObj; - } + public FontRenderer getFontRenderer() { + return this.fontRendererObj; + } - public void elementClicked() { - if(subgui != null) - subgui.elementClicked(); - } - @Override - public boolean doesGuiPauseGame(){ + public void elementClicked() { + if (subgui != null) + subgui.elementClicked(); + } + + @Override + public boolean doesGuiPauseGame() { return false; } - public void doubleClicked() { - } - - public boolean isInventoryKey(int i){ - return i == mc.gameSettings.keyBindInventory.getKeyCode(); //inventory key - } - @Override - public void drawDefaultBackground() { - super.drawDefaultBackground(); - } - - public void displayGuiScreen(GuiScreen gui) { - mc.displayGuiScreen(gui); - } - - public void setSubGui(SubGuiInterface gui){ - subgui = gui; - subgui.setWorldAndResolution(mc, width, height); - subgui.parent = this; - initGui(); + public void doubleClicked() { } - public void closeSubGui(SubGuiInterface gui) { - subgui = null; - } - public boolean hasSubGui() { - return subgui != null; - } - public SubGuiInterface getSubGui() { - if(hasSubGui() && subgui.hasSubGui()) - return subgui.getSubGui(); - return subgui; - } - public void drawNpc(int x, int y){ + public boolean isInventoryKey(int i) { + return i == mc.gameSettings.keyBindInventory.getKeyCode(); //inventory key + } + + @Override + public void drawDefaultBackground() { + super.drawDefaultBackground(); + } + + public void displayGuiScreen(GuiScreen gui) { + mc.displayGuiScreen(gui); + } + + public void setSubGui(SubGuiInterface gui) { + subgui = gui; + subgui.setWorldAndResolution(mc, width, height); + subgui.parent = this; + initGui(); + } + + public void closeSubGui(SubGuiInterface gui) { + subgui = null; + timeClosedSubGui = Minecraft.getSystemTime(); + initGui(); + } + + public boolean hasSubGui() { + return subgui != null; + } + + public SubGuiInterface getSubGui() { + if (hasSubGui() && subgui.hasSubGui()) + return subgui.getSubGui(); + return subgui; + } + + public void drawNpc(int x, int y) { drawNpc(npc, x, y, 1, 0); } - public void drawNpc(EntityLivingBase entity, int x, int y, float zoomed, int rotation){ + public void drawNpc(EntityLivingBase entity, int x, int y, float zoomed, int rotation) { EntityNPCInterface npc = null; - if(entity instanceof EntityNPCInterface) + if (entity instanceof EntityNPCInterface) npc = (EntityNPCInterface) entity; - GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); - if(npc != null) + GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); + if (npc != null) npc.isDrawn = true; - GL11.glEnable(GL11.GL_COLOR_MATERIAL); - GL11.glPushMatrix(); - GL11.glTranslatef(guiLeft + x, guiTop + y, 50F); + GL11.glEnable(GL11.GL_COLOR_MATERIAL); + GL11.glPushMatrix(); + GL11.glTranslatef(guiLeft + x, guiTop + y, 50F); float scale = 1; - if(entity.height > 2.4) - scale = 2 / npc.height; + if (entity.height > 2.4) + scale = 2 / npc.height; GL11.glScalef(-30 * scale * zoomed, 30 * scale * zoomed, 30 * scale * zoomed); - GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F); + GL11.glRotatef(180F, 0.0F, 0.0F, 1.0F); - float f2 = entity.renderYawOffset; - float f3 = entity.rotationYaw; - float f4 = entity.rotationPitch; - float f7 = entity.rotationYawHead; - float f5 = (float) (guiLeft + x) - mouseX; + float f2 = entity.renderYawOffset; + float f3 = entity.rotationYaw; + float f4 = entity.rotationPitch; + float f7 = entity.rotationYawHead; + float f5 = (float) (guiLeft + x) - mouseX; float f6 = (float) ((guiTop + y) - 50 * scale * zoomed) - mouseY; int orientation = 0; - if(npc != null){ + if (npc != null) { orientation = npc.ai.orientation; npc.ai.orientation = rotation; } - GL11.glRotatef(135F, 0.0F, 1.0F, 0.0F); - RenderHelper.enableStandardItemLighting(); - GL11.glRotatef(-135F, 0.0F, 1.0F, 0.0F); - GL11.glRotatef(-(float) Math.atan(f6 / 40F) * 20F, 1.0F, 0.0F, 0.0F); + GL11.glRotatef(135F, 0.0F, 1.0F, 0.0F); + RenderHelper.enableStandardItemLighting(); + GL11.glRotatef(-135F, 0.0F, 1.0F, 0.0F); + GL11.glRotatef(-(float) Math.atan(f6 / 40F) * 20F, 1.0F, 0.0F, 0.0F); entity.renderYawOffset = rotation; - entity.rotationYaw = (float)Math.atan(f5 / 80F) * 40F + rotation; + entity.rotationYaw = (float) Math.atan(f5 / 80F) * 40F + rotation; entity.rotationPitch = -(float) Math.atan(f6 / 40F) * 20F; entity.rotationYawHead = entity.rotationYaw; - GL11.glTranslatef(0.0F, entity.yOffset, 0.0F); - RenderManager.instance.playerViewY = 180F; - RenderManager.instance.renderEntityWithPosYaw(entity, 0, 0, 0, 0, 1); + GL11.glTranslatef(0.0F, entity.yOffset, 0.0F); + RenderManager.instance.playerViewY = 180F; + RenderManager.instance.renderEntityWithPosYaw(entity, 0, 0, 0, 0, 1); entity.prevRenderYawOffset = entity.renderYawOffset = f2; entity.prevRotationYaw = entity.rotationYaw = f3; entity.prevRotationPitch = entity.rotationPitch = f4; entity.prevRotationYawHead = entity.rotationYawHead = f7; - if(npc != null){ + if (npc != null) { npc.ai.orientation = orientation; } - GL11.glPopMatrix(); - RenderHelper.disableStandardItemLighting(); - GL11.glDisable(GL12.GL_RESCALE_NORMAL); - if(npc != null) + GL11.glPopMatrix(); + RenderHelper.disableStandardItemLighting(); + GL11.glDisable(GL12.GL_RESCALE_NORMAL); + if (npc != null) npc.isDrawn = false; - OpenGlHelper.setActiveTexture(OpenGlHelper.lightmapTexUnit); - GL11.glDisable(GL11.GL_TEXTURE_2D); - OpenGlHelper.setActiveTexture(OpenGlHelper.defaultTexUnit); - } + OpenGlHelper.setActiveTexture(OpenGlHelper.lightmapTexUnit); + GL11.glDisable(GL11.GL_TEXTURE_2D); + OpenGlHelper.setActiveTexture(OpenGlHelper.defaultTexUnit); + } - public void openLink(String link){ - try{ + public void openLink(String link) { + try { Class oclass = Class.forName("java.awt.Desktop"); - Object object = oclass.getMethod("getDesktop", new Class[0]).invoke((Object)null, new Object[0]); - oclass.getMethod("browse", new Class[] {URI.class}).invoke(object, new Object[] {new URI(link)}); - } - catch (Throwable throwable) - { + Object object = oclass.getMethod("getDesktop", new Class[0]).invoke((Object) null, new Object[0]); + oclass.getMethod("browse", new Class[]{URI.class}).invoke(object, new Object[]{new URI(link)}); + } catch (Throwable throwable) { } } }