    001package net.minecraft.client.gui.achievement;
    002
    003import cpw.mods.fml.relauncher.Side;
    004import cpw.mods.fml.relauncher.SideOnly;
    005import net.minecraft.client.Minecraft;
    006import net.minecraft.client.gui.Gui;
    007import net.minecraft.client.gui.ScaledResolution;
    008import net.minecraft.client.renderer.RenderHelper;
    009import net.minecraft.client.renderer.entity.RenderItem;
    010import net.minecraft.stats.Achievement;
    011import net.minecraft.util.StatCollector;
    012import org.lwjgl.opengl.GL11;
    013import org.lwjgl.opengl.GL12;
    014
    015@SideOnly(Side.CLIENT)
    016public class GuiAchievement extends Gui
    017{
    018    /** Holds the instance of the game (Minecraft) */
    019    private Minecraft theGame;
    020
    021    /** Holds the latest width scaled to fit the game window. */
    022    private int achievementWindowWidth;
    023
    024    /** Holds the latest height scaled to fit the game window. */
    025    private int achievementWindowHeight;
    026    private String achievementGetLocalText;
    027    private String achievementStatName;
    028
    029    /** Holds the achievement that will be displayed on the GUI. */
    030    private Achievement theAchievement;
    031    private long achievementTime;
    032
    033    /**
    034     * Holds a instance of RenderItem, used to draw the achievement icons on screen (is based on ItemStack)
    035     */
    036    private RenderItem itemRender;
    037    private boolean haveAchiement;
    038
    039    public GuiAchievement(Minecraft par1Minecraft)
    040    {
    041        this.theGame = par1Minecraft;
    042        this.itemRender = new RenderItem();
    043    }
    044
    045    /**
    046     * Queue a taken achievement to be displayed.
    047     */
    048    public void queueTakenAchievement(Achievement par1Achievement)
    049    {
    050        this.achievementGetLocalText = StatCollector.translateToLocal("achievement.get");
    051        this.achievementStatName = StatCollector.translateToLocal(par1Achievement.getName());
    052        this.achievementTime = Minecraft.getSystemTime();
    053        this.theAchievement = par1Achievement;
    054        this.haveAchiement = false;
    055    }
    056
    057    /**
    058     * Queue a information about a achievement to be displayed.
    059     */
    060    public void queueAchievementInformation(Achievement par1Achievement)
    061    {
    062        this.achievementGetLocalText = StatCollector.translateToLocal(par1Achievement.getName());
    063        this.achievementStatName = par1Achievement.getDescription();
    064        this.achievementTime = Minecraft.getSystemTime() - 2500L;
    065        this.theAchievement = par1Achievement;
    066        this.haveAchiement = true;
    067    }
    068
    069    /**
    070     * Update the display of the achievement window to match the game window.
    071     */
    072    private void updateAchievementWindowScale()
    073    {
    074        GL11.glViewport(0, 0, this.theGame.displayWidth, this.theGame.displayHeight);
    075        GL11.glMatrixMode(GL11.GL_PROJECTION);
    076        GL11.glLoadIdentity();
    077        GL11.glMatrixMode(GL11.GL_MODELVIEW);
    078        GL11.glLoadIdentity();
    079        this.achievementWindowWidth = this.theGame.displayWidth;
    080        this.achievementWindowHeight = this.theGame.displayHeight;
    081        ScaledResolution scaledresolution = new ScaledResolution(this.theGame.gameSettings, this.theGame.displayWidth, this.theGame.displayHeight);
    082        this.achievementWindowWidth = scaledresolution.getScaledWidth();
    083        this.achievementWindowHeight = scaledresolution.getScaledHeight();
    084        GL11.glClear(GL11.GL_DEPTH_BUFFER_BIT);
    085        GL11.glMatrixMode(GL11.GL_PROJECTION);
    086        GL11.glLoadIdentity();
    087        GL11.glOrtho(0.0D, (double)this.achievementWindowWidth, (double)this.achievementWindowHeight, 0.0D, 1000.0D, 3000.0D);
    088        GL11.glMatrixMode(GL11.GL_MODELVIEW);
    089        GL11.glLoadIdentity();
    090        GL11.glTranslatef(0.0F, 0.0F, -2000.0F);
    091    }
    092
    093    /**
    094     * Updates the small achievement tooltip window, showing a queued achievement if is needed.
    095     */
    096    public void updateAchievementWindow()
    097    {
    098        if (this.theAchievement != null && this.achievementTime != 0L)
    099        {
    100            double d0 = (double)(Minecraft.getSystemTime() - this.achievementTime) / 3000.0D;
    101
    102            if (!this.haveAchiement && (d0 < 0.0D || d0 > 1.0D))
    103            {
    104                this.achievementTime = 0L;
    105            }
    106            else
    107            {
    108                this.updateAchievementWindowScale();
    109                GL11.glDisable(GL11.GL_DEPTH_TEST);
    110                GL11.glDepthMask(false);
    111                double d1 = d0 * 2.0D;
    112
    113                if (d1 > 1.0D)
    114                {
    115                    d1 = 2.0D - d1;
    116                }
    117
    118                d1 *= 4.0D;
    119                d1 = 1.0D - d1;
    120
    121                if (d1 < 0.0D)
    122                {
    123                    d1 = 0.0D;
    124                }
    125
    126                d1 *= d1;
    127                d1 *= d1;
    128                int i = this.achievementWindowWidth - 160;
    129                int j = 0 - (int)(d1 * 36.0D);
    130                GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
    131                GL11.glEnable(GL11.GL_TEXTURE_2D);
    132                this.theGame.renderEngine.bindTexture("/achievement/bg.png");
    133                GL11.glDisable(GL11.GL_LIGHTING);
    134                this.drawTexturedModalRect(i, j, 96, 202, 160, 32);
    135
    136                if (this.haveAchiement)
    137                {
    138                    this.theGame.fontRenderer.drawSplitString(this.achievementStatName, i + 30, j + 7, 120, -1);
    139                }
    140                else
    141                {
    142                    this.theGame.fontRenderer.drawString(this.achievementGetLocalText, i + 30, j + 7, -256);
    143                    this.theGame.fontRenderer.drawString(this.achievementStatName, i + 30, j + 18, -1);
    144                }
    145
    146                RenderHelper.enableGUIStandardItemLighting();
    147                GL11.glDisable(GL11.GL_LIGHTING);
    148                GL11.glEnable(GL12.GL_RESCALE_NORMAL);
    149                GL11.glEnable(GL11.GL_COLOR_MATERIAL);
    150                GL11.glEnable(GL11.GL_LIGHTING);
    151                this.itemRender.renderItemAndEffectIntoGUI(this.theGame.fontRenderer, this.theGame.renderEngine, this.theAchievement.theItemStack, i + 8, j + 8);
    152                GL11.glDisable(GL11.GL_LIGHTING);
    153                GL11.glDepthMask(true);
    154                GL11.glEnable(GL11.GL_DEPTH_TEST);
    155            }
    156        }
    157    }
    158}