    001    package net.minecraft.stats;
    002
    003    import cpw.mods.fml.common.Side;
    004    import cpw.mods.fml.common.asm.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    }