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.MathHelper; 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 final List field_96134_d = 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) { int j = this.func_96127_i(); boolean flag = false; int k = 0; int l = this.field_96134_d.size(); float f = this.mc.gameSettings.chatOpacity * 0.9F + 0.1F; if (l > 0) { if (this.getChatOpen()) { flag = true; } float f1 = this.func_96131_h(); int i1 = MathHelper.ceiling_float_int((float)this.func_96126_f() / f1); GL11.glPushMatrix(); GL11.glTranslatef(2.0F, 20.0F, 0.0F); GL11.glScalef(f1, f1, 1.0F); int j1; int k1; int l1; for (j1 = 0; j1 + this.field_73768_d < this.field_96134_d.size() && j1 < j; ++j1) { ChatLine chatline = (ChatLine)this.field_96134_d.get(j1 + this.field_73768_d); if (chatline != null) { k1 = par1 - chatline.getUpdatedCounter(); if (k1 < 200 || flag) { double d0 = (double)k1 / 200.0D; d0 = 1.0D - d0; d0 *= 10.0D; if (d0 < 0.0D) { d0 = 0.0D; } if (d0 > 1.0D) { d0 = 1.0D; } d0 *= d0; l1 = (int)(255.0D * d0); if (flag) { l1 = 255; } l1 = (int)((float)l1 * f); ++k; if (l1 > 3) { byte b0 = 0; int i2 = -j1 * 9; drawRect(b0, i2 - 9, b0 + i1 + 4, i2, l1 / 2 << 24); GL11.glEnable(GL11.GL_BLEND); String s = chatline.getChatLineString(); if (!this.mc.gameSettings.chatColours) { s = StringUtils.stripControlCodes(s); } this.mc.fontRenderer.drawStringWithShadow(s, b0, i2 - 8, 16777215 + (l1 << 24)); } } } } if (flag) { j1 = this.mc.fontRenderer.FONT_HEIGHT; GL11.glTranslatef(-3.0F, 0.0F, 0.0F); int j2 = l * j1 + l; k1 = k * j1 + k; int k2 = this.field_73768_d * k1 / l; int l2 = k1 * k1 / j2; if (j2 != k1) { l1 = k2 > 0 ? 170 : 96; int i3 = this.field_73769_e ? 13382451 : 3355562; drawRect(0, -k2, 2, -k2 - l2, i3 + (l1 << 24)); drawRect(2, -k2, 1, -k2 - l2, 13421772 + (l1 << 24)); } } GL11.glPopMatrix(); } } } /** * Clears the chat. */ public void clearChatMessages() { this.field_96134_d.clear(); 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) { this.func_96129_a(par1Str, par2, this.mc.ingameGUI.getUpdateCounter(), false); this.mc.getLogAgent().logInfo("[CHAT] " + par1Str); } private void func_96129_a(String par1Str, int par2, int par3, boolean par4) { boolean flag1 = this.getChatOpen(); boolean flag2 = true; if (par2 != 0) { this.deleteChatLine(par2); } Iterator iterator = this.mc.fontRenderer.listFormattedStringToWidth(par1Str, MathHelper.floor_float((float)this.func_96126_f() / this.func_96131_h())).iterator(); while (iterator.hasNext()) { String s1 = (String)iterator.next(); if (flag1 && this.field_73768_d > 0) { this.field_73769_e = true; this.scroll(1); } if (!flag2) { s1 = " " + s1; } flag2 = false; this.field_96134_d.add(0, new ChatLine(par3, s1, par2)); } while (this.field_96134_d.size() > 100) { this.field_96134_d.remove(this.field_96134_d.size() - 1); } if (!par4) { this.chatLines.add(0, new ChatLine(par3, par1Str.trim(), par2)); while (this.chatLines.size() > 100) { this.chatLines.remove(this.chatLines.size() - 1); } } } public void func_96132_b() { this.field_96134_d.clear(); this.resetScroll(); for (int i = this.chatLines.size() - 1; i >= 0; --i) { ChatLine chatline = (ChatLine)this.chatLines.get(i); this.func_96129_a(chatline.getChatLineString(), chatline.getChatLineID(), chatline.getUpdatedCounter(), true); } } /** * 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 j = this.field_96134_d.size(); if (this.field_73768_d > j - this.func_96127_i()) { this.field_73768_d = j - this.func_96127_i(); } 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 scaledresolution = new ScaledResolution(this.mc.gameSettings, this.mc.displayWidth, this.mc.displayHeight); int k = scaledresolution.getScaleFactor(); float f = this.func_96131_h(); int l = par1 / k - 3; int i1 = par2 / k - 25; l = MathHelper.floor_float((float)l / f); i1 = MathHelper.floor_float((float)i1 / f); if (l >= 0 && i1 >= 0) { int j1 = Math.min(this.func_96127_i(), this.field_96134_d.size()); if (l <= MathHelper.floor_float((float)this.func_96126_f() / this.func_96131_h()) && i1 < this.mc.fontRenderer.FONT_HEIGHT * j1 + j1) { int k1 = i1 / (this.mc.fontRenderer.FONT_HEIGHT + 1) + this.field_73768_d; return new ChatClickData(this.mc.fontRenderer, (ChatLine)this.field_96134_d.get(k1), l, i1 - (k1 - this.field_73768_d) * this.mc.fontRenderer.FONT_HEIGHT + k1); } 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 iterator = this.field_96134_d.iterator(); ChatLine chatline; do { if (!iterator.hasNext()) { iterator = this.chatLines.iterator(); do { if (!iterator.hasNext()) { return; } chatline = (ChatLine)iterator.next(); } while (chatline.getChatLineID() != par1); iterator.remove(); return; } chatline = (ChatLine)iterator.next(); } while (chatline.getChatLineID() != par1); iterator.remove(); } public int func_96126_f() { return func_96128_a(this.mc.gameSettings.chatWidth); } public int func_96133_g() { return func_96130_b(this.getChatOpen() ? this.mc.gameSettings.chatHeightFocused : this.mc.gameSettings.chatHeightUnfocused); } public float func_96131_h() { return this.mc.gameSettings.chatScale; } public static final int func_96128_a(float par0) { short short1 = 320; byte b0 = 40; return MathHelper.floor_float(par0 * (float)(short1 - b0) + (float)b0); } public static final int func_96130_b(float par0) { short short1 = 180; byte b0 = 20; return MathHelper.floor_float(par0 * (float)(short1 - b0) + (float)b0); } public int func_96127_i() { return this.func_96133_g() / 9; } }