the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
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}