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