diff --git a/src/main/java/codechicken/nei/api/NEIInfo.java b/src/main/java/codechicken/nei/api/NEIInfo.java index a2549cd5..964b0ad4 100644 --- a/src/main/java/codechicken/nei/api/NEIInfo.java +++ b/src/main/java/codechicken/nei/api/NEIInfo.java @@ -5,6 +5,7 @@ import java.util.LinkedList; import net.minecraft.world.World; import codechicken.nei.NEIClientConfig; +import codechicken.nei.config.GuiOptionList; import codechicken.nei.config.OptionCycled; public class NEIInfo { @@ -13,7 +14,8 @@ public class NEIInfo { public static void load(World world) { OptionCycled modeOption = (OptionCycled) NEIClientConfig.getOptionList().getOption("inventory.cheatmode"); - modeOption.parent.synthesizeEnvironment(false); + // kept alive so the WeakReference in Option.slotRef isn't GC'd before copyGlobals/cycle use it + GuiOptionList env = modeOption.parent.synthesizeEnvironment(false); if (!modeOption.optionValid(modeOption.value())) { modeOption.copyGlobals(); modeOption.cycle(); diff --git a/src/main/java/codechicken/nei/config/DataDumper.java b/src/main/java/codechicken/nei/config/DataDumper.java index 918e06cc..ef3f139d 100644 --- a/src/main/java/codechicken/nei/config/DataDumper.java +++ b/src/main/java/codechicken/nei/config/DataDumper.java @@ -93,7 +93,7 @@ public abstract class DataDumper extends Option { public Rectangle4i dumpButtonSize() { int width = 80; - return new Rectangle4i(slot.slotWidth() - width, 0, width, 20); + return new Rectangle4i(getSlot().slotWidth() - width, 0, width, 20); } public Rectangle4i modeButtonSize() { diff --git a/src/main/java/codechicken/nei/config/GuiHighlightTips.java b/src/main/java/codechicken/nei/config/GuiHighlightTips.java index cd37cfe2..6500988a 100644 --- a/src/main/java/codechicken/nei/config/GuiHighlightTips.java +++ b/src/main/java/codechicken/nei/config/GuiHighlightTips.java @@ -64,7 +64,7 @@ public class GuiHighlightTips extends GuiScreenWidget { @Override public void keyTyped(char c, int keycode) { if (keycode == Keyboard.KEY_ESCAPE || keycode == Keyboard.KEY_BACK) { - Minecraft.getMinecraft().displayGuiScreen(opt.slot.getGui()); + Minecraft.getMinecraft().displayGuiScreen(opt.getSlot().getGui()); return; } super.keyTyped(c, keycode); diff --git a/src/main/java/codechicken/nei/config/GuiItemIconDumper.java b/src/main/java/codechicken/nei/config/GuiItemIconDumper.java index b3ad024a..adc06cfe 100644 --- a/src/main/java/codechicken/nei/config/GuiItemIconDumper.java +++ b/src/main/java/codechicken/nei/config/GuiItemIconDumper.java @@ -62,7 +62,7 @@ public class GuiItemIconDumper extends GuiScreen { } private void returnScreen(IChatComponent msg) { - Minecraft.getMinecraft().displayGuiScreen(opt.slot.getGui()); + Minecraft.getMinecraft().displayGuiScreen(opt.getSlot().getGui()); NEIClientUtils.printChatMessage(msg); } diff --git a/src/main/java/codechicken/nei/config/GuiItemSorter.java b/src/main/java/codechicken/nei/config/GuiItemSorter.java index d8f0e78e..e42af183 100644 --- a/src/main/java/codechicken/nei/config/GuiItemSorter.java +++ b/src/main/java/codechicken/nei/config/GuiItemSorter.java @@ -98,7 +98,7 @@ public class GuiItemSorter extends GuiOptionPane { @Override public GuiScreen getParentScreen() { - return opt.slot.getGui(); + return opt.getSlot().getGui(); } @Override diff --git a/src/main/java/codechicken/nei/config/GuiPanelSettings.java b/src/main/java/codechicken/nei/config/GuiPanelSettings.java index 4fd3d5c4..075f25d3 100644 --- a/src/main/java/codechicken/nei/config/GuiPanelSettings.java +++ b/src/main/java/codechicken/nei/config/GuiPanelSettings.java @@ -247,7 +247,7 @@ public class GuiPanelSettings extends GuiScreenWidget { public void keyTyped(char c, int keycode) { if (keycode == Keyboard.KEY_ESCAPE || keycode == Keyboard.KEY_BACK) { - Minecraft.getMinecraft().displayGuiScreen(opt.slot.getGui()); + Minecraft.getMinecraft().displayGuiScreen(opt.getSlot().getGui()); return; } diff --git a/src/main/java/codechicken/nei/config/Option.java b/src/main/java/codechicken/nei/config/Option.java index 89a7e337..5ac7ab82 100644 --- a/src/main/java/codechicken/nei/config/Option.java +++ b/src/main/java/codechicken/nei/config/Option.java @@ -1,5 +1,6 @@ package codechicken.nei.config; +import java.lang.ref.WeakReference; import java.util.List; import net.minecraft.client.Minecraft; @@ -17,7 +18,11 @@ public abstract class Option { .playSound(PositionedSoundRecord.func_147674_a(new ResourceLocation("gui.button.press"), 1.0F)); } - public OptionScrollSlot slot; + private WeakReference slotRef; + + public OptionScrollSlot getSlot() { + return slotRef != null ? slotRef.get() : null; + } public String namespace = null; public final String name; @@ -134,7 +139,7 @@ public abstract class Option { * @return true if the gui is in world config mode */ public boolean worldConfig() { - return slot.getGui().worldConfig(); + return getSlot().getGui().worldConfig(); } /** @@ -189,7 +194,7 @@ public abstract class Option { } public void onAdded(OptionScrollSlot slot) { - this.slot = slot; + this.slotRef = new WeakReference<>(slot); } public void onAdded(OptionList list) { diff --git a/src/main/java/codechicken/nei/config/OptionButton.java b/src/main/java/codechicken/nei/config/OptionButton.java index 40c60ca6..9a83d531 100644 --- a/src/main/java/codechicken/nei/config/OptionButton.java +++ b/src/main/java/codechicken/nei/config/OptionButton.java @@ -57,10 +57,10 @@ public abstract class OptionButton extends Option { } public Rectangle buttonSize() { - if (getPrefix() == null) return new Rectangle(0, 0, slot.slotWidth(), 20); + if (getPrefix() == null) return new Rectangle(0, 0, getSlot().slotWidth(), 20); int width = Math.max(60, getStringWidth(getButtonText()) + 8); - return new Rectangle(slot.slotWidth() - width, 0, width, 20); + return new Rectangle(getSlot().slotWidth() - width, 0, width, 20); } public String getPrefix() { diff --git a/src/main/java/codechicken/nei/config/OptionKeyBind.java b/src/main/java/codechicken/nei/config/OptionKeyBind.java index 3602beb7..9ed27dad 100644 --- a/src/main/java/codechicken/nei/config/OptionKeyBind.java +++ b/src/main/java/codechicken/nei/config/OptionKeyBind.java @@ -85,7 +85,7 @@ public class OptionKeyBind extends OptionButton { return false; } - for (Option o : slot.options) { + for (Option o : getSlot().options) { if (o instanceof OptionKeyBind && o != this && ((OptionKeyBind) o).getValue() == keyboard) { return true; } diff --git a/src/main/java/codechicken/nei/config/OptionList.java b/src/main/java/codechicken/nei/config/OptionList.java index 468db24e..4e5bc19a 100644 --- a/src/main/java/codechicken/nei/config/OptionList.java +++ b/src/main/java/codechicken/nei/config/OptionList.java @@ -131,13 +131,15 @@ public class OptionList extends OptionButton { /** * Adds this option to a temporary slot and gui for internal setting manipulation. */ - public void synthesizeEnvironment(boolean world) { - getGui(null, this, world).addWidgets(); + public GuiOptionList synthesizeEnvironment(boolean world) { + GuiOptionList gui = getGui(null, this, world); + gui.addWidgets(); + return gui; } @Override public boolean onClick(int button) { - openGui(slot.getGui(), slot.getGui().worldConfig()); + openGui(getSlot().getGui(), getSlot().getGui().worldConfig()); return true; } diff --git a/src/main/java/codechicken/nei/config/OptionStringSet.java b/src/main/java/codechicken/nei/config/OptionStringSet.java index 9afa3196..43b8031a 100644 --- a/src/main/java/codechicken/nei/config/OptionStringSet.java +++ b/src/main/java/codechicken/nei/config/OptionStringSet.java @@ -131,6 +131,6 @@ public abstract class OptionStringSet extends Option { } public int buttonX() { - return slot.slotWidth() - (24 * options.size() - 4); + return getSlot().slotWidth() - (24 * options.size() - 4); } } diff --git a/src/main/java/codechicken/nei/config/OptionTextField.java b/src/main/java/codechicken/nei/config/OptionTextField.java index f249847b..67c7ee30 100644 --- a/src/main/java/codechicken/nei/config/OptionTextField.java +++ b/src/main/java/codechicken/nei/config/OptionTextField.java @@ -53,7 +53,7 @@ public class OptionTextField extends Option { } protected int getMaxInputWidth() { - return slot.slotWidth(); + return getSlot().slotWidth(); } public boolean isEnabled() { @@ -64,9 +64,10 @@ public class OptionTextField extends Option { public void draw(int mousex, int mousey, float frame) { GuiDraw.drawString(getPrefix(), 10, 6, -1); - textField.w = Math - .max(60, Math.min(getMaxInputWidth(), slot.slotWidth() - GuiDraw.getStringWidth(getPrefix())) - 16); - textField.x = slot.slotWidth() - textField.w; + textField.w = Math.max( + 60, + Math.min(getMaxInputWidth(), getSlot().slotWidth() - GuiDraw.getStringWidth(getPrefix())) - 16); + textField.x = getSlot().slotWidth() - textField.w; textField.draw(mousex, mousey); } diff --git a/src/main/java/codechicken/nei/config/preset/GuiPresetList.java b/src/main/java/codechicken/nei/config/preset/GuiPresetList.java index 2c7544a6..cbd42bb0 100644 --- a/src/main/java/codechicken/nei/config/preset/GuiPresetList.java +++ b/src/main/java/codechicken/nei/config/preset/GuiPresetList.java @@ -253,7 +253,7 @@ public class GuiPresetList extends GuiOptionPane { @Override public GuiScreen getParentScreen() { - return opt.slot.getGui(); + return opt.getSlot().getGui(); } @Override