From c8f4c94c94fd26d8677ee574873457d070b7a9a2 Mon Sep 17 00:00:00 2001 From: Ellpeck Date: Thu, 17 Nov 2016 17:36:00 +0100 Subject: [PATCH] Added back config, achievements and view online button --- .../api/booklet/IBookletPage.java | 2 + .../mod/booklet/gui/GuiMainPage.java | 33 ++++++++++- .../mod/booklet/gui/GuiPage.java | 52 ++++++++++++++++-- .../mod/booklet/misc/GuiAAAchievements.java | 19 ++++++- .../mod/booklet/page/BookletPage.java | 5 ++ .../mod/booklet/page/PageLinkButton.java | 2 +- .../gui/booklet/guibookletgadgets.png | Bin 6561 -> 7695 bytes 7 files changed, 106 insertions(+), 7 deletions(-) diff --git a/src/main/java/de/ellpeck/actuallyadditions/api/booklet/IBookletPage.java b/src/main/java/de/ellpeck/actuallyadditions/api/booklet/IBookletPage.java index 789e99875..bdfe0f55e 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/api/booklet/IBookletPage.java +++ b/src/main/java/de/ellpeck/actuallyadditions/api/booklet/IBookletPage.java @@ -59,6 +59,8 @@ public interface IBookletPage{ String getIdentifier(); + String getWebLink(); + IBookletPage addTextReplacement(String key, String value); IBookletPage addTextReplacement(String key, float value); diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/gui/GuiMainPage.java b/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/gui/GuiMainPage.java index 6f2efbac1..e12ef792f 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/gui/GuiMainPage.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/gui/GuiMainPage.java @@ -14,8 +14,11 @@ import de.ellpeck.actuallyadditions.api.ActuallyAdditionsAPI; import de.ellpeck.actuallyadditions.api.booklet.IBookletEntry; import de.ellpeck.actuallyadditions.mod.booklet.InitBooklet; import de.ellpeck.actuallyadditions.mod.booklet.button.EntryButton; +import de.ellpeck.actuallyadditions.mod.booklet.misc.GuiAAAchievements; +import de.ellpeck.actuallyadditions.mod.config.GuiConfiguration; import de.ellpeck.actuallyadditions.mod.data.PlayerData; import de.ellpeck.actuallyadditions.mod.data.PlayerData.PlayerSave; +import de.ellpeck.actuallyadditions.mod.inventory.gui.TexturedButton; import de.ellpeck.actuallyadditions.mod.network.PacketHandlerHelper; import de.ellpeck.actuallyadditions.mod.util.ModUtil; import de.ellpeck.actuallyadditions.mod.util.StringUtil; @@ -30,6 +33,8 @@ import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; import java.util.List; @SideOnly(Side.CLIENT) @@ -46,9 +51,15 @@ public class GuiMainPage extends GuiBooklet{ "It's got some stuff I guess.@Ellpeck", "Actually Additions should be included in every new modpack that includes any form of tech.@KarillEndusa", "A mod that basically lets you do what ever the heck you want.@Joshwoo70", - "TINY TORCHES!! BABY TORCHES!! Somebody actually finally did it!!@Soaryn" + "TINY TORCHES!! BABY TORCHES!! Somebody actually finally did it!!@Soaryn", + "Balanced mod wich makes things different - in a good way.@garantiertnicht", + "The mod everyone needs, but not everyone knows@Brewpl", + "The in-game documentation is the best I’ve seen. I especially love the JEI integration. Even a derp like me can figure it out.@dannydjdk" }; + private TexturedButton achievementButton; + private TexturedButton configButton; + private GuiButton tutorialButton; private boolean showTutorial; @@ -86,6 +97,18 @@ public class GuiMainPage extends GuiBooklet{ this.buttonList.add(this.tutorialButton); } + List configText = new ArrayList(); + configText.add(TextFormatting.GOLD+"Open Config GUI"); + configText.addAll(this.fontRendererObj.listFormattedStringToWidth("Press this to configure "+ModUtil.NAME+" in-game. \nSome changes will require a game restart!", 200)); + this.configButton = new TexturedButton(RES_LOC_GADGETS, -388, this.guiLeft+16, this.guiTop+this.ySize-30, 188, 14, 16, 16, configText); + this.buttonList.add(this.configButton); + + List achievementText = new ArrayList(); + achievementText.add(TextFormatting.GOLD+"Open Achievements"); + achievementText.addAll(this.fontRendererObj.listFormattedStringToWidth("Press this to open the "+ModUtil.NAME+" Achievements.", 200)); + this.achievementButton = new TexturedButton(RES_LOC_GADGETS, -389, this.guiLeft+36, this.guiTop+this.ySize-30, 204, 14, 16, 16, achievementText); + this.buttonList.add(this.achievementButton); + for(int i = 0; i < BUTTONS_PER_PAGE; i++){ if(ActuallyAdditionsAPI.BOOKLET_ENTRIES.size() > i){ IBookletEntry entry = ActuallyAdditionsAPI.BOOKLET_ENTRIES.get(i); @@ -107,6 +130,14 @@ public class GuiMainPage extends GuiBooklet{ } } } + else if(button == this.achievementButton){ + GuiScreen achievements = new GuiAAAchievements(this, this.mc.thePlayer.getStatFileWriter()); + this.mc.displayGuiScreen(achievements); + } + else if(button == this.configButton){ + GuiScreen config = new GuiConfiguration(this); + this.mc.displayGuiScreen(config); + } else if(this.showTutorial && button == this.tutorialButton){ if(this.hasBookmarkButtons()){ if(!isShiftKeyDown()){ diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/gui/GuiPage.java b/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/gui/GuiPage.java index c3b3f06f7..a67ba795f 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/gui/GuiPage.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/gui/GuiPage.java @@ -15,15 +15,21 @@ import de.ellpeck.actuallyadditions.api.booklet.IBookletPage; import de.ellpeck.actuallyadditions.api.booklet.internal.GuiBookletBase; import de.ellpeck.actuallyadditions.mod.booklet.misc.BookletUtils; import de.ellpeck.actuallyadditions.mod.booklet.page.ItemDisplay; +import de.ellpeck.actuallyadditions.mod.inventory.gui.TexturedButton; +import de.ellpeck.actuallyadditions.mod.util.ModUtil; import net.minecraft.client.gui.GuiButton; import net.minecraft.client.gui.GuiScreen; import net.minecraft.client.renderer.GlStateManager; import net.minecraft.item.ItemStack; +import net.minecraft.util.text.TextFormatting; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; +import java.awt.*; import java.io.IOException; +import java.net.URI; import java.util.ArrayList; +import java.util.Collections; import java.util.List; @SideOnly(Side.CLIENT) @@ -33,6 +39,8 @@ public class GuiPage extends GuiBooklet{ private final List itemDisplays = new ArrayList(); private int pageTimer; + private GuiButton buttonViewOnline; + public GuiPage(GuiScreen previousScreen, GuiBookletBase parentPage, IBookletPage page1, IBookletPage page2){ super(previousScreen, parentPage); @@ -79,11 +87,26 @@ public class GuiPage extends GuiBooklet{ @Override public void actionPerformed(GuiButton button) throws IOException{ - super.actionPerformed(button); + if(button == this.buttonViewOnline){ + List links = this.getWebLinks(); + if(Desktop.isDesktopSupported()){ + for(String link : links){ + try{ + Desktop.getDesktop().browse(new URI(link)); + } + catch(Exception e){ + ModUtil.LOGGER.error("Couldn't open website from Booklet page!", e); + } + } + } + } + else{ + super.actionPerformed(button); - for(IBookletPage page : this.pages){ - if(page != null){ - page.actionPerformed(this, button); + for(IBookletPage page : this.pages){ + if(page != null){ + page.actionPerformed(this, button); + } } } } @@ -93,6 +116,12 @@ public class GuiPage extends GuiBooklet{ this.itemDisplays.clear(); super.initGui(); + List links = this.getWebLinks(); + if(links != null && !links.isEmpty()){ + this.buttonViewOnline = new TexturedButton(RES_LOC_GADGETS, -782822, this.guiLeft+this.xSize-24, this.guiTop+this.ySize-25, 0, 172, 16, 16, Collections.singletonList(TextFormatting.GOLD+"View Online")); + this.buttonList.add(this.buttonViewOnline); + } + for(int i = 0; i < this.pages.length; i++){ IBookletPage page = this.pages[i]; if(page != null){ @@ -101,6 +130,21 @@ public class GuiPage extends GuiBooklet{ } } + private List getWebLinks(){ + List links = new ArrayList(); + + for(IBookletPage page : this.pages){ + if(page != null){ + String link = page.getWebLink(); + if(link != null && !links.contains(link)){ + links.add(link); + } + } + } + + return links; + } + @Override public void updateScreen(){ super.updateScreen(); diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/misc/GuiAAAchievements.java b/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/misc/GuiAAAchievements.java index cb23c04f8..03ed10850 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/misc/GuiAAAchievements.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/misc/GuiAAAchievements.java @@ -18,6 +18,9 @@ import net.minecraft.stats.StatisticsManager; import net.minecraftforge.fml.relauncher.ReflectionHelper; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; +import org.lwjgl.input.Keyboard; + +import java.io.IOException; /** * (Partially excerpted from Botania by Vazkii with permission, thanks!) @@ -38,6 +41,20 @@ public class GuiAAAchievements extends GuiAchievements{ @Override public void initGui(){ super.initGui(); - this.buttonList.get(1).displayString = InitAchievements.theAchievementPage.getName(); + + try{ + this.buttonList.remove(1); + } + catch(Exception e){ + ModUtil.LOGGER.error("Something went wrong trying to initialize the Achievements GUI!", e); + } + } + + @Override + protected void keyTyped(char typedChar, int key) throws IOException{ + if(key == Keyboard.KEY_ESCAPE || key == this.mc.gameSettings.keyBindInventory.getKeyCode()){ + this.mc.displayGuiScreen(this.parentScreen); + } + else super.keyTyped(typedChar, key); } } diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/page/BookletPage.java b/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/page/BookletPage.java index 6822208f8..e3951a67f 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/page/BookletPage.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/page/BookletPage.java @@ -139,6 +139,11 @@ public class BookletPage implements IBookletPage{ return this.chapter.getIdentifier()+"."+this.chapter.getPageIndex(this); } + @Override + public String getWebLink(){ + return "http://ellpeck.de/actaddmanual#"+this.chapter.getIdentifier(); + } + public BookletPage setNoText(){ this.hasNoText = true; return this; diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/page/PageLinkButton.java b/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/page/PageLinkButton.java index 056865841..313878f61 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/page/PageLinkButton.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/page/PageLinkButton.java @@ -49,7 +49,7 @@ public class PageLinkButton extends BookletPage{ Desktop.getDesktop().browse(new URI(this.link)); } catch(Exception e){ - ModUtil.LOGGER.info("Couldn't open website from Link Button page!", e); + ModUtil.LOGGER.error("Couldn't open website from Link Button page!", e); } } } diff --git a/src/main/resources/assets/actuallyadditions/textures/gui/booklet/guibookletgadgets.png b/src/main/resources/assets/actuallyadditions/textures/gui/booklet/guibookletgadgets.png index 6e1af9b4f9964ab5b973eb278cea58ec2dd37151..bd63be8a61063c5c88dc6fd6ae04c4355df5b2d1 100644 GIT binary patch literal 7695 zcmds6XIN8Pmp&mF10<4w^cKJyRD{qJ3ng?>%JteP(yJm(dJmWjL8@W_>F7n2E)qam z=peoKE`mbnod9#t&zW!LnP2mBe&jj(?6cR}Yp=ETyGla;)X_jPax($|fYiLI`WFB| zz##;H!@$SAM;X@OgWg6-TL}R2qnK!B$G~?6r>pud0B|Dx=m!ZIdG82L9(UE$Ry#fp z=SN?Xq<#`z2B)}O)%09%I$FDWm_4!roXqY!xQaVixng9*CB!AAROsy%0D#X+Q&s7f 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�IYVivC}G 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