From 074a627663e0150e23d47a87486afb852dd2cfdd Mon Sep 17 00:00:00 2001 From: Unknown Date: Sun, 3 Feb 2019 21:15:22 +0800 Subject: Version Checker + Mirror REI + Fix Bugs --- src/main/java/me/shedaniel/rei/REIMixinInit.java | 2 - .../me/shedaniel/rei/RoughlyEnoughItemsCore.java | 6 - .../java/me/shedaniel/rei/client/ClientHelper.java | 5 +- .../java/me/shedaniel/rei/client/ConfigHelper.java | 21 +++ .../java/me/shedaniel/rei/client/GuiHelper.java | 2 + .../java/me/shedaniel/rei/client/REIConfig.java | 2 + .../me/shedaniel/rei/gui/ContainerGuiOverlay.java | 56 ++++--- .../me/shedaniel/rei/gui/widget/ConfigWidget.java | 70 +++++++-- .../gui/widget/CraftableToggleButtonWidget.java | 6 +- .../shedaniel/rei/gui/widget/ItemListOverlay.java | 10 +- .../rei/gui/widget/RecipeViewingWidgetGui.java | 2 +- .../rei/listeners/IMixinGuiContainer.java | 1 - .../rei/plugin/DefaultBrewingCategory.java | 1 - .../me/shedaniel/rei/update/UpdateAnnouncer.java | 47 ++++++ .../me/shedaniel/rei/update/UpdateChecker.java | 166 +++++++++++++++++++++ .../me/shedaniel/rei/update/UpdatePriority.java | 13 ++ src/main/java/me/shedaniel/rei/update/Version.java | 49 ++++++ 17 files changed, 406 insertions(+), 53 deletions(-) create mode 100644 src/main/java/me/shedaniel/rei/update/UpdateAnnouncer.java create mode 100644 src/main/java/me/shedaniel/rei/update/UpdateChecker.java create mode 100644 src/main/java/me/shedaniel/rei/update/UpdatePriority.java create mode 100644 src/main/java/me/shedaniel/rei/update/Version.java (limited to 'src/main/java/me/shedaniel') diff --git a/src/main/java/me/shedaniel/rei/REIMixinInit.java b/src/main/java/me/shedaniel/rei/REIMixinInit.java index 7b8eb00b6..39f3639e2 100644 --- a/src/main/java/me/shedaniel/rei/REIMixinInit.java +++ b/src/main/java/me/shedaniel/rei/REIMixinInit.java @@ -1,7 +1,5 @@ package me.shedaniel.rei; -import net.minecraft.client.Minecraft; -import org.dimdev.rift.listener.client.ClientTickable; import org.dimdev.riftloader.listener.InitializationListener; import org.spongepowered.asm.launch.MixinBootstrap; import org.spongepowered.asm.mixin.Mixins; diff --git a/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java b/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java index bf0268a90..b7104b301 100644 --- a/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java +++ b/src/main/java/me/shedaniel/rei/RoughlyEnoughItemsCore.java @@ -1,7 +1,6 @@ package me.shedaniel.rei; import me.shedaniel.rei.client.ClientHelper; -import me.shedaniel.rei.client.ConfigHelper; import me.shedaniel.rei.client.RecipeHelper; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -11,11 +10,6 @@ public class RoughlyEnoughItemsCore { public static final Logger LOGGER = LogManager.getFormatterLogger("REI"); private static final RecipeHelper RECIPE_HELPER = new RecipeHelper(); private static final ClientHelper CLIENT_HELPER = new ClientHelper(); - private static final ConfigHelper CONFIG_HELPER = new ConfigHelper(); - - public static ConfigHelper getConfigHelper() { - return CONFIG_HELPER; - } public static RecipeHelper getRecipeHelper() { return RECIPE_HELPER; diff --git a/src/main/java/me/shedaniel/rei/client/ClientHelper.java b/src/main/java/me/shedaniel/rei/client/ClientHelper.java index e4347b85b..87e438ab3 100644 --- a/src/main/java/me/shedaniel/rei/client/ClientHelper.java +++ b/src/main/java/me/shedaniel/rei/client/ClientHelper.java @@ -2,7 +2,6 @@ package me.shedaniel.rei.client; import com.google.common.collect.ImmutableList; import com.google.common.collect.Lists; -import me.shedaniel.rei.RoughlyEnoughItemsCore; import me.shedaniel.rei.api.IRecipeCategory; import me.shedaniel.rei.api.IRecipeDisplay; import me.shedaniel.rei.gui.ContainerGuiOverlay; @@ -95,9 +94,9 @@ public class ClientHelper { } else { ResourceLocation location = IRegistry.ITEM.getKey(cheatedStack.getItem()); String tagMessage = cheatedStack.copy().getTag() != null && !cheatedStack.copy().getTag().isEmpty() ? cheatedStack.copy().getTag().toString() : ""; - String madeUpCommand = RoughlyEnoughItemsCore.getConfigHelper().getGiveCommandPrefix() + " " + Minecraft.getInstance().player.getScoreboardName() + " " + location.toString() + tagMessage + (cheatedStack.getCount() != 1 ? " " + cheatedStack.getCount() : ""); + String madeUpCommand = ConfigHelper.getInstance().getGiveCommandPrefix() + " " + Minecraft.getInstance().player.getScoreboardName() + " " + location.toString() + tagMessage + (cheatedStack.getCount() != 1 ? " " + cheatedStack.getCount() : ""); if (madeUpCommand.length() > 256) - madeUpCommand = RoughlyEnoughItemsCore.getConfigHelper().getGiveCommandPrefix() + " " + Minecraft.getInstance().player.getScoreboardName() + " " + location.toString() + (cheatedStack.getCount() != 1 ? " " + cheatedStack.getCount() : ""); + madeUpCommand = ConfigHelper.getInstance().getGiveCommandPrefix() + " " + Minecraft.getInstance().player.getScoreboardName() + " " + location.toString() + (cheatedStack.getCount() != 1 ? " " + cheatedStack.getCount() : ""); Minecraft.getInstance().player.sendChatMessage(madeUpCommand); return true; } diff --git a/src/main/java/me/shedaniel/rei/client/ConfigHelper.java b/src/main/java/me/shedaniel/rei/client/ConfigHelper.java index d0e5de001..9b6c15596 100644 --- a/src/main/java/me/shedaniel/rei/client/ConfigHelper.java +++ b/src/main/java/me/shedaniel/rei/client/ConfigHelper.java @@ -13,8 +13,13 @@ public class ConfigHelper { private final File configFile; private REIConfig config; + private static ConfigHelper instance = new ConfigHelper(); private boolean craftableOnly; + public static ConfigHelper getInstance() { + return instance; + } + public ConfigHelper() { this.configFile = new File(RiftLoader.instance.configDir, "rei.json"); this.craftableOnly = false; @@ -105,4 +110,20 @@ public class ConfigHelper { config.sideSearchField = sideSearchField; } + public boolean checkUpdates() { + return config.checkUpdates; + } + + public void setCheckUpdates(boolean checkUpdates) { + config.checkUpdates = checkUpdates; + } + + public boolean isMirrorItemPanel() { + return config.mirrorItemPanel; + } + + public void setMirrorItemPanel(boolean mirrorItemPanel) { + config.mirrorItemPanel = mirrorItemPanel; + } + } diff --git a/src/main/java/me/shedaniel/rei/client/GuiHelper.java b/src/main/java/me/shedaniel/rei/client/GuiHelper.java index 253a51480..1f603463b 100644 --- a/src/main/java/me/shedaniel/rei/client/GuiHelper.java +++ b/src/main/java/me/shedaniel/rei/client/GuiHelper.java @@ -4,6 +4,7 @@ import com.google.common.collect.Lists; import me.shedaniel.rei.gui.ContainerGuiOverlay; import me.shedaniel.rei.gui.widget.TextFieldWidget; import me.shedaniel.rei.listeners.IMixinGuiContainer; +import me.shedaniel.rei.update.UpdateAnnouncer; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.item.ItemStack; @@ -59,6 +60,7 @@ public class GuiHelper implements ClientTickable { GuiHelper.lastGuiContainer = (GuiContainer) client.currentScreen; GuiHelper.lastMixinGuiContainer = (IMixinGuiContainer) lastGuiContainer; } + UpdateAnnouncer.clientTick(client); } } diff --git a/src/main/java/me/shedaniel/rei/client/REIConfig.java b/src/main/java/me/shedaniel/rei/client/REIConfig.java index 49ccb1dec..b5b798371 100644 --- a/src/main/java/me/shedaniel/rei/client/REIConfig.java +++ b/src/main/java/me/shedaniel/rei/client/REIConfig.java @@ -12,5 +12,7 @@ public class REIConfig { public boolean enableCraftableOnlyButton = true; public boolean sideSearchField = false; public String giveCommandPrefix = "/give"; + public boolean checkUpdates = true; + public boolean mirrorItemPanel = false; } diff --git a/src/main/java/me/shedaniel/rei/gui/ContainerGuiOverlay.java b/src/main/java/me/shedaniel/rei/gui/ContainerGuiOverlay.java index ac78abbf0..e1963ea12 100644 --- a/src/main/java/me/shedaniel/rei/gui/ContainerGuiOverlay.java +++ b/src/main/java/me/shedaniel/rei/gui/ContainerGuiOverlay.java @@ -3,6 +3,7 @@ package me.shedaniel.rei.gui; import com.google.common.collect.Lists; import me.shedaniel.rei.RoughlyEnoughItemsCore; import me.shedaniel.rei.client.ClientHelper; +import me.shedaniel.rei.client.ConfigHelper; import me.shedaniel.rei.client.GuiHelper; import me.shedaniel.rei.client.KeyBindHelper; import me.shedaniel.rei.gui.widget.*; @@ -64,7 +65,7 @@ public class ContainerGuiOverlay extends GuiScreen { } }); page = MathHelper.clamp(page, 0, getTotalPage()); - widgets.add(new ButtonWidget(10, 10, 40, 20, "") { + widgets.add(new ButtonWidget(ConfigHelper.getInstance().isMirrorItemPanel() ? window.getScaledWidth() - 50 : 10, 10, 40, 20, "") { @Override public void draw(int int_1, int int_2, float float_1) { this.text = getCheatModeText(); @@ -76,7 +77,7 @@ public class ContainerGuiOverlay extends GuiScreen { ClientHelper.setCheating(!ClientHelper.isCheating()); } }); - widgets.add(new ButtonWidget(10, 35, 40, 20, I18n.format("text.rei.config")) { + widgets.add(new ButtonWidget(ConfigHelper.getInstance().isMirrorItemPanel() ? window.getScaledWidth() - 50 : 10, 35, 40, 20, I18n.format("text.rei.config")) { @Override public void onPressed(int button, double mouseX, double mouseY) { ClientHelper.openConfigWindow(GuiHelper.getLastGuiContainer()); @@ -108,11 +109,11 @@ public class ContainerGuiOverlay extends GuiScreen { GuiHelper.searchField.setBounds(getTextFieldArea()); this.widgets.add(GuiHelper.searchField); GuiHelper.searchField.setText(searchTerm); - if (RoughlyEnoughItemsCore.getConfigHelper().showCraftableOnlyButton()) + if (ConfigHelper.getInstance().showCraftableOnlyButton()) this.widgets.add(new CraftableToggleButtonWidget(getCraftableToggleArea()) { @Override public void onPressed(int button, double mouseX, double mouseY) { - RoughlyEnoughItemsCore.getConfigHelper().toggleCraftableOnly(); + ConfigHelper.getInstance().toggleCraftableOnly(); itemListOverlay.updateList(page, searchTerm); } }); @@ -122,8 +123,8 @@ public class ContainerGuiOverlay extends GuiScreen { } private Rectangle getTextFieldArea() { - int widthRemoved = RoughlyEnoughItemsCore.getConfigHelper().showCraftableOnlyButton() ? 22 : 0; - if (RoughlyEnoughItemsCore.getConfigHelper().sideSearchField()) + int widthRemoved = ConfigHelper.getInstance().showCraftableOnlyButton() ? 22 : 0; + if (ConfigHelper.getInstance().sideSearchField()) return new Rectangle(rectangle.x + 2, window.getScaledHeight() - 22, rectangle.width - 6 - widthRemoved, 18); if (Minecraft.getInstance().currentScreen instanceof RecipeViewingWidgetGui) { RecipeViewingWidgetGui widget = (RecipeViewingWidgetGui) Minecraft.getInstance().currentScreen; @@ -144,7 +145,7 @@ public class ContainerGuiOverlay extends GuiScreen { } private Rectangle getItemListArea() { - return new Rectangle(rectangle.x + 2, rectangle.y + 24, rectangle.width - 4, rectangle.height - (RoughlyEnoughItemsCore.getConfigHelper().sideSearchField() ? 27 + 22 : 27)); + return new Rectangle(rectangle.x + 2, rectangle.y + 24, rectangle.width - 4, rectangle.height - (ConfigHelper.getInstance().sideSearchField() ? 27 + 22 : 27)); } public Rectangle getRectangle() { @@ -155,7 +156,7 @@ public class ContainerGuiOverlay extends GuiScreen { List currentStacks = ClientHelper.getInventoryItemsTypes(); if (getLeft() != lastLeft) onInitialized(); - else if (RoughlyEnoughItemsCore.getConfigHelper().craftableOnly() && (!hasSameListContent(new LinkedList<>(GuiHelper.inventoryStacks), currentStacks) || (currentStacks.size() != GuiHelper.inventoryStacks.size()))) { + else if (ConfigHelper.getInstance().craftableOnly() && (!hasSameListContent(new LinkedList<>(GuiHelper.inventoryStacks), currentStacks) || (currentStacks.size() != GuiHelper.inventoryStacks.size()))) { GuiHelper.inventoryStacks = ClientHelper.getInventoryItemsTypes(); itemListOverlay.updateList(page, searchTerm); } @@ -202,14 +203,22 @@ public class ContainerGuiOverlay extends GuiScreen { } private Rectangle calculateBoundary() { - int startX = GuiHelper.getLastMixinGuiContainer().getContainerLeft() + GuiHelper.getLastMixinGuiContainer().getContainerWidth() + 10; - int width = window.getScaledWidth() - startX; + if (!ConfigHelper.getInstance().isMirrorItemPanel()) { + int startX = GuiHelper.getLastMixinGuiContainer().getContainerLeft() + GuiHelper.getLastMixinGuiContainer().getContainerWidth() + 10; + int width = window.getScaledWidth() - startX; + if (Minecraft.getInstance().currentScreen instanceof RecipeViewingWidgetGui) { + RecipeViewingWidgetGui widget = (RecipeViewingWidgetGui) Minecraft.getInstance().currentScreen; + startX = widget.getBounds().x + widget.getBounds().width + 10; + width = window.getScaledWidth() - startX; + } + return new Rectangle(startX, 0, width, window.getScaledHeight()); + } + int width = GuiHelper.getLastMixinGuiContainer().getContainerLeft() - 6; if (Minecraft.getInstance().currentScreen instanceof RecipeViewingWidgetGui) { RecipeViewingWidgetGui widget = (RecipeViewingWidgetGui) Minecraft.getInstance().currentScreen; - startX = widget.getBounds().x + widget.getBounds().width + 10; - width = window.getScaledWidth() - startX; + width = widget.getBounds().x - 6; } - return new Rectangle(startX, 0, width, window.getScaledHeight()); + return new Rectangle(4, 0, width, window.getScaledHeight()); } private int getLeft() { @@ -226,6 +235,8 @@ public class ContainerGuiOverlay extends GuiScreen { @Override public boolean mouseScrolled(double amount) { + if (!GuiHelper.isOverlayVisible()) + return false; if (rectangle.contains(ClientHelper.getMouseLocation())) { if (amount > 0 && buttonLeft.enabled) buttonLeft.onPressed(0, 0, 0); @@ -243,6 +254,12 @@ public class ContainerGuiOverlay extends GuiScreen { @Override public boolean keyPressed(int int_1, int int_2, int int_3) { + if (KeyBindHelper.HIDE.matchesKey(int_1, int_2)) { + GuiHelper.toggleOverlayVisible(); + return true; + } + if (!GuiHelper.isOverlayVisible()) + return false; for(IGuiEventListener listener : children) if (listener.keyPressed(int_1, int_2, int_3)) return true; @@ -270,19 +287,24 @@ public class ContainerGuiOverlay extends GuiScreen { else if (KeyBindHelper.USAGE.matchesKey(int_1, int_2)) return ClientHelper.executeUsageKeyBind(this, itemStack); } - if (KeyBindHelper.HIDE.matchesKey(int_1, int_2)) { - GuiHelper.toggleOverlayVisible(); - return true; - } return false; } @Override public boolean charTyped(char char_1, int int_1) { + if (!GuiHelper.isOverlayVisible()) + return false; for(IGuiEventListener listener : children) if (listener.charTyped(char_1, int_1)) return true; return super.charTyped(char_1, int_1); } + @Override + public boolean mouseClicked(double double_1, double double_2, int int_1) { + if (!GuiHelper.isOverlayVisible()) + return false; + return super.mouseClicked(double_1, double_2, int_1); + } + } diff --git a/src/main/java/me/shedaniel/rei/gui/widget/ConfigWidget.java b/src/main/java/me/shedaniel/rei/gui/widget/ConfigWidget.java index 1b5e01052..9519a949a 100644 --- a/src/main/java/me/shedaniel/rei/gui/widget/ConfigWidget.java +++ b/src/main/java/me/shedaniel/rei/gui/widget/ConfigWidget.java @@ -1,7 +1,7 @@ package me.shedaniel.rei.gui.widget; import com.google.common.collect.Lists; -import me.shedaniel.rei.RoughlyEnoughItemsCore; +import me.shedaniel.rei.client.ConfigHelper; import me.shedaniel.rei.client.REIItemListOrdering; import net.minecraft.client.MainWindow; import net.minecraft.client.Minecraft; @@ -43,9 +43,9 @@ public class ConfigWidget extends GuiScreen { @Override public void onPressed(int button, double mouseX, double mouseY) { if (button == 0) - RoughlyEnoughItemsCore.getConfigHelper().setSideSearchField(!RoughlyEnoughItemsCore.getConfigHelper().sideSearchField()); + ConfigHelper.getInstance().setSideSearchField(!ConfigHelper.getInstance().sideSearchField()); try { - RoughlyEnoughItemsCore.getConfigHelper().saveConfig(); + ConfigHelper.getInstance().saveConfig(); } catch (IOException e) { e.printStackTrace(); } @@ -53,8 +53,8 @@ public class ConfigWidget extends GuiScreen { @Override public void draw(int mouseX, int mouseY, float partialTicks) { - text = getTrueFalseText(RoughlyEnoughItemsCore.getConfigHelper().sideSearchField()); - String t = I18n.format("text.rei.centre_searchbox"); + text = getTrueFalseText(ConfigHelper.getInstance().sideSearchField()); + String t = I18n.format("text.rei.side_searchbox"); int width = fontRenderer.getStringWidth(t); fontRenderer.drawStringWithShadow(t, this.x - width - 10, this.y + (this.height - 8) / 2, -1); super.draw(mouseX, mouseY, partialTicks); @@ -64,9 +64,9 @@ public class ConfigWidget extends GuiScreen { @Override public void onPressed(int button, double mouseX, double mouseY) { if (button == 0) - RoughlyEnoughItemsCore.getConfigHelper().setShowCraftableOnlyButton(!RoughlyEnoughItemsCore.getConfigHelper().showCraftableOnlyButton()); + ConfigHelper.getInstance().setShowCraftableOnlyButton(!ConfigHelper.getInstance().showCraftableOnlyButton()); try { - RoughlyEnoughItemsCore.getConfigHelper().saveConfig(); + ConfigHelper.getInstance().saveConfig(); } catch (IOException e) { e.printStackTrace(); } @@ -74,7 +74,7 @@ public class ConfigWidget extends GuiScreen { @Override public void draw(int mouseX, int mouseY, float partialTicks) { - text = getTrueFalseText(RoughlyEnoughItemsCore.getConfigHelper().showCraftableOnlyButton()); + text = getTrueFalseText(ConfigHelper.getInstance().showCraftableOnlyButton()); String t = I18n.format("text.rei.enable_craftable_only"); int width = fontRenderer.getStringWidth(t); fontRenderer.drawStringWithShadow(t, this.x - width - 10, this.y + (this.height - 8) / 2, -1); @@ -84,14 +84,14 @@ public class ConfigWidget extends GuiScreen { widgets.add(new ButtonWidget(window.getScaledWidth() / 2 - 90, 90, 150, 20, "") { @Override public void onPressed(int button, double mouseX, double mouseY) { - int index = Arrays.asList(REIItemListOrdering.values()).indexOf(RoughlyEnoughItemsCore.getConfigHelper().getItemListOrdering()) + 1; + int index = Arrays.asList(REIItemListOrdering.values()).indexOf(ConfigHelper.getInstance().getItemListOrdering()) + 1; if (index >= REIItemListOrdering.values().length) { index = 0; - RoughlyEnoughItemsCore.getConfigHelper().setAscending(!RoughlyEnoughItemsCore.getConfigHelper().isAscending()); + ConfigHelper.getInstance().setAscending(!ConfigHelper.getInstance().isAscending()); } - RoughlyEnoughItemsCore.getConfigHelper().setItemListOrdering(REIItemListOrdering.values()[index]); + ConfigHelper.getInstance().setItemListOrdering(REIItemListOrdering.values()[index]); try { - RoughlyEnoughItemsCore.getConfigHelper().saveConfig(); + ConfigHelper.getInstance().saveConfig(); } catch (IOException e) { e.printStackTrace(); } @@ -100,12 +100,54 @@ public class ConfigWidget extends GuiScreen { @Override public void draw(int int_1, int int_2, float float_1) { RenderHelper.disableStandardItemLighting(); - this.text = I18n.format("text.rei.list_ordering_button", I18n.format(RoughlyEnoughItemsCore.getConfigHelper().getItemListOrdering().getNameTranslationKey()), I18n.format(RoughlyEnoughItemsCore.getConfigHelper().isAscending() ? "ordering.rei.ascending" : "ordering.rei.descending")); + this.text = I18n.format("text.rei.list_ordering_button", I18n.format(ConfigHelper.getInstance().getItemListOrdering().getNameTranslationKey()), I18n.format(ConfigHelper.getInstance().isAscending() ? "ordering.rei.ascending" : "ordering.rei.descending")); String t = I18n.format("text.rei.list_ordering") + ": "; - drawString(Minecraft.getInstance().fontRenderer, t, parent.width / 2 - 95 - Minecraft.getInstance().fontRenderer.getStringWidth(t), 90 + 6, -1); + fontRenderer.drawStringWithShadow(t, parent.width / 2 - 95 - Minecraft.getInstance().fontRenderer.getStringWidth(t), 90 + 6, -1); super.draw(int_1, int_2, float_1); } }); + widgets.add(new ButtonWidget(window.getScaledWidth() / 2 - 20, 120, 40, 20, "") { + @Override + public void onPressed(int button, double mouseX, double mouseY) { + if (button == 0) + ConfigHelper.getInstance().setMirrorItemPanel(!ConfigHelper.getInstance().isMirrorItemPanel()); + try { + ConfigHelper.getInstance().saveConfig(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Override + public void draw(int mouseX, int mouseY, float partialTicks) { + text = getTrueFalseText(ConfigHelper.getInstance().isMirrorItemPanel()); + String t = I18n.format("text.rei.mirror_rei"); + int width = fontRenderer.getStringWidth(t); + fontRenderer.drawStringWithShadow(t, this.x - width - 10, this.y + (this.height - 8) / 2, -1); + super.draw(mouseX, mouseY, partialTicks); + } + }); + widgets.add(new ButtonWidget(window.getScaledWidth() / 2 - 20, 150, 40, 20, "") { + @Override + public void onPressed(int button, double mouseX, double mouseY) { + if (button == 0) + ConfigHelper.getInstance().setCheckUpdates(!ConfigHelper.getInstance().checkUpdates()); + try { + ConfigHelper.getInstance().saveConfig(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + @Override + public void draw(int mouseX, int mouseY, float partialTicks) { + text = getTrueFalseText(ConfigHelper.getInstance().checkUpdates()); + String t = I18n.format("text.rei.check_updates"); + int width = fontRenderer.getStringWidth(t); + fontRenderer.drawStringWithShadow(t, this.x - width - 10, this.y + (this.height - 8) / 2, -1); + super.draw(mouseX, mouseY, partialTicks); + } + }); } private String getTrueFalseText(boolean showCraftableOnlyButton) { diff --git a/src/main/java/me/shedaniel/rei/gui/widget/CraftableToggleButtonWidget.java b/src/main/java/me/shedaniel/rei/gui/widget/CraftableToggleButtonWidget.java index 035d5cac6..93086e661 100644 --- a/src/main/java/me/shedaniel/rei/gui/widget/CraftableToggleButtonWidget.java +++ b/src/main/java/me/shedaniel/rei/gui/widget/CraftableToggleButtonWidget.java @@ -1,7 +1,7 @@ package me.shedaniel.rei.gui.widget; -import me.shedaniel.rei.RoughlyEnoughItemsCore; import me.shedaniel.rei.client.ClientHelper; +import me.shedaniel.rei.client.ConfigHelper; import me.shedaniel.rei.client.GuiHelper; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.GlStateManager; @@ -42,14 +42,14 @@ public abstract class CraftableToggleButtonWidget extends ButtonWidget { Minecraft.getInstance().getTextureManager().bindTexture(CHEST_GUI_TEXTURE); GlStateManager.color4f(1.0F, 1.0F, 1.0F, 1.0F); this.zLevel = 100f; - this.drawTexturedModalRect(x, y, (56 + (RoughlyEnoughItemsCore.getConfigHelper().craftableOnly() ? 0 : 20)), 202, 20, 20); + this.drawTexturedModalRect(x, y, (56 + (ConfigHelper.getInstance().craftableOnly() ? 0 : 20)), 202, 20, 20); this.zLevel = 0f; if (getBounds().contains(mouseX, mouseY)) drawTooltip(); } private void drawTooltip() { - GuiHelper.getLastOverlay().addTooltip(new QueuedTooltip(ClientHelper.getMouseLocation(), Arrays.asList(I18n.format(RoughlyEnoughItemsCore.getConfigHelper().craftableOnly() ? "text.rei.showing_craftable" : "text.rei.showing_all")))); + GuiHelper.getLastOverlay().addTooltip(new QueuedTooltip(ClientHelper.getMouseLocation(), Arrays.asList(I18n.format(ConfigHelper.getInstance().craftableOnly() ? "text.rei.showing_craftable" : "text.rei.showing_all")))); } } diff --git a/src/main/java/me/shedaniel/rei/gui/widget/ItemListOverlay.java b/src/main/java/me/shedaniel/rei/gui/widget/ItemListOverlay.java index d2c7ef467..a413add52 100644 --- a/src/main/java/me/shedaniel/rei/gui/widget/ItemListOverlay.java +++ b/src/main/java/me/shedaniel/rei/gui/widget/ItemListOverlay.java @@ -103,7 +103,7 @@ public class ItemListOverlay extends Gui implements IWidget { List os = new LinkedList<>(ol), stacks = Lists.newArrayList(), finalStacks = Lists.newArrayList(); List itemGroups = new LinkedList<>(Arrays.asList(ItemGroup.GROUPS)); itemGroups.add(null); - REIItemListOrdering ordering = RoughlyEnoughItemsCore.getConfigHelper().getItemListOrdering(); + REIItemListOrdering ordering = ConfigHelper.getInstance().getItemListOrdering(); if (ordering != REIItemListOrdering.REGISTRY) Collections.sort(os, (itemStack, t1) -> { if (ordering.equals(REIItemListOrdering.NAME)) @@ -112,7 +112,7 @@ public class ItemListOverlay extends Gui implements IWidget { return itemGroups.indexOf(itemStack.getItem().getGroup()) - itemGroups.indexOf(t1.getItem().getGroup()); return 0; }); - if (!RoughlyEnoughItemsCore.getConfigHelper().isAscending()) + if (!ConfigHelper.getInstance().isAscending()) Collections.reverse(os); String[] splitSearchTerm = StringUtils.splitByWholeSeparatorPreserveAllTokens(searchTerm, "|"); Arrays.stream(splitSearchTerm).forEachOrdered(s -> { @@ -135,14 +135,14 @@ public class ItemListOverlay extends Gui implements IWidget { }); if (splitSearchTerm.length == 0) stacks.addAll(os); - List workingItems = RoughlyEnoughItemsCore.getConfigHelper().craftableOnly() && inventoryItems.size() > 0 ? new ArrayList<>() : new LinkedList<>(ol); - if (RoughlyEnoughItemsCore.getConfigHelper().craftableOnly()) { + List workingItems = ConfigHelper.getInstance().craftableOnly() && inventoryItems.size() > 0 ? new ArrayList<>() : new LinkedList<>(ol); + if (ConfigHelper.getInstance().craftableOnly()) { RecipeHelper.getInstance().findCraftableByItems(inventoryItems).forEach(workingItems::add); workingItems.addAll(inventoryItems); } final List finalWorkingItems = workingItems; finalStacks.addAll(stacks.stream().filter(itemStack -> { - if (!RoughlyEnoughItemsCore.getConfigHelper().craftableOnly()) + if (!ConfigHelper.getInstance().craftableOnly()) return true; for(ItemStack workingItem : finalWorkingItems) if (itemStack.isItemEqual(workingItem)) diff --git a/src/main/java/me/shedaniel/rei/gui/widget/RecipeViewingWidgetGui.java b/src/main/java/me/shedaniel/rei/gui/widget/RecipeViewingWidgetGui.java index a1b810b98..22bc5d03c 100644 --- a/src/main/java/me/shedaniel/rei/gui/widget/RecipeViewingWidgetGui.java +++ b/src/main/java/me/shedaniel/rei/gui/widget/RecipeViewingWidgetGui.java @@ -178,7 +178,7 @@ public class RecipeViewingWidgetGui extends GuiScreen { SpeedCraftAreaSupplier supplier = RecipeHelper.getInstance().getSpeedCraftButtonArea(selectedCategory); final SpeedCraftFunctional functional = getSpeedCraftFunctionalByCategory(GuiHelper.getLastGuiContainer(), selectedCategory); if (page * getRecipesPerPage() < categoriesMap.get(selectedCategory).size()) { - final Supplier topDisplaySupplier = () -> categoriesMap.get(selectedCategory).get(page * getRecipesPerPage()); + final Supplier topDisplaySupplier = () -> categoriesMap.get(selectedCategory).get(page * getRecipesPerPage()); final Rectangle topBounds = new Rectangle((int) getBounds().getCenterX() - 75, getBounds().y + 40, 150, selectedCategory.usesFullPage() ? 140 : 66); widgets.addAll(selectedCategory.setupDisplay(topDisplaySupplier, topBounds)); if (supplier != null) diff --git a/src/main/java/me/shedaniel/rei/listeners/IMixinGuiContainer.java b/src/main/java/me/shedaniel/rei/listeners/IMixinGuiContainer.java index 167772205..84c57a1eb 100644 --- a/src/main/java/me/shedaniel/rei/listeners/IMixinGuiContainer.java +++ b/src/main/java/me/shedaniel/rei/listeners/IMixinGuiContainer.java @@ -1,7 +1,6 @@ package me.shedaniel.rei.listeners; import me.shedaniel.rei.gui.ContainerGuiOverlay; -import net.minecraft.client.gui.inventory.GuiContainer; import net.minecraft.inventory.Slot; import net.minecraft.item.ItemStack; diff --git a/src/main/java/me/shedaniel/rei/plugin/DefaultBrewingCategory.java b/src/main/java/me/shedaniel/rei/plugin/DefaultBrewingCategory.java index d51fb0798..541c6476c 100644 --- a/src/main/java/me/shedaniel/rei/plugin/DefaultBrewingCategory.java +++ b/src/main/java/me/shedaniel/rei/plugin/DefaultBrewingCategory.java @@ -4,7 +4,6 @@ import me.shedaniel.rei.api.IRecipeCategory; import me.shedaniel.rei.gui.widget.IWidget; import me.shedaniel.rei.gui.widget.ItemSlotWidget; import me.shedaniel.rei.gui.widget.RecipeBaseWidget; -import me.shedaniel.rei.listeners.IMixinGuiContainer; import net.minecraft.client.Minecraft; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.RenderHelper; diff --git a/src/main/java/me/shedaniel/rei/update/UpdateAnnouncer.java b/src/main/java/me/shedaniel/rei/update/UpdateAnnouncer.java new file mode 100644 index 000000000..fce623da7 --- /dev/null +++ b/src/main/java/me/shedaniel/rei/update/UpdateAnnouncer.java @@ -0,0 +1,47 @@ +package me.shedaniel.rei.update; + +import com.google.common.collect.Lists; +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import net.minecraft.client.Minecraft; +import net.minecraft.client.resources.I18n; +import net.minecraft.util.text.TextComponentString; +import net.minecraft.world.World; + +import java.util.List; + +import static me.shedaniel.rei.update.UpdateChecker.*; + +public class UpdateAnnouncer { + + private static World lastWorld = null; + + public static void clientTick(Minecraft client) { + if (client.world != lastWorld) { + lastWorld = client.world; + if (lastWorld != null) { + if (checkUpdates() && isOutdated()) { + String currentVersionString = getCurrentVersion() == null ? "null" : getCurrentVersion().toString(); + List versions = getVersionsHigherThan(getCurrentVersion()); + String t[] = I18n.format("text.rei.update_outdated", currentVersionString, getLatestForGame(), getUpdatePriority(versions).name().toUpperCase()).split("\n"); + for(String s : t) + client.player.sendStatusMessage(new TextComponentString(s), false); + getChangelog(getCurrentVersion()).forEach(s -> client.player.sendStatusMessage(new TextComponentString(s), false)); + } + } + } + } + + public static List getChangelog(Version currentVersion) { + List changelogs = Lists.newLinkedList(); + JsonArray array = getElement().getChangelogs().getRift(); + array.forEach(jsonElement -> { + JsonObject jsonObject = jsonElement.getAsJsonObject(); + Version jsonVersion = new Version(jsonObject.get("version").getAsString()); + if (jsonVersion.compareTo(currentVersion) > 0 && jsonVersion.compareTo(getLatestForGame()) <= 0) + changelogs.add(I18n.format("text.rei.update_changelog_line", jsonObject.get("text").getAsString())); + }); + return changelogs; + } + +} diff --git a/src/main/java/me/shedaniel/rei/update/UpdateChecker.java b/src/main/java/me/shedaniel/rei/update/UpdateChecker.java new file mode 100644 index 000000000..46ee48c69 --- /dev/null +++ b/src/main/java/me/shedaniel/rei/update/UpdateChecker.java @@ -0,0 +1,166 @@ +package me.shedaniel.rei.update; + +import com.google.common.collect.Lists; +import com.google.gson.*; +import com.google.gson.annotations.SerializedName; +import me.shedaniel.rei.client.ConfigHelper; +import org.apache.commons.io.IOUtils; +import org.dimdev.riftloader.listener.InitializationListener; + +import java.io.IOException; +import java.io.InputStream; +import java.io.StringBufferInputStream; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.util.Arrays; +import java.util.LinkedList; +import java.util.List; +import java.util.stream.Collectors; + +public class UpdateChecker implements InitializationListener { + + private static final Gson GSON = new GsonBuilder().setPrettyPrinting().disableHtmlEscaping().create(); + private static final Version CURRENT_VERSION = new Version("2.2.0.16"); + private static final String CURRENT_GAME_VERSION = "1.13.2"; + private static Version latestForGame = null; + private static JsonVersionElement element; + private static String VERSION_STRING = "https://raw.githubusercontent.com/shedaniel/RoughlyEnoughItems/1.13.2-rewrite/version.json"; + + public static boolean isOutdated() { + return latestForGame.compareTo(CURRENT_VERSION) == 1 && CURRENT_VERSION != null; + } + + public static JsonVersionElement getElement() { + return element; + } + + public static UpdatePriority getUpdatePriority(List versions) { + UpdatePriority p = UpdatePriority.NONE; + List priorities = Arrays.asList(UpdatePriority.values()); + for(UpdatePriority priority : versions.stream().map(UpdateChecker::getUpdatePriority).collect(Collectors.toList())) + if (priority.compareTo(p) > 0) + p = priority; + return p; + } + + public static UpdatePriority getUpdatePriority(Version version) { + JsonArray array = element.getChangelogs().getRift(); + for(JsonElement element : array) { + JsonObject jsonObject = element.getAsJsonObject(); + if (jsonObject.has("version") && jsonObject.get("version").getAsString().equals(version.toString())) + return UpdatePriority.fromString(jsonObject.get("level").getAsString()); + } + return UpdatePriority.NONE; + } + + public static boolean checkUpdates() { + return ConfigHelper.getInstance().checkUpdates(); + } + + public static Version getCurrentVersion() { + return CURRENT_VERSION; + } + + public static Version getLatestForGame() { + return latestForGame; + } + + static List getVersionsHigherThan(Version currentVersion) { + List versions = Lists.newLinkedList(); + JsonArray array = element.getChangelogs().getRift(); + array.forEach(jsonElement -> { + Version jsonVersion = new Version(jsonElement.getAsJsonObject().get("version").getAsString()); + if (jsonVersion.compareTo(currentVersion) > 0) + versions.add(jsonVersion); + }); + return versions; + } + + private static InputStream downloadVersionString() { + try { + URL versionUrl = new URL(VERSION_STRING); + return versionUrl.openStream(); + } catch (IOException e) { + return new StringBufferInputStream("{}"); + } + } + + private static String parseLatest(JsonVersionElement element, String gameVersion) { + List objects = new LinkedList<>(element.getLatestVersions()); + for(int i = objects.size() - 1; i >= 0; i--) + if (objects.get(i).getGameVersion().equals(gameVersion)) + return objects.get(i).getModVersion(); + return objects.get(objects.size() - 1).getModVersion(); + } + + @Override + public void onInitialization() { + if (!checkUpdates()) + return; + InputStream downloadedStream = downloadVersionString(); + String downloadedString = null; + try { + downloadedString = IOUtils.toString(downloadedStream, StandardCharsets.UTF_8); + element = GSON.fromJson(downloadedString, JsonVersionElement.class); + } catch (IOException e) { + e.printStackTrace(); + } + if (downloadedString != null && !downloadedString.equalsIgnoreCase("{}")) + latestForGame = new Version(parseLatest(element, CURRENT_GAME_VERSION)); + else + latestForGame = new Version("0.0.0"); + } + + static class JsonVersionElement { + @SerializedName("latest") + private List latestVersions; + private ChangelogObject changelogs; + + public JsonVersionElement() { + this.latestVersions = Lists.newArrayList(); + changelogs = new ChangelogObject(); + } + + public List getLatestVersions() { + return latestVersions; + } + + public ChangelogObject getChangelogs() { + return changelogs; + } + } + + static class LatestVersionObject { + @SerializedName("game") + private String gameVersion = ""; + @SerializedName("mod") + private String modVersion = ""; + + public String getGameVersion() { + return gameVersion; + } + + public String getModVersion() { + return modVersion; + } + + @Override + public String toString() { + return String.format("LatestVersion[%s] = %s", getGameVersion(), getModVersion()); + } + } + + static class ChangelogObject { + private JsonArray fabric = new JsonArray(); + private JsonArray rift = new JsonArray(); + + public JsonArray getFabric() { + return fabric; + } + + public JsonArray getRift() { + return rift; + } + } + +} \ No newline at end of file diff --git a/src/main/java/me/shedaniel/rei/update/UpdatePriority.java b/src/main/java/me/shedaniel/rei/update/UpdatePriority.java new file mode 100644 index 000000000..433cf2fca --- /dev/null +++ b/src/main/java/me/shedaniel/rei/update/UpdatePriority.java @@ -0,0 +1,13 @@ +package me.shedaniel.rei.update; + +import java.util.Arrays; + +public enum UpdatePriority { + + NONE, LIGHT, NORMAL, USEFUL, IMPORTANT; + + public static UpdatePriority fromString(String string) { + return Arrays.stream(values()).filter(updatePriority -> updatePriority.name().toLowerCase().equals(string)).findFirst().orElse(NONE); + } + +} diff --git a/src/main/java/me/shedaniel/rei/update/Version.java b/src/main/java/me/shedaniel/rei/update/Version.java new file mode 100644 index 000000000..32d34eb3f --- /dev/null +++ b/src/main/java/me/shedaniel/rei/update/Version.java @@ -0,0 +1,49 @@ +package me.shedaniel.rei.update; + +public class Version implements Comparable { + + private String version; + + public Version(String version) { + if (version == null) + throw new IllegalArgumentException("Version can not be null"); + if (!version.matches("[0-9]+(\\.[0-9]+)*")) + throw new IllegalArgumentException("Invalid version format"); + this.version = version; + } + + @Override + public final String toString() { + return this.version; + } + + @Override + public int compareTo(Version other) { + if (other == null) + return 1; + String[] thisParts = this.toString().split("\\."); + String[] thatParts = other.toString().split("\\."); + int length = Math.max(thisParts.length, thatParts.length); + for(int i = 0; i < length; i++) { + int thisPart = i < thisParts.length ? Integer.parseInt(thisParts[i]) : 0; + int thatPart = i < thatParts.length ? Integer.parseInt(thatParts[i]) : 0; + if (thisPart < thatPart) + return -1; + if (thisPart > thatPart) + return 1; + } + return 0; + } + + @Override + public boolean equals(Object that) { + if (this == that) + return true; + if (that == null) + return false; + if (this.getClass() != that.getClass()) + return false; + return this.compareTo((Version) that) == 0; + } + +} \ No newline at end of file -- cgit