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