package net.minecraft.client.gui; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import java.io.ByteArrayOutputStream; import java.io.DataOutputStream; import net.minecraft.entity.player.EntityPlayer; import net.minecraft.item.Item; import net.minecraft.item.ItemStack; import net.minecraft.nbt.NBTTagCompound; import net.minecraft.nbt.NBTTagList; import net.minecraft.nbt.NBTTagString; import net.minecraft.network.packet.Packet; import net.minecraft.network.packet.Packet250CustomPayload; import net.minecraft.util.ChatAllowedCharacters; import net.minecraft.util.StatCollector; import org.lwjgl.input.Keyboard; import org.lwjgl.opengl.GL11; @SideOnly(Side.CLIENT) public class GuiScreenBook extends GuiScreen { /** The player editing the book */ private final EntityPlayer editingPlayer; private final ItemStack itemstackBook; /** Whether the book is signed or can still be edited */ private final boolean bookIsUnsigned; private boolean bookModified; private boolean editingTitle; /** Update ticks since the gui was opened */ private int updateCount; private int bookImageWidth = 192; private int bookImageHeight = 192; private int bookTotalPages = 1; private int currPage; private NBTTagList bookPages; private String bookTitle = ""; private GuiButtonNextPage buttonNextPage; private GuiButtonNextPage buttonPreviousPage; private GuiButton buttonDone; /** The GuiButton to sign this book. */ private GuiButton buttonSign; private GuiButton buttonFinalize; private GuiButton buttonCancel; public GuiScreenBook(EntityPlayer par1EntityPlayer, ItemStack par2ItemStack, boolean par3) { this.editingPlayer = par1EntityPlayer; this.itemstackBook = par2ItemStack; this.bookIsUnsigned = par3; if (par2ItemStack.hasTagCompound()) { NBTTagCompound var4 = par2ItemStack.getTagCompound(); this.bookPages = var4.getTagList("pages"); if (this.bookPages != null) { this.bookPages = (NBTTagList)this.bookPages.copy(); this.bookTotalPages = this.bookPages.tagCount(); if (this.bookTotalPages < 1) { this.bookTotalPages = 1; } } } if (this.bookPages == null && par3) { this.bookPages = new NBTTagList("pages"); this.bookPages.appendTag(new NBTTagString("1", "")); this.bookTotalPages = 1; } } /** * Called from the main game loop to update the screen. */ public void updateScreen() { super.updateScreen(); ++this.updateCount; } /** * Adds the buttons (and other controls) to the screen in question. */ public void initGui() { this.controlList.clear(); Keyboard.enableRepeatEvents(true); if (this.bookIsUnsigned) { this.controlList.add(this.buttonSign = new GuiButton(3, this.width / 2 - 100, 4 + this.bookImageHeight, 98, 20, StatCollector.translateToLocal("book.signButton"))); this.controlList.add(this.buttonDone = new GuiButton(0, this.width / 2 + 2, 4 + this.bookImageHeight, 98, 20, StatCollector.translateToLocal("gui.done"))); this.controlList.add(this.buttonFinalize = new GuiButton(5, this.width / 2 - 100, 4 + this.bookImageHeight, 98, 20, StatCollector.translateToLocal("book.finalizeButton"))); this.controlList.add(this.buttonCancel = new GuiButton(4, this.width / 2 + 2, 4 + this.bookImageHeight, 98, 20, StatCollector.translateToLocal("gui.cancel"))); } else { this.controlList.add(this.buttonDone = new GuiButton(0, this.width / 2 - 100, 4 + this.bookImageHeight, 200, 20, StatCollector.translateToLocal("gui.done"))); } int var1 = (this.width - this.bookImageWidth) / 2; byte var2 = 2; this.controlList.add(this.buttonNextPage = new GuiButtonNextPage(1, var1 + 120, var2 + 154, true)); this.controlList.add(this.buttonPreviousPage = new GuiButtonNextPage(2, var1 + 38, var2 + 154, false)); this.updateButtons(); } /** * Called when the screen is unloaded. Used to disable keyboard repeat events */ public void onGuiClosed() { Keyboard.enableRepeatEvents(false); } private void updateButtons() { this.buttonNextPage.drawButton = !this.editingTitle && (this.currPage < this.bookTotalPages - 1 || this.bookIsUnsigned); this.buttonPreviousPage.drawButton = !this.editingTitle && this.currPage > 0; this.buttonDone.drawButton = !this.bookIsUnsigned || !this.editingTitle; if (this.bookIsUnsigned) { this.buttonSign.drawButton = !this.editingTitle; this.buttonCancel.drawButton = this.editingTitle; this.buttonFinalize.drawButton = this.editingTitle; this.buttonFinalize.enabled = this.bookTitle.trim().length() > 0; } } private void sendBookToServer(boolean par1) { if (this.bookIsUnsigned && this.bookModified) { if (this.bookPages != null) { while (this.bookPages.tagCount() > 1) { NBTTagString var2 = (NBTTagString)this.bookPages.tagAt(this.bookPages.tagCount() - 1); if (var2.data != null && var2.data.length() != 0) { break; } this.bookPages.removeTag(this.bookPages.tagCount() - 1); } if (this.itemstackBook.hasTagCompound()) { NBTTagCompound var7 = this.itemstackBook.getTagCompound(); var7.setTag("pages", this.bookPages); } else { this.itemstackBook.setTagInfo("pages", this.bookPages); } String var8 = "MC|BEdit"; if (par1) { var8 = "MC|BSign"; this.itemstackBook.setTagInfo("author", new NBTTagString("author", this.editingPlayer.username)); this.itemstackBook.setTagInfo("title", new NBTTagString("title", this.bookTitle.trim())); this.itemstackBook.itemID = Item.writtenBook.itemID; } ByteArrayOutputStream var3 = new ByteArrayOutputStream(); DataOutputStream var4 = new DataOutputStream(var3); try { Packet.writeItemStack(this.itemstackBook, var4); this.mc.getSendQueue().addToSendQueue(new Packet250CustomPayload(var8, var3.toByteArray())); } catch (Exception var6) { var6.printStackTrace(); } } } } /** * Fired when a control is clicked. This is the equivalent of ActionListener.actionPerformed(ActionEvent e). */ protected void actionPerformed(GuiButton par1GuiButton) { if (par1GuiButton.enabled) { if (par1GuiButton.id == 0) { this.mc.displayGuiScreen((GuiScreen)null); this.sendBookToServer(false); } else if (par1GuiButton.id == 3 && this.bookIsUnsigned) { this.editingTitle = true; } else if (par1GuiButton.id == 1) { if (this.currPage < this.bookTotalPages - 1) { ++this.currPage; } else if (this.bookIsUnsigned) { this.addNewPage(); if (this.currPage < this.bookTotalPages - 1) { ++this.currPage; } } } else if (par1GuiButton.id == 2) { if (this.currPage > 0) { --this.currPage; } } else if (par1GuiButton.id == 5 && this.editingTitle) { this.sendBookToServer(true); this.mc.displayGuiScreen((GuiScreen)null); } else if (par1GuiButton.id == 4 && this.editingTitle) { this.editingTitle = false; } this.updateButtons(); } } private void addNewPage() { if (this.bookPages != null && this.bookPages.tagCount() < 50) { this.bookPages.appendTag(new NBTTagString("" + (this.bookTotalPages + 1), "")); ++this.bookTotalPages; this.bookModified = true; } } /** * Fired when a key is typed. This is the equivalent of KeyListener.keyTyped(KeyEvent e). */ protected void keyTyped(char par1, int par2) { super.keyTyped(par1, par2); if (this.bookIsUnsigned) { if (this.editingTitle) { this.func_74162_c(par1, par2); } else { this.keyTypedInBook(par1, par2); } } } /** * Processes keystrokes when editing the text of a book */ private void keyTypedInBook(char par1, int par2) { switch (par1) { case 22: this.func_74160_b(GuiScreen.getClipboardString()); return; default: switch (par2) { case 14: String var3 = this.func_74158_i(); if (var3.length() > 0) { this.func_74159_a(var3.substring(0, var3.length() - 1)); } return; case 28: this.func_74160_b("\n"); return; default: if (ChatAllowedCharacters.isAllowedCharacter(par1)) { this.func_74160_b(Character.toString(par1)); } } } } private void func_74162_c(char par1, int par2) { switch (par2) { case 14: if (this.bookTitle.length() > 0) { this.bookTitle = this.bookTitle.substring(0, this.bookTitle.length() - 1); this.updateButtons(); } return; case 28: if (this.bookTitle.length() > 0) { this.sendBookToServer(true); this.mc.displayGuiScreen((GuiScreen)null); } return; default: if (this.bookTitle.length() < 16 && ChatAllowedCharacters.isAllowedCharacter(par1)) { this.bookTitle = this.bookTitle + Character.toString(par1); this.updateButtons(); this.bookModified = true; } } } private String func_74158_i() { if (this.bookPages != null && this.currPage >= 0 && this.currPage < this.bookPages.tagCount()) { NBTTagString var1 = (NBTTagString)this.bookPages.tagAt(this.currPage); return var1.toString(); } else { return ""; } } private void func_74159_a(String par1Str) { if (this.bookPages != null && this.currPage >= 0 && this.currPage < this.bookPages.tagCount()) { NBTTagString var2 = (NBTTagString)this.bookPages.tagAt(this.currPage); var2.data = par1Str; this.bookModified = true; } } private void func_74160_b(String par1Str) { String var2 = this.func_74158_i(); String var3 = var2 + par1Str; int var4 = this.fontRenderer.splitStringWidth(var3 + "\u00a70_", 118); if (var4 <= 118 && var3.length() < 256) { this.func_74159_a(var3); } } /** * Draws the screen and all the components in it. */ public void drawScreen(int par1, int par2, float par3) { int var4 = this.mc.renderEngine.getTexture("/gui/book.png"); GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F); this.mc.renderEngine.bindTexture(var4); int var5 = (this.width - this.bookImageWidth) / 2; byte var6 = 2; this.drawTexturedModalRect(var5, var6, 0, 0, this.bookImageWidth, this.bookImageHeight); String var7; String var8; int var9; if (this.editingTitle) { var7 = this.bookTitle; if (this.bookIsUnsigned) { if (this.updateCount / 6 % 2 == 0) { var7 = var7 + "\u00a70_"; } else { var7 = var7 + "\u00a77_"; } } var8 = StatCollector.translateToLocal("book.editTitle"); var9 = this.fontRenderer.getStringWidth(var8); this.fontRenderer.drawString(var8, var5 + 36 + (116 - var9) / 2, var6 + 16 + 16, 0); int var10 = this.fontRenderer.getStringWidth(var7); this.fontRenderer.drawString(var7, var5 + 36 + (116 - var10) / 2, var6 + 48, 0); String var11 = String.format(StatCollector.translateToLocal("book.byAuthor"), new Object[] {this.editingPlayer.username}); int var12 = this.fontRenderer.getStringWidth(var11); this.fontRenderer.drawString("\u00a78" + var11, var5 + 36 + (116 - var12) / 2, var6 + 48 + 10, 0); String var13 = StatCollector.translateToLocal("book.finalizeWarning"); this.fontRenderer.drawSplitString(var13, var5 + 36, var6 + 80, 116, 0); } else { var7 = String.format(StatCollector.translateToLocal("book.pageIndicator"), new Object[] {Integer.valueOf(this.currPage + 1), Integer.valueOf(this.bookTotalPages)}); var8 = ""; if (this.bookPages != null && this.currPage >= 0 && this.currPage < this.bookPages.tagCount()) { NBTTagString var14 = (NBTTagString)this.bookPages.tagAt(this.currPage); var8 = var14.toString(); } if (this.bookIsUnsigned) { if (this.fontRenderer.getBidiFlag()) { var8 = var8 + "_"; } else if (this.updateCount / 6 % 2 == 0) { var8 = var8 + "\u00a70_"; } else { var8 = var8 + "\u00a77_"; } } var9 = this.fontRenderer.getStringWidth(var7); this.fontRenderer.drawString(var7, var5 - var9 + this.bookImageWidth - 44, var6 + 16, 0); this.fontRenderer.drawSplitString(var8, var5 + 36, var6 + 16 + 16, 116, 0); } super.drawScreen(par1, par2, par3); } }