diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/ClientEventHandler.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/ClientEventHandler.java
index 705576b23..5760036eb 100644
--- a/src/main/java/pl/pabilo8/immersiveintelligence/client/ClientEventHandler.java
+++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/ClientEventHandler.java
@@ -106,6 +106,7 @@
import pl.pabilo8.immersiveintelligence.common.entity.EntityTripodPeriscope;
import pl.pabilo8.immersiveintelligence.common.entity.ammo.types.EntityAmmoProjectile;
import pl.pabilo8.immersiveintelligence.common.entity.vehicle.utils.part.EntityVehicleSeat;
+import pl.pabilo8.immersiveintelligence.common.item.ItemIIPrintedPage.PageType;
import pl.pabilo8.immersiveintelligence.common.item.weapons.ItemIIGunBase;
import pl.pabilo8.immersiveintelligence.common.item.weapons.ItemIIRailgunOverride;
import pl.pabilo8.immersiveintelligence.common.network.IIPacketHandler;
@@ -978,7 +979,7 @@ public void onRenderHand(RenderSpecificHandEvent event)
.doHandRender(stack, event.getHand(), stackOpposite, event.getSwingProgress(), event.getPartialTicks()))
event.setCanceled(true);
- if(stack.getItem()==IIContent.itemPrintedPage)
+ if(stack.getItem()==IIContent.itemPrintedPage && PageType.fromStack(stack).useHandSpecialRender())
{
PrintedPageRenderer.renderItemFirstPerson(stack, event.getHand(), event.getEquipProgress(), event.getSwingProgress(), event.getInterpolatedPitch());
event.setCanceled(true);
diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/item/GuiPrintedPage.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/item/GuiPrintedPage.java
index 21c3fbb59..c4b49943e 100644
--- a/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/item/GuiPrintedPage.java
+++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/gui/item/GuiPrintedPage.java
@@ -2,17 +2,31 @@
import blusunrize.immersiveengineering.client.ClientUtils;
import blusunrize.immersiveengineering.common.util.ItemNBTHelper;
+import net.minecraft.client.Minecraft;
+import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.GuiScreen;
+import net.minecraft.client.renderer.BufferBuilder;
import net.minecraft.client.renderer.GlStateManager;
+import net.minecraft.client.renderer.Tessellator;
+import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
+import net.minecraft.client.resources.I18n;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.EnumHand;
+import net.minecraft.util.ResourceLocation;
+import net.minecraft.util.StringUtils;
import net.minecraft.util.text.TextFormatting;
+import net.minecraftforge.fml.relauncher.Side;
+import net.minecraftforge.fml.relauncher.SideOnly;
import pl.pabilo8.immersiveintelligence.ImmersiveIntelligence;
import pl.pabilo8.immersiveintelligence.client.IIClientUtils;
import pl.pabilo8.immersiveintelligence.client.gui.deco.util.DecoColors;
import pl.pabilo8.immersiveintelligence.client.util.font.IIFontRenderer;
+import pl.pabilo8.immersiveintelligence.common.item.ItemIIPrintedPage.PageType;
+import javax.annotation.Nonnull;
+import java.io.IOException;
import java.util.Arrays;
import java.util.function.BiConsumer;
import java.util.regex.Matcher;
@@ -30,13 +44,132 @@ public class GuiPrintedPage extends GuiScreen
private static final Pattern patternUnderline = Pattern.compile("__(.+?)__");
private static final Pattern patternStrikethrough = Pattern.compile("~~(.+?)~~");
- private static final String PAGE_TEXTURE = ImmersiveIntelligence.MODID+":textures/gui/printed_page.png";
- private final FormattedTextLine[] lines;
- private int guiLeft = 0, guiTop = 0;
+ private static final String PAGE_TEXTURE_PAGE = ImmersiveIntelligence.MODID + ":textures/gui/printed_page/page.png";
+ private static final String PAGE_TEXTURE_BG = ImmersiveIntelligence.MODID + ":textures/gui/printed_page/";
+ private static final ResourceLocation BOOK_GUI_TEXTURES = new ResourceLocation("textures/gui/book.png");
+ private int guiLeft = 0, guiTop = 0, topOffset = 0;
+ private int currentPage = 0;
+ private final int displayedPagesNum;
+ private final String pageTexture;
+ private FormattedTextLine[][] pages;
+ private final PageType generalPageType;
+ private PageType[] pageTypes;
+
+ private NextPageButton buttonNextPage;
+ private NextPageButton buttonPreviousPage;
+ private GuiButton buttonDone;
+ private final String author;
+ private final String title;
+ public final EnumHand initiatedFromHand;
public GuiPrintedPage(EntityPlayer player, ItemStack heldStack, EnumHand hand)
{
- String text = ItemNBTHelper.getString(heldStack, "text")
+ this(player, heldStack, hand, false);
+ }
+
+ public GuiPrintedPage(EntityPlayer player, ItemStack heldStack, EnumHand hand, boolean onlyTitle)
+ {
+ generalPageType = PageType.fromStack(heldStack);
+ pageTexture = PAGE_TEXTURE_BG + generalPageType.getUITextureName(heldStack);
+ displayedPagesNum = generalPageType.getDisplayedPages();
+ initiatedFromHand = hand;
+ author = ItemNBTHelper.getString(heldStack, "author");
+ title = ItemNBTHelper.getString(heldStack, "title");
+
+ switch (generalPageType)
+ {
+ // No display; No text
+ case BLANK:
+ case LETTER:
+ break;
+
+ // Single page display (TODO: currently all of them display just text, need to adjust later)
+ case TEXT:
+ case CODE:
+ case BLUEPRINT:
+ {
+ pages = new FormattedTextLine[1][];
+ pages[0] = prepareLines(ItemNBTHelper.getString(heldStack, "text"));
+ pageTypes = new PageType[]{generalPageType};
+ break;
+ }
+ case LETTER_OPENED:
+ {
+ pages = new FormattedTextLine[1][];
+ pages[0] = prepareLines(ItemNBTHelper.getString(heldStack, "text"));
+
+ pageTypes = new PageType[]{
+ PageType.valueOf(
+ ItemNBTHelper.hasTag(heldStack) ?
+ ItemNBTHelper.getTag(heldStack).getString("type") :
+ PageType.TEXT.toString()
+ )
+ };
+ break;
+ }
+
+ // Multiple Pages display
+ case BOUND_PAGES:
+ case NEWSPAPER:
+ case BOOK:
+ {
+ topOffset = - 10;
+ if (heldStack.hasTagCompound())
+ {
+ NBTTagCompound nbttagcompound = heldStack.getTagCompound();
+ net.minecraft.nbt.NBTTagList pagesNBT = nbttagcompound.getTagList("pages", 10).copy();
+ int pagesLength = pagesNBT.tagCount();
+
+ // If the title only is needed, we don't need to load any additional pages
+ if (onlyTitle) pagesLength = Math.min(pagesLength, displayedPagesNum);
+
+ if (pagesLength < 1)
+ {
+ // Has no data, create single empty page
+ pages = new FormattedTextLine[1][];
+ pages[0] = new FormattedTextLine[]{};
+ pageTypes = new PageType[]{PageType.TEXT};
+ } else
+ {
+ // Create array of pages and page types
+ pages = new FormattedTextLine[pagesLength][];
+ pageTypes = new PageType[pagesLength];
+
+ int index = 0;
+ while(index < pagesLength)
+ {
+ try
+ {
+ NBTTagCompound pageNBT = pagesNBT.getCompoundTagAt(index);
+ pageTypes[index] = PageType.valueOf(pageNBT.getString("type"));
+ pages[index] = prepareLines(pageNBT.getString("text"));
+ } catch (Exception e)
+ {
+ pages[index] = new FormattedTextLine[]{};
+ pageTypes[index] = PageType.TEXT;
+ }
+ finally
+ {
+ index += 1;
+ }
+ }
+ }
+ } else {
+ // Has no data, create single empty page
+ pages = new FormattedTextLine[1][];
+ pages[0] = new FormattedTextLine[]{};
+ pageTypes = new PageType[]{PageType.TEXT};
+ }
+ break;
+ }
+
+ }
+ }
+
+ @Nonnull
+ private FormattedTextLine[] prepareLines(String text)
+ {
+ text = text
.replace("
", "\n")
.replace("\\n", "\n");
@@ -47,8 +180,7 @@ public GuiPrintedPage(EntityPlayer player, ItemStack heldStack, EnumHand hand)
text = matchReplaceSimple(patternUnderline, text, TextFormatting.UNDERLINE); //underline
text = matchReplaceSimple(patternStrikethrough, text, TextFormatting.STRIKETHROUGH); //strikethrough
- //create lines with font specified
- lines = Arrays.stream(text.split("\n"))
+ return Arrays.stream(text.split("\n"))
.map(FormattedTextLine::new)
.toArray(FormattedTextLine[]::new);
}
@@ -58,8 +190,20 @@ public void initGui()
{
super.initGui();
- guiLeft = (this.width-149)/2;
+ guiLeft = (this.width-(149 * displayedPagesNum))/2;
guiTop = (this.height-196)/2;
+
+ int buttonLeft = (this.width - 188) / 2;
+ int buttonPagesOffset = 74 * (displayedPagesNum - 1);
+ this.buttonNextPage = this.addButton(new NextPageButton(1, buttonLeft + buttonPagesOffset + 141, guiTop + 182, true));
+ this.buttonPreviousPage = this.addButton(new NextPageButton(2, buttonLeft - buttonPagesOffset + 20, guiTop + 182, false));
+ this.buttonDone = this.addButton(new GuiButton(0, this.width / 2 - 100, guiTop + 220, 200, 20, I18n.format("gui.done", new Object[0])));
+ this.updateButtons();
+ }
+
+ private void updateButtons() {
+ buttonNextPage.visible = (currentPage + displayedPagesNum) < pages.length;
+ buttonPreviousPage.visible = currentPage > 0;
}
@Override
@@ -73,25 +217,202 @@ public boolean doesGuiPauseGame()
*/
public void drawScreen(int mouseX, int mouseY, float partialTicks)
{
+ drawPageBackground();
+ int leftOffset = 0;
+ for (int renderedPage = currentPage; renderedPage < currentPage + displayedPagesNum; renderedPage += 1)
+ {
+ try {
+ drawPageContent(pages[renderedPage], pageTypes[renderedPage], leftOffset);
+ } catch (Exception r) {}
+ leftOffset += 149;
+
+ }
+ drawPageForeground();
+ drawPageIndicator();
+ if (generalPageType == PageType.NEWSPAPER)
+ drawPageHeader();
super.drawScreen(mouseX, mouseY, partialTicks);
- drawDefaultBackground();
- drawPage();
}
- public void drawPage()
+ private void drawPageHeader()
+ {
+ int leftLabel = (width - 220) / 2;
+ int rightLabel = (width + 220) / 2;
+
+ int titleWidthHalf = (this.fontRenderer.getStringWidth(title) / 2);
+ this.fontRenderer.drawString(title, leftLabel - titleWidthHalf, guiTop - 10, 0);
+
+ if (!StringUtils.isNullOrEmpty(author)) {
+ String authorLabel = net.minecraft.util.text.translation.I18n.translateToLocalFormatted("book.byAuthor", new Object[]{author});
+ int labelWidthHalf = (this.fontRenderer.getStringWidth(authorLabel) / 2);
+ this.fontRenderer.drawString(authorLabel, rightLabel - labelWidthHalf, guiTop - 10, 0);
+ }
+ }
+
+ private void drawPageIndicator()
+ {
+ if (pages.length > 1)
+ {
+ int left = (width - 149 * (displayedPagesNum - 1)) / 2;
+ for (int labelledPage = currentPage; labelledPage < currentPage + displayedPagesNum; labelledPage++)
+ {
+ String pagesLabel = String.valueOf(labelledPage + 1);
+ int labelWidthHalf = (this.fontRenderer.getStringWidth(pagesLabel) / 2);
+ this.fontRenderer.drawString(pagesLabel, left - labelWidthHalf, guiTop + 185, 0);
+ left += 149;
+ }
+ }
+ }
+
+ @Override
+ protected void mouseClicked(int mouseX, int mouseY, int mouseButton) throws IOException
+ {
+ super.mouseClicked(mouseX, mouseY, mouseButton);
+ Minecraft mc = Minecraft.getMinecraft();
+
+ if (buttonNextPage.mousePressed(mc, mouseX, mouseY))
+ {
+ currentPage += displayedPagesNum;
+ updateButtons();
+ }
+
+ if (buttonPreviousPage.mousePressed(mc, mouseX, mouseY))
+ {
+ currentPage -= displayedPagesNum;
+ updateButtons();
+ }
+
+ if (buttonDone.mousePressed(mc, mouseX, mouseY))
+ mc.displayGuiScreen(null);
+ }
+
+ /**
+ * Draws the Handheld item, with fixed viewing setting to always be on the first pages
+ */
+ public void drawTitlePage()
+ {
+ drawPageBackground();
+ int leftOffset = 0;
+ for (int renderedPage = 0; renderedPage < displayedPagesNum; renderedPage += 1)
+ {
+ try {
+ drawPageContent(pages[renderedPage], pageTypes[renderedPage], leftOffset);
+ } catch (Exception r) {}
+ leftOffset += 149;
+
+ }
+ drawPageForeground();
+ }
+
+ public void drawPageBackground()
{
+ // Draw the initial background
GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);
- ClientUtils.bindTexture(PAGE_TEXTURE);
- this.drawTexturedModalRect(guiLeft, guiTop, 0, 0, 146, 196);
+ ClientUtils.bindTexture(pageTexture);
+ switch (generalPageType)
+ {
+ case TEXT:
+ case CODE:
+ case BLUEPRINT:
+ case LETTER_OPENED:
+ this.drawTexturedModalRect(guiLeft, guiTop, 0, 0, 146, 196);
+ break;
+ case BOUND_PAGES:
+ this.drawTexturedModalRect(guiLeft - 8, guiTop, 0, 0, 155, 207);
+ break;
+ case NEWSPAPER:
+ this.drawTexturedModalRect(guiLeft - 5, guiTop - 22, 0, 0, 218, 226);
+ this.drawTexturedModalRect(guiLeft + 213, guiTop - 22, 20, 0, 31, 226);
+ this.drawTexturedModalRect(guiLeft + 244, guiTop - 22, 20, 0, 221, 226);
+ break;
+ case BOOK:
+ this.drawTexturedModalRect(guiLeft - 6, guiTop - 1, 0, 0, 166, 217);
+ this.drawTexturedModalRectXMirrored(guiLeft + 160, guiTop - 1, 0, 0, 141, 217);
+ break;
+ default: break;
+ }
+ }
+
+ private void drawTexturedModalRectXMirrored(int x, int y, int textureX, int textureY, int width, int height) {
+ float f = 0.00390625F;
+ float f1 = 0.00390625F;
+ Tessellator tessellator = Tessellator.getInstance();
+ BufferBuilder bufferbuilder = tessellator.getBuffer();
+ bufferbuilder.begin(7, DefaultVertexFormats.POSITION_TEX);
+ bufferbuilder.pos((double)(x + 0), (double)(y + height), (double)this.zLevel).tex((double)((float)(textureX + width) * 0.00390625F), (double)((float)(textureY + height) * 0.00390625F)).endVertex();
+ bufferbuilder.pos((double)(x + width), (double)(y + height), (double)this.zLevel).tex((double)((float)(textureX + 0) * 0.00390625F), (double)((float)(textureY + height) * 0.00390625F)).endVertex();
+ bufferbuilder.pos((double)(x + width), (double)(y + 0), (double)this.zLevel).tex((double)((float)(textureX + 0) * 0.00390625F), (double)((float)(textureY + 0) * 0.00390625F)).endVertex();
+ bufferbuilder.pos((double)(x + 0), (double)(y + 0), (double)this.zLevel).tex((double)((float)(textureX + width) * 0.00390625F), (double)((float)(textureY + 0) * 0.00390625F)).endVertex();
+ tessellator.draw();
+ }
+
+ public void drawPageForeground()
+ {
+ // The overlay should always go over the text.
+ GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);
+ ClientUtils.bindTexture(pageTexture);
+ switch (generalPageType)
+ {
+ case TEXT:
+ case CODE:
+ case BLUEPRINT:
+ case LETTER_OPENED:
+ this.drawTexturedModalRect(guiLeft, guiTop, 0, 196, 21, 19);
+ break;
+ case BOUND_PAGES:
+ this.drawTexturedModalRect(guiLeft - 7, guiTop, 155, 0, 14, 207);
+ break;
+ case NEWSPAPER:
+ break;
+ case BOOK:
+ break;
+ default: break;
+ }
+ }
- int y = 24;
+ public void drawPageContent(FormattedTextLine[] lines, PageType pageType, int leftOffset)
+ {
+ int pageOffset = -1;
+ int bgHeight = 1;
+
+ if (pageType == PageType.BLUEPRINT) {pageOffset = 0; bgHeight = 48;}
+ if (pageType == PageType.CODE) {pageOffset = 48; bgHeight = 36;}
+
+ // Draw additional Page Background
+ if(pageOffset >= 0)
+ {
+ GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);
+ ClientUtils.bindTexture(PAGE_TEXTURE_PAGE);
+ GlStateManager.enableBlend();
+ int cutoff_y = 179;
+ int cutoff_x = 138;
+ for(int grid_y = 0; grid_y < 48 * 4; grid_y += bgHeight )
+ {
+ for(int grid_x = 0; grid_x < 48 * 3; grid_x += 48 )
+ {
+ this.drawTexturedModalRect(
+ guiLeft + leftOffset + grid_x + 4,
+ guiTop + topOffset + grid_y + 13,
+ 146, pageOffset,
+ Math.min(48, cutoff_x - grid_x),
+ Math.min(bgHeight, cutoff_y - grid_y)
+ );
+ }
+ }
+ GlStateManager.disableBlend();
+ }
+
+ int y = 20;
for(FormattedTextLine line : lines)
{
+ int lineHeight = (int)((line.font.getWordWrappedHeight(line.text, (int)(133/line.size)))*line.size);
+ if (y + lineHeight > 192) break;
+
GlStateManager.pushMatrix();
- GlStateManager.translate(guiLeft+8, guiTop+y, 0);
+ GlStateManager.translate(guiLeft + leftOffset + 8, guiTop + topOffset + y, 0);
GlStateManager.scale(line.size, line.size, line.size);
- line.font.drawSplitString(line.text, 0, 0, (int)(141/line.size), DecoColors.H1.getPackedRGB());
- y += (line.font.getWordWrappedHeight(line.text, (int)(141/line.size)))*line.size;
+ line.font.drawSplitString(line.text, 0, 0, (int)(133/line.size), DecoColors.H1.getPackedRGB());
+ y += lineHeight;
GlStateManager.popMatrix();
}
}
@@ -193,4 +514,34 @@ else if(s.startsWith("@"))
this.size = size;
}
}
+
+ @SideOnly(Side.CLIENT)
+ static class NextPageButton extends GuiButton
+ {
+ private final boolean isForward;
+
+ public NextPageButton(int buttonId, int x, int y, boolean isForwardIn)
+ {
+ super(buttonId, x, y, 23, 13, "");
+ this.isForward = isForwardIn;
+ }
+
+ public void drawButton(Minecraft mc, int mouseX, int mouseY, float partialTicks)
+ {
+ if (this.visible)
+ {
+ boolean flag = mouseX >= this.x && mouseY >= this.y && mouseX < this.x + this.width && mouseY < this.y + this.height;
+ GlStateManager.color(1.0F, 1.0F, 1.0F, 1.0F);
+ mc.getTextureManager().bindTexture(BOOK_GUI_TEXTURES);
+ int i = 0;
+ int j = 192;
+
+ if (flag) i += 23;
+ if (!this.isForward) j += 13;
+
+ this.drawTexturedModalRect(this.x, this.y, i, j, 23, 13);
+ }
+
+ }
+ }
}
diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/client/render/item/PrintedPageRenderer.java b/src/main/java/pl/pabilo8/immersiveintelligence/client/render/item/PrintedPageRenderer.java
index 06e598553..5bacef616 100644
--- a/src/main/java/pl/pabilo8/immersiveintelligence/client/render/item/PrintedPageRenderer.java
+++ b/src/main/java/pl/pabilo8/immersiveintelligence/client/render/item/PrintedPageRenderer.java
@@ -4,6 +4,7 @@
import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.AbstractClientPlayer;
import net.minecraft.client.entity.EntityPlayerSP;
+import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.client.renderer.entity.Render;
import net.minecraft.client.renderer.entity.RenderPlayer;
@@ -13,6 +14,7 @@
import net.minecraft.util.EnumHandSide;
import net.minecraft.util.math.MathHelper;
import pl.pabilo8.immersiveintelligence.client.gui.item.GuiPrintedPage;
+import pl.pabilo8.immersiveintelligence.common.item.ItemIIPrintedPage.PageType;
/**
* @author Pabilo8 (pabilo@iiteam.net)
@@ -20,15 +22,40 @@
*/
public class PrintedPageRenderer
{
- private static ItemStack cachedStack;
- private static GuiPrintedPage cachedGui;
+ private static ItemStack cachedStackMain;
+ private static PageType cachedTypeMain;
+ private static GuiPrintedPage cachedGuiMain;
+ private static ItemStack cachedStackOff;
+ private static PageType cachedTypeOff;
+ private static GuiPrintedPage cachedGuiOff;
private static void renderItem(ItemStack stack, EnumHand hand)
{
- if(cachedStack==null||stack.getTagCompound()!=cachedStack.getTagCompound())
+ PageType pageType = PageType.fromStack(stack);
+
+ // Draw Item in Hand
+ if (hand == EnumHand.OFF_HAND)
+ {
+ if(cachedTypeOff == null
+ || pageType != cachedTypeOff
+ || checkNBTCacheNeedsUpdate(stack, cachedStackOff)
+ )
+ {
+ cachedStackOff = stack.copy();
+ cachedTypeOff = pageType;
+ cachedGuiOff = new GuiPrintedPage(ClientUtils.mc().player, stack, hand, true);
+ }
+ } else
{
- cachedStack = stack;
- cachedGui = new GuiPrintedPage(ClientUtils.mc().player, stack, hand);
+ if(cachedTypeMain == null
+ || pageType != cachedTypeMain
+ || checkNBTCacheNeedsUpdate(stack, cachedStackMain)
+ )
+ {
+ cachedStackMain = stack.copy();
+ cachedTypeMain = pageType;
+ cachedGuiMain = new GuiPrintedPage(ClientUtils.mc().player, stack, hand, true);
+ }
}
final float scale = 0.25F;
@@ -40,15 +67,41 @@ private static void renderItem(ItemStack stack, EnumHand hand)
GlStateManager.disableLighting();
GlStateManager.translate(-0.5F, -0.5F, 0.0F);
GlStateManager.scale(0.0078125F, 0.0078125F, 0.0078125F);
-
+ if (pageType == PageType.NEWSPAPER) GlStateManager.translate(-165.0F, -15.0F, 0.0F);
GlStateManager.disableDepth();
- cachedGui.drawPage();
+
+ ((hand == EnumHand.OFF_HAND) ? cachedGuiOff : cachedGuiMain).drawTitlePage();
GlStateManager.popMatrix();
}
+ /**
+ * Returns true, if the NBT Data between the cached stack and the supplied one suggests, that the cache is invalid
+ * @param stack is the fresh ItemStack
+ */
+ private static boolean checkNBTCacheNeedsUpdate(ItemStack stack, ItemStack cachedStack)
+ {
+ if (cachedStack == null || stack == null) return true;
+ boolean stackHasNBT = stack.hasTagCompound();
+ if (stackHasNBT != cachedStack.hasTagCompound()) return true;
+ if (stackHasNBT) // At that point we know, that both the cache and the new stack have NBT data
+ return !cachedStack.getTagCompound().equals(stack.getTagCompound());
+
+ return false;
+ }
+
public static void renderItemFirstPerson(ItemStack stack, EnumHand hand, float equipProgress, float swingProgress, float pitch)
{
+
+ // Check if page is already rendering as UI, skip it if true, to reduce clutter
+ GuiScreen screen = Minecraft.getMinecraft().currentScreen;
+ if (screen instanceof GuiPrintedPage)
+ {
+ GuiPrintedPage guiPrintedPage = (GuiPrintedPage) screen;
+ if (guiPrintedPage.initiatedFromHand == hand) return;
+
+ }
+
EntityPlayer player = Minecraft.getMinecraft().player;
GlStateManager.pushMatrix();
if(hand==EnumHand.MAIN_HAND&&player.getHeldItemOffhand().isEmpty())
diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/IIGUI.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/IIGUI.java
index fda85018a..f2c84bc4b 100644
--- a/src/main/java/pl/pabilo8/immersiveintelligence/common/IIGUI.java
+++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/IIGUI.java
@@ -105,6 +105,9 @@ public enum IIGUI implements ISerializableEnum
PRINTED_PAGE_TEXT(),
PRINTED_PAGE_CODE(),
PRINTED_PAGE_BLUEPRINT(),
+ PRINTED_PAGE_NEWSPAPER(),
+ PRINTED_PAGE_BOOK(),
+ PRINTED_PAGE_BOUND(),
PRINTED_PAGE_LOGISTIC_TAG(),
CASING_POUCH(ContainerCasingPouch::new),
@@ -233,11 +236,15 @@ public static void initClientGUIs()
IIGUI.ARITHMETIC_LOGIC_MACHINE_STORAGE.setClientDecoGui(GuiArithmeticLogicMachine::getStorageGui);
IIGUI.ARITHMETIC_LOGIC_MACHINE_VARIABLES.setClientDecoGui(GuiArithmeticLogicMachine::getVariablesGui);
IIGUI.ARITHMETIC_LOGIC_MACHINE_EDIT.setClientDecoGui(GuiArithmeticLogicMachineEdit::new);
+
//Printed Page
IIGUI.PRINTED_PAGE_BLANK.setClientStackGui(GuiPrintedPage::new);
IIGUI.PRINTED_PAGE_TEXT.setClientStackGui(GuiPrintedPage::new);
IIGUI.PRINTED_PAGE_CODE.setClientStackGui(GuiPrintedPage::new);
IIGUI.PRINTED_PAGE_BLUEPRINT.setClientStackGui(GuiPrintedPage::new);
+ IIGUI.PRINTED_PAGE_NEWSPAPER.setClientStackGui(GuiPrintedPage::new);
+ IIGUI.PRINTED_PAGE_BOUND.setClientStackGui(GuiPrintedPage::new);
+ IIGUI.PRINTED_PAGE_BOOK.setClientStackGui(GuiPrintedPage::new);
IIGUI.CASING_POUCH.setClientStackGui(GuiCasingPouch::new);
diff --git a/src/main/java/pl/pabilo8/immersiveintelligence/common/item/ItemIIPrintedPage.java b/src/main/java/pl/pabilo8/immersiveintelligence/common/item/ItemIIPrintedPage.java
index 7e47cb3ae..2b9834ccf 100644
--- a/src/main/java/pl/pabilo8/immersiveintelligence/common/item/ItemIIPrintedPage.java
+++ b/src/main/java/pl/pabilo8/immersiveintelligence/common/item/ItemIIPrintedPage.java
@@ -1,13 +1,15 @@
package pl.pabilo8.immersiveintelligence.common.item;
-import blusunrize.immersiveengineering.common.util.ItemNBTHelper;
import net.minecraft.client.resources.I18n;
import net.minecraft.client.util.ITooltipFlag;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.item.ItemStack;
+import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.util.ActionResult;
import net.minecraft.util.EnumActionResult;
import net.minecraft.util.EnumHand;
+import net.minecraft.util.StringUtils;
+import net.minecraft.util.text.TextFormatting;
import net.minecraft.world.World;
import pl.pabilo8.immersiveintelligence.api.utils.ItemTooltipHandler.IGuiItem;
import pl.pabilo8.immersiveintelligence.common.CommonProxy;
@@ -42,13 +44,29 @@ public void addInformation(@Nonnull ItemStack stack, @Nullable World worldIn, @N
{
super.addInformation(stack, worldIn, tooltip, flagIn);
tooltip.add(IIStringUtil.getItalicString(I18n.format(stackToSub(stack).tooltip)));
+
+ if (stack.hasTagCompound())
+ {
+ NBTTagCompound nbttagcompound = stack.getTagCompound();
+ String s = nbttagcompound.getString("author");
+ if (!StringUtils.isNullOrEmpty(s))
+ tooltip.add(TextFormatting.GRAY + net.minecraft.util.text.translation.I18n.translateToLocalFormatted("book.byAuthor", new Object[]{s}));
+ }
}
- public void setText(ItemStack stack, String text)
+ @Override
+ @Nonnull
+ public String getItemStackDisplayName(ItemStack stack) {
+ if (stack.hasTagCompound())
{
- ItemNBTHelper.setString(stack, "text", text);
+ NBTTagCompound nbttagcompound = stack.getTagCompound();
+ String titleString = nbttagcompound.getString("title");
+ if (!StringUtils.isNullOrEmpty(titleString)) return titleString;
}
+ return super.getItemStackDisplayName(stack);
+}
+
@Override
public IIGUI getGUI(ItemStack stack)
{
@@ -63,28 +81,59 @@ public IIGUI getGUI(ItemStack stack)
public ActionResult onItemRightClick(@Nonnull World world, EntityPlayer player, @Nonnull EnumHand hand)
{
ItemStack stack = player.getHeldItem(hand);
- CommonProxy.openGuiForItem(player, hand);
- return new ActionResult<>(EnumActionResult.SUCCESS, stack);
+
+ switch (stackToSub(stack))
+ {
+ case BLANK:
+ return new ActionResult<>(EnumActionResult.PASS, stack);
+ case TEXT:
+ case CODE:
+ case BLUEPRINT:
+ case LETTER_OPENED:
+ case BOUND_PAGES:
+ case BOOK:
+ case NEWSPAPER:
+ {
+ CommonProxy.openGuiForItem(player, hand);
+ return new ActionResult<>(EnumActionResult.SUCCESS, stack);
+ }
+ case LETTER:
+ {
+ stack.setItemDamage(PageType.LETTER_OPENED.getMeta());
+ player.setHeldItem(hand, stack);
+ return new ActionResult<>(EnumActionResult.SUCCESS, stack);
+ }
+ }
+
+ return new ActionResult<>(EnumActionResult.FAIL, stack);
}
@GeneratedItemModels(itemName = "printed_page")
public enum PageType implements IIItemEnum
{
- @IIItemProperties(oreDict = "pageEmpty")
+ // Special case for blank paper
+ @IIItemProperties(oreDict = {"pageEmpty", "paper"})
BLANK(IIGUI.PRINTED_PAGE_BLANK),
+
+ // All single Page item variants
@IIItemProperties(oreDict = {"pageText", "pageWritten"})
TEXT(IIGUI.PRINTED_PAGE_TEXT),
@IIItemProperties(oreDict = {"pageCode", "pageWritten"})
CODE(IIGUI.PRINTED_PAGE_CODE),
@IIItemProperties(oreDict = {"pageBlueprint", "pageWritten"})
BLUEPRINT(IIGUI.PRINTED_PAGE_BLUEPRINT),
+ @IIItemProperties(oreDict = {"pageLetterOpen", "pageWritten"})
+ LETTER_OPENED(IIGUI.PRINTED_PAGE_BLANK),
+ // All multi Page variants
@IIItemProperties(oreDict = "pageBinded")
- BOUND_PAGES(IIGUI.PRINTED_PAGE_BLANK),
+ BOUND_PAGES(IIGUI.PRINTED_PAGE_BOUND),
@IIItemProperties(oreDict = "pageNewspaper")
- NEWSPAPER(IIGUI.PRINTED_PAGE_BLANK),
+ NEWSPAPER(IIGUI.PRINTED_PAGE_NEWSPAPER),
@IIItemProperties(oreDict = {"pageBook", "book", "bookPrinted"})
- BOOK(IIGUI.PRINTED_PAGE_BLANK),
+ BOOK(IIGUI.PRINTED_PAGE_BOOK),
+
+ // All page containers
@IIItemProperties(oreDict = {"pageLetter", "letter"})
LETTER(IIGUI.PRINTED_PAGE_BLANK);
@@ -96,5 +145,83 @@ public enum PageType implements IIItemEnum
this.gui = gui;
tooltip = IIReference.DESCRIPTION_KEY+"printed_page."+getName();
}
+
+ public static PageType fromStack(ItemStack stack)
+ {
+ try
+ {
+ return PageType.values()[stack.getMetadata()];
+ } catch (Exception e)
+ {
+ return PageType.values()[0];
+ }
+ }
+
+ public boolean useHandSpecialRender()
+ {
+ switch (this)
+ {
+ case TEXT:
+ case CODE:
+ case BLUEPRINT:
+ case LETTER_OPENED:
+ case BOUND_PAGES:
+ case NEWSPAPER:
+ return true;
+ case BOOK:
+ case LETTER:
+ case BLANK:
+ default:
+ return false;
+ }
+ }
+
+ public int getDisplayedPages()
+ {
+ switch (this)
+ {
+ case TEXT:
+ case CODE:
+ case BLUEPRINT:
+ case LETTER_OPENED:
+ case BOUND_PAGES:
+ return 1;
+ case NEWSPAPER:
+ return 3;
+ case BOOK:
+ return 2;
+ case LETTER:
+ case BLANK:
+ default:
+ return 0;
+ }
+ }
+
+ /**
+ * Returns the name of the actual file within the printed_page directory
+ * @param stack the item stack, where the metadata is taken from
+ * @return a String for the filename
+ */
+ public String getUITextureName(ItemStack stack)
+ {
+ switch (this)
+ {
+ case TEXT:
+ case CODE:
+ case BLUEPRINT:
+ case LETTER_OPENED:
+ return "page.png";
+ case BOUND_PAGES:
+ return "bound.png";
+ case NEWSPAPER:
+ return "newspaper.png";
+ case BOOK:
+ return "book.png";
+ case LETTER:
+ case BLANK:
+ default:
+ return "";
+ }
+ }
}
}
diff --git a/src/main/resources/assets/immersiveintelligence/lang/de_de.lang b/src/main/resources/assets/immersiveintelligence/lang/de_de.lang
index 4546f351a..710075734 100644
--- a/src/main/resources/assets/immersiveintelligence/lang/de_de.lang
+++ b/src/main/resources/assets/immersiveintelligence/lang/de_de.lang
@@ -364,6 +364,7 @@ item.immersiveintelligence.printed_page.bound_pages.name=Gebundene Seiten
item.immersiveintelligence.printed_page.newspaper.name=Zeitung
item.immersiveintelligence.printed_page.book.name=Buch
item.immersiveintelligence.printed_page.letter.name=Brief
+item.immersiveintelligence.printed_page.letter_opened.name=Geöffneter Brief
item.immersiveintelligence.precission_tool.buzzsaw.name=Präzisionskreissäge
item.immersiveintelligence.precission_tool.drill.name=Präzisionsbohrer
@@ -1200,6 +1201,7 @@ desc.immersiveintelligence.printed_page.bound_pages=Verschiedene zusammengebunde
desc.immersiveintelligence.printed_page.newspaper=Mehrere Seiten zu einer Zeitschrift gebunden.
desc.immersiveintelligence.printed_page.book=Mehrere Seiten zu einem Buch gebunden.
desc.immersiveintelligence.printed_page.letter=Eine Seite in einem Umschlag um verschickt zu werden.
+desc.immersiveintelligence.printed_page.letter_opened=Ein geöffner Umschlag mit einer Seite.
desc.immersiveintelligence.punchtape.empty=Keine Variablen geschrieben
desc.immersiveintelligence.punchtape.written=Geschrieben
diff --git a/src/main/resources/assets/immersiveintelligence/lang/en_us.lang b/src/main/resources/assets/immersiveintelligence/lang/en_us.lang
index 0374c81ab..fbdcf97b0 100644
--- a/src/main/resources/assets/immersiveintelligence/lang/en_us.lang
+++ b/src/main/resources/assets/immersiveintelligence/lang/en_us.lang
@@ -364,6 +364,7 @@ item.immersiveintelligence.printed_page.bound_pages.name=Bound Pages
item.immersiveintelligence.printed_page.newspaper.name=Newspaper
item.immersiveintelligence.printed_page.book.name=Book
item.immersiveintelligence.printed_page.letter.name=Letter
+item.immersiveintelligence.printed_page.letter_opened.name=Opened Letter
item.immersiveintelligence.logistic_tag.name=Logistic Manifest
@@ -1189,6 +1190,7 @@ desc.immersiveintelligence.printed_page.bound_pages=Various pages bound together
desc.immersiveintelligence.printed_page.newspaper=Multiple pages bound into a newspaper.
desc.immersiveintelligence.printed_page.book=Multiple pages bound into a book.
desc.immersiveintelligence.printed_page.letter=A page packed into an envelope to be sent to someone.
+desc.immersiveintelligence.printed_page.letter_opened=An opened envelope containing a page.
desc.immersiveintelligence.logistic_tag.none=No logistic data written
desc.immersiveintelligence.logistic_tag.info.hold=%s - Logistic Manifest
diff --git a/src/main/resources/assets/immersiveintelligence/lang/pl_pl.lang b/src/main/resources/assets/immersiveintelligence/lang/pl_pl.lang
index 1cdebacfb..cb597d0ff 100644
--- a/src/main/resources/assets/immersiveintelligence/lang/pl_pl.lang
+++ b/src/main/resources/assets/immersiveintelligence/lang/pl_pl.lang
@@ -150,6 +150,8 @@ item.immersiveintelligence.printed_page.blank.name=Pusta Strona
item.immersiveintelligence.printed_page.text.name=Wydrukowany Tekst
item.immersiveintelligence.printed_page.code.name=Wydrukowany Kod
item.immersiveintelligence.printed_page.blueprint.name=Wydrukowany Schemat Budowlany
+item.immersiveintelligence.printed_page.letter.name=List
+item.immersiveintelligence.printed_page.letter_opened.name=List otwarty
item.immersiveintelligence.precission_tool.precission_buzzsaw.name=Precyzyjna Piła
item.immersiveintelligence.precission_tool.precission_drill.name=Precyzyjne Wiertło
@@ -425,6 +427,8 @@ desc.immersiveintelligence.printed_page.blank=Pusta strona gotowa do druku.
desc.immersiveintelligence.printed_page.text=Strona zawierająca tekst.
desc.immersiveintelligence.printed_page.code=Strona zawierająca kod w języku programowania.
desc.immersiveintelligence.printed_page.blueprint=Strona zawierające informacje o budowie jakiejś struktury.
+desc.immersiveintelligence.printed_page.letter=Jedna strona w kopercie, gotowa do wysłania.
+desc.immersiveintelligence.printed_page.letter_opened=Otwarty kopert z jednym bokiem.
desc.immersiveintelligence.infrared_enabled=Wizja §4Podczerwona§r aktywna!
desc.immersiveintelligence.infrared_disabled=Wizja §cPodczerwona§r wyłączona!
diff --git a/src/main/resources/assets/immersiveintelligence/lang/ru_ru.lang b/src/main/resources/assets/immersiveintelligence/lang/ru_ru.lang
index 05f1864db..56cf8c92b 100644
--- a/src/main/resources/assets/immersiveintelligence/lang/ru_ru.lang
+++ b/src/main/resources/assets/immersiveintelligence/lang/ru_ru.lang
@@ -364,6 +364,7 @@ item.immersiveintelligence.printed_page.bound_pages.name=Связанные ст
item.immersiveintelligence.printed_page.newspaper.name=Газета
item.immersiveintelligence.printed_page.book.name=Печатная книга
item.immersiveintelligence.printed_page.letter.name=Письмо
+item.immersiveintelligence.printed_page.letter_opened.name=Открытое письмо
item.immersiveintelligence.precission_tool.buzzsaw.name=Точная циркулярная пила
item.immersiveintelligence.precission_tool.drill.name=Точная дрель
@@ -1200,6 +1201,7 @@ desc.immersiveintelligence.printed_page.bound_pages=Разные страниц
desc.immersiveintelligence.printed_page.newspaper=Несколько страниц, переплетенных в газету.
desc.immersiveintelligence.printed_page.book=Несколько страниц, переплетенных в печатную книгу.
desc.immersiveintelligence.printed_page.letter=Страница, упакованная в конверт для отправки кому-либо.
+desc.immersiveintelligence.printed_page.letter_opened=Раскрытый конверт с одной страницей.
desc.immersiveintelligence.punchtape.empty=Переменные не записаны
desc.immersiveintelligence.punchtape.written=Записаны
diff --git a/src/main/resources/assets/immersiveintelligence/lang/uk_ua.lang b/src/main/resources/assets/immersiveintelligence/lang/uk_ua.lang
index 3243bb04f..cd01ba97c 100644
--- a/src/main/resources/assets/immersiveintelligence/lang/uk_ua.lang
+++ b/src/main/resources/assets/immersiveintelligence/lang/uk_ua.lang
@@ -364,6 +364,7 @@ item.immersiveintelligence.printed_page.bound_pages.name=Зшиті сторін
item.immersiveintelligence.printed_page.newspaper.name=Газета
item.immersiveintelligence.printed_page.book.name=Книга
item.immersiveintelligence.printed_page.letter.name=Лист
+item.immersiveintelligence.printed_page.letter_opened.name=Відкритий лист
item.immersiveintelligence.precission_tool.buzzsaw.name=Точна жуйка
item.immersiveintelligence.precission_tool.drill.name=Прецизійне свердло
@@ -1174,6 +1175,7 @@ desc.immersiveintelligence.printed_page.bound_pages=Різні сторінки,
desc.immersiveintelligence.printed_page.newspaper=Кілька сторінок переплетені в газету.
desc.immersiveintelligence.printed_page.book=Кілька сторінок переплетені в одну книгу.
desc.immersiveintelligence.printed_page.letter=Сторінка, запакована в конверт для відправлення комусь.
+desc.immersiveintelligence.printed_page.letter_opened=Розкритий конверт, що містить одну сторінку.
desc.immersiveintelligence.punchtape.empty=Немає записаних змінних
desc.immersiveintelligence.punchtape.written=Написаний
diff --git a/src/main/resources/assets/immersiveintelligence/lang/zh_cn.lang b/src/main/resources/assets/immersiveintelligence/lang/zh_cn.lang
index 344a9e726..b70cd483f 100644
--- a/src/main/resources/assets/immersiveintelligence/lang/zh_cn.lang
+++ b/src/main/resources/assets/immersiveintelligence/lang/zh_cn.lang
@@ -343,6 +343,7 @@ item.immersiveintelligence.printed_page.bound_pages.name=装订页
item.immersiveintelligence.printed_page.newspaper.name=报纸
item.immersiveintelligence.printed_page.book.name=书册
item.immersiveintelligence.printed_page.letter.name=信
+item.immersiveintelligence.printed_page.letter_opened.name=公开信
item.immersiveintelligence.precission_tool.buzzsaw.name=精密圆锯
item.immersiveintelligence.precission_tool.drill.name=精密钻头
@@ -1118,6 +1119,7 @@ desc.immersiveintelligence.printed_page.bound_pages=各种页面装订在一起.
desc.immersiveintelligence.printed_page.newspaper=多页装订成一份报纸.
desc.immersiveintelligence.printed_page.book=多页装订成一本书.
desc.immersiveintelligence.printed_page.letter=装在信封里寄给某人的一页.
+desc.immersiveintelligence.printed_page.letter_opened=一个已拆封的信封,内含一页纸.
desc.immersiveintelligence.punchtape.empty=未写入变量
desc.immersiveintelligence.punchtape.written=被写入过的
diff --git a/src/main/resources/assets/immersiveintelligence/textures/gui/printed_page.png b/src/main/resources/assets/immersiveintelligence/textures/gui/printed_page.png
deleted file mode 100644
index d1957364c..000000000
Binary files a/src/main/resources/assets/immersiveintelligence/textures/gui/printed_page.png and /dev/null differ
diff --git a/src/main/resources/assets/immersiveintelligence/textures/gui/printed_page/book.png b/src/main/resources/assets/immersiveintelligence/textures/gui/printed_page/book.png
new file mode 100644
index 000000000..69ca1e404
Binary files /dev/null and b/src/main/resources/assets/immersiveintelligence/textures/gui/printed_page/book.png differ
diff --git a/src/main/resources/assets/immersiveintelligence/textures/gui/printed_page/bound.png b/src/main/resources/assets/immersiveintelligence/textures/gui/printed_page/bound.png
new file mode 100644
index 000000000..0cb9db645
Binary files /dev/null and b/src/main/resources/assets/immersiveintelligence/textures/gui/printed_page/bound.png differ
diff --git a/src/main/resources/assets/immersiveintelligence/textures/gui/printed_page/newspaper.png b/src/main/resources/assets/immersiveintelligence/textures/gui/printed_page/newspaper.png
new file mode 100644
index 000000000..081573fdd
Binary files /dev/null and b/src/main/resources/assets/immersiveintelligence/textures/gui/printed_page/newspaper.png differ
diff --git a/src/main/resources/assets/immersiveintelligence/textures/gui/printed_page/page.png b/src/main/resources/assets/immersiveintelligence/textures/gui/printed_page/page.png
new file mode 100644
index 000000000..f6493f341
Binary files /dev/null and b/src/main/resources/assets/immersiveintelligence/textures/gui/printed_page/page.png differ
diff --git a/src/main/resources/assets/immersiveintelligence/textures/items/printed_page/letter_opened.png b/src/main/resources/assets/immersiveintelligence/textures/items/printed_page/letter_opened.png
new file mode 100644
index 000000000..7ecb77b2b
Binary files /dev/null and b/src/main/resources/assets/immersiveintelligence/textures/items/printed_page/letter_opened.png differ
diff --git a/src/main/resources/assets/immersiveintelligence/textures/items/printed_page/newspaper.png b/src/main/resources/assets/immersiveintelligence/textures/items/printed_page/newspaper.png
index 13c2012cf..fe9503d2e 100644
Binary files a/src/main/resources/assets/immersiveintelligence/textures/items/printed_page/newspaper.png and b/src/main/resources/assets/immersiveintelligence/textures/items/printed_page/newspaper.png differ