001 package net.minecraft.stats; 002 003 import cpw.mods.fml.relauncher.Side; 004 import cpw.mods.fml.relauncher.SideOnly; 005 import java.util.ArrayList; 006 import java.util.HashMap; 007 import java.util.HashSet; 008 import java.util.Iterator; 009 import java.util.List; 010 import java.util.Map; 011 import net.minecraft.block.Block; 012 import net.minecraft.item.Item; 013 import net.minecraft.item.ItemStack; 014 import net.minecraft.item.crafting.CraftingManager; 015 import net.minecraft.item.crafting.FurnaceRecipes; 016 import net.minecraft.item.crafting.IRecipe; 017 import net.minecraft.util.StatCollector; 018 019 public class StatList 020 { 021 /** Tracks one-off stats. */ 022 protected static Map oneShotStats = new HashMap(); 023 public static List allStats = new ArrayList(); 024 public static List generalStats = new ArrayList(); 025 public static List itemStats = new ArrayList(); 026 027 /** Tracks the number of times a given block or item has been mined. */ 028 public static List objectMineStats = new ArrayList(); 029 030 /** times the game has been started */ 031 public static StatBase startGameStat = (new StatBasic(1000, "stat.startGame")).initIndependentStat().registerStat(); 032 033 /** times a world has been created */ 034 public static StatBase createWorldStat = (new StatBasic(1001, "stat.createWorld")).initIndependentStat().registerStat(); 035 036 /** the number of times you have loaded a world */ 037 public static StatBase loadWorldStat = (new StatBasic(1002, "stat.loadWorld")).initIndependentStat().registerStat(); 038 039 /** number of times you've joined a multiplayer world */ 040 public static StatBase joinMultiplayerStat = (new StatBasic(1003, "stat.joinMultiplayer")).initIndependentStat().registerStat(); 041 042 /** number of times you've left a game */ 043 public static StatBase leaveGameStat = (new StatBasic(1004, "stat.leaveGame")).initIndependentStat().registerStat(); 044 045 /** number of minutes you have played */ 046 public static StatBase minutesPlayedStat = (new StatBasic(1100, "stat.playOneMinute", StatBase.timeStatType)).initIndependentStat().registerStat(); 047 048 /** distance you've walked */ 049 public static StatBase distanceWalkedStat = (new StatBasic(2000, "stat.walkOneCm", StatBase.distanceStatType)).initIndependentStat().registerStat(); 050 051 /** distance you have swam */ 052 public static StatBase distanceSwumStat = (new StatBasic(2001, "stat.swimOneCm", StatBase.distanceStatType)).initIndependentStat().registerStat(); 053 054 /** the distance you have fallen */ 055 public static StatBase distanceFallenStat = (new StatBasic(2002, "stat.fallOneCm", StatBase.distanceStatType)).initIndependentStat().registerStat(); 056 057 /** the distance you've climbed */ 058 public static StatBase distanceClimbedStat = (new StatBasic(2003, "stat.climbOneCm", StatBase.distanceStatType)).initIndependentStat().registerStat(); 059 060 /** the distance you've flown */ 061 public static StatBase distanceFlownStat = (new StatBasic(2004, "stat.flyOneCm", StatBase.distanceStatType)).initIndependentStat().registerStat(); 062 063 /** the distance you've dived */ 064 public static StatBase distanceDoveStat = (new StatBasic(2005, "stat.diveOneCm", StatBase.distanceStatType)).initIndependentStat().registerStat(); 065 066 /** the distance you've traveled by minecart */ 067 public static StatBase distanceByMinecartStat = (new StatBasic(2006, "stat.minecartOneCm", StatBase.distanceStatType)).initIndependentStat().registerStat(); 068 069 /** the distance you've traveled by boat */ 070 public static StatBase distanceByBoatStat = (new StatBasic(2007, "stat.boatOneCm", StatBase.distanceStatType)).initIndependentStat().registerStat(); 071 072 /** the distance you've traveled by pig */ 073 public static StatBase distanceByPigStat = (new StatBasic(2008, "stat.pigOneCm", StatBase.distanceStatType)).initIndependentStat().registerStat(); 074 075 /** the times you've jumped */ 076 public static StatBase jumpStat = (new StatBasic(2010, "stat.jump")).initIndependentStat().registerStat(); 077 078 /** the distance you've dropped (or times you've fallen?) */ 079 public static StatBase dropStat = (new StatBasic(2011, "stat.drop")).initIndependentStat().registerStat(); 080 081 /** the amount of damage you've dealt */ 082 public static StatBase damageDealtStat = (new StatBasic(2020, "stat.damageDealt")).registerStat(); 083 084 /** the amount of damage you have taken */ 085 public static StatBase damageTakenStat = (new StatBasic(2021, "stat.damageTaken")).registerStat(); 086 087 /** the number of times you have died */ 088 public static StatBase deathsStat = (new StatBasic(2022, "stat.deaths")).registerStat(); 089 090 /** the number of mobs you have killed */ 091 public static StatBase mobKillsStat = (new StatBasic(2023, "stat.mobKills")).registerStat(); 092 093 /** counts the number of times you've killed a player */ 094 public static StatBase playerKillsStat = (new StatBasic(2024, "stat.playerKills")).registerStat(); 095 public static StatBase fishCaughtStat = (new StatBasic(2025, "stat.fishCaught")).registerStat(); 096 public static StatBase[] mineBlockStatArray = initMinableStats("stat.mineBlock", 16777216); 097 098 /** Tracks the number of items a given block or item has been crafted. */ 099 public static StatBase[] objectCraftStats; 100 101 /** Tracks the number of times a given block or item has been used. */ 102 public static StatBase[] objectUseStats; 103 104 /** Tracks the number of times a given block or item has been broken. */ 105 public static StatBase[] objectBreakStats; 106 private static boolean blockStatsInitialized; 107 private static boolean itemStatsInitialized; 108 109 /** 110 * This method simply NOPs. It is presumably used to call the static constructors on server start. 111 */ 112 public static void nopInit() {} 113 114 /** 115 * Initializes statistic fields related to breakable items and blocks. 116 */ 117 public static void initBreakableStats() 118 { 119 objectUseStats = initUsableStats(objectUseStats, "stat.useItem", 16908288, 0, 256); 120 objectBreakStats = initBreakStats(objectBreakStats, "stat.breakItem", 16973824, 0, 256); 121 blockStatsInitialized = true; 122 initCraftableStats(); 123 } 124 125 public static void initStats() 126 { 127 objectUseStats = initUsableStats(objectUseStats, "stat.useItem", 16908288, 256, 32000); 128 objectBreakStats = initBreakStats(objectBreakStats, "stat.breakItem", 16973824, 256, 32000); 129 itemStatsInitialized = true; 130 initCraftableStats(); 131 } 132 133 /** 134 * Initializes statistics related to craftable items. Is only called after both block and item stats have been 135 * initialized. 136 */ 137 public static void initCraftableStats() 138 { 139 if (blockStatsInitialized && itemStatsInitialized) 140 { 141 HashSet var0 = new HashSet(); 142 Iterator var1 = CraftingManager.getInstance().getRecipeList().iterator(); 143 144 while (var1.hasNext()) 145 { 146 IRecipe var2 = (IRecipe)var1.next(); 147 148 if (var2.getRecipeOutput() != null) 149 { 150 var0.add(Integer.valueOf(var2.getRecipeOutput().itemID)); 151 } 152 } 153 154 var1 = FurnaceRecipes.smelting().getSmeltingList().values().iterator(); 155 156 while (var1.hasNext()) 157 { 158 ItemStack var4 = (ItemStack)var1.next(); 159 var0.add(Integer.valueOf(var4.itemID)); 160 } 161 162 objectCraftStats = new StatBase[32000]; 163 var1 = var0.iterator(); 164 165 while (var1.hasNext()) 166 { 167 Integer var5 = (Integer)var1.next(); 168 169 if (Item.itemsList[var5.intValue()] != null) 170 { 171 String var3 = StatCollector.translateToLocalFormatted("stat.craftItem", new Object[] {Item.itemsList[var5.intValue()].getStatName()}); 172 objectCraftStats[var5.intValue()] = (new StatCrafting(16842752 + var5.intValue(), var3, var5.intValue())).registerStat(); 173 } 174 } 175 176 replaceAllSimilarBlocks(objectCraftStats); 177 } 178 } 179 180 /** 181 * Initializes statistic fields related to minable items and blocks. 182 */ 183 private static StatBase[] initMinableStats(String par0Str, int par1) 184 { 185 StatBase[] var2 = new StatBase[Block.blocksList.length]; 186 187 for (int var3 = 0; var3 < Block.blocksList.length; ++var3) 188 { 189 if (Block.blocksList[var3] != null && Block.blocksList[var3].getEnableStats()) 190 { 191 String var4 = StatCollector.translateToLocalFormatted(par0Str, new Object[] {Block.blocksList[var3].translateBlockName()}); 192 var2[var3] = (new StatCrafting(par1 + var3, var4, var3)).registerStat(); 193 objectMineStats.add((StatCrafting)var2[var3]); 194 } 195 } 196 197 replaceAllSimilarBlocks(var2); 198 return var2; 199 } 200 201 /** 202 * Initializes statistic fields related to usable items and blocks. 203 */ 204 private static StatBase[] initUsableStats(StatBase[] par0ArrayOfStatBase, String par1Str, int par2, int par3, int par4) 205 { 206 if (par0ArrayOfStatBase == null) 207 { 208 par0ArrayOfStatBase = new StatBase[32000]; 209 } 210 211 for (int var5 = par3; var5 < par4; ++var5) 212 { 213 if (Item.itemsList[var5] != null) 214 { 215 String var6 = StatCollector.translateToLocalFormatted(par1Str, new Object[] {Item.itemsList[var5].getStatName()}); 216 par0ArrayOfStatBase[var5] = (new StatCrafting(par2 + var5, var6, var5)).registerStat(); 217 218 if (var5 >= 256) 219 { 220 itemStats.add((StatCrafting)par0ArrayOfStatBase[var5]); 221 } 222 } 223 } 224 225 replaceAllSimilarBlocks(par0ArrayOfStatBase); 226 return par0ArrayOfStatBase; 227 } 228 229 private static StatBase[] initBreakStats(StatBase[] par0ArrayOfStatBase, String par1Str, int par2, int par3, int par4) 230 { 231 if (par0ArrayOfStatBase == null) 232 { 233 par0ArrayOfStatBase = new StatBase[32000]; 234 } 235 236 for (int var5 = par3; var5 < par4; ++var5) 237 { 238 if (Item.itemsList[var5] != null && Item.itemsList[var5].isDamageable()) 239 { 240 String var6 = StatCollector.translateToLocalFormatted(par1Str, new Object[] {Item.itemsList[var5].getStatName()}); 241 par0ArrayOfStatBase[var5] = (new StatCrafting(par2 + var5, var6, var5)).registerStat(); 242 } 243 } 244 245 replaceAllSimilarBlocks(par0ArrayOfStatBase); 246 return par0ArrayOfStatBase; 247 } 248 249 /** 250 * Forces all dual blocks to count for each other on the stats list 251 */ 252 private static void replaceAllSimilarBlocks(StatBase[] par0ArrayOfStatBase) 253 { 254 replaceSimilarBlocks(par0ArrayOfStatBase, Block.waterStill.blockID, Block.waterMoving.blockID); 255 replaceSimilarBlocks(par0ArrayOfStatBase, Block.lavaStill.blockID, Block.lavaStill.blockID); 256 replaceSimilarBlocks(par0ArrayOfStatBase, Block.pumpkinLantern.blockID, Block.pumpkin.blockID); 257 replaceSimilarBlocks(par0ArrayOfStatBase, Block.stoneOvenActive.blockID, Block.stoneOvenIdle.blockID); 258 replaceSimilarBlocks(par0ArrayOfStatBase, Block.oreRedstoneGlowing.blockID, Block.oreRedstone.blockID); 259 replaceSimilarBlocks(par0ArrayOfStatBase, Block.redstoneRepeaterActive.blockID, Block.redstoneRepeaterIdle.blockID); 260 replaceSimilarBlocks(par0ArrayOfStatBase, Block.torchRedstoneActive.blockID, Block.torchRedstoneIdle.blockID); 261 replaceSimilarBlocks(par0ArrayOfStatBase, Block.mushroomRed.blockID, Block.mushroomBrown.blockID); 262 replaceSimilarBlocks(par0ArrayOfStatBase, Block.stoneDoubleSlab.blockID, Block.stoneSingleSlab.blockID); 263 replaceSimilarBlocks(par0ArrayOfStatBase, Block.woodDoubleSlab.blockID, Block.woodSingleSlab.blockID); 264 replaceSimilarBlocks(par0ArrayOfStatBase, Block.grass.blockID, Block.dirt.blockID); 265 replaceSimilarBlocks(par0ArrayOfStatBase, Block.tilledField.blockID, Block.dirt.blockID); 266 } 267 268 /** 269 * Forces stats for one block to add to another block, such as idle and active furnaces 270 */ 271 private static void replaceSimilarBlocks(StatBase[] par0ArrayOfStatBase, int par1, int par2) 272 { 273 if (par0ArrayOfStatBase[par1] != null && par0ArrayOfStatBase[par2] == null) 274 { 275 par0ArrayOfStatBase[par2] = par0ArrayOfStatBase[par1]; 276 } 277 else 278 { 279 allStats.remove(par0ArrayOfStatBase[par1]); 280 objectMineStats.remove(par0ArrayOfStatBase[par1]); 281 generalStats.remove(par0ArrayOfStatBase[par1]); 282 par0ArrayOfStatBase[par1] = par0ArrayOfStatBase[par2]; 283 } 284 } 285 286 @SideOnly(Side.CLIENT) 287 public static StatBase getOneShotStat(int par0) 288 { 289 return (StatBase)oneShotStats.get(Integer.valueOf(par0)); 290 } 291 292 static 293 { 294 AchievementList.init(); 295 blockStatsInitialized = false; 296 itemStatsInitialized = false; 297 } 298 }