    001    package net.minecraft.client.gui.inventory;
    002
    003    import cpw.mods.fml.common.Side;
    004    import cpw.mods.fml.common.asm.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    }