001    package net.minecraft.client.gui.achievement;
002    
003    import cpw.mods.fml.relauncher.Side;
004    import cpw.mods.fml.relauncher.SideOnly;
005    import net.minecraft.client.Minecraft;
006    import net.minecraft.client.gui.Gui;
007    import net.minecraft.client.gui.ScaledResolution;
008    import net.minecraft.client.renderer.RenderHelper;
009    import net.minecraft.client.renderer.entity.RenderItem;
010    import net.minecraft.stats.Achievement;
011    import net.minecraft.util.StatCollector;
012    import org.lwjgl.opengl.GL11;
013    import org.lwjgl.opengl.GL12;
014    
015    @SideOnly(Side.CLIENT)
016    public 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 var1 = new ScaledResolution(this.theGame.gameSettings, this.theGame.displayWidth, this.theGame.displayHeight);
082            this.achievementWindowWidth = var1.getScaledWidth();
083            this.achievementWindowHeight = var1.getScaledHeight();
084            GL11.glClear(256);
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 var1 = (double)(Minecraft.getSystemTime() - this.achievementTime) / 3000.0D;
101    
102                if (!this.haveAchiement && (var1 < 0.0D || var1 > 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 var3 = var1 * 2.0D;
112    
113                    if (var3 > 1.0D)
114                    {
115                        var3 = 2.0D - var3;
116                    }
117    
118                    var3 *= 4.0D;
119                    var3 = 1.0D - var3;
120    
121                    if (var3 < 0.0D)
122                    {
123                        var3 = 0.0D;
124                    }
125    
126                    var3 *= var3;
127                    var3 *= var3;
128                    int var5 = this.achievementWindowWidth - 160;
129                    int var6 = 0 - (int)(var3 * 36.0D);
130                    int var7 = this.theGame.renderEngine.getTexture("/achievement/bg.png");
131                    GL11.glColor4f(1.0F, 1.0F, 1.0F, 1.0F);
132                    GL11.glEnable(GL11.GL_TEXTURE_2D);
133                    GL11.glBindTexture(GL11.GL_TEXTURE_2D, var7);
134                    GL11.glDisable(GL11.GL_LIGHTING);
135                    this.drawTexturedModalRect(var5, var6, 96, 202, 160, 32);
136    
137                    if (this.haveAchiement)
138                    {
139                        this.theGame.fontRenderer.drawSplitString(this.achievementStatName, var5 + 30, var6 + 7, 120, -1);
140                    }
141                    else
142                    {
143                        this.theGame.fontRenderer.drawString(this.achievementGetLocalText, var5 + 30, var6 + 7, -256);
144                        this.theGame.fontRenderer.drawString(this.achievementStatName, var5 + 30, var6 + 18, -1);
145                    }
146    
147                    RenderHelper.enableGUIStandardItemLighting();
148                    GL11.glDisable(GL11.GL_LIGHTING);
149                    GL11.glEnable(GL12.GL_RESCALE_NORMAL);
150                    GL11.glEnable(GL11.GL_COLOR_MATERIAL);
151                    GL11.glEnable(GL11.GL_LIGHTING);
152                    this.itemRender.renderItemAndEffectIntoGUI(this.theGame.fontRenderer, this.theGame.renderEngine, this.theAchievement.theItemStack, var5 + 8, var6 + 8);
153                    GL11.glDisable(GL11.GL_LIGHTING);
154                    GL11.glDepthMask(true);
155                    GL11.glEnable(GL11.GL_DEPTH_TEST);
156                }
157            }
158        }
159    }