the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
at main 557 lines 23 kB view raw
1#include "stdafx.h" 2#include "net.minecraft.locale.h" 3#include "net.minecraft.world.level.tile.h" 4#include "net.minecraft.world.item.h" 5#include "net.minecraft.world.entity.item.h" 6#include "net.minecraft.world.item.crafting.h" 7#include "Achievements.h" 8#include "ItemStat.h" 9#include "GeneralStat.h" 10#include "Stats.h" 11#include "..\Minecraft.Client\StatsCounter.h" 12 13const int Stats::BLOCKS_MINED_OFFSET = 0x1000000; 14const int Stats::ITEMS_COLLECTED_OFFSET = 0x1010000; 15const int Stats::ITEMS_CRAFTED_OFFSET = 0x1020000; 16const int Stats::ADDITIONAL_STATS_OFFSET = 0x5010000; // Needs to be higher than Achievements::ACHIEVEMENT_OFFSET = 0x500000; 17 18unordered_map<int, Stat*>* Stats::statsById = new unordered_map<int, Stat*>; 19 20vector<Stat *> *Stats::all = new vector<Stat *>; 21vector<Stat *> *Stats::generalStats = new vector<Stat *>; 22vector<ItemStat *> *Stats::blocksMinedStats = new vector<ItemStat *>; 23vector<ItemStat *> *Stats::itemsCollectedStats = new vector<ItemStat *>; 24vector<ItemStat *> *Stats::itemsCraftedStats = new vector<ItemStat *>; 25 26#if (defined _EXTENDED_ACHIEVEMENTS) && (!defined _DURANGO) 27vector<ItemStat *> *Stats::blocksPlacedStats = new vector<ItemStat *>; 28#endif 29 30Stat *Stats::walkOneM = NULL; 31Stat *Stats::swimOneM = NULL; 32Stat *Stats::fallOneM = NULL; 33Stat *Stats::climbOneM = NULL; 34Stat *Stats::minecartOneM = NULL; 35Stat *Stats::boatOneM = NULL; 36Stat *Stats::pigOneM = NULL; 37Stat *Stats::portalsCreated = NULL; 38Stat *Stats::cowsMilked = NULL; 39Stat *Stats::netherLavaCollected = NULL; 40Stat *Stats::killsZombie = NULL; 41Stat *Stats::killsSkeleton = NULL; 42Stat *Stats::killsCreeper = NULL; 43Stat *Stats::killsSpider = NULL; 44Stat *Stats::killsSpiderJockey = NULL; 45Stat *Stats::killsZombiePigman = NULL; 46Stat *Stats::killsSlime = NULL; 47Stat *Stats::killsGhast = NULL; 48Stat *Stats::killsNetherZombiePigman = NULL; 49 50// 4J : WESTY : Added for new achievements. 51Stat *Stats::befriendsWolf = NULL; 52Stat *Stats::totalBlocksMined = NULL; 53Stat *Stats::timePlayed = NULL; 54 55StatArray Stats::blocksMined; 56StatArray Stats::itemsCollected; 57StatArray Stats::itemsCrafted; 58 59#if (defined _EXTENDED_ACHIEVEMENTS) && (!defined _DURANGO) 60StatArray Stats::blocksPlaced; 61StatArray Stats::rainbowCollection; 62StatArray Stats::biomesVisisted; 63#endif 64 65Stat *Stats::killsEnderdragon = NULL; // The number of times this player has dealt the killing blow to the Enderdragon 66Stat *Stats::completeTheEnd = NULL; // The number of times this player has been present when the Enderdragon has died 67 68void Stats::staticCtor() 69{ 70 Stats::walkOneM = (new GeneralStat(2000, L"stat.walkOneM", (StatFormatter *) Stat::distanceFormatter))->setAwardLocallyOnly()->postConstruct(); 71 Stats::swimOneM = (new GeneralStat(2001, L"stat.swimOneM", (StatFormatter *) Stat::distanceFormatter))->setAwardLocallyOnly()->postConstruct(); 72 Stats::fallOneM = (new GeneralStat(2002, L"stat.fallOneM", (StatFormatter *) Stat::distanceFormatter))->setAwardLocallyOnly()->postConstruct(); 73 Stats::climbOneM = (new GeneralStat(2003, L"stat.climbOneM", (StatFormatter *) Stat::distanceFormatter))->setAwardLocallyOnly()->postConstruct(); 74 Stats::minecartOneM = (new GeneralStat(2004, L"stat.minecartOneM", (StatFormatter *) Stat::distanceFormatter))->setAwardLocallyOnly()->postConstruct(); 75 Stats::boatOneM = (new GeneralStat(2005, L"stat.boatOneM", (StatFormatter *) Stat::distanceFormatter))->setAwardLocallyOnly()->postConstruct(); 76 Stats::pigOneM = (new GeneralStat(2006, L"stat.pigOneM", (StatFormatter *) Stat::distanceFormatter))->setAwardLocallyOnly()->postConstruct(); 77 Stats::portalsCreated = (new GeneralStat(2007, L"stat.portalsUsed"))->postConstruct(); 78 Stats::cowsMilked = (new GeneralStat(2008, L"stat.cowsMilked"))->postConstruct(); 79 Stats::netherLavaCollected = (new GeneralStat(2009, L"stat.netherLavaCollected"))->postConstruct(); 80 Stats::killsZombie = (new GeneralStat(2010, L"stat.killsZombie"))->postConstruct(); 81 Stats::killsSkeleton = (new GeneralStat(2011, L"stat.killsSkeleton"))->postConstruct(); 82 Stats::killsCreeper = (new GeneralStat(2012, L"stat.killsCreeper"))->postConstruct(); 83 Stats::killsSpider = (new GeneralStat(2013, L"stat.killsSpider"))->postConstruct(); 84 Stats::killsSpiderJockey = (new GeneralStat(2014, L"stat.killsSpiderJockey"))->postConstruct(); 85 Stats::killsZombiePigman = (new GeneralStat(2015, L"stat.killsZombiePigman"))->postConstruct(); 86 Stats::killsSlime = (new GeneralStat(2016, L"stat.killsSlime"))->postConstruct(); 87 Stats::killsGhast = (new GeneralStat(2017, L"stat.killsGhast"))->postConstruct(); 88 Stats::killsNetherZombiePigman = (new GeneralStat(2018, L"stat.killsNetherZombiePigman"))->postConstruct(); 89 90 // 4J : WESTY : Added for new achievements. 91 Stats::befriendsWolf = (new GeneralStat(2019, L"stat.befriendsWolf"))->postConstruct(); 92 Stats::totalBlocksMined = (new GeneralStat(2020, L"stat.totalBlocksMined"))->postConstruct(); 93 94 // 4J-PB - don't want the time played going to the server 95 Stats::timePlayed = (new GeneralStat(2021, L"stat.timePlayed"))->setAwardLocallyOnly()->postConstruct(); 96 97// WARNING: NO NEW STATS CAN BE ADDED HERE 98// These stats are directly followed by the achievemnts in the profile data, so cannot be changed without migrating the profile data 99 100 buildBlockStats(); 101 102 Achievements::init(); 103 Achievements::staticCtor(); 104 105 // 4J Stu - Added this function to allow us to add news stats from TU9 onwards 106 buildAdditionalStats(); 107} 108 109void Stats::init() 110{ 111} 112 113bool Stats::blockStatsLoaded = false; 114 115// WARNING: NO NEW STATS CAN BE ADDED HERE 116// These stats are directly followed by the achievemnts in the profile data, so cannot be changed without migrating the profile data 117void Stats::buildBlockStats() 118{ 119 blocksMined = StatArray(32000); 120 121 ItemStat* newStat = new ItemStat(BLOCKS_MINED_OFFSET + 0, L"mineBlock.dirt", Tile::dirt->id); 122 blocksMinedStats->push_back(newStat); 123 blocksMined[Tile::dirt->id] = newStat; 124 blocksMined[Tile::grass->id] = newStat; 125 blocksMined[Tile::farmland->id] = newStat; 126 newStat->postConstruct(); 127 128 newStat = new ItemStat(BLOCKS_MINED_OFFSET + 1, L"mineBlock.stone", Tile::cobblestone->id); 129 blocksMinedStats->push_back(newStat); 130 blocksMined[Tile::cobblestone->id] = newStat; 131 newStat->postConstruct(); 132 133 newStat = new ItemStat(BLOCKS_MINED_OFFSET + 2, L"mineBlock.sand", Tile::sand->id); 134 blocksMinedStats->push_back(newStat); 135 blocksMined[Tile::sand->id] = newStat; 136 newStat->postConstruct(); 137 138 newStat = new ItemStat(BLOCKS_MINED_OFFSET + 3, L"mineBlock.cobblestone", Tile::stone->id); 139 blocksMinedStats->push_back(newStat); 140 blocksMined[Tile::stone->id] = newStat; 141 newStat->postConstruct(); 142 143 newStat = new ItemStat(BLOCKS_MINED_OFFSET + 4, L"mineBlock.gravel", Tile::gravel->id); 144 blocksMinedStats->push_back(newStat); 145 blocksMined[Tile::gravel->id] = newStat; 146 newStat->postConstruct(); 147 148 newStat = new ItemStat(BLOCKS_MINED_OFFSET + 5, L"mineBlock.clay", Tile::clay->id); 149 blocksMinedStats->push_back(newStat); 150 blocksMined[Tile::clay->id] = newStat; 151 newStat->postConstruct(); 152 153 newStat = new ItemStat(BLOCKS_MINED_OFFSET + 6, L"mineBlock.obsidian", Tile::obsidian->id); 154 blocksMinedStats->push_back(newStat); 155 blocksMined[Tile::obsidian->id] = newStat; 156 newStat->postConstruct(); 157 158 newStat = new ItemStat(BLOCKS_MINED_OFFSET + 7, L"mineBlock.coal", Tile::coalOre->id); 159 blocksMinedStats->push_back(newStat); 160 blocksMined[Tile::coalOre->id] = newStat; 161 newStat->postConstruct(); 162 163 newStat = new ItemStat(BLOCKS_MINED_OFFSET + 8, L"mineBlock.iron", Tile::ironOre->id); 164 blocksMinedStats->push_back(newStat); 165 blocksMined[Tile::ironOre->id] = newStat; 166 newStat->postConstruct(); 167 168 newStat = new ItemStat(BLOCKS_MINED_OFFSET + 9, L"mineBlock.gold", Tile::goldOre->id); 169 blocksMinedStats->push_back(newStat); 170 blocksMined[Tile::goldOre->id] = newStat; 171 newStat->postConstruct(); 172 173 newStat = new ItemStat(BLOCKS_MINED_OFFSET + 10, L"mineBlock.diamond", Tile::diamondOre->id); 174 blocksMinedStats->push_back(newStat); 175 blocksMined[Tile::diamondOre->id] = newStat; 176 newStat->postConstruct(); 177 178 newStat = new ItemStat(BLOCKS_MINED_OFFSET + 11, L"mineBlock.redstone", Tile::redStoneOre->id); 179 blocksMinedStats->push_back(newStat); 180 blocksMined[Tile::redStoneOre->id] = newStat; 181 blocksMined[Tile::redStoneOre_lit->id] = newStat; 182 newStat->postConstruct(); 183 184 newStat = new ItemStat(BLOCKS_MINED_OFFSET + 12, L"mineBlock.lapisLazuli", Tile::lapisOre->id); 185 blocksMinedStats->push_back(newStat); 186 blocksMined[Tile::lapisOre->id] = newStat; 187 newStat->postConstruct(); 188 189 newStat = new ItemStat(BLOCKS_MINED_OFFSET + 13, L"mineBlock.netherrack", Tile::netherRack->id); 190 blocksMinedStats->push_back(newStat); 191 blocksMined[Tile::netherRack->id] = newStat; 192 newStat->postConstruct(); 193 194 newStat = new ItemStat(BLOCKS_MINED_OFFSET + 14, L"mineBlock.soulSand", Tile::soulsand->id); 195 blocksMinedStats->push_back(newStat); 196 blocksMined[Tile::soulsand->id] = newStat; 197 newStat->postConstruct(); 198 199 newStat = new ItemStat(BLOCKS_MINED_OFFSET + 15, L"mineBlock.glowstone", Tile::glowstone->id); 200 blocksMinedStats->push_back(newStat); 201 blocksMined[Tile::glowstone->id] = newStat; 202 newStat->postConstruct(); 203 204 newStat = new ItemStat(BLOCKS_MINED_OFFSET + 16, L"mineBlock.wood", Tile::treeTrunk->id); 205 blocksMinedStats->push_back(newStat); 206 blocksMined[Tile::treeTrunk->id] = newStat; 207 newStat->postConstruct(); 208 209// WARNING: NO NEW STATS CAN BE ADDED HERE 210// These stats are directly followed by the achievemnts in the profile data, so cannot be changed without migrating the profile data 211 212 213 blockStatsLoaded = true; 214 buildCraftableStats(); 215} 216 217bool Stats::itemStatsLoaded = false; 218 219void Stats::buildItemStats() 220{ 221 itemStatsLoaded = true; 222 buildCraftableStats(); 223} 224 225bool Stats::craftableStatsLoaded = false; 226 227 228// WARNING: NO NEW STATS CAN BE ADDED HERE 229// These stats are directly followed by the achievemnts in the profile data, so cannot be changed without migrating the profile data 230void Stats::buildCraftableStats() 231{ 232 if (!blockStatsLoaded || !itemStatsLoaded || craftableStatsLoaded) 233 { 234 // still waiting for the JVM to load stuff 235 //Or stats already loaded 236 return; 237 } 238 239 craftableStatsLoaded = true; 240 241 //Collected stats 242 243 itemsCollected = StatArray(32000); 244 245 ItemStat* newStat = new ItemStat(ITEMS_COLLECTED_OFFSET + 0, L"collectItem.egg", Item::egg->id); 246 itemsCollectedStats->push_back(newStat); 247 itemsCollected[Item::egg->id] = newStat; 248 newStat->postConstruct(); 249 250 // 4J Stu - The following stats were added as it was too easy to cheat the leaderboards by dropping and picking up these items 251 // They are now changed to mining the block which involves a tiny bit more effort 252 newStat = new ItemStat(BLOCKS_MINED_OFFSET + 18, L"mineBlock.wheat", Tile::wheat_Id); 253 blocksMinedStats->push_back(newStat); 254 blocksMined[Tile::wheat_Id] = newStat; 255 newStat->postConstruct(); 256 257 newStat = new ItemStat(BLOCKS_MINED_OFFSET + 19, L"mineBlock.mushroom1", Tile::mushroom_brown_Id); 258 blocksMinedStats->push_back(newStat); 259 blocksMined[Tile::mushroom_brown_Id] = newStat; 260 newStat->postConstruct(); 261 262 newStat = new ItemStat(BLOCKS_MINED_OFFSET + 17, L"mineBlock.sugar", Tile::reeds_Id); 263 blocksMinedStats->push_back(newStat); 264 blocksMined[Tile::reeds_Id] = newStat; 265 newStat->postConstruct(); 266#if 0 267 newStat = new ItemStat(ITEMS_COLLECTED_OFFSET + 1, L"collectItem.wheat", Item::wheat->id); 268 itemsCollectedStats->push_back(newStat); 269 itemsCollected[Item::wheat->id] = newStat; 270 newStat->postConstruct(); 271 272 newStat = new ItemStat(ITEMS_COLLECTED_OFFSET + 2, L"collectItem.mushroom", Tile::mushroom1->id); 273 itemsCollectedStats->push_back(newStat); 274 itemsCollected[Tile::mushroom1->id] = newStat; 275 itemsCollected[Tile::mushroom2->id] = newStat; 276 newStat->postConstruct(); 277 278 newStat = new ItemStat(ITEMS_COLLECTED_OFFSET + 3, L"collectItem.sugarCane", Item::reeds->id); 279 itemsCollectedStats->push_back(newStat); 280 itemsCollected[Item::reeds->id] = newStat; 281 newStat->postConstruct(); 282#endif 283 284 newStat = new ItemStat(ITEMS_COLLECTED_OFFSET + 4, L"collectItem.pumpkin", Tile::pumpkin->id); 285 itemsCollectedStats->push_back(newStat); 286 itemsCollected[Tile::pumpkin->id] = newStat; 287 itemsCollected[Tile::litPumpkin->id] = newStat; 288 newStat->postConstruct(); 289 290 //Crafted stats 291 292 itemsCrafted = StatArray(32000); 293 294 newStat = new ItemStat(ITEMS_CRAFTED_OFFSET + 0, L"craftItem.plank", Tile::wood->id); 295 itemsCraftedStats->push_back(newStat); 296 itemsCrafted[Tile::wood->id] = newStat; 297 newStat->postConstruct(); 298 299 newStat = new ItemStat(ITEMS_CRAFTED_OFFSET + 1, L"craftItem.workbench", Tile::workBench->id); 300 itemsCraftedStats->push_back(newStat); 301 itemsCrafted[Tile::workBench->id] = newStat; 302 newStat->postConstruct(); 303 304 newStat = new ItemStat(ITEMS_CRAFTED_OFFSET + 2, L"craftItem.stick", Item::stick->id); 305 itemsCraftedStats->push_back(newStat); 306 itemsCrafted[Item::stick->id] = newStat; 307 newStat->postConstruct(); 308 309 newStat = new ItemStat(ITEMS_CRAFTED_OFFSET + 3, L"craftItem.woodenShovel", Item::shovel_wood->id); 310 itemsCraftedStats->push_back(newStat); 311 itemsCrafted[Item::shovel_wood->id] = newStat; 312 newStat->postConstruct(); 313 314 // 4J : WESTY : Added for new achievements. 315 newStat = new ItemStat(ITEMS_CRAFTED_OFFSET + 4, L"craftItem.woodenPickAxe", Item::pickAxe_wood->id); 316 itemsCraftedStats->push_back(newStat); 317 itemsCrafted[Item::pickAxe_wood->id] = newStat; 318 newStat->postConstruct(); 319 320 newStat = new ItemStat(ITEMS_CRAFTED_OFFSET + 5, L"craftItem.stonePickAxe", Item::pickAxe_stone->id); 321 itemsCraftedStats->push_back(newStat); 322 itemsCrafted[Item::pickAxe_stone->id] = newStat; 323 newStat->postConstruct(); 324 325 newStat = new ItemStat(ITEMS_CRAFTED_OFFSET + 6, L"craftItem.ironPickAxe", Item::pickAxe_iron->id); 326 itemsCraftedStats->push_back(newStat); 327 itemsCrafted[Item::pickAxe_iron->id] = newStat; 328 newStat->postConstruct(); 329 330 newStat = new ItemStat(ITEMS_CRAFTED_OFFSET + 7, L"craftItem.diamondPickAxe", Item::pickAxe_diamond->id); 331 itemsCraftedStats->push_back(newStat); 332 itemsCrafted[Item::pickAxe_diamond->id] = newStat; 333 newStat->postConstruct(); 334 335 newStat = new ItemStat(ITEMS_CRAFTED_OFFSET + 8, L"craftItem.goldPickAxe", Item::pickAxe_gold->id); 336 itemsCraftedStats->push_back(newStat); 337 itemsCrafted[Item::pickAxe_gold->id] = newStat; 338 newStat->postConstruct(); 339 340 newStat = new ItemStat(ITEMS_CRAFTED_OFFSET + 9, L"craftItem.stoneShovel", Item::shovel_stone->id); 341 itemsCraftedStats->push_back(newStat); 342 itemsCrafted[Item::shovel_stone->id] = newStat; 343 newStat->postConstruct(); 344 345 newStat = new ItemStat(ITEMS_CRAFTED_OFFSET + 10, L"craftItem.ironShovel", Item::shovel_iron->id); 346 itemsCraftedStats->push_back(newStat); 347 itemsCrafted[Item::shovel_iron->id] = newStat; 348 newStat->postConstruct(); 349 350 newStat = new ItemStat(ITEMS_CRAFTED_OFFSET + 11, L"craftItem.diamondShovel", Item::shovel_diamond->id); 351 itemsCraftedStats->push_back(newStat); 352 itemsCrafted[Item::shovel_diamond->id] = newStat; 353 newStat->postConstruct(); 354 355 newStat = new ItemStat(ITEMS_CRAFTED_OFFSET + 12, L"craftItem.goldShovel", Item::shovel_gold->id); 356 itemsCraftedStats->push_back(newStat); 357 itemsCrafted[Item::shovel_gold->id] = newStat; 358 newStat->postConstruct(); 359 360 newStat = new ItemStat(ITEMS_CRAFTED_OFFSET + 13, L"craftItem.woodenAxe", Item::hatchet_wood->id); 361 itemsCraftedStats->push_back(newStat); 362 itemsCrafted[Item::hatchet_wood->id] = newStat; 363 newStat->postConstruct(); 364 365 newStat = new ItemStat(ITEMS_CRAFTED_OFFSET + 14, L"craftItem.stoneAxe", Item::hatchet_stone->id); 366 itemsCraftedStats->push_back(newStat); 367 itemsCrafted[Item::hatchet_stone->id] = newStat; 368 newStat->postConstruct(); 369 370 newStat = new ItemStat(ITEMS_CRAFTED_OFFSET + 15, L"craftItem.ironAxe", Item::hatchet_iron->id); 371 itemsCraftedStats->push_back(newStat); 372 itemsCrafted[Item::hatchet_iron->id] = newStat; 373 newStat->postConstruct(); 374 375 newStat = new ItemStat(ITEMS_CRAFTED_OFFSET + 16, L"craftItem.diamondAxe", Item::hatchet_diamond->id); 376 itemsCraftedStats->push_back(newStat); 377 itemsCrafted[Item::hatchet_diamond->id] = newStat; 378 newStat->postConstruct(); 379 380 newStat = new ItemStat(ITEMS_CRAFTED_OFFSET + 17, L"craftItem.goldAxe", Item::hatchet_gold->id); 381 itemsCraftedStats->push_back(newStat); 382 itemsCrafted[Item::hatchet_gold->id] = newStat; 383 newStat->postConstruct(); 384 385 newStat = new ItemStat(ITEMS_CRAFTED_OFFSET + 18, L"craftItem.woodenHoe", Item::hoe_wood->id); 386 itemsCraftedStats->push_back(newStat); 387 itemsCrafted[Item::hoe_wood->id] = newStat; 388 newStat->postConstruct(); 389 390 newStat = new ItemStat(ITEMS_CRAFTED_OFFSET + 19, L"craftItem.stoneHoe", Item::hoe_stone->id); 391 itemsCraftedStats->push_back(newStat); 392 itemsCrafted[Item::hoe_stone->id] = newStat; 393 newStat->postConstruct(); 394 395 newStat = new ItemStat(ITEMS_CRAFTED_OFFSET + 20, L"craftItem.ironHoe", Item::hoe_iron->id); 396 itemsCraftedStats->push_back(newStat); 397 itemsCrafted[Item::hoe_iron->id] = newStat; 398 newStat->postConstruct(); 399 400 newStat = new ItemStat(ITEMS_CRAFTED_OFFSET + 21, L"craftItem.diamondHoe", Item::hoe_diamond->id); 401 itemsCraftedStats->push_back(newStat); 402 itemsCrafted[Item::hoe_diamond->id] = newStat; 403 newStat->postConstruct(); 404 405 newStat = new ItemStat(ITEMS_CRAFTED_OFFSET + 22, L"craftItem.goldHoe", Item::hoe_gold->id); 406 itemsCraftedStats->push_back(newStat); 407 itemsCrafted[Item::hoe_gold->id] = newStat; 408 newStat->postConstruct(); 409 410 newStat = new ItemStat(ITEMS_CRAFTED_OFFSET + 23, L"craftItem.glowstone", Tile::glowstone_Id); 411 itemsCraftedStats->push_back(newStat); 412 itemsCrafted[Tile::glowstone_Id] = newStat; 413 newStat->postConstruct(); 414 415 newStat = new ItemStat(ITEMS_CRAFTED_OFFSET + 24, L"craftItem.tnt", Tile::tnt_Id); 416 itemsCraftedStats->push_back(newStat); 417 itemsCrafted[Tile::tnt_Id] = newStat; 418 newStat->postConstruct(); 419 420 newStat = new ItemStat(ITEMS_CRAFTED_OFFSET + 25, L"craftItem.bowl", Item::bowl->id); 421 itemsCraftedStats->push_back(newStat); 422 itemsCrafted[Item::bowl->id] = newStat; 423 newStat->postConstruct(); 424 425 newStat = new ItemStat(ITEMS_CRAFTED_OFFSET + 26, L"craftItem.bucket", Item::bucket_empty->id); 426 itemsCraftedStats->push_back(newStat); 427 itemsCrafted[Item::bucket_empty->id] = newStat; 428 newStat->postConstruct(); 429 430 newStat = new ItemStat(ITEMS_CRAFTED_OFFSET + 27, L"craftItem.flintAndSteel", Item::flintAndSteel->id); 431 itemsCraftedStats->push_back(newStat); 432 itemsCrafted[Item::flintAndSteel->id] = newStat; 433 newStat->postConstruct(); 434 435 newStat = new ItemStat(ITEMS_CRAFTED_OFFSET + 28, L"craftItem.fishingRod", Item::fishingRod->id); 436 itemsCraftedStats->push_back(newStat); 437 itemsCrafted[Item::fishingRod->id] = newStat; 438 newStat->postConstruct(); 439 440 newStat = new ItemStat(ITEMS_CRAFTED_OFFSET + 29, L"craftItem.clock", Item::clock->id); 441 itemsCraftedStats->push_back(newStat); 442 itemsCrafted[Item::clock->id] = newStat; 443 newStat->postConstruct(); 444 445 newStat = new ItemStat(ITEMS_CRAFTED_OFFSET + 30, L"craftItem.compass", Item::compass->id); 446 itemsCraftedStats->push_back(newStat); 447 itemsCrafted[Item::compass->id] = newStat; 448 newStat->postConstruct(); 449 450 newStat = new ItemStat(ITEMS_CRAFTED_OFFSET + 31, L"craftItem.map", Item::map->id); 451 itemsCraftedStats->push_back(newStat); 452 itemsCrafted[Item::map->id] = newStat; 453 newStat->postConstruct(); 454 455// WARNING: NO NEW STATS CAN BE ADDED HERE 456// These stats are directly followed by the achievemnts in the profile data, so cannot be changed without migrating the profile data 457 458 //This sets up a static list of stat/leaderboard pairings, used to tell which leaderboards need an update 459 StatsCounter::setupStatBoards(); 460} 461 462// 4J Stu - Added this function to allow us to add news stats from TU9 onwards 463void Stats::buildAdditionalStats() 464{ 465 int offset = ADDITIONAL_STATS_OFFSET; 466 467 // The order of these stats should not be changed, as the map directly to bits in the profile data 468 469 // The number of times this player has dealt the killing blow to the Enderdragon 470 Stats::killsEnderdragon = (new GeneralStat(offset++, L"stat.killsEnderdragon"))->postConstruct(); 471 472 // The number of times this player has been present when the Enderdragon has died 473 Stats::completeTheEnd = (new GeneralStat(offset++, L"stat.completeTheEnd"))->postConstruct(); 474 475 476#if (defined _EXTENDED_ACHIEVEMENTS) && (!defined _DURANGO) 477 { 478 ItemStat *itemStat = new ItemStat(offset++, L"craftItem.flowerPot", Item::flowerPot_Id); 479 itemsCraftedStats->push_back(itemStat); 480 itemsCrafted[itemStat->getItemId()] = itemStat; 481 itemStat->postConstruct(); 482 483 itemStat = new ItemStat(offset++, L"craftItem.sign", Item::sign_Id); 484 itemsCraftedStats->push_back(itemStat); 485 itemsCrafted[itemStat->getItemId()] = itemStat; 486 itemStat->postConstruct(); 487 488 itemStat = new ItemStat(offset++, L"mineBlock.emerald", Tile::emeraldOre_Id); 489 blocksMinedStats->push_back(itemStat); 490 blocksMined[itemStat->getItemId()] = itemStat; 491 itemStat->postConstruct(); 492 493 // 4J-JEV: We don't need itemsCollected(emerald) so I'm using it to 494 // stor itemsBought(emerald) so I don't have to make yet another massive 495 // StatArray for Items Bought. 496 itemStat = new ItemStat(offset++, L"itemsBought.emerald", Item::emerald_Id); 497 itemsCollectedStats->push_back(itemStat); 498 itemsCollected[itemStat->getItemId()] = itemStat; 499 itemStat->postConstruct(); 500 501 // 4J-JEV: WHY ON EARTH DO THESE ARRAYS HAVE TO BE SO PAINFULLY LARGE WHEN THEY ARE GOING TO BE MOSTLY EMPTY!!! 502 // Either way, I'm making this one smaller because we don't need those record items (and we only need 2). 503 blocksPlaced = StatArray(1000); 504 505 itemStat = new ItemStat(offset++, L"blockPlaced.flowerPot", Tile::flowerPot_Id); 506 blocksPlacedStats->push_back(itemStat); 507 blocksPlaced[itemStat->getItemId()] = itemStat; 508 itemStat->postConstruct(); 509 510 itemStat = new ItemStat(offset++, L"blockPlaced.sign", Tile::sign_Id); 511 blocksPlacedStats->push_back(itemStat); 512 blocksPlaced[itemStat->getItemId()] = itemStat; 513 itemStat->postConstruct(); 514 515 itemStat = new ItemStat(offset++, L"blockPlaced.wallsign", Tile::wallSign_Id); 516 blocksPlacedStats->push_back(itemStat); 517 blocksPlaced[itemStat->getItemId()] = itemStat; 518 itemStat->postConstruct(); 519 520 GeneralStat *generalStat = NULL; 521 522 rainbowCollection = StatArray(16); 523 for (unsigned int i = 0; i < 16; i++) 524 { 525 generalStat = new GeneralStat(offset++, L"rainbowCollection." + _toString<unsigned int>(i)); 526 generalStats->push_back(generalStat); 527 rainbowCollection[i] = generalStat; 528 generalStat->postConstruct(); 529 } 530 531 biomesVisisted = StatArray(23); 532 for (unsigned int i = 0; i < 23; i++) 533 { 534 generalStat = new GeneralStat(offset++, L"biomesVisited." + _toString<unsigned int>(i)); 535 generalStats->push_back(generalStat); 536 biomesVisisted[i] = generalStat; 537 generalStat->postConstruct(); 538 } 539 540 itemStat = new ItemStat(offset++, L"itemCrafted.porkchop", Item::porkChop_cooked_Id); 541 itemsCraftedStats->push_back(itemStat); 542 itemsCrafted[itemStat->getItemId()] = itemStat; 543 itemStat->postConstruct(); 544 545 itemStat = new ItemStat(offset++, L"itemEaten.porkchop", Item::porkChop_cooked_Id); 546 blocksPlacedStats->push_back(itemStat); 547 blocksPlaced[itemStat->getItemId()] = itemStat; 548 itemStat->postConstruct(); 549 } 550#endif 551 552} 553 554Stat *Stats::get(int key) 555{ 556 return statsById->at(key); 557}