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 }