001 package net.minecraft.client.gui;
002
003 import cpw.mods.fml.relauncher.Side;
004 import cpw.mods.fml.relauncher.SideOnly;
005 import java.util.ArrayList;
006 import java.util.Iterator;
007 import java.util.List;
008 import net.minecraft.client.Minecraft;
009 import net.minecraft.util.StringTranslate;
010 import net.minecraft.util.StringUtils;
011 import org.lwjgl.opengl.GL11;
012
013 @SideOnly(Side.CLIENT)
014 public 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 }