package net.minecraft.client.gui; import cpw.mods.fml.relauncher.Side; import cpw.mods.fml.relauncher.SideOnly; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import net.minecraft.client.Minecraft; import net.minecraft.util.StringTranslate; import net.minecraft.util.StringUtils; import org.lwjgl.opengl.GL11; @SideOnly(Side.CLIENT) public class GuiNewChat extends Gui { /** The Minecraft instance. */ private final Minecraft mc; /** A list of messages previously sent through the chat GUI */ private final List sentMessages = new ArrayList(); /** Chat lines to be displayed in the chat box */ private final List chatLines = new ArrayList(); private int field_73768_d = 0; private boolean field_73769_e = false; public GuiNewChat(Minecraft par1Minecraft) { this.mc = par1Minecraft; } public void drawChat(int par1) { if (this.mc.gameSettings.chatVisibility != 2) { byte var2 = 10; boolean var3 = false; int var4 = 0; int var5 = this.chatLines.size(); float var6 = this.mc.gameSettings.chatOpacity * 0.9F + 0.1F; if (var5 > 0) { if (this.getChatOpen()) { var2 = 20; var3 = true; } int var7; int var9; int var12; for (var7 = 0; var7 + this.field_73768_d < this.chatLines.size() && var7 < var2; ++var7) { ChatLine var8 = (ChatLine)this.chatLines.get(var7 + this.field_73768_d); if (var8 != null) { var9 = par1 - var8.getUpdatedCounter(); if (var9 < 200 || var3) { double var10 = (double)var9 / 200.0D; var10 = 1.0D - var10; var10 *= 10.0D; if (var10 < 0.0D) { var10 = 0.0D; } if (var10 > 1.0D) { var10 = 1.0D; } var10 *= var10; var12 = (int)(255.0D * var10); if (var3) { var12 = 255; } var12 = (int)((float)var12 * var6); ++var4; if (var12 > 3) { byte var13 = 3; int var14 = -var7 * 9; drawRect(var13, var14 - 1, var13 + 320 + 4, var14 + 8, var12 / 2 << 24); GL11.glEnable(GL11.GL_BLEND); String var15 = var8.getChatLineString(); if (!this.mc.gameSettings.chatColours) { var15 = StringUtils.stripControlCodes(var15); } this.mc.fontRenderer.drawStringWithShadow(var15, var13, var14, 16777215 + (var12 << 24)); } } } } if (var3) { var7 = this.mc.fontRenderer.FONT_HEIGHT; GL11.glTranslatef(0.0F, (float)var7, 0.0F); int var16 = var5 * var7 + var5; var9 = var4 * var7 + var4; int var17 = this.field_73768_d * var9 / var5; int var11 = var9 * var9 / var16; if (var16 != var9) { var12 = var17 > 0 ? 170 : 96; int var18 = this.field_73769_e ? 13382451 : 3355562; drawRect(0, -var17, 2, -var17 - var11, var18 + (var12 << 24)); drawRect(2, -var17, 1, -var17 - var11, 13421772 + (var12 << 24)); } } } } } public void func_73761_a() { this.chatLines.clear(); this.sentMessages.clear(); } /** * takes a String and prints it to chat */ public void printChatMessage(String par1Str) { this.printChatMessageWithOptionalDeletion(par1Str, 0); } /** * prints the String to Chat. If the ID is not 0, deletes an existing Chat Line of that ID from the GUI */ public void printChatMessageWithOptionalDeletion(String par1Str, int par2) { boolean var3 = this.getChatOpen(); boolean var4 = true; if (par2 != 0) { this.deleteChatLine(par2); } Iterator var5 = this.mc.fontRenderer.listFormattedStringToWidth(par1Str, 320).iterator(); while (var5.hasNext()) { String var6 = (String)var5.next(); if (var3 && this.field_73768_d > 0) { this.field_73769_e = true; this.scroll(1); } if (!var4) { var6 = " " + var6; } var4 = false; this.chatLines.add(0, new ChatLine(this.mc.ingameGUI.getUpdateCounter(), var6, par2)); } while (this.chatLines.size() > 100) { this.chatLines.remove(this.chatLines.size() - 1); } } /** * Gets the list of messages previously sent through the chat GUI */ public List getSentMessages() { return this.sentMessages; } /** * Adds this string to the list of sent messages, for recall using the up/down arrow keys */ public void addToSentMessages(String par1Str) { if (this.sentMessages.isEmpty() || !((String)this.sentMessages.get(this.sentMessages.size() - 1)).equals(par1Str)) { this.sentMessages.add(par1Str); } } /** * Resets the chat scroll (executed when the GUI is closed) */ public void resetScroll() { this.field_73768_d = 0; this.field_73769_e = false; } /** * Scrolls the chat by the given number of lines. */ public void scroll(int par1) { this.field_73768_d += par1; int var2 = this.chatLines.size(); if (this.field_73768_d > var2 - 20) { this.field_73768_d = var2 - 20; } if (this.field_73768_d <= 0) { this.field_73768_d = 0; this.field_73769_e = false; } } public ChatClickData func_73766_a(int par1, int par2) { if (!this.getChatOpen()) { return null; } else { ScaledResolution var3 = new ScaledResolution(this.mc.gameSettings, this.mc.displayWidth, this.mc.displayHeight); int var4 = var3.getScaleFactor(); int var5 = par1 / var4 - 3; int var6 = par2 / var4 - 40; if (var5 >= 0 && var6 >= 0) { int var7 = Math.min(20, this.chatLines.size()); if (var5 <= 320 && var6 < this.mc.fontRenderer.FONT_HEIGHT * var7 + var7) { int var8 = var6 / (this.mc.fontRenderer.FONT_HEIGHT + 1) + this.field_73768_d; return new ChatClickData(this.mc.fontRenderer, (ChatLine)this.chatLines.get(var8), var5, var6 - (var8 - this.field_73768_d) * this.mc.fontRenderer.FONT_HEIGHT + var8); } else { return null; } } else { return null; } } } /** * Adds a message to the chat after translating to the client's locale. */ public void addTranslatedMessage(String par1Str, Object ... par2ArrayOfObj) { this.printChatMessage(StringTranslate.getInstance().translateKeyFormat(par1Str, par2ArrayOfObj)); } /** * @return {@code true} if the chat GUI is open */ public boolean getChatOpen() { return this.mc.currentScreen instanceof GuiChat; } /** * finds and deletes a Chat line by ID */ public void deleteChatLine(int par1) { Iterator var2 = this.chatLines.iterator(); ChatLine var3; do { if (!var2.hasNext()) { return; } var3 = (ChatLine)var2.next(); } while (var3.getChatLineID() != par1); var2.remove(); } }