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