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 }