diff --git a/build/build.properties b/build/build.properties index 87de3555..3755adf8 100644 --- a/build/build.properties +++ b/build/build.properties @@ -1,5 +1,5 @@ mc_version=1.7.10 forge_version=10.13.0.1151 ccl_version=1.1.1.96 -ccc_version=1.0.2.+ -mod_version=1.0.2 +ccc_version=1.0.3.+ +mod_version=1.0.3 diff --git a/resources/assets/nei/textures/patreonNeon.png b/resources/assets/nei/textures/patreonNeon.png new file mode 100644 index 00000000..c069e36f Binary files /dev/null and b/resources/assets/nei/textures/patreonNeon.png differ diff --git a/resources/neimod.info b/resources/neimod.info index 60bcb652..639e0f50 100644 --- a/resources/neimod.info +++ b/resources/neimod.info @@ -1,13 +1,17 @@ -[ +[ { "modid": "NotEnoughItems", "name": "Not Enough Items", "version": "${version}", "mcversion": "${mc_version}", - "description": "Recipe Viewer, Inventory Manager, Item Spawner, Cheats and more.", + "description": "Recipe Viewer, Inventory Manager, Item Spawner, Cheats and more. + +$plugins + +§bSupporters:", "url": "http://www.minecraftforum.net/topic/909223", - "credits": "Alexandria - Original Idea", - "authors": [ "ChickenBones" ], + "credits": "Alexandria - original idea", + "authorList": [ "ChickenBones" ], "dependencies": [ "CodeChickenCore" ] diff --git a/src/codechicken/nei/ClientHandler.java b/src/codechicken/nei/ClientHandler.java index d751b9b8..5428aa8a 100644 --- a/src/codechicken/nei/ClientHandler.java +++ b/src/codechicken/nei/ClientHandler.java @@ -1,6 +1,7 @@ package codechicken.nei; import codechicken.core.ClientUtils; +import codechicken.core.GuiModListScroll; import codechicken.lib.packet.PacketCustom; import codechicken.nei.api.API; import codechicken.nei.api.ItemInfo; @@ -115,6 +116,7 @@ public class ClientHandler public static void load() { instance = new ClientHandler(); + GuiModListScroll.register("NotEnoughItems"); PacketCustom.assignHandler(NEICPH.channel, new NEICPH()); FMLCommonHandler.instance().bus().register(instance); MinecraftForge.EVENT_BUS.register(instance); diff --git a/src/codechicken/nei/ItemList.java b/src/codechicken/nei/ItemList.java index c8131d78..c868e29c 100644 --- a/src/codechicken/nei/ItemList.java +++ b/src/codechicken/nei/ItemList.java @@ -22,23 +22,17 @@ public class ItemList /** * Fields are replaced atomically and contents never modified. */ - public static List items = new ArrayList(); + public static volatile List items = new ArrayList(); /** * Fields are replaced atomically and contents never modified. */ - public static ListMultimap itemMap = ArrayListMultimap.create(); + public static volatile ListMultimap itemMap = ArrayListMultimap.create(); /** * Updates to this should be synchronised on this */ public static final List itemFilterers = new LinkedList(); public static final List loadCallbacks = new LinkedList(); - private static boolean loading = false; - private static boolean reload = false; - - private static boolean filtering = false; - private static boolean refilter = false; - private static HashSet erroredItems = new HashSet(); private static HashSet stackTraces = new HashSet(); diff --git a/src/codechicken/nei/ItemPanel.java b/src/codechicken/nei/ItemPanel.java index 7e50e163..e936d2c1 100644 --- a/src/codechicken/nei/ItemPanel.java +++ b/src/codechicken/nei/ItemPanel.java @@ -17,6 +17,9 @@ import static codechicken.lib.gui.GuiDraw.drawRect; public class ItemPanel extends Widget { + /** + * Should not be externally modified, use updateItemList + */ public static ArrayList items = new ArrayList(); /** * Swapped into visible items on update diff --git a/src/codechicken/nei/LayoutManager.java b/src/codechicken/nei/LayoutManager.java index 62c10b3c..61d4c886 100644 --- a/src/codechicken/nei/LayoutManager.java +++ b/src/codechicken/nei/LayoutManager.java @@ -272,7 +272,7 @@ public class LayoutManager implements IContainerInputHandler, IContainerTooltipH @Override public boolean onButtonPress(boolean rightclick) { if (!rightclick) { - getOptionList().showGui(getGuiContainer()); + getOptionList().openGui(getGuiContainer(), false); return true; } return false; diff --git a/src/codechicken/nei/NEIClientConfig.java b/src/codechicken/nei/NEIClientConfig.java index e927228f..049f75a3 100644 --- a/src/codechicken/nei/NEIClientConfig.java +++ b/src/codechicken/nei/NEIClientConfig.java @@ -9,6 +9,7 @@ import codechicken.nei.config.*; import codechicken.nei.recipe.RecipeInfo; import codechicken.obfuscator.ObfuscationRun; import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; @@ -151,16 +152,26 @@ public class NEIClientConfig } private static void linkOptionList() { - getOptionList().bindConfig(new IConfigSetHolder() + OptionList.setOptionList(new OptionList("nei.options") { + @Override + public ConfigSet globalConfigSet() { + return global; + } + @Override public ConfigSet worldConfigSet() { return world; } @Override - public ConfigSet globalConfigSet() { - return global; + public OptionList configBase() { + return this; + } + + @Override + public GuiOptionList getGui(GuiScreen parent, OptionList list, boolean world) { + return new GuiNEIOptionList(parent, list, world); } }); } diff --git a/src/codechicken/nei/NEIModContainer.java b/src/codechicken/nei/NEIModContainer.java index f0ae99cc..e7acea8c 100644 --- a/src/codechicken/nei/NEIModContainer.java +++ b/src/codechicken/nei/NEIModContainer.java @@ -28,7 +28,7 @@ public class NEIModContainer extends DummyModContainer public NEIModContainer() { super(MetadataCollection.from(MetadataCollection.class.getResourceAsStream("/neimod.info"), "NotEnoughItems").getMetadataForId("NotEnoughItems", null)); - getMetadata(); + loadMetadata(); } @Override @@ -43,24 +43,29 @@ public class NEIModContainer extends DummyModContainer return new LinkedList(getRequirements()); } + private String description; + private void loadMetadata() { + description = super.getMetadata().description; + } + @Override public ModMetadata getMetadata() { - ModMetadata meta = super.getMetadata(); - meta.description = "Recipe Viewer, Inventory Manager, Item Spawner, Cheats and more.\n"+ EnumChatFormatting.WHITE+"\n"; - + String s_plugins = ""; if (plugins.size() == 0) { - meta.description += EnumChatFormatting.RED+"No installed plugins."; + s_plugins += EnumChatFormatting.RED+"No installed plugins."; } else { - meta.description += EnumChatFormatting.GREEN+"Installed plugins: "; + s_plugins += EnumChatFormatting.GREEN+"Installed plugins: "; for (int i = 0; i < plugins.size(); i++) { if (i > 0) - meta.description += ", "; + s_plugins += ", "; IConfigureNEI plugin = plugins.get(i); - meta.description += plugin.getName() + " " + plugin.getVersion(); + s_plugins += plugin.getName() + " " + plugin.getVersion(); } - meta.description += "."; + s_plugins += "."; } + ModMetadata meta = super.getMetadata(); + meta.description = description.replace("$plugins", s_plugins); return meta; } diff --git a/src/codechicken/nei/NEIServerConfig.java b/src/codechicken/nei/NEIServerConfig.java index 13395123..2409e85b 100644 --- a/src/codechicken/nei/NEIServerConfig.java +++ b/src/codechicken/nei/NEIServerConfig.java @@ -193,7 +193,7 @@ public class NEIServerConfig continue; int delim = s.lastIndexOf('='); if(delim < 0) { - System.err.println("line "+line+": Missing ="); + logger.error("line "+line+": Missing ="); continue; } try { @@ -203,7 +203,7 @@ public class NEIServerConfig values.add(s2.trim()); bannedItems.put(InventoryUtils.loadPersistant(key), values); } catch (Exception e) { - System.err.println("line "+line+": "+e.getMessage()); + logger.error("line "+line+": "+e.getMessage()); } } r.close(); diff --git a/src/codechicken/nei/api/NEIInfo.java b/src/codechicken/nei/api/NEIInfo.java index 561145eb..77898df7 100644 --- a/src/codechicken/nei/api/NEIInfo.java +++ b/src/codechicken/nei/api/NEIInfo.java @@ -12,7 +12,7 @@ public class NEIInfo public static void load(World world) { OptionCycled modeOption = (OptionCycled) NEIClientConfig.getOptionList().getOption("inventory.cheatmode"); - modeOption.parent.synthesizeEnvironment(); + modeOption.parent.synthesizeEnvironment(false); if(!modeOption.optionValid(modeOption.value())) { modeOption.copyGlobals(); modeOption.cycle(); diff --git a/src/codechicken/nei/config/DataDumper.java b/src/codechicken/nei/config/DataDumper.java index cb42651c..f97565d2 100644 --- a/src/codechicken/nei/config/DataDumper.java +++ b/src/codechicken/nei/config/DataDumper.java @@ -3,6 +3,7 @@ package codechicken.nei.config; import codechicken.core.CommonUtils; import codechicken.lib.vec.Rectangle4i; import codechicken.nei.LayoutManager; +import codechicken.nei.NEIClientConfig; import codechicken.nei.NEIClientUtils; import net.minecraft.util.ChatComponentTranslation; import net.minecraft.util.IChatComponent; @@ -41,8 +42,7 @@ public abstract class DataDumper extends Option NEIClientUtils.printChatMessage(dumpMessage(file)); } catch (Exception e) { - System.err.println("Error dumping " + renderName() + " mode: " + getMode()); - e.printStackTrace(); + NEIClientConfig.logger.error("Error dumping " + renderName() + " mode: " + getMode(), e); } } diff --git a/src/codechicken/nei/config/GuiNEIOptionList.java b/src/codechicken/nei/config/GuiNEIOptionList.java new file mode 100644 index 00000000..4bb6dcb0 --- /dev/null +++ b/src/codechicken/nei/config/GuiNEIOptionList.java @@ -0,0 +1,54 @@ +package codechicken.nei.config; + +import codechicken.core.gui.GuiCCButton; +import codechicken.nei.NEIClientConfig; +import net.minecraft.client.gui.GuiConfirmOpenLink; +import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.gui.GuiYesNoCallback; + +import java.awt.*; +import java.net.URI; + +public class GuiNEIOptionList extends GuiOptionList implements GuiYesNoCallback +{ + private GuiCCButton patreonButton; + + public GuiNEIOptionList(GuiScreen parent, OptionList optionList, boolean world) { + super(parent, optionList, world); + } + + @Override + public void resize() { + super.resize(); + patreonButton.x = width-73; + patreonButton.y = height-23; + } + + @Override + public void addWidgets() { + super.addWidgets(); + add(patreonButton = new PatreonButton(0, 0, 70, 20).setActionCommand("patreon")); + } + + @Override + public void actionPerformed(String ident, Object... params) { + if (ident.equals("patreon")) { + GuiConfirmOpenLink gui = new GuiConfirmOpenLink(this, "patreon.com/cb", 0, true); + gui.func_146358_g(); + mc.displayGuiScreen(gui); + } else + super.actionPerformed(ident, params); + } + + @Override + public void confirmClicked(boolean yes, int id) { + if(yes && id == 0) { + try { + Desktop.getDesktop().browse(new URI("http://patreon.com/cb")); + } catch (Exception e) { + NEIClientConfig.logger.error("Failed to open patreon page", e); + } + } + mc.displayGuiScreen(this); + } +} diff --git a/src/codechicken/nei/config/GuiOptionList.java b/src/codechicken/nei/config/GuiOptionList.java index 0e45bf37..0425bb9c 100644 --- a/src/codechicken/nei/config/GuiOptionList.java +++ b/src/codechicken/nei/config/GuiOptionList.java @@ -6,10 +6,13 @@ import codechicken.core.gui.GuiScrollSlot; import codechicken.lib.vec.Rectangle4i; import codechicken.nei.LayoutManager; import net.minecraft.client.Minecraft; +import net.minecraft.client.gui.GuiConfirmOpenLink; import net.minecraft.client.gui.GuiScreen; +import net.minecraft.client.gui.GuiYesNoCallback; import org.lwjgl.opengl.GL11; import java.awt.*; +import java.net.URI; import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedList; @@ -173,13 +176,13 @@ public class GuiOptionList extends GuiScreenWidget } } - private final GuiScreen parent; - private final OptionList optionList; - private boolean world; + protected final GuiScreen parent; + protected final OptionList optionList; + protected boolean world; - private OptionScrollSlot slot; - private GuiCCButton backButton; - private GuiCCButton worldButton; + protected OptionScrollSlot slot; + protected GuiCCButton backButton; + protected GuiCCButton worldButton; public GuiOptionList(GuiScreen parent, OptionList optionList, boolean world) { this.parent = parent; @@ -193,14 +196,16 @@ public class GuiOptionList extends GuiScreenWidget ySize = height; super.initGui(); - if (slot != null) { - slot.resize(); - backButton.width = Math.min(200, width - 40); - backButton.x = (width - backButton.width) / 2; - backButton.y = height - 25; - worldButton.width = 60; - worldButton.x = width - worldButton.width - 15; - } + } + + @Override + public void resize() { + slot.resize(); + backButton.width = Math.min(200, width - 40); + backButton.x = (width - backButton.width) / 2; + backButton.y = height - 25; + worldButton.width = 60; + worldButton.x = width - worldButton.width - 15; } @Override @@ -208,7 +213,6 @@ public class GuiOptionList extends GuiScreenWidget add(slot = new OptionScrollSlot()); add(backButton = new GuiCCButton(0, 0, 0, 20, translateToLocal("nei.options.back")).setActionCommand("back")); add(worldButton = new GuiCCButton(0, 2, 0, 16, worldButtonName()).setActionCommand("world")); - initGui(); } private String worldButtonName() { diff --git a/src/codechicken/nei/config/IConfigSetHolder.java b/src/codechicken/nei/config/IConfigSetHolder.java deleted file mode 100644 index 5aa146af..00000000 --- a/src/codechicken/nei/config/IConfigSetHolder.java +++ /dev/null @@ -1,7 +0,0 @@ -package codechicken.nei.config; - -public interface IConfigSetHolder -{ - public ConfigSet worldConfigSet(); - public ConfigSet globalConfigSet(); -} diff --git a/src/codechicken/nei/config/Option.java b/src/codechicken/nei/config/Option.java index d2852de1..f34d3ac2 100644 --- a/src/codechicken/nei/config/Option.java +++ b/src/codechicken/nei/config/Option.java @@ -45,16 +45,21 @@ public abstract class Option return 20; } + private T assertParentOverride(T elem) { + if(elem == null) throw new IllegalStateException("Option "+fullName()+" does not have a defined parent list. Use OptionList.setOptionList to insert a parent"); + return elem; + } + public ConfigSet globalConfigSet() { - return parent.globalConfigSet(); + return assertParentOverride(parent.globalConfigSet()); } public ConfigSet worldConfigSet() { - return parent.worldConfigSet(); + return assertParentOverride(parent.worldConfigSet()); } public OptionList configBase() { - return parent.configBase(); + return assertParentOverride(parent.configBase()); } /** diff --git a/src/codechicken/nei/config/OptionList.java b/src/codechicken/nei/config/OptionList.java index eeee0de6..d9ebb5e2 100644 --- a/src/codechicken/nei/config/OptionList.java +++ b/src/codechicken/nei/config/OptionList.java @@ -1,5 +1,6 @@ package codechicken.nei.config; +import codechicken.nei.NEIClientConfig; import codechicken.nei.config.GuiOptionList.OptionScrollSlot; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.GuiScreen; @@ -9,147 +10,152 @@ import java.util.HashMap; public class OptionList extends OptionButton { - public static final OptionList top = new OptionList(null); - - public static OptionList getOptionList(String fullName) + public static final OptionList root = new RootOptionList(); + + private static class RootOptionList extends OptionList { - Option o = top.getOption(fullName); - if(o == null) - top.addOption(o = new OptionList(fullName)); + public RootOptionList() { + super(null); + } + + @Override + public ConfigSet globalConfigSet() { + return null; + } + + @Override + public ConfigSet worldConfigSet() { + return null; + } + + @Override + public OptionList configBase() { + return null; + } + + @Override + public GuiOptionList getGui(GuiScreen parent, OptionList list, boolean world) { + return new GuiOptionList(parent, list, world); + } + } + + public static OptionList getOptionList(String fullName) { + Option o = root.getOption(fullName); + if (o == null) + root.addOption(o = new OptionList(fullName)); return (OptionList) o; } - public static String parent(String fullName) - { + public static void setOptionList(OptionList list) { + OptionList prev = (OptionList) root.getOption(list.fullName()); + if (prev == null) + root.addOption(list); + else { + list.parent = prev.parent; + list.options = prev.options; + list.optionList = prev.optionList; + for (Option o : list.optionList) + o.parent = list; + list.parent.options.put(list.fullName(), list); + list.parent.optionList.remove(prev); + list.parent.addSorted(list); + } + } + + public static String parent(String fullName) { int i = fullName.indexOf('.'); - if(i < 0) + if (i < 0) return fullName; return fullName.substring(0, i); } - - public static String child(String fullName) - { + + public static String child(String fullName) { int i = fullName.indexOf('.'); - return fullName.substring(i+1); + return fullName.substring(i + 1); } - + public ArrayList