    001package net.minecraft.client.gui;
    002
    003import cpw.mods.fml.relauncher.Side;
    004import cpw.mods.fml.relauncher.SideOnly;
    005import java.util.ArrayList;
    006import java.util.Iterator;
    007import java.util.List;
    008import net.minecraft.client.Minecraft;
    009import net.minecraft.util.MathHelper;
    010import net.minecraft.util.StringTranslate;
    011import net.minecraft.util.StringUtils;
    012import org.lwjgl.opengl.GL11;
    013
    014@SideOnly(Side.CLIENT)
    015public class GuiNewChat extends Gui
    016{
    017    /** The Minecraft instance. */
    018    private final Minecraft mc;
    019
    020    /** A list of messages previously sent through the chat GUI */
    021    private final List sentMessages = new ArrayList();
    022
    023    /** Chat lines to be displayed in the chat box */
    024    private final List chatLines = new ArrayList();
    025    private final List field_96134_d = new ArrayList();
    026    private int field_73768_d = 0;
    027    private boolean field_73769_e = false;
    028
    029    public GuiNewChat(Minecraft par1Minecraft)
    030    {
    031        this.mc = par1Minecraft;
    032    }
    033
    034    public void drawChat(int par1)
    035    {
    036        if (this.mc.gameSettings.chatVisibility != 2)
    037        {
    038            int j = this.func_96127_i();
    039            boolean flag = false;
    040            int k = 0;
    041            int l = this.field_96134_d.size();
    042            float f = this.mc.gameSettings.chatOpacity * 0.9F + 0.1F;
    043
    044            if (l > 0)
    045            {
    046                if (this.getChatOpen())
    047                {
    048                    flag = true;
    049                }
    050
    051                float f1 = this.func_96131_h();
    052                int i1 = MathHelper.ceiling_float_int((float)this.func_96126_f() / f1);
    053                GL11.glPushMatrix();
    054                GL11.glTranslatef(2.0F, 20.0F, 0.0F);
    055                GL11.glScalef(f1, f1, 1.0F);
    056                int j1;
    057                int k1;
    058                int l1;
    059
    060                for (j1 = 0; j1 + this.field_73768_d < this.field_96134_d.size() && j1 < j; ++j1)
    061                {
    062                    ChatLine chatline = (ChatLine)this.field_96134_d.get(j1 + this.field_73768_d);
    063
    064                    if (chatline != null)
    065                    {
    066                        k1 = par1 - chatline.getUpdatedCounter();
    067
    068                        if (k1 < 200 || flag)
    069                        {
    070                            double d0 = (double)k1 / 200.0D;
    071                            d0 = 1.0D - d0;
    072                            d0 *= 10.0D;
    073
    074                            if (d0 < 0.0D)
    075                            {
    076                                d0 = 0.0D;
    077                            }
    078
    079                            if (d0 > 1.0D)
    080                            {
    081                                d0 = 1.0D;
    082                            }
    083
    084                            d0 *= d0;
    085                            l1 = (int)(255.0D * d0);
    086
    087                            if (flag)
    088                            {
    089                                l1 = 255;
    090                            }
    091
    092                            l1 = (int)((float)l1 * f);
    093                            ++k;
    094
    095                            if (l1 > 3)
    096                            {
    097                                byte b0 = 0;
    098                                int i2 = -j1 * 9;
    099                                drawRect(b0, i2 - 9, b0 + i1 + 4, i2, l1 / 2 << 24);
    100                                GL11.glEnable(GL11.GL_BLEND);
    101                                String s = chatline.getChatLineString();
    102
    103                                if (!this.mc.gameSettings.chatColours)
    104                                {
    105                                    s = StringUtils.stripControlCodes(s);
    106                                }
    107
    108                                this.mc.fontRenderer.drawStringWithShadow(s, b0, i2 - 8, 16777215 + (l1 << 24));
    109                            }
    110                        }
    111                    }
    112                }
    113
    114                if (flag)
    115                {
    116                    j1 = this.mc.fontRenderer.FONT_HEIGHT;
    117                    GL11.glTranslatef(-3.0F, 0.0F, 0.0F);
    118                    int j2 = l * j1 + l;
    119                    k1 = k * j1 + k;
    120                    int k2 = this.field_73768_d * k1 / l;
    121                    int l2 = k1 * k1 / j2;
    122
    123                    if (j2 != k1)
    124                    {
    125                        l1 = k2 > 0 ? 170 : 96;
    126                        int i3 = this.field_73769_e ? 13382451 : 3355562;
    127                        drawRect(0, -k2, 2, -k2 - l2, i3 + (l1 << 24));
    128                        drawRect(2, -k2, 1, -k2 - l2, 13421772 + (l1 << 24));
    129                    }
    130                }
    131
    132                GL11.glPopMatrix();
    133            }
    134        }
    135    }
    136
    137    /**
    138     * Clears the chat.
    139     */
    140    public void clearChatMessages()
    141    {
    142        this.field_96134_d.clear();
    143        this.chatLines.clear();
    144        this.sentMessages.clear();
    145    }
    146
    147    /**
    148     * takes a String and prints it to chat
    149     */
    150    public void printChatMessage(String par1Str)
    151    {
    152        this.printChatMessageWithOptionalDeletion(par1Str, 0);
    153    }
    154
    155    /**
    156     * prints the String to Chat. If the ID is not 0, deletes an existing Chat Line of that ID from the GUI
    157     */
    158    public void printChatMessageWithOptionalDeletion(String par1Str, int par2)
    159    {
    160        this.func_96129_a(par1Str, par2, this.mc.ingameGUI.getUpdateCounter(), false);
    161        this.mc.getLogAgent().logInfo("[CHAT] " + par1Str);
    162    }
    163
    164    private void func_96129_a(String par1Str, int par2, int par3, boolean par4)
    165    {
    166        boolean flag1 = this.getChatOpen();
    167        boolean flag2 = true;
    168
    169        if (par2 != 0)
    170        {
    171            this.deleteChatLine(par2);
    172        }
    173
    174        Iterator iterator = this.mc.fontRenderer.listFormattedStringToWidth(par1Str, MathHelper.floor_float((float)this.func_96126_f() / this.func_96131_h())).iterator();
    175
    176        while (iterator.hasNext())
    177        {
    178            String s1 = (String)iterator.next();
    179
    180            if (flag1 && this.field_73768_d > 0)
    181            {
    182                this.field_73769_e = true;
    183                this.scroll(1);
    184            }
    185
    186            if (!flag2)
    187            {
    188                s1 = " " + s1;
    189            }
    190
    191            flag2 = false;
    192            this.field_96134_d.add(0, new ChatLine(par3, s1, par2));
    193        }
    194
    195        while (this.field_96134_d.size() > 100)
    196        {
    197            this.field_96134_d.remove(this.field_96134_d.size() - 1);
    198        }
    199
    200        if (!par4)
    201        {
    202            this.chatLines.add(0, new ChatLine(par3, par1Str.trim(), par2));
    203
    204            while (this.chatLines.size() > 100)
    205            {
    206                this.chatLines.remove(this.chatLines.size() - 1);
    207            }
    208        }
    209    }
    210
    211    public void func_96132_b()
    212    {
    213        this.field_96134_d.clear();
    214        this.resetScroll();
    215
    216        for (int i = this.chatLines.size() - 1; i >= 0; --i)
    217        {
    218            ChatLine chatline = (ChatLine)this.chatLines.get(i);
    219            this.func_96129_a(chatline.getChatLineString(), chatline.getChatLineID(), chatline.getUpdatedCounter(), true);
    220        }
    221    }
    222
    223    /**
    224     * Gets the list of messages previously sent through the chat GUI
    225     */
    226    public List getSentMessages()
    227    {
    228        return this.sentMessages;
    229    }
    230
    231    /**
    232     * Adds this string to the list of sent messages, for recall using the up/down arrow keys
    233     */
    234    public void addToSentMessages(String par1Str)
    235    {
    236        if (this.sentMessages.isEmpty() || !((String)this.sentMessages.get(this.sentMessages.size() - 1)).equals(par1Str))
    237        {
    238            this.sentMessages.add(par1Str);
    239        }
    240    }
    241
    242    /**
    243     * Resets the chat scroll (executed when the GUI is closed)
    244     */
    245    public void resetScroll()
    246    {
    247        this.field_73768_d = 0;
    248        this.field_73769_e = false;
    249    }
    250
    251    /**
    252     * Scrolls the chat by the given number of lines.
    253     */
    254    public void scroll(int par1)
    255    {
    256        this.field_73768_d += par1;
    257        int j = this.field_96134_d.size();
    258
    259        if (this.field_73768_d > j - this.func_96127_i())
    260        {
    261            this.field_73768_d = j - this.func_96127_i();
    262        }
    263
    264        if (this.field_73768_d <= 0)
    265        {
    266            this.field_73768_d = 0;
    267            this.field_73769_e = false;
    268        }
    269    }
    270
    271    public ChatClickData func_73766_a(int par1, int par2)
    272    {
    273        if (!this.getChatOpen())
    274        {
    275            return null;
    276        }
    277        else
    278        {
    279            ScaledResolution scaledresolution = new ScaledResolution(this.mc.gameSettings, this.mc.displayWidth, this.mc.displayHeight);
    280            int k = scaledresolution.getScaleFactor();
    281            float f = this.func_96131_h();
    282            int l = par1 / k - 3;
    283            int i1 = par2 / k - 25;
    284            l = MathHelper.floor_float((float)l / f);
    285            i1 = MathHelper.floor_float((float)i1 / f);
    286
    287            if (l >= 0 && i1 >= 0)
    288            {
    289                int j1 = Math.min(this.func_96127_i(), this.field_96134_d.size());
    290
    291                if (l <= MathHelper.floor_float((float)this.func_96126_f() / this.func_96131_h()) && i1 < this.mc.fontRenderer.FONT_HEIGHT * j1 + j1)
    292                {
    293                    int k1 = i1 / (this.mc.fontRenderer.FONT_HEIGHT + 1) + this.field_73768_d;
    294                    return new ChatClickData(this.mc.fontRenderer, (ChatLine)this.field_96134_d.get(k1), l, i1 - (k1 - this.field_73768_d) * this.mc.fontRenderer.FONT_HEIGHT + k1);
    295                }
    296                else
    297                {
    298                    return null;
    299                }
    300            }
    301            else
    302            {
    303                return null;
    304            }
    305        }
    306    }
    307
    308    /**
    309     * Adds a message to the chat after translating to the client's locale.
    310     */
    311    public void addTranslatedMessage(String par1Str, Object ... par2ArrayOfObj)
    312    {
    313        this.printChatMessage(StringTranslate.getInstance().translateKeyFormat(par1Str, par2ArrayOfObj));
    314    }
    315
    316    /**
    317     * @return {@code true} if the chat GUI is open
    318     */
    319    public boolean getChatOpen()
    320    {
    321        return this.mc.currentScreen instanceof GuiChat;
    322    }
    323
    324    /**
    325     * finds and deletes a Chat line by ID
    326     */
    327    public void deleteChatLine(int par1)
    328    {
    329        Iterator iterator = this.field_96134_d.iterator();
    330        ChatLine chatline;
    331
    332        do
    333        {
    334            if (!iterator.hasNext())
    335            {
    336                iterator = this.chatLines.iterator();
    337
    338                do
    339                {
    340                    if (!iterator.hasNext())
    341                    {
    342                        return;
    343                    }
    344
    345                    chatline = (ChatLine)iterator.next();
    346                }
    347                while (chatline.getChatLineID() != par1);
    348
    349                iterator.remove();
    350                return;
    351            }
    352
    353            chatline = (ChatLine)iterator.next();
    354        }
    355        while (chatline.getChatLineID() != par1);
    356
    357        iterator.remove();
    358    }
    359
    360    public int func_96126_f()
    361    {
    362        return func_96128_a(this.mc.gameSettings.chatWidth);
    363    }
    364
    365    public int func_96133_g()
    366    {
    367        return func_96130_b(this.getChatOpen() ? this.mc.gameSettings.chatHeightFocused : this.mc.gameSettings.chatHeightUnfocused);
    368    }
    369
    370    public float func_96131_h()
    371    {
    372        return this.mc.gameSettings.chatScale;
    373    }
    374
    375    public static final int func_96128_a(float par0)
    376    {
    377        short short1 = 320;
    378        byte b0 = 40;
    379        return MathHelper.floor_float(par0 * (float)(short1 - b0) + (float)b0);
    380    }
    381
    382    public static final int func_96130_b(float par0)
    383    {
    384        short short1 = 180;
    385        byte b0 = 20;
    386        return MathHelper.floor_float(par0 * (float)(short1 - b0) + (float)b0);
    387    }
    388
    389    public int func_96127_i()
    390    {
    391        return this.func_96133_g() / 9;
    392    }
    393}