package net.minecraft.client.gui;
import com.google.common.collect.Lists;
import java.util.Iterator;
import java.util.List;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.util.ChatComponentText;
import net.minecraft.util.IChatComponent;
import net.minecraft.util.MathHelper;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
public class GuiNewChat extends Gui
{
private static final Logger logger = LogManager.getLogger();
private final Minecraft mc;
/** A list of messages previously sent through the chat GUI */
private final List sentMessages = Lists.newArrayList();
/** Chat lines to be displayed in the chat box */
private final List chatLines = Lists.newArrayList();
private final List field_146253_i = Lists.newArrayList();
private int scrollPos;
private boolean isScrolled;
private static final String __OBFID = "CL_00000669";
public GuiNewChat(Minecraft mcIn)
{
this.mc = mcIn;
}
public void drawChat(int p_146230_1_)
{
if (this.mc.gameSettings.chatVisibility != EntityPlayer.EnumChatVisibility.HIDDEN)
{
int var2 = this.getLineCount();
boolean var3 = false;
int var4 = 0;
int var5 = this.field_146253_i.size();
float var6 = this.mc.gameSettings.chatOpacity * 0.9F + 0.1F;
if (var5 > 0)
{
if (this.getChatOpen())
{
var3 = true;
}
float var7 = this.getChatScale();
int var8 = MathHelper.ceiling_float_int((float)this.getChatWidth() / var7);
GlStateManager.pushMatrix();
GlStateManager.translate(2.0F, 20.0F, 0.0F);
GlStateManager.scale(var7, var7, 1.0F);
int var9;
int var11;
int var14;
for (var9 = 0; var9 + this.scrollPos < this.field_146253_i.size() && var9 < var2; ++var9)
{
ChatLine var10 = (ChatLine)this.field_146253_i.get(var9 + this.scrollPos);
if (var10 != null)
{
var11 = p_146230_1_ - var10.getUpdatedCounter();
if (var11 < 200 || var3)
{
double var12 = (double)var11 / 200.0D;
var12 = 1.0D - var12;
var12 *= 10.0D;
var12 = MathHelper.clamp_double(var12, 0.0D, 1.0D);
var12 *= var12;
var14 = (int)(255.0D * var12);
if (var3)
{
var14 = 255;
}
var14 = (int)((float)var14 * var6);
++var4;
if (var14 > 3)
{
byte var15 = 0;
int var16 = -var9 * 9;
drawRect(var15, var16 - 9, var15 + var8 + 4, var16, var14 / 2 << 24);
String var17 = var10.getChatComponent().getFormattedText();
GlStateManager.enableBlend();
this.mc.fontRendererObj.func_175063_a(var17, (float)var15, (float)(var16 - 8), 16777215 + (var14 << 24));
GlStateManager.disableAlpha();
GlStateManager.disableBlend();
}
}
}
}
if (var3)
{
var9 = this.mc.fontRendererObj.FONT_HEIGHT;
GlStateManager.translate(-3.0F, 0.0F, 0.0F);
int var18 = var5 * var9 + var5;
var11 = var4 * var9 + var4;
int var19 = this.scrollPos * var11 / var5;
int var13 = var11 * var11 / var18;
if (var18 != var11)
{
var14 = var19 > 0 ? 170 : 96;
int var20 = this.isScrolled ? 13382451 : 3355562;
drawRect(0, -var19, 2, -var19 - var13, var20 + (var14 << 24));
drawRect(2, -var19, 1, -var19 - var13, 13421772 + (var14 << 24));
}
}
GlStateManager.popMatrix();
}
}
}
/**
* Clears the chat.
*/
public void clearChatMessages()
{
this.field_146253_i.clear();
this.chatLines.clear();
this.sentMessages.clear();
}
public void printChatMessage(IChatComponent p_146227_1_)
{
this.printChatMessageWithOptionalDeletion(p_146227_1_, 0);
}
/**
* prints the ChatComponent to Chat. If the ID is not 0, deletes an existing Chat Line of that ID from the GUI
*/
public void printChatMessageWithOptionalDeletion(IChatComponent p_146234_1_, int p_146234_2_)
{
this.setChatLine(p_146234_1_, p_146234_2_, this.mc.ingameGUI.getUpdateCounter(), false);
logger.info("[CHAT] " + p_146234_1_.getUnformattedText());
}
private void setChatLine(IChatComponent p_146237_1_, int p_146237_2_, int p_146237_3_, boolean p_146237_4_)
{
if (p_146237_2_ != 0)
{
this.deleteChatLine(p_146237_2_);
}
int var5 = MathHelper.floor_float((float)this.getChatWidth() / this.getChatScale());
List var6 = GuiUtilRenderComponents.func_178908_a(p_146237_1_, var5, this.mc.fontRendererObj, false, false);
boolean var7 = this.getChatOpen();
IChatComponent var9;
for (Iterator var8 = var6.iterator(); var8.hasNext(); this.field_146253_i.add(0, new ChatLine(p_146237_3_, var9, p_146237_2_)))
{
var9 = (IChatComponent)var8.next();
if (var7 && this.scrollPos > 0)
{
this.isScrolled = true;
this.scroll(1);
}
}
while (this.field_146253_i.size() > 100)
{
this.field_146253_i.remove(this.field_146253_i.size() - 1);
}
if (!p_146237_4_)
{
this.chatLines.add(0, new ChatLine(p_146237_3_, p_146237_1_, p_146237_2_));
while (this.chatLines.size() > 100)
{
this.chatLines.remove(this.chatLines.size() - 1);
}
}
}
public void refreshChat()
{
this.field_146253_i.clear();
this.resetScroll();
for (int var1 = this.chatLines.size() - 1; var1 >= 0; --var1)
{
ChatLine var2 = (ChatLine)this.chatLines.get(var1);
this.setChatLine(var2.getChatComponent(), var2.getChatLineID(), var2.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 p_146239_1_)
{
if (this.sentMessages.isEmpty() || !((String)this.sentMessages.get(this.sentMessages.size() - 1)).equals(p_146239_1_))
{
this.sentMessages.add(p_146239_1_);
}
}
/**
* Resets the chat scroll (executed when the GUI is closed, among others)
*/
public void resetScroll()
{
this.scrollPos = 0;
this.isScrolled = false;
}
/**
* Scrolls the chat by the given number of lines.
*/
public void scroll(int p_146229_1_)
{
this.scrollPos += p_146229_1_;
int var2 = this.field_146253_i.size();
if (this.scrollPos > var2 - this.getLineCount())
{
this.scrollPos = var2 - this.getLineCount();
}
if (this.scrollPos <= 0)
{
this.scrollPos = 0;
this.isScrolled = false;
}
}
/**
* Gets the chat component under the mouse
*/
public IChatComponent getChatComponent(int p_146236_1_, int p_146236_2_)
{
if (!this.getChatOpen())
{
return null;
}
else
{
ScaledResolution var3 = new ScaledResolution(this.mc, this.mc.displayWidth, this.mc.displayHeight);
int var4 = var3.getScaleFactor();
float var5 = this.getChatScale();
int var6 = p_146236_1_ / var4 - 3;
int var7 = p_146236_2_ / var4 - 27;
var6 = MathHelper.floor_float((float)var6 / var5);
var7 = MathHelper.floor_float((float)var7 / var5);
if (var6 >= 0 && var7 >= 0)
{
int var8 = Math.min(this.getLineCount(), this.field_146253_i.size());
if (var6 <= MathHelper.floor_float((float)this.getChatWidth() / this.getChatScale()) && var7 < this.mc.fontRendererObj.FONT_HEIGHT * var8 + var8)
{
int var9 = var7 / this.mc.fontRendererObj.FONT_HEIGHT + this.scrollPos;
if (var9 >= 0 && var9 < this.field_146253_i.size())
{
ChatLine var10 = (ChatLine)this.field_146253_i.get(var9);
int var11 = 0;
Iterator var12 = var10.getChatComponent().iterator();
while (var12.hasNext())
{
IChatComponent var13 = (IChatComponent)var12.next();
if (var13 instanceof ChatComponentText)
{
var11 += this.mc.fontRendererObj.getStringWidth(GuiUtilRenderComponents.func_178909_a(((ChatComponentText)var13).getChatComponentText_TextValue(), false));
if (var11 > var6)
{
return var13;
}
}
}
}
return null;
}
else
{
return null;
}
}
else
{
return null;
}
}
}
/**
* Returns 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 p_146242_1_)
{
Iterator var2 = this.field_146253_i.iterator();
ChatLine var3;
while (var2.hasNext())
{
var3 = (ChatLine)var2.next();
if (var3.getChatLineID() == p_146242_1_)
{
var2.remove();
}
}
var2 = this.chatLines.iterator();
while (var2.hasNext())
{
var3 = (ChatLine)var2.next();
if (var3.getChatLineID() == p_146242_1_)
{
var2.remove();
break;
}
}
}
public int getChatWidth()
{
return calculateChatboxWidth(this.mc.gameSettings.chatWidth);
}
public int getChatHeight()
{
return calculateChatboxHeight(this.getChatOpen() ? this.mc.gameSettings.chatHeightFocused : this.mc.gameSettings.chatHeightUnfocused);
}
/**
* Returns the chatscale from mc.gameSettings.chatScale
*/
public float getChatScale()
{
return this.mc.gameSettings.chatScale;
}
public static int calculateChatboxWidth(float p_146233_0_)
{
short var1 = 320;
byte var2 = 40;
return MathHelper.floor_float(p_146233_0_ * (float)(var1 - var2) + (float)var2);
}
public static int calculateChatboxHeight(float p_146243_0_)
{
short var1 = 180;
byte var2 = 20;
return MathHelper.floor_float(p_146243_0_ * (float)(var1 - var2) + (float)var2);
}
public int getLineCount()
{
return this.getChatHeight() / 9;
}
}