001    package net.minecraft.stats;
002    
003    import cpw.mods.fml.relauncher.Side;
004    import cpw.mods.fml.relauncher.SideOnly;
005    import net.minecraft.block.Block;
006    import net.minecraft.item.Item;
007    import net.minecraft.item.ItemStack;
008    import net.minecraft.util.StatCollector;
009    
010    public class Achievement extends StatBase
011    {
012        /**
013         * Is the column (related to center of achievement gui, in 24 pixels unit) that the achievement will be displayed.
014         */
015        public final int displayColumn;
016    
017        /**
018         * Is the row (related to center of achievement gui, in 24 pixels unit) that the achievement will be displayed.
019         */
020        public final int displayRow;
021    
022        /**
023         * Holds the parent achievement, that must be taken before this achievement is avaiable.
024         */
025        public final Achievement parentAchievement;
026    
027        /**
028         * Holds the description of the achievement, ready to be formatted and/or displayed.
029         */
030        private final String achievementDescription;
031        @SideOnly(Side.CLIENT)
032    
033        /**
034         * Holds a string formatter for the achievement, some of then needs extra dynamic info - like the key used to open
035         * the inventory.
036         */
037        private IStatStringFormat statStringFormatter;
038    
039        /**
040         * Holds the ItemStack that will be used to draw the achievement into the GUI.
041         */
042        public final ItemStack theItemStack;
043    
044        /**
045         * Special achievements have a 'spiked' (on normal texture pack) frame, special achievements are the hardest ones to
046         * achieve.
047         */
048        private boolean isSpecial;
049    
050        public Achievement(int par1, String par2Str, int par3, int par4, Item par5Item, Achievement par6Achievement)
051        {
052            this(par1, par2Str, par3, par4, new ItemStack(par5Item), par6Achievement);
053        }
054    
055        public Achievement(int par1, String par2Str, int par3, int par4, Block par5Block, Achievement par6Achievement)
056        {
057            this(par1, par2Str, par3, par4, new ItemStack(par5Block), par6Achievement);
058        }
059    
060        public Achievement(int par1, String par2Str, int par3, int par4, ItemStack par5ItemStack, Achievement par6Achievement)
061        {
062            super(5242880 + par1, "achievement." + par2Str);
063            this.theItemStack = par5ItemStack;
064            this.achievementDescription = "achievement." + par2Str + ".desc";
065            this.displayColumn = par3;
066            this.displayRow = par4;
067    
068            if (par3 < AchievementList.minDisplayColumn)
069            {
070                AchievementList.minDisplayColumn = par3;
071            }
072    
073            if (par4 < AchievementList.minDisplayRow)
074            {
075                AchievementList.minDisplayRow = par4;
076            }
077    
078            if (par3 > AchievementList.maxDisplayColumn)
079            {
080                AchievementList.maxDisplayColumn = par3;
081            }
082    
083            if (par4 > AchievementList.maxDisplayRow)
084            {
085                AchievementList.maxDisplayRow = par4;
086            }
087    
088            this.parentAchievement = par6Achievement;
089        }
090    
091        /**
092         * Indicates whether or not the given achievement or statistic is independent (i.e., lacks prerequisites for being
093         * update).
094         */
095        public Achievement setIndependent()
096        {
097            this.isIndependent = true;
098            return this;
099        }
100    
101        /**
102         * Special achievements have a 'spiked' (on normal texture pack) frame, special achievements are the hardest ones to
103         * achieve.
104         */
105        public Achievement setSpecial()
106        {
107            this.isSpecial = true;
108            return this;
109        }
110    
111        /**
112         * Adds the achievement on the internal list of registered achievements, also, it's check for duplicated id's.
113         */
114        public Achievement registerAchievement()
115        {
116            super.registerStat();
117            AchievementList.achievementList.add(this);
118            return this;
119        }
120    
121        @SideOnly(Side.CLIENT)
122    
123        /**
124         * Returns whether or not the StatBase-derived class is a statistic (running counter) or an achievement (one-shot).
125         */
126        public boolean isAchievement()
127        {
128            return true;
129        }
130    
131        @SideOnly(Side.CLIENT)
132    
133        /**
134         * Returns the fully description of the achievement - ready to be displayed on screen.
135         */
136        public String getDescription()
137        {
138            return this.statStringFormatter != null ? this.statStringFormatter.formatString(StatCollector.translateToLocal(this.achievementDescription)) : StatCollector.translateToLocal(this.achievementDescription);
139        }
140    
141        @SideOnly(Side.CLIENT)
142    
143        /**
144         * Defines a string formatter for the achievement.
145         */
146        public Achievement setStatStringFormatter(IStatStringFormat par1IStatStringFormat)
147        {
148            this.statStringFormatter = par1IStatStringFormat;
149            return this;
150        }
151    
152        @SideOnly(Side.CLIENT)
153    
154        /**
155         * Special achievements have a 'spiked' (on normal texture pack) frame, special achievements are the hardest ones to
156         * achieve.
157         */
158        public boolean getSpecial()
159        {
160            return this.isSpecial;
161        }
162    
163        /**
164         * Register the stat into StatList.
165         */
166        public StatBase registerStat()
167        {
168            return this.registerAchievement();
169        }
170    
171        /**
172         * Initializes the current stat as independent (i.e., lacking prerequisites for being updated) and returns the
173         * current instance.
174         */
175        public StatBase initIndependentStat()
176        {
177            return this.setIndependent();
178        }
179    }