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 }