From 0f641f424fc76f16be6e7b0c0393b32be9f87039 Mon Sep 17 00:00:00 2001 From: Ellpeck Date: Wed, 2 Sep 2015 20:06:34 +0200 Subject: [PATCH] Added "Update available"-button to the booklet --- .../actuallyadditions/ActuallyAdditions.java | 2 + .../actuallyadditions/booklet/GuiBooklet.java | 92 ++++++++++++++---- .../actuallyadditions/proxy/ClientProxy.java | 10 +- .../update/UpdateChecker.java | 36 ------- .../update/UpdateCheckerClientNotifier.java | 51 ++++++++++ .../textures/gui/guiBooklet.png | Bin 13527 -> 13699 bytes 6 files changed, 131 insertions(+), 60 deletions(-) create mode 100644 src/main/java/ellpeck/actuallyadditions/update/UpdateCheckerClientNotifier.java diff --git a/src/main/java/ellpeck/actuallyadditions/ActuallyAdditions.java b/src/main/java/ellpeck/actuallyadditions/ActuallyAdditions.java index d8a19515a..aed36b96a 100644 --- a/src/main/java/ellpeck/actuallyadditions/ActuallyAdditions.java +++ b/src/main/java/ellpeck/actuallyadditions/ActuallyAdditions.java @@ -40,6 +40,7 @@ import ellpeck.actuallyadditions.recipe.FuelHandler; import ellpeck.actuallyadditions.recipe.HairyBallHandler; import ellpeck.actuallyadditions.recipe.TreasureChestHandler; import ellpeck.actuallyadditions.tile.TileEntityBase; +import ellpeck.actuallyadditions.update.UpdateChecker; import ellpeck.actuallyadditions.util.ModUtil; import ellpeck.actuallyadditions.util.Util; // So that BuildCraft Oil always gets used @@ -64,6 +65,7 @@ public class ActuallyAdditions{ InitItems.init(); InitVillager.init(); FuelHandler.init(); + new UpdateChecker().init(); proxy.preInit(event); ModUtil.LOGGER.info("PreInitialization Finished."); diff --git a/src/main/java/ellpeck/actuallyadditions/booklet/GuiBooklet.java b/src/main/java/ellpeck/actuallyadditions/booklet/GuiBooklet.java index 3335814cc..ba53c096d 100644 --- a/src/main/java/ellpeck/actuallyadditions/booklet/GuiBooklet.java +++ b/src/main/java/ellpeck/actuallyadditions/booklet/GuiBooklet.java @@ -14,6 +14,7 @@ import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import ellpeck.actuallyadditions.booklet.page.IBookletPage; import ellpeck.actuallyadditions.config.GuiConfiguration; +import ellpeck.actuallyadditions.update.UpdateChecker; import ellpeck.actuallyadditions.util.*; import net.minecraft.client.Minecraft; import net.minecraft.client.gui.FontRenderer; @@ -51,17 +52,19 @@ public class GuiBooklet extends GuiScreen{ private GuiTextField searchField; - private static final int BUTTON_TWITTER_ID = -4; - private static final int BUTTON_FORUM_ID = -3; - private static final int BUTTON_ACHIEVEMENTS_ID = -2; - private static final int BUTTON_CONFIG_ID = -1; private static final int BUTTON_FORWARD_ID = 0; private static final int BUTTON_BACK_ID = 1; private static final int BUTTON_RETURN_ID = 2; private static final int CHAPTER_BUTTONS_START = 3; - private static final int BUTTONS_PER_PAGE = 13; + private static final int BUTTON_UPDATE_ID = CHAPTER_BUTTONS_START+BUTTONS_PER_PAGE; + private static final int BUTTON_TWITTER_ID = BUTTON_UPDATE_ID+1; + private static final int BUTTON_FORUM_ID = BUTTON_TWITTER_ID+1; + private static final int BUTTON_ACHIEVEMENTS_ID = BUTTON_FORUM_ID+1; + private static final int BUTTON_CONFIG_ID = BUTTON_ACHIEVEMENTS_ID+1; + private int cursorCounter; + private boolean mouseClicked; public GuiBooklet(){ @@ -73,6 +76,16 @@ public class GuiBooklet extends GuiScreen{ public void updateScreen(){ super.updateScreen(); this.searchField.updateCursorCounter(); + + boolean buttonThere = UpdateChecker.doneChecking && UpdateChecker.updateVersion > UpdateChecker.clientVersion; + this.getButton(BUTTON_UPDATE_ID).visible = buttonThere; + if(buttonThere){ + this.cursorCounter++; + if(this.cursorCounter%8 == 0){ + TexturedButton button = (TexturedButton)this.getButton(BUTTON_UPDATE_ID); + button.setTexturePos(245, button.texturePosY == 0 ? 22 : 0); + } + } } @SuppressWarnings("unchecked") @@ -125,18 +138,21 @@ public class GuiBooklet extends GuiScreen{ this.unicodeRenderer = new FontRenderer(this.mc.gameSettings, new ResourceLocation("textures/font/ascii.png"), this.mc.renderEngine, true); - this.buttonList.add(new TexturedButton(BUTTON_FORWARD_ID, this.guiLeft+this.xSize, this.guiTop+this.ySize+2, 164, 0, 18, 10)); - this.buttonList.add(new TexturedButton(BUTTON_BACK_ID, this.guiLeft-18, this.guiTop+this.ySize+2, 146, 0, 18, 10)); - this.buttonList.add(new TexturedButton(BUTTON_RETURN_ID, this.guiLeft+this.xSize/2-7, this.guiTop+this.ySize+2, 182, 0, 15, 10)); + this.addButton(new TexturedButton(BUTTON_FORWARD_ID, this.guiLeft+this.xSize, this.guiTop+this.ySize+2, 164, 0, 18, 10)); + this.addButton(new TexturedButton(BUTTON_BACK_ID, this.guiLeft-18, this.guiTop+this.ySize+2, 146, 0, 18, 10)); + this.addButton(new TexturedButton(BUTTON_RETURN_ID, this.guiLeft+this.xSize/2-7, this.guiTop+this.ySize+2, 182, 0, 15, 10)); for(int i = 0; i < BUTTONS_PER_PAGE; i++){ - this.buttonList.add(new IndexButton(this.unicodeRenderer, CHAPTER_BUTTONS_START+i, guiLeft+15, guiTop+10+(i*12), 110, 10, "")); + this.addButton(new IndexButton(this.unicodeRenderer, CHAPTER_BUTTONS_START+i, guiLeft+15, guiTop+10+(i*12), 110, 10, "")); } - this.buttonList.add(new TexturedButton(BUTTON_ACHIEVEMENTS_ID, this.guiLeft+138, this.guiTop, 205, 0, 8, 8)); - this.buttonList.add(new TexturedButton(BUTTON_CONFIG_ID, this.guiLeft+138, this.guiTop+10, 197, 0, 8, 8)); - this.buttonList.add(new TexturedButton(BUTTON_TWITTER_ID, this.guiLeft, this.guiTop, 213, 0, 8, 8)); - this.buttonList.add(new TexturedButton(BUTTON_FORUM_ID, this.guiLeft, this.guiTop+10, 221, 0, 8, 8)); + this.addButton(new TexturedButton(BUTTON_UPDATE_ID, this.guiLeft-11, this.guiTop-11, 245, 0, 11, 11)); + this.getButton(BUTTON_UPDATE_ID).visible = UpdateChecker.doneChecking && UpdateChecker.updateVersion > UpdateChecker.clientVersion; + + this.addButton(new TexturedButton(BUTTON_TWITTER_ID, this.guiLeft, this.guiTop, 213, 0, 8, 8)); + this.addButton(new TexturedButton(BUTTON_FORUM_ID, this.guiLeft, this.guiTop+10, 221, 0, 8, 8)); + this.addButton(new TexturedButton(BUTTON_ACHIEVEMENTS_ID, this.guiLeft+138, this.guiTop, 205, 0, 8, 8)); + this.addButton(new TexturedButton(BUTTON_CONFIG_ID, this.guiLeft+138, this.guiTop+10, 197, 0, 8, 8)); this.searchField = new GuiTextField(this.unicodeRenderer, guiLeft+148, guiTop+162, 66, 10); this.searchField.setMaxStringLength(30); @@ -157,6 +173,16 @@ public class GuiBooklet extends GuiScreen{ } } + @SuppressWarnings("unchecked") + private void addButton(GuiButton button){ + if(this.buttonList.size() > button.id){ + this.buttonList.set(button.id, button); + } + else{ + this.buttonList.add(button.id, button); + } + } + private GuiButton getButton(int id){ return (GuiButton)this.buttonList.get(id); } @@ -244,6 +270,16 @@ public class GuiBooklet extends GuiScreen{ if(x >= this.guiLeft && x <= this.guiLeft+7 && y >= this.guiTop+10 && y <= this.guiTop+10+7){ this.func_146283_a(Collections.singletonList(EnumChatFormatting.GOLD+"Open Minecraft Forum Post in Browser"), x, y); } + //Update Checker Hover Text + if(x >= this.guiLeft-11 && x <= this.guiLeft-11+10 && y >= this.guiTop-11 && y <= this.guiTop-11+10){ + if(UpdateChecker.doneChecking && UpdateChecker.updateVersion > UpdateChecker.clientVersion){ + ArrayList list = new ArrayList(); + list.add(EnumChatFormatting.GOLD+"There is an Update available!"); + list.add(EnumChatFormatting.ITALIC+"You have: "+ModUtil.VERSION+", Newest: "+UpdateChecker.updateVersionS); + list.add("Click this button to visit the download page!"); + this.func_146283_a(list, x, y); + } + } if(this.mouseClicked) this.mouseClicked = false; } @@ -276,14 +312,26 @@ public class GuiBooklet extends GuiScreen{ @Override public void actionPerformed(GuiButton button){ - if(button.id == BUTTON_TWITTER_ID){ + if(button.id == BUTTON_UPDATE_ID){ + if(UpdateChecker.doneChecking && UpdateChecker.updateVersion > UpdateChecker.clientVersion){ + try{ + if(Desktop.isDesktopSupported()){ + Desktop.getDesktop().browse(new URI(UpdateChecker.DOWNLOAD_LINK)); + } + } + catch(Exception e){ + ModUtil.LOGGER.error("Something bad happened when trying to open a URL!", e); + } + } + } + else if(button.id == BUTTON_TWITTER_ID){ try{ if(Desktop.isDesktopSupported()){ - Desktop.getDesktop().browse(new URI("https://twitter.com/ActAddMod")); + Desktop.getDesktop().browse(new URI("http://twitter.com/ActAddMod")); } } catch(Exception e){ - e.printStackTrace(); + ModUtil.LOGGER.error("Something bad happened when trying to open a URL!", e); } } else if(button.id == BUTTON_FORUM_ID){ @@ -293,7 +341,7 @@ public class GuiBooklet extends GuiScreen{ } } catch(Exception e){ - e.printStackTrace(); + ModUtil.LOGGER.error("Something bad happened when trying to open a URL!", e); } } else if(button.id == BUTTON_CONFIG_ID){ @@ -458,8 +506,8 @@ public class GuiBooklet extends GuiScreen{ private static class TexturedButton extends GuiButton{ - private int texturePosX; - private int texturePosY; + public int texturePosX; + public int texturePosY; public TexturedButton(int id, int x, int y, int texturePosX, int texturePosY, int width, int height){ super(id, x, y, width, height, ""); @@ -467,6 +515,11 @@ public class GuiBooklet extends GuiScreen{ this.texturePosY = texturePosY; } + public void setTexturePos(int x, int y){ + this.texturePosX = x; + this.texturePosY = y; + } + @Override public void drawButton(Minecraft minecraft, int x, int y){ if(this.visible){ @@ -474,6 +527,7 @@ public class GuiBooklet extends GuiScreen{ GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); this.field_146123_n = x >= this.xPosition && y >= this.yPosition && x < this.xPosition+this.width && y < this.yPosition+this.height; int k = this.getHoverState(this.field_146123_n); + if(k == 0) k = 1; GL11.glEnable(GL11.GL_BLEND); OpenGlHelper.glBlendFunc(770, 771, 1, 0); GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA); diff --git a/src/main/java/ellpeck/actuallyadditions/proxy/ClientProxy.java b/src/main/java/ellpeck/actuallyadditions/proxy/ClientProxy.java index 0453d5c97..4b23e0d3d 100644 --- a/src/main/java/ellpeck/actuallyadditions/proxy/ClientProxy.java +++ b/src/main/java/ellpeck/actuallyadditions/proxy/ClientProxy.java @@ -23,7 +23,7 @@ import ellpeck.actuallyadditions.config.values.ConfigBoolValues; import ellpeck.actuallyadditions.config.values.ConfigIntValues; import ellpeck.actuallyadditions.event.RenderPlayerEventAA; import ellpeck.actuallyadditions.tile.*; -import ellpeck.actuallyadditions.update.UpdateChecker; +import ellpeck.actuallyadditions.update.UpdateCheckerClientNotifier; import ellpeck.actuallyadditions.util.AssetUtil; import ellpeck.actuallyadditions.util.ModUtil; import ellpeck.actuallyadditions.util.PersistantVariables; @@ -41,10 +41,6 @@ public class ClientProxy implements IProxy{ public void preInit(FMLPreInitializationEvent event){ ModUtil.LOGGER.info("PreInitializing ClientProxy..."); - if(ConfigBoolValues.DO_UPDATE_CHECK.isEnabled()){ - new UpdateChecker().init(); - } - PersistantVariables.setTheFile(new File(event.getModConfigurationDirectory().getParent(), ModUtil.MOD_ID+"Data.dat")); } @@ -53,6 +49,10 @@ public class ClientProxy implements IProxy{ public void init(FMLInitializationEvent event){ ModUtil.LOGGER.info("Initializing ClientProxy..."); + if(ConfigBoolValues.DO_UPDATE_CHECK.isEnabled()){ + Util.registerEvent(new UpdateCheckerClientNotifier()); + } + AssetUtil.COMPOST_RENDER_ID = RenderingRegistry.getNextAvailableRenderId(); AssetUtil.FISHING_NET_RENDER_ID = RenderingRegistry.getNextAvailableRenderId(); AssetUtil.FURNACE_SOLAR_RENDER_ID = RenderingRegistry.getNextAvailableRenderId(); diff --git a/src/main/java/ellpeck/actuallyadditions/update/UpdateChecker.java b/src/main/java/ellpeck/actuallyadditions/update/UpdateChecker.java index 7f3607f49..ed3404ff1 100644 --- a/src/main/java/ellpeck/actuallyadditions/update/UpdateChecker.java +++ b/src/main/java/ellpeck/actuallyadditions/update/UpdateChecker.java @@ -10,21 +10,13 @@ package ellpeck.actuallyadditions.update; -import cpw.mods.fml.common.eventhandler.SubscribeEvent; -import cpw.mods.fml.common.gameevent.TickEvent; import ellpeck.actuallyadditions.util.ModUtil; -import ellpeck.actuallyadditions.util.StringUtil; import ellpeck.actuallyadditions.util.Util; -import net.minecraft.client.Minecraft; -import net.minecraft.entity.player.EntityPlayer; -import net.minecraft.util.ChatComponentText; -import net.minecraft.util.IChatComponent; public class UpdateChecker{ public static boolean doneChecking = false; public static boolean checkFailed = false; - private static boolean notified = false; public static String updateVersionS; public static int updateVersion; public static int clientVersion; @@ -37,32 +29,4 @@ public class UpdateChecker{ Util.registerEvent(this); new ThreadUpdateChecker(); } - - @SubscribeEvent(receiveCanceled = true) - public void onTick(TickEvent.ClientTickEvent event){ - //Don't notify directly to prevent the Message getting lost in Spam on World Joining - if(Minecraft.getSystemTime() % 200 == 0 && !notified && doneChecking && Minecraft.getMinecraft().thePlayer != null){ - EntityPlayer player = Minecraft.getMinecraft().thePlayer; - if(checkFailed){ - player.addChatComponentMessage(IChatComponent.Serializer.func_150699_a(StringUtil.localize("info."+ModUtil.MOD_ID_LOWER+".update.failed.desc"))); - } - else{ - if(updateVersion > clientVersion){ - String notice1 = "info."+ModUtil.MOD_ID_LOWER+".update.generic.desc"; - String notice2 = "info."+ModUtil.MOD_ID_LOWER+".update.versionComp.desc"; - String notice3 = "info."+ModUtil.MOD_ID_LOWER+".update.changelog.desc"; - String notice4 = "info."+ModUtil.MOD_ID_LOWER+".update.download.desc"; - player.addChatComponentMessage(new ChatComponentText("")); - player.addChatComponentMessage(IChatComponent.Serializer.func_150699_a(StringUtil.localize(notice1))); - player.addChatComponentMessage(IChatComponent.Serializer.func_150699_a(StringUtil.localizeFormatted(notice2, ModUtil.VERSION, updateVersionS))); - player.addChatComponentMessage(new ChatComponentText(StringUtil.localizeFormatted(notice3, changelog))); - player.addChatComponentMessage(IChatComponent.Serializer.func_150699_a(StringUtil.localizeFormatted(notice4, DOWNLOAD_LINK))); - player.addChatComponentMessage(new ChatComponentText("")); - } - } - notified = true; - } - } - - } diff --git a/src/main/java/ellpeck/actuallyadditions/update/UpdateCheckerClientNotifier.java b/src/main/java/ellpeck/actuallyadditions/update/UpdateCheckerClientNotifier.java new file mode 100644 index 000000000..9223ad6eb --- /dev/null +++ b/src/main/java/ellpeck/actuallyadditions/update/UpdateCheckerClientNotifier.java @@ -0,0 +1,51 @@ +/* + * This file ("UpdateCheckerClientNotifier.java") is part of the Actually Additions Mod for Minecraft. + * It is created and owned by Ellpeck and distributed + * under the Actually Additions License to be found at + * http://github.com/Ellpeck/ActuallyAdditions/blob/master/README.md + * View the source code at https://github.com/Ellpeck/ActuallyAdditions + * + * © 2015 Ellpeck + */ + +package ellpeck.actuallyadditions.update; + +import cpw.mods.fml.common.eventhandler.SubscribeEvent; +import cpw.mods.fml.common.gameevent.TickEvent; +import ellpeck.actuallyadditions.util.ModUtil; +import ellpeck.actuallyadditions.util.StringUtil; +import net.minecraft.client.Minecraft; +import net.minecraft.entity.player.EntityPlayer; +import net.minecraft.util.ChatComponentText; +import net.minecraft.util.IChatComponent; + +public class UpdateCheckerClientNotifier{ + + private static boolean notified = false; + + @SubscribeEvent(receiveCanceled = true) + public void onTick(TickEvent.ClientTickEvent event){ + //Don't notify directly to prevent the Message getting lost in Spam on World Joining + if(Minecraft.getSystemTime() % 200 == 0 && !notified && UpdateChecker.doneChecking && Minecraft.getMinecraft().thePlayer != null){ + EntityPlayer player = Minecraft.getMinecraft().thePlayer; + if(UpdateChecker.checkFailed){ + player.addChatComponentMessage(IChatComponent.Serializer.func_150699_a(StringUtil.localize("info."+ModUtil.MOD_ID_LOWER+".update.failed.desc"))); + } + else{ + if(UpdateChecker.updateVersion > UpdateChecker.clientVersion){ + String notice1 = "info."+ModUtil.MOD_ID_LOWER+".update.generic.desc"; + String notice2 = "info."+ModUtil.MOD_ID_LOWER+".update.versionComp.desc"; + String notice3 = "info."+ModUtil.MOD_ID_LOWER+".update.changelog.desc"; + String notice4 = "info."+ModUtil.MOD_ID_LOWER+".update.download.desc"; + player.addChatComponentMessage(new ChatComponentText("")); + player.addChatComponentMessage(IChatComponent.Serializer.func_150699_a(StringUtil.localize(notice1))); + player.addChatComponentMessage(IChatComponent.Serializer.func_150699_a(StringUtil.localizeFormatted(notice2, ModUtil.VERSION, UpdateChecker.updateVersionS))); + player.addChatComponentMessage(new ChatComponentText(StringUtil.localizeFormatted(notice3, UpdateChecker.changelog))); + player.addChatComponentMessage(IChatComponent.Serializer.func_150699_a(StringUtil.localizeFormatted(notice4, UpdateChecker.DOWNLOAD_LINK))); + player.addChatComponentMessage(new ChatComponentText("")); + } + } + notified = true; + } + } +} diff --git a/src/main/resources/assets/actuallyadditions/textures/gui/guiBooklet.png b/src/main/resources/assets/actuallyadditions/textures/gui/guiBooklet.png index 0de8cff24d4e7b6c6b1042d0123f22365d89c446..95762e222e4dcfc326f586e3532f782091f6096e 100644 GIT binary patch literal 13699 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 WcR}&0#R@?GeztR1Q?QyJ_x}LY*fNL! literal 13527 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 NyRKM}GhdMO{{XfP#@GM=