diff --git a/src/hdskins/java/com/voxelmodpack/hdskins/gui/GLWindow.java b/src/hdskins/java/com/voxelmodpack/hdskins/gui/GLWindow.java index 794c678d..6a83a618 100644 --- a/src/hdskins/java/com/voxelmodpack/hdskins/gui/GLWindow.java +++ b/src/hdskins/java/com/voxelmodpack/hdskins/gui/GLWindow.java @@ -44,9 +44,11 @@ public class GLWindow extends DropTarget { return instance; } - public static void refresh(boolean fullscreen) { - if (instance != null) { - instance.onRefresh(fullscreen); + public static void create() { + try { + current().open(); + } catch (LWJGLException e) { + throw new RuntimeException(e); } } @@ -74,12 +76,11 @@ public class GLWindow extends DropTarget { private boolean isFullscreen; + private boolean ready = false; + private boolean closeRequested = false; + private GLWindow() { - try { - open(); - } catch (LWJGLException e) { - throw new RuntimeException(e); - } + } private void open() throws LWJGLException { @@ -100,7 +101,10 @@ public class GLWindow extends DropTarget { frame.addWindowListener(new WindowAdapter() { @Override public void windowClosed(WindowEvent windowEvent) { - mc.shutdown(); + if (!closeRequested) { + mc.shutdown(); + } + closeRequested = false; } @Override @@ -139,9 +143,13 @@ public class GLWindow extends DropTarget { Display.setParent(canvas); Display.setFullscreen(isFullscreen); + + ready = true; } private void close() { + closeRequested = true; + try { Display.setParent(null); } catch (LWJGLException e) { @@ -196,8 +204,8 @@ public class GLWindow extends DropTarget { canvas.setBounds(0, 0, frame.getContentPane().getWidth(), frame.getContentPane().getHeight()); } - private void onRefresh(boolean fullscreen) { - if (fullscreen != isFullscreen) { + public void refresh(boolean fullscreen) { + if (ready && fullscreen != isFullscreen) { // Repaint the canvas, not the window. // The former strips the window of its state. The latter fixes a viewport scaling bug. canvas.setBounds(0, 0, 0, 0); @@ -207,7 +215,7 @@ public class GLWindow extends DropTarget { } public void clearDropTargetListener() { - if (dropListener != null) { + if (ready && dropListener != null) { removeDropTargetListener(dropListener); dropListener = null; frame.setDropTarget(null); @@ -215,6 +223,10 @@ public class GLWindow extends DropTarget { } public void setDropTargetListener(DropTargetListener dtl) { + if (!ready) { + return; + } + clearDropTargetListener(); dropListener = dtl; diff --git a/src/hdskins/java/com/voxelmodpack/hdskins/gui/HDSkinsConfigPanel.java b/src/hdskins/java/com/voxelmodpack/hdskins/gui/HDSkinsConfigPanel.java index 664aa5c8..06d24a48 100644 --- a/src/hdskins/java/com/voxelmodpack/hdskins/gui/HDSkinsConfigPanel.java +++ b/src/hdskins/java/com/voxelmodpack/hdskins/gui/HDSkinsConfigPanel.java @@ -1,8 +1,12 @@ package com.voxelmodpack.hdskins.gui; +import com.mumfrey.liteloader.client.gui.GuiCheckbox; +import com.mumfrey.liteloader.core.LiteLoader; import com.mumfrey.liteloader.modconfig.ConfigPanel; import com.mumfrey.liteloader.modconfig.ConfigPanelHost; import com.voxelmodpack.hdskins.HDSkinManager; +import com.voxelmodpack.hdskins.mod.LiteModHDSkinsMod; + import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiButton; @@ -10,21 +14,45 @@ public class HDSkinsConfigPanel implements ConfigPanel { private GuiButton button; + private GuiCheckbox checkbox; + + private LiteModHDSkinsMod mod; + @Override public void onPanelShown(ConfigPanelHost host) { - this.button = new GuiButton(0, 40, 10, 100, 20, "Clear Skin Cache"); + this.mod = LiteLoader.getInstance().getMod(LiteModHDSkinsMod.class); + this.button = new GuiButton(0, 40, 70, 100, 20, "Clear Skin Cache"); + this.checkbox = new GuiCheckbox(1, 40, 40, "Experimental Skin Drop"); + + this.checkbox.checked = mod.experimentalSkinDrop; } @Override public void drawPanel(ConfigPanelHost host, int mouseX, int mouseY, float partialTicks) { - this.button.drawButton(Minecraft.getMinecraft(), mouseX, mouseY, partialTicks); + Minecraft mc = Minecraft.getMinecraft(); + + this.button.drawButton(mc, mouseX, mouseY, partialTicks); + this.checkbox.drawButton(mc, mouseX, mouseY, partialTicks); } @Override public void mousePressed(ConfigPanelHost host, int mouseX, int mouseY, int mouseButton) { - if (button.mousePressed(Minecraft.getMinecraft(), mouseX, mouseY)) { + Minecraft mc = Minecraft.getMinecraft(); + + if (button.mousePressed(mc, mouseX, mouseY)) { HDSkinManager.clearSkinCache(); + } else if (checkbox.mousePressed(mc, mouseX, mouseY)) { + checkbox.checked = !checkbox.checked; + mod.experimentalSkinDrop = checkbox.checked; + + LiteLoader.getInstance().writeConfig(mod); + + if (mod.experimentalSkinDrop) { + GLWindow.create(); + } else { + GLWindow.dispose(); + } } } diff --git a/src/hdskins/java/com/voxelmodpack/hdskins/mod/LiteModHDSkinsMod.java b/src/hdskins/java/com/voxelmodpack/hdskins/mod/LiteModHDSkinsMod.java index 52de53f1..531ff5cb 100644 --- a/src/hdskins/java/com/voxelmodpack/hdskins/mod/LiteModHDSkinsMod.java +++ b/src/hdskins/java/com/voxelmodpack/hdskins/mod/LiteModHDSkinsMod.java @@ -27,6 +27,9 @@ public class LiteModHDSkinsMod implements HDSkinsMod { @Expose public List skin_servers = SkinServer.defaultServers; + @Expose + public boolean experimentalSkinDrop = true; + @Override public String getName() { return "HD Skins"; @@ -57,7 +60,9 @@ public class LiteModHDSkinsMod implements HDSkinsMod { IReloadableResourceManager irrm = (IReloadableResourceManager) Minecraft.getMinecraft().getResourceManager(); irrm.registerReloadListener(HDSkinManager.INSTANCE); - GLWindow.current(); + if (experimentalSkinDrop) { + GLWindow.create(); + } } @Override @@ -92,6 +97,6 @@ public class LiteModHDSkinsMod implements HDSkinsMod { @Override public void onFullScreenToggled(boolean fullScreen) { - GLWindow.refresh(fullScreen); + GLWindow.current().refresh(fullScreen); } }