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 }