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 1b6925645..1b2f49f05 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/api/booklet/IBookletPage.java +++ b/src/main/java/de/ellpeck/actuallyadditions/api/booklet/IBookletPage.java @@ -56,4 +56,6 @@ public interface IBookletPage{ void drawScreenPost(GuiBookletBase gui, int startX, int startY, int mouseX, int mouseY, float partialTicks); boolean shouldBeOnLeftSide(); + + String getIdentifier(); } diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/button/BookmarkButton.java b/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/button/BookmarkButton.java new file mode 100644 index 000000000..164f13f8d --- /dev/null +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/button/BookmarkButton.java @@ -0,0 +1,112 @@ +/* + * This file ("BookmarkButton.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://ellpeck.de/actaddlicense + * View the source code at https://github.com/Ellpeck/ActuallyAdditions + * + * © 2015-2016 Ellpeck + */ + +package de.ellpeck.actuallyadditions.mod.booklet.button; + +import de.ellpeck.actuallyadditions.api.booklet.IBookletChapter; +import de.ellpeck.actuallyadditions.api.booklet.IBookletPage; +import de.ellpeck.actuallyadditions.mod.booklet.gui.GuiBooklet; +import de.ellpeck.actuallyadditions.mod.booklet.gui.GuiPage; +import de.ellpeck.actuallyadditions.mod.booklet.misc.BookletUtils; +import de.ellpeck.actuallyadditions.mod.util.AssetUtil; +import net.minecraft.client.Minecraft; +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.client.config.GuiUtils; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +import java.util.ArrayList; +import java.util.List; + +@SideOnly(Side.CLIENT) +public class BookmarkButton extends GuiButton{ + + private final GuiBooklet booklet; + public IBookletPage assignedPage; + + public BookmarkButton(int id, int x, int y, GuiBooklet booklet){ + super(id, x, y, 16, 16, ""); + this.booklet = booklet; + } + + public void onPressed(){ + if(this.assignedPage != null){ + if(GuiScreen.isShiftKeyDown()){ + this.assignedPage = null; + } + else{ + GuiPage gui = BookletUtils.createPageGui(this.booklet.previousScreen, this.booklet, this.assignedPage); + Minecraft.getMinecraft().displayGuiScreen(gui); + } + } + else{ + if(this.booklet instanceof GuiPage){ + this.assignedPage = ((GuiPage)this.booklet).pages[0]; + } + } + } + + @Override + public void drawButton(Minecraft minecraft, int x, int y){ + if(this.visible){ + minecraft.getTextureManager().bindTexture(GuiBooklet.RES_LOC_GADGETS); + GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F); + this.hovered = x >= this.xPosition && y >= this.yPosition && x < this.xPosition+this.width && y < this.yPosition+this.height; + int k = this.getHoverState(this.hovered); + if(k == 0){ + k = 1; + } + + GlStateManager.enableBlend(); + GlStateManager.tryBlendFuncSeparate(770, 771, 1, 0); + GlStateManager.blendFunc(770, 771); + int renderHeight = 25; + this.drawTexturedModalRect(this.xPosition, this.yPosition, 224+(this.assignedPage == null ? 0 : 16), 14-renderHeight+k*renderHeight, this.width, renderHeight); + this.mouseDragged(minecraft, x, y); + + if(this.assignedPage != null){ + ItemStack display = this.assignedPage.getChapter().getDisplayItemStack(); + if(display != null){ + GlStateManager.pushMatrix(); + AssetUtil.renderStackToGui(display, this.xPosition+2, this.yPosition+1, 0.725F); + GlStateManager.popMatrix(); + } + } + } + } + + public void drawHover(int mouseX, int mouseY){ + if(this.isMouseOver()){ + List list = new ArrayList(); + + if(this.assignedPage != null){ + IBookletChapter chapter = this.assignedPage.getChapter(); + + list.add(TextFormatting.GOLD+chapter.getLocalizedName()+", Page "+(chapter.getPageIndex(this.assignedPage)+1)); + list.add("Click to open"); + list.add(TextFormatting.ITALIC+"Shift-Click to remove"); + } + else{ + list.add(TextFormatting.GOLD+"None"); + + if(this.booklet instanceof GuiPage){ + list.add("Click to save current page"); + } + } + + Minecraft mc = Minecraft.getMinecraft(); + GuiUtils.drawHoveringText(list, mouseX, mouseY, mc.displayWidth, mc.displayHeight, -1, mc.fontRendererObj); + } + } +} diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/gui/GuiBooklet.java b/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/gui/GuiBooklet.java index e502be321..4a928bd48 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/gui/GuiBooklet.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/gui/GuiBooklet.java @@ -12,6 +12,9 @@ package de.ellpeck.actuallyadditions.mod.booklet.gui; import de.ellpeck.actuallyadditions.api.ActuallyAdditionsAPI; import de.ellpeck.actuallyadditions.api.booklet.internal.GuiBookletBase; +import de.ellpeck.actuallyadditions.mod.booklet.button.BookmarkButton; +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.util.AssetUtil; import de.ellpeck.actuallyadditions.mod.util.StringUtil; @@ -23,6 +26,7 @@ import net.minecraft.util.ResourceLocation; import net.minecraft.util.text.TextFormatting; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; +import org.apache.commons.lang3.ArrayUtils; import org.lwjgl.input.Keyboard; import java.io.IOException; @@ -41,6 +45,7 @@ public abstract class GuiBooklet extends GuiBookletBase{ private GuiButton buttonLeft; private GuiButton buttonRight; private GuiButton buttonBack; + private final BookmarkButton[] bookmarkButtons = new BookmarkButton[12]; public GuiTextField searchField; @@ -84,10 +89,41 @@ public abstract class GuiBooklet extends GuiBookletBase{ this.searchField.setMaxStringLength(50); this.searchField.setEnableBackgroundDrawing(false); } + + if(this.hasBookmarkButtons()){ + PlayerSave data = PlayerData.getDataFromPlayer(this.mc.thePlayer); + for(int i = 0; i < this.bookmarkButtons.length; i++){ + this.bookmarkButtons[i] = new BookmarkButton(1337+i, this.guiLeft+12+i*16, this.guiTop+this.ySize, this); + this.buttonList.add(this.bookmarkButtons[i]); + + if(data.bookmarks[i] != null){ + this.bookmarkButtons[i].assignedPage = data.bookmarks[i]; + } + } + } + } + + @Override + public void onGuiClosed(){ + super.onGuiClosed(); + + PlayerSave data = PlayerData.getDataFromPlayer(this.mc.thePlayer); + + for(int i = 0; i < this.bookmarkButtons.length; i++){ + data.bookmarks[i] = this.bookmarkButtons[i].assignedPage; + } + + data.lastOpenBooklet = this; } @Override public void drawScreen(int mouseX, int mouseY, float partialTicks){ + this.drawScreenPre(mouseX, mouseY, partialTicks); + super.drawScreen(mouseX, mouseY, partialTicks); + this.drawScreenPost(mouseX, mouseY, partialTicks); + } + + public void drawScreenPre(int mouseX, int mouseY, float partialTicks){ GlStateManager.color(1F, 1F, 1F); this.mc.getTextureManager().bindTexture(RES_LOC_GUI); drawModalRectWithCustomSizedTexture(this.guiLeft, this.guiTop, 0, 0, this.xSize, this.ySize, 512, 512); @@ -107,8 +143,14 @@ public abstract class GuiBooklet extends GuiBookletBase{ this.fontRendererObj.setUnicodeFlag(unicodeBefore); } + } - super.drawScreen(mouseX, mouseY, partialTicks); + public void drawScreenPost(int mouseX, int mouseY, float partialTicks){ + if(this.hasBookmarkButtons()){ + for(BookmarkButton button : this.bookmarkButtons){ + button.drawHover(mouseX, mouseY); + } + } } @Override @@ -162,6 +204,10 @@ public abstract class GuiBooklet extends GuiBookletBase{ return true; } + public boolean hasBookmarkButtons(){ + return true; + } + public void onSearchBarChanged(String searchBarText){ GuiBookletBase parent = !(this instanceof GuiEntry) ? this : this.parentPage; this.mc.displayGuiScreen(new GuiEntry(this.previousScreen, parent, ActuallyAdditionsAPI.allAndSearch, 0, searchBarText, true)); @@ -178,6 +224,12 @@ public abstract class GuiBooklet extends GuiBookletBase{ else if(this.hasBackButton() && button == this.buttonBack){ this.onBackButtonPressed(); } + else if(this.hasBookmarkButtons() && button instanceof BookmarkButton){ + int index = ArrayUtils.indexOf(this.bookmarkButtons, button); + if(index >= 0){ + this.bookmarkButtons[index].onPressed(); + } + } else{ super.actionPerformed(button); } 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 dc55c6c3a..6ed441d9a 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 @@ -19,6 +19,7 @@ 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.nbt.NBTTagCompound; import net.minecraftforge.fml.relauncher.Side; import net.minecraftforge.fml.relauncher.SideOnly; @@ -116,8 +117,8 @@ public class GuiPage extends GuiBooklet{ } @Override - public void drawScreen(int mouseX, int mouseY, float partialTicks){ - super.drawScreen(mouseX, mouseY, partialTicks); + public void drawScreenPre(int mouseX, int mouseY, float partialTicks){ + super.drawScreenPre(mouseX, mouseY, partialTicks); for(int i = 0; i < this.pages.length; i++){ IBookletPage page = this.pages[i]; @@ -129,6 +130,11 @@ public class GuiPage extends GuiBooklet{ for(ItemDisplay display : this.itemDisplays){ display.drawPre(); } + } + + @Override + public void drawScreenPost(int mouseX, int mouseY, float partialTicks){ + super.drawScreenPost(mouseX, mouseY, partialTicks); for(int i = 0; i < this.pages.length; i++){ IBookletPage page = this.pages[i]; diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/misc/BookletUtils.java b/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/misc/BookletUtils.java index bc299d41d..093fe7ed1 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/misc/BookletUtils.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/booklet/misc/BookletUtils.java @@ -14,7 +14,6 @@ import de.ellpeck.actuallyadditions.api.ActuallyAdditionsAPI; import de.ellpeck.actuallyadditions.api.booklet.IBookletChapter; import de.ellpeck.actuallyadditions.api.booklet.IBookletPage; import de.ellpeck.actuallyadditions.api.booklet.internal.GuiBookletBase; -import de.ellpeck.actuallyadditions.mod.booklet.gui.GuiBooklet; import de.ellpeck.actuallyadditions.mod.booklet.gui.GuiEntry; import de.ellpeck.actuallyadditions.mod.booklet.gui.GuiMainPage; import de.ellpeck.actuallyadditions.mod.booklet.gui.GuiPage; @@ -70,4 +69,17 @@ public final class BookletUtils{ return new GuiPage(previousScreen, parentPage, page1, page2); } + + public static IBookletPage getBookletPageById(String id){ + if(id != null){ + for(IBookletChapter chapter : ActuallyAdditionsAPI.ALL_CHAPTERS){ + for(IBookletPage page : chapter.getAllPages()){ + if(id.equals(page.getIdentifier())){ + return page; + } + } + } + } + return null; + } } 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 1e4e31cf7..d691fc7d3 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 @@ -136,6 +136,11 @@ public class BookletPage implements IBookletPage{ return (this.chapter.getPageIndex(this)+1)%2 != 0; } + @Override + public String getIdentifier(){ + return this.chapter.getIdentifier()+"."+this.chapter.getPageIndex(this); + } + public BookletPage setNoText(){ this.hasNoText = true; return this; diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/data/PlayerData.java b/src/main/java/de/ellpeck/actuallyadditions/mod/data/PlayerData.java index 404f71c20..bbedc08e8 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/data/PlayerData.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/data/PlayerData.java @@ -10,8 +10,15 @@ package de.ellpeck.actuallyadditions.mod.data; +import de.ellpeck.actuallyadditions.api.booklet.IBookletPage; +import de.ellpeck.actuallyadditions.mod.booklet.gui.GuiBooklet; +import de.ellpeck.actuallyadditions.mod.booklet.misc.BookletUtils; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.nbt.NBTTagCompound; +import net.minecraft.nbt.NBTTagList; +import net.minecraft.nbt.NBTTagString; +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; import java.util.List; import java.util.UUID; @@ -44,6 +51,11 @@ public final class PlayerData{ public boolean displayTesla; public boolean bookGottenAlready; + public IBookletPage[] bookmarks = new IBookletPage[12]; + + @SideOnly(Side.CLIENT) + public GuiBooklet lastOpenBooklet; + public PlayerSave(UUID id){ this.id = id; } @@ -51,11 +63,26 @@ public final class PlayerData{ public void readFromNBT(NBTTagCompound compound){ this.displayTesla = compound.getBoolean("DisplayTesla"); this.bookGottenAlready = compound.getBoolean("BookGotten"); + + NBTTagList bookmarks = compound.getTagList("Bookmarks", 8); + for(int i = 0; i < bookmarks.tagCount(); i++){ + String strg = bookmarks.getStringTagAt(i); + if(strg != null && !strg.isEmpty()){ + IBookletPage page = BookletUtils.getBookletPageById(strg); + this.bookmarks[i] = page; + } + } } public void writeToNBT(NBTTagCompound compound){ compound.setBoolean("DisplayTesla", this.displayTesla); compound.setBoolean("BookGotten", this.bookGottenAlready); + + NBTTagList bookmarks = new NBTTagList(); + for(IBookletPage bookmark : this.bookmarks){ + bookmarks.appendTag(new NBTTagString(bookmark == null ? "" : bookmark.getIdentifier())); + } + compound.setTag("Bookmarks", bookmarks); } } diff --git a/src/main/java/de/ellpeck/actuallyadditions/mod/inventory/GuiHandler.java b/src/main/java/de/ellpeck/actuallyadditions/mod/inventory/GuiHandler.java index 29a7b81c0..82e915bc6 100644 --- a/src/main/java/de/ellpeck/actuallyadditions/mod/inventory/GuiHandler.java +++ b/src/main/java/de/ellpeck/actuallyadditions/mod/inventory/GuiHandler.java @@ -14,6 +14,7 @@ import de.ellpeck.actuallyadditions.mod.ActuallyAdditions; import de.ellpeck.actuallyadditions.mod.booklet.gui.GuiBooklet; import de.ellpeck.actuallyadditions.mod.booklet.gui.GuiMainPage; import de.ellpeck.actuallyadditions.mod.booklet.misc.BookletUtils; +import de.ellpeck.actuallyadditions.mod.data.PlayerData; import de.ellpeck.actuallyadditions.mod.inventory.gui.*; import de.ellpeck.actuallyadditions.mod.items.ItemBooklet; import de.ellpeck.actuallyadditions.mod.tile.TileEntityBase; @@ -177,7 +178,13 @@ public class GuiHandler implements IGuiHandler{ return gui; } else{ - return new GuiMainPage(null); + PlayerData.PlayerSave data = PlayerData.getDataFromPlayer(player); + if(data.lastOpenBooklet != null){ + return data.lastOpenBooklet; + } + else{ + return new GuiMainPage(null); + } } case DIRECTIONAL_BREAKER: return new GuiDirectionalBreaker(player.inventory, tile); 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 a5842423f..6e1af9b4f 100644 Binary files a/src/main/resources/assets/actuallyadditions/textures/gui/booklet/guiBookletGadgets.png and b/src/main/resources/assets/actuallyadditions/textures/gui/booklet/guiBookletGadgets.png differ