package net.minecraft.client.gui.achievement;
import cpw.mods.fml.relauncher.Side;
import cpw.mods.fml.relauncher.SideOnly;
import java.util.LinkedList;
import java.util.List;
import java.util.Random;
import net.minecraft.block.Block;
import net.minecraft.client.Minecraft;
import net.minecraft.client.gui.GuiButton;
import net.minecraft.client.gui.GuiScreen;
import net.minecraft.client.gui.GuiSmallButton;
import net.minecraft.client.renderer.RenderHelper;
import net.minecraft.client.renderer.entity.RenderItem;
import net.minecraft.stats.Achievement;
import net.minecraft.stats.AchievementList;
import net.minecraft.stats.StatFileWriter;
import net.minecraft.util.Icon;
import net.minecraft.util.MathHelper;
import net.minecraft.util.StatCollector;
import org.lwjgl.input.Mouse;
import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL12;
import net.minecraftforge.common.AchievementPage;
@SideOnly(Side.CLIENT)
public class GuiAchievements extends GuiScreen
{
/** The top x coordinate of the achievement map */
private static final int guiMapTop = AchievementList.minDisplayColumn * 24 - 112;
/** The left y coordinate of the achievement map */
private static final int guiMapLeft = AchievementList.minDisplayRow * 24 - 112;
/** The bottom x coordinate of the achievement map */
private static final int guiMapBottom = AchievementList.maxDisplayColumn * 24 - 77;
/** The right y coordinate of the achievement map */
private static final int guiMapRight = AchievementList.maxDisplayRow * 24 - 77;
protected int achievementsPaneWidth = 256;
protected int achievementsPaneHeight = 202;
/** The current mouse x coordinate */
protected int mouseX = 0;
/** The current mouse y coordinate */
protected int mouseY = 0;
protected double field_74117_m;
protected double field_74115_n;
/** The x position of the achievement map */
protected double guiMapX;
/** The y position of the achievement map */
protected double guiMapY;
protected double field_74124_q;
protected double field_74123_r;
/** Whether the Mouse Button is down or not */
private int isMouseButtonDown = 0;
private StatFileWriter statFileWriter;
private int currentPage = -1;
private GuiSmallButton button;
private LinkedList<Achievement> minecraftAchievements = new LinkedList<Achievement>();
public GuiAchievements(StatFileWriter par1StatFileWriter)
{
this.statFileWriter = par1StatFileWriter;
short short1 = 141;
short short2 = 141;
this.field_74117_m = this.guiMapX = this.field_74124_q = (double)(AchievementList.openInventory.displayColumn * 24 - short1 / 2 - 12);
this.field_74115_n = this.guiMapY = this.field_74123_r = (double)(AchievementList.openInventory.displayRow * 24 - short2 / 2);
minecraftAchievements.clear();
for (Object achievement : AchievementList.achievementList)
{
if (!AchievementPage.isAchievementInPages((Achievement)achievement))
{
minecraftAchievements.add((Achievement)achievement);
}
}
}
/**
* Adds the buttons (and other controls) to the screen in question.
*/
public void initGui()
{
this.buttonList.clear();
this.buttonList.add(new GuiSmallButton(1, this.width / 2 + 24, this.height / 2 + 74, 80, 20, StatCollector.translateToLocal("gui.done")));
this.buttonList.add(button = new GuiSmallButton(2, (width - achievementsPaneWidth) / 2 + 24, height / 2 + 74, 125, 20, AchievementPage.getTitle(currentPage)));
}
/**
* Fired when a control is clicked. This is the equivalent of ActionListener.actionPerformed(ActionEvent e).
*/
protected void actionPerformed(GuiButton par1GuiButton)
{
if (par1GuiButton.id == 1)
{
this.mc.displayGuiScreen((GuiScreen)null);
this.mc.setIngameFocus();
}
if (par1GuiButton.id == 2)
{
currentPage++;
if (currentPage >= AchievementPage.getAchievementPages().size())
{
currentPage = -1;
}
button.displayString = AchievementPage.getTitle(currentPage);
}
super.actionPerformed(par1GuiButton);
}
/**
* Fired when a key is typed. This is the equivalent of KeyListener.keyTyped(KeyEvent e).
*/
protected void keyTyped(char par1, int par2)
{
if (par2 == this.mc.gameSettings.keyBindInventory.keyCode)
{
this.mc.displayGuiScreen((GuiScreen)null);
this.mc.setIngameFocus();
}
else
{
super.keyTyped(par1, par2);
}
}
/**
* Draws the screen and all the components in it.
*/
public void drawScreen(int par1, int par2, float par3)
{
if (Mouse.isButtonDown(0))
{
int k = (this.width - this.achievementsPaneWidth) / 2;
int l = (this.height - this.achievementsPaneHeight) / 2;
int i1 = k + 8;
int j1 = l + 17;
if ((this.isMouseButtonDown == 0 || this.isMouseButtonDown == 1) && par1 >= i1 && par1 < i1 + 224 && par2 >= j1 && par2 < j1 + 155)
{
if (this.isMouseButtonDown == 0)
{
this.isMouseButtonDown = 1;
}
else
{
this.guiMapX -= (double)(par1 - this.mouseX);
this.guiMapY -= (double)(par2 - this.mouseY);
this.field_74124_q = this.field_74117_m = this.guiMapX;
this.field_74123_r = this.field_74115_n = this.guiMapY;
}
this.mouseX = par1;
this.mouseY = par2;
}
if (this.field_74124_q < (double)guiMapTop)
{
this.field_74124_q = (double)guiMapTop;
}
if (this.field_74123_r < (double)guiMapLeft)
{
this.field_74123_r = (double)guiMapLeft;
}
if (this.field_74124_q >= (double)guiMapBottom)
{
this.field_74124_q = (double)(guiMapBottom - 1);
}
if (this.field_74123_r >= (double)guiMapRight)
{
this.field_74123_r = (double)(guiMapRight - 1);
}
}
else
{
this.isMouseButtonDown = 0;
}
this.drawDefaultBackground();
this.genAchievementBackground(par1, par2, par3);
GL11.glDisable(GL11.GL_LIGHTING);
GL11.glDisable(GL11.GL_DEPTH_TEST);
this.drawTitle();
GL11.glEnable(GL11.GL_LIGHTING);
GL11.glEnable(GL11.GL_DEPTH_TEST);
}
/**
* Called from the main game loop to update the screen.
*/
public void updateScreen()
{
this.field_74117_m = this.guiMapX;
this.field_74115_n = this.guiMapY;
double d0 = this.field_74124_q - this.guiMapX;
double d1 = this.field_74123_r - this.guiMapY;
if (d0 * d0 + d1 * d1 < 4.0D)
{
this.guiMapX += d0;
this.guiMapY += d1;
}
else
{
this.guiMapX += d0 * 0.85D;
this.guiMapY += d1 * 0.85D;
}
}
/**
* Draws the "Achievements" title at the top of the GUI.
*/
protected void drawTitle()
{
int i = (this.width - this.achievementsPaneWidth) / 2;
int j = (this.height - this.achievementsPaneHeight) / 2;
this.fontRenderer.drawString("Achievements", i + 15, j + 5, 4210752);
}
protected void genAchievementBackground(int par1, int par2, float par3)
{
int k = MathHelper.floor_double(this.field_74117_m + (this.guiMapX - this.field_74117_m) * (double)par3);
int l = MathHelper.floor_double(this.field_74115_n + (this.guiMapY - this.field_74115_n) * (double)par3);
if (k < guiMapTop)
{
k = guiMapTop;
}
if (l < guiMapLeft)
{
l = guiMapLeft;
}
if (k >= guiMapBottom)
{
k = guiMapBottom - 1;
}
if (l >= guiMapRight)
{
l = guiMapRight - 1;
}
int i1 = (this.width - this.achievementsPaneWidth) / 2;
int j1 = (this.height - this.achievementsPaneHeight) / 2;
int k1 = i1 + 16;
int l1 = j1 + 17;
this.zLevel = 0.0F;
GL11.glDepthFunc(GL11.GL_GEQUAL);
GL11.glPushMatrix();
GL11.glTranslatef(0.0F, 0.0F, -200.0F);
GL11.glEnable(GL11.GL_TEXTURE_2D);
GL11.glDisable(GL11.GL_LIGHTING);
GL11.glEnable(GL12.GL_RESCALE_NORMAL);
GL11.glEnable(GL11.GL_COLOR_MATERIAL);
this.mc.renderEngine.bindTexture("/terrain.png");
int i2 = k + 288 >> 4;
int j2 = l + 288 >> 4;
int k2 = (k + 288) % 16;
int l2 = (l + 288) % 16;
Random random = new Random();
int i3;
int j3;
int k3;
for (i3 = 0; i3 * 16 - l2 < 155; ++i3)
{
float f1 = 0.6F - (float)(j2 + i3) / 25.0F * 0.3F;
GL11.glColor4f(f1, f1, f1, 1.0F);
for (k3 = 0; k3 * 16 - k2 < 224; ++k3)
{
random.setSeed((long)(1234 + i2 + k3));
random.nextInt();
j3 = random.nextInt(1 + j2 + i3) + (j2 + i3) / 2;
Icon icon = Block.sand.getIcon(0, 0);
if (j3 <= 37 && j2 + i3 != 35)
{
if (j3 == 22)
{
if (random.nextInt(2) == 0)
{
icon = Block.oreDiamond.getIcon(0, 0);
}
else
{
icon = Block.oreRedstone.getIcon(0, 0);
}
}
else if (j3 == 10)
{
icon = Block.oreIron.getIcon(0, 0);
}
else if (j3 == 8)
{
icon = Block.oreCoal.getIcon(0, 0);
}
else if (j3 > 4)
{
icon = Block.stone.getIcon(0, 0);
}
else if (j3 > 0)
{
icon = Block.dirt.getIcon(0, 0);
}
}
else
{
icon = Block.bedrock.getIcon(0, 0);
}
this.drawTexturedModelRectFromIcon(k1 + k3 * 16 - k2, l1 + i3 * 16 - l2, icon, 16, 16);
}
}
GL11.glEnable(GL11.GL_DEPTH_TEST);
GL11.glDepthFunc(GL11.GL_LEQUAL);
GL11.glDisable(GL11.GL_TEXTURE_2D);
int l3;
int i4;
int j4;
List<Achievement> achievementList = (currentPage == -1 ? minecraftAchievements : AchievementPage.getAchievementPage(currentPage).getAchievements());
for (i3 = 0; i3 < achievementList.size(); ++i3)
{
Achievement achievement = achievementList.get(i3);
if (achievement.parentAchievement != null && achievementList.contains(achievement.parentAchievement))
{
k3 = achievement.displayColumn * 24 - k + 11 + k1;
j3 = achievement.displayRow * 24 - l + 11 + l1;
j4 = achievement.parentAchievement.displayColumn * 24 - k + 11 + k1;
l3 = achievement.parentAchievement.displayRow * 24 - l + 11 + l1;
boolean flag = this.statFileWriter.hasAchievementUnlocked(achievement);
boolean flag1 = this.statFileWriter.canUnlockAchievement(achievement);
i4 = Math.sin((double)(Minecraft.getSystemTime() % 600L) / 600.0D * Math.PI * 2.0D) > 0.6D ? 255 : 130;
int k4 = -16777216;
if (flag)
{
k4 = -9408400;
}
else if (flag1)
{
k4 = 65280 + (i4 << 24);
}
this.drawHorizontalLine(k3, j4, j3, k4);
this.drawVerticalLine(j4, j3, l3, k4);
}
}
Achievement achievement1 = null;
RenderItem renderitem = new RenderItem();
RenderHelper.enableGUIStandardItemLighting();
GL11.glDisable(GL11.GL_LIGHTING);
GL11.glEnable(GL12.GL_RESCALE_NORMAL);
GL11.glEnable(GL11.GL_COLOR_MATERIAL);
int l4;
int i5;
for (k3 = 0; k3 < achievementList.size(); ++k3)
{
Achievement achievement2 = (Achievement)achievementList.get(k3);
j4 = achievement2.displayColumn * 24 - k;
l3 = achievement2.displayRow * 24 - l;
if (j4 >= -24 && l3 >= -24 && j4 <= 224 && l3 <= 155)
{
float f2;
if (this.statFileWriter.hasAchievementUnlocked(achievement2))
{
f2 = 1.0F;
GL11.glColor4f(f2, f2, f2, 1.0F);
}
else if (this.statFileWriter.canUnlockAchievement(achievement2))
{
f2 = Math.sin((double)(Minecraft.getSystemTime() % 600L) / 600.0D * Math.PI * 2.0D) < 0.6D ? 0.6F : 0.8F;
GL11.glColor4f(f2, f2, f2, 1.0F);
}
else
{
f2 = 0.3F;
GL11.glColor4f(f2, f2, f2, 1.0F);
}
this.mc.renderEngine.bindTexture("/achievement/bg.png");
i5 = k1 + j4;
l4 = l1 + l3;
if (achievement2.getSpecial())
{
this.drawTexturedModalRect(i5 - 2, l4 - 2, 26, 202, 26, 26);
}
else
{
this.drawTexturedModalRect(i5 - 2, l4 - 2, 0, 202, 26, 26);
}
if (!this.statFileWriter.canUnlockAchievement(achievement2))
{
float f3 = 0.1F;
GL11.glColor4f(f3, f3, f3, 1.0F);
renderitem.renderWithColor = false;
}
GL11.glEnable(GL11.GL_LIGHTING);
GL11.glEnable(GL11.GL_CULL_FACE);
renderitem.renderItemAndEffectIntoGUI(this.mc.fontRenderer, this.mc.renderEngine, achievement2.theItemStack, i5 + 3, l4 + 3);
GL11.glDisable(GL11.GL_LIGHTING);
if (!this.statFileWriter.canUnlockAchievement(achievement2))
{
renderitem.renderWithColor = true;
}
GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
if (par1 >= k1 && par2 >= l1 && par1 < k1 + 224 && par2 < l1 + 155 && par1 >= i5 && par1 <= i5 + 22 && par2 >= l4 && par2 <= l4 + 22)
{
achievement1 = achievement2;
}
}
}
GL11.glDisable(GL11.GL_DEPTH_TEST);
GL11.glEnable(GL11.GL_BLEND);
GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
this.mc.renderEngine.bindTexture("/achievement/bg.png");
this.drawTexturedModalRect(i1, j1, 0, 0, this.achievementsPaneWidth, this.achievementsPaneHeight);
GL11.glPopMatrix();
this.zLevel = 0.0F;
GL11.glDepthFunc(GL11.GL_LEQUAL);
GL11.glDisable(GL11.GL_DEPTH_TEST);
GL11.glEnable(GL11.GL_TEXTURE_2D);
super.drawScreen(par1, par2, par3);
if (achievement1 != null)
{
String s = StatCollector.translateToLocal(achievement1.getName());
String s1 = achievement1.getDescription();
j4 = par1 + 12;
l3 = par2 - 4;
if (this.statFileWriter.canUnlockAchievement(achievement1))
{
i5 = Math.max(this.fontRenderer.getStringWidth(s), 120);
l4 = this.fontRenderer.splitStringWidth(s1, i5);
if (this.statFileWriter.hasAchievementUnlocked(achievement1))
{
l4 += 12;
}
this.drawGradientRect(j4 - 3, l3 - 3, j4 + i5 + 3, l3 + l4 + 3 + 12, -1073741824, -1073741824);
this.fontRenderer.drawSplitString(s1, j4, l3 + 12, i5, -6250336);
if (this.statFileWriter.hasAchievementUnlocked(achievement1))
{
this.fontRenderer.drawStringWithShadow(StatCollector.translateToLocal("achievement.taken"), j4, l3 + l4 + 4, -7302913);
}
}
else
{
i5 = Math.max(this.fontRenderer.getStringWidth(s), 120);
String s2 = StatCollector.translateToLocalFormatted("achievement.requires", new Object[] {StatCollector.translateToLocal(achievement1.parentAchievement.getName())});
i4 = this.fontRenderer.splitStringWidth(s2, i5);
this.drawGradientRect(j4 - 3, l3 - 3, j4 + i5 + 3, l3 + i4 + 12 + 3, -1073741824, -1073741824);
this.fontRenderer.drawSplitString(s2, j4, l3 + 12, i5, -9416624);
}
this.fontRenderer.drawStringWithShadow(s, j4, l3, this.statFileWriter.canUnlockAchievement(achievement1) ? (achievement1.getSpecial() ? -128 : -1) : (achievement1.getSpecial() ? -8355776 : -8355712));
}
GL11.glEnable(GL11.GL_DEPTH_TEST);
GL11.glEnable(GL11.GL_LIGHTING);
RenderHelper.disableStandardItemLighting();
}
/**
* Returns true if this GUI should pause the game when it is displayed in single-player
*/
public boolean doesGuiPauseGame()
{
return true;
}
}