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