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.StringTranslate;
010import net.minecraft.util.StringUtils;
011import org.lwjgl.opengl.GL11;
012
013@SideOnly(Side.CLIENT)
014public class GuiNewChat extends Gui
015{
016    /** The Minecraft instance. */
017    private final Minecraft mc;
018
019    /** A list of messages previously sent through the chat GUI */
020    private final List sentMessages = new ArrayList();
021
022    /** Chat lines to be displayed in the chat box */
023    private final List chatLines = new ArrayList();
024    private int field_73768_d = 0;
025    private boolean field_73769_e = false;
026
027    public GuiNewChat(Minecraft par1Minecraft)
028    {
029        this.mc = par1Minecraft;
030    }
031
032    public void drawChat(int par1)
033    {
034        if (this.mc.gameSettings.chatVisibility != 2)
035        {
036            byte var2 = 10;
037            boolean var3 = false;
038            int var4 = 0;
039            int var5 = this.chatLines.size();
040            float var6 = this.mc.gameSettings.chatOpacity * 0.9F + 0.1F;
041
042            if (var5 > 0)
043            {
044                if (this.getChatOpen())
045                {
046                    var2 = 20;
047                    var3 = true;
048                }
049
050                int var7;
051                int var9;
052                int var12;
053
054                for (var7 = 0; var7 + this.field_73768_d < this.chatLines.size() && var7 < var2; ++var7)
055                {
056                    ChatLine var8 = (ChatLine)this.chatLines.get(var7 + this.field_73768_d);
057
058                    if (var8 != null)
059                    {
060                        var9 = par1 - var8.getUpdatedCounter();
061
062                        if (var9 < 200 || var3)
063                        {
064                            double var10 = (double)var9 / 200.0D;
065                            var10 = 1.0D - var10;
066                            var10 *= 10.0D;
067
068                            if (var10 < 0.0D)
069                            {
070                                var10 = 0.0D;
071                            }
072
073                            if (var10 > 1.0D)
074                            {
075                                var10 = 1.0D;
076                            }
077
078                            var10 *= var10;
079                            var12 = (int)(255.0D * var10);
080
081                            if (var3)
082                            {
083                                var12 = 255;
084                            }
085
086                            var12 = (int)((float)var12 * var6);
087                            ++var4;
088
089                            if (var12 > 3)
090                            {
091                                byte var13 = 3;
092                                int var14 = -var7 * 9;
093                                drawRect(var13, var14 - 1, var13 + 320 + 4, var14 + 8, var12 / 2 << 24);
094                                GL11.glEnable(GL11.GL_BLEND);
095                                String var15 = var8.getChatLineString();
096
097                                if (!this.mc.gameSettings.chatColours)
098                                {
099                                    var15 = StringUtils.stripControlCodes(var15);
100                                }
101
102                                this.mc.fontRenderer.drawStringWithShadow(var15, var13, var14, 16777215 + (var12 << 24));
103                            }
104                        }
105                    }
106                }
107
108                if (var3)
109                {
110                    var7 = this.mc.fontRenderer.FONT_HEIGHT;
111                    GL11.glTranslatef(0.0F, (float)var7, 0.0F);
112                    int var16 = var5 * var7 + var5;
113                    var9 = var4 * var7 + var4;
114                    int var17 = this.field_73768_d * var9 / var5;
115                    int var11 = var9 * var9 / var16;
116
117                    if (var16 != var9)
118                    {
119                        var12 = var17 > 0 ? 170 : 96;
120                        int var18 = this.field_73769_e ? 13382451 : 3355562;
121                        drawRect(0, -var17, 2, -var17 - var11, var18 + (var12 << 24));
122                        drawRect(2, -var17, 1, -var17 - var11, 13421772 + (var12 << 24));
123                    }
124                }
125            }
126        }
127    }
128
129    public void func_73761_a()
130    {
131        this.chatLines.clear();
132        this.sentMessages.clear();
133    }
134
135    /**
136     * takes a String and prints it to chat
137     */
138    public void printChatMessage(String par1Str)
139    {
140        this.printChatMessageWithOptionalDeletion(par1Str, 0);
141    }
142
143    /**
144     * prints the String to Chat. If the ID is not 0, deletes an existing Chat Line of that ID from the GUI
145     */
146    public void printChatMessageWithOptionalDeletion(String par1Str, int par2)
147    {
148        boolean var3 = this.getChatOpen();
149        boolean var4 = true;
150
151        if (par2 != 0)
152        {
153            this.deleteChatLine(par2);
154        }
155
156        Iterator var5 = this.mc.fontRenderer.listFormattedStringToWidth(par1Str, 320).iterator();
157
158        while (var5.hasNext())
159        {
160            String var6 = (String)var5.next();
161
162            if (var3 && this.field_73768_d > 0)
163            {
164                this.field_73769_e = true;
165                this.scroll(1);
166            }
167
168            if (!var4)
169            {
170                var6 = " " + var6;
171            }
172
173            var4 = false;
174            this.chatLines.add(0, new ChatLine(this.mc.ingameGUI.getUpdateCounter(), var6, par2));
175        }
176
177        while (this.chatLines.size() > 100)
178        {
179            this.chatLines.remove(this.chatLines.size() - 1);
180        }
181    }
182
183    /**
184     * Gets the list of messages previously sent through the chat GUI
185     */
186    public List getSentMessages()
187    {
188        return this.sentMessages;
189    }
190
191    /**
192     * Adds this string to the list of sent messages, for recall using the up/down arrow keys
193     */
194    public void addToSentMessages(String par1Str)
195    {
196        if (this.sentMessages.isEmpty() || !((String)this.sentMessages.get(this.sentMessages.size() - 1)).equals(par1Str))
197        {
198            this.sentMessages.add(par1Str);
199        }
200    }
201
202    /**
203     * Resets the chat scroll (executed when the GUI is closed)
204     */
205    public void resetScroll()
206    {
207        this.field_73768_d = 0;
208        this.field_73769_e = false;
209    }
210
211    /**
212     * Scrolls the chat by the given number of lines.
213     */
214    public void scroll(int par1)
215    {
216        this.field_73768_d += par1;
217        int var2 = this.chatLines.size();
218
219        if (this.field_73768_d > var2 - 20)
220        {
221            this.field_73768_d = var2 - 20;
222        }
223
224        if (this.field_73768_d <= 0)
225        {
226            this.field_73768_d = 0;
227            this.field_73769_e = false;
228        }
229    }
230
231    public ChatClickData func_73766_a(int par1, int par2)
232    {
233        if (!this.getChatOpen())
234        {
235            return null;
236        }
237        else
238        {
239            ScaledResolution var3 = new ScaledResolution(this.mc.gameSettings, this.mc.displayWidth, this.mc.displayHeight);
240            int var4 = var3.getScaleFactor();
241            int var5 = par1 / var4 - 3;
242            int var6 = par2 / var4 - 40;
243
244            if (var5 >= 0 && var6 >= 0)
245            {
246                int var7 = Math.min(20, this.chatLines.size());
247
248                if (var5 <= 320 && var6 < this.mc.fontRenderer.FONT_HEIGHT * var7 + var7)
249                {
250                    int var8 = var6 / (this.mc.fontRenderer.FONT_HEIGHT + 1) + this.field_73768_d;
251                    return new ChatClickData(this.mc.fontRenderer, (ChatLine)this.chatLines.get(var8), var5, var6 - (var8 - this.field_73768_d) * this.mc.fontRenderer.FONT_HEIGHT + var8);
252                }
253                else
254                {
255                    return null;
256                }
257            }
258            else
259            {
260                return null;
261            }
262        }
263    }
264
265    /**
266     * Adds a message to the chat after translating to the client's locale.
267     */
268    public void addTranslatedMessage(String par1Str, Object ... par2ArrayOfObj)
269    {
270        this.printChatMessage(StringTranslate.getInstance().translateKeyFormat(par1Str, par2ArrayOfObj));
271    }
272
273    /**
274     * @return {@code true} if the chat GUI is open
275     */
276    public boolean getChatOpen()
277    {
278        return this.mc.currentScreen instanceof GuiChat;
279    }
280
281    /**
282     * finds and deletes a Chat line by ID
283     */
284    public void deleteChatLine(int par1)
285    {
286        Iterator var2 = this.chatLines.iterator();
287        ChatLine var3;
288
289        do
290        {
291            if (!var2.hasNext())
292            {
293                return;
294            }
295
296            var3 = (ChatLine)var2.next();
297        }
298        while (var3.getChatLineID() != par1);
299
300        var2.remove();
301    }
302}