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