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 }