001 package net.minecraft.client.gui.inventory;
002
003 import cpw.mods.fml.relauncher.Side;
004 import cpw.mods.fml.relauncher.SideOnly;
005 import net.minecraft.block.Block;
006 import net.minecraft.client.gui.GuiButton;
007 import net.minecraft.client.gui.GuiScreen;
008 import net.minecraft.client.multiplayer.NetClientHandler;
009 import net.minecraft.client.renderer.tileentity.TileEntityRenderer;
010 import net.minecraft.network.packet.Packet130UpdateSign;
011 import net.minecraft.tileentity.TileEntitySign;
012 import net.minecraft.util.ChatAllowedCharacters;
013 import org.lwjgl.input.Keyboard;
014 import org.lwjgl.opengl.GL11;
015
016 @SideOnly(Side.CLIENT)
017 public class GuiEditSign extends GuiScreen
018 {
019 /**
020 * This String is just a local copy of the characters allowed in text rendering of minecraft.
021 */
022 private static final String allowedCharacters = ChatAllowedCharacters.allowedCharacters;
023
024 /** The title string that is displayed in the top-center of the screen. */
025 protected String screenTitle = "Edit sign message:";
026
027 /** Reference to the sign object. */
028 private TileEntitySign entitySign;
029
030 /** Counts the number of screen updates. */
031 private int updateCounter;
032
033 /** The number of the line that is being edited. */
034 private int editLine = 0;
035
036 public GuiEditSign(TileEntitySign par1TileEntitySign)
037 {
038 this.entitySign = par1TileEntitySign;
039 }
040
041 /**
042 * Adds the buttons (and other controls) to the screen in question.
043 */
044 public void initGui()
045 {
046 this.controlList.clear();
047 Keyboard.enableRepeatEvents(true);
048 this.controlList.add(new GuiButton(0, this.width / 2 - 100, this.height / 4 + 120, "Done"));
049 this.entitySign.setEditable(false);
050 }
051
052 /**
053 * Called when the screen is unloaded. Used to disable keyboard repeat events
054 */
055 public void onGuiClosed()
056 {
057 Keyboard.enableRepeatEvents(false);
058 NetClientHandler var1 = this.mc.getSendQueue();
059
060 if (var1 != null)
061 {
062 var1.addToSendQueue(new Packet130UpdateSign(this.entitySign.xCoord, this.entitySign.yCoord, this.entitySign.zCoord, this.entitySign.signText));
063 }
064
065 this.entitySign.setEditable(true);
066 }
067
068 /**
069 * Called from the main game loop to update the screen.
070 */
071 public void updateScreen()
072 {
073 ++this.updateCounter;
074 }
075
076 /**
077 * Fired when a control is clicked. This is the equivalent of ActionListener.actionPerformed(ActionEvent e).
078 */
079 protected void actionPerformed(GuiButton par1GuiButton)
080 {
081 if (par1GuiButton.enabled)
082 {
083 if (par1GuiButton.id == 0)
084 {
085 this.entitySign.onInventoryChanged();
086 this.mc.displayGuiScreen((GuiScreen)null);
087 }
088 }
089 }
090
091 /**
092 * Fired when a key is typed. This is the equivalent of KeyListener.keyTyped(KeyEvent e).
093 */
094 protected void keyTyped(char par1, int par2)
095 {
096 if (par2 == 200)
097 {
098 this.editLine = this.editLine - 1 & 3;
099 }
100
101 if (par2 == 208 || par2 == 28)
102 {
103 this.editLine = this.editLine + 1 & 3;
104 }
105
106 if (par2 == 14 && this.entitySign.signText[this.editLine].length() > 0)
107 {
108 this.entitySign.signText[this.editLine] = this.entitySign.signText[this.editLine].substring(0, this.entitySign.signText[this.editLine].length() - 1);
109 }
110
111 if (allowedCharacters.indexOf(par1) >= 0 && this.entitySign.signText[this.editLine].length() < 15)
112 {
113 this.entitySign.signText[this.editLine] = this.entitySign.signText[this.editLine] + par1;
114 }
115 }
116
117 /**
118 * Draws the screen and all the components in it.
119 */
120 public void drawScreen(int par1, int par2, float par3)
121 {
122 this.drawDefaultBackground();
123 this.drawCenteredString(this.fontRenderer, this.screenTitle, this.width / 2, 40, 16777215);
124 GL11.glPushMatrix();
125 GL11.glTranslatef((float)(this.width / 2), 0.0F, 50.0F);
126 float var4 = 93.75F;
127 GL11.glScalef(-var4, -var4, -var4);
128 GL11.glRotatef(180.0F, 0.0F, 1.0F, 0.0F);
129 Block var5 = this.entitySign.getBlockType();
130
131 if (var5 == Block.signPost)
132 {
133 float var6 = (float)(this.entitySign.getBlockMetadata() * 360) / 16.0F;
134 GL11.glRotatef(var6, 0.0F, 1.0F, 0.0F);
135 GL11.glTranslatef(0.0F, -1.0625F, 0.0F);
136 }
137 else
138 {
139 int var8 = this.entitySign.getBlockMetadata();
140 float var7 = 0.0F;
141
142 if (var8 == 2)
143 {
144 var7 = 180.0F;
145 }
146
147 if (var8 == 4)
148 {
149 var7 = 90.0F;
150 }
151
152 if (var8 == 5)
153 {
154 var7 = -90.0F;
155 }
156
157 GL11.glRotatef(var7, 0.0F, 1.0F, 0.0F);
158 GL11.glTranslatef(0.0F, -1.0625F, 0.0F);
159 }
160
161 if (this.updateCounter / 6 % 2 == 0)
162 {
163 this.entitySign.lineBeingEdited = this.editLine;
164 }
165
166 TileEntityRenderer.instance.renderTileEntityAt(this.entitySign, -0.5D, -0.75D, -0.5D, 0.0F);
167 this.entitySign.lineBeingEdited = -1;
168 GL11.glPopMatrix();
169 super.drawScreen(par1, par2, par3);
170 }
171 }