Something went wrong. Try again.
the game where you go into mines and start crafting! but for consoles (forked directly from smartcmd's github)
Something went wrong. Try again.
32 kB · 1221 lines
C++
at master
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221#include "stdafx.h"
#include "ItemStat.h"
#include "Achievement.h"#include "Achievements.h"
#include "DamageSource.h"#include "Player.h"#include "ItemInstance.h"#include "Tile.h"#include "Item.h"#include "Level.h"
#include "..\Minecraft.Client\Minecraft.h"#include "LevelData.h"#include "LevelSettings.h"
#include "..\Minecraft.Client\LocalPlayer.h"#include "..\Minecraft.Client\MultiPlayerLocalPlayer.h"
#include "EntityIO.h"
#include "..\Minecraft.Client\Durango\ServiceConfig\Events-XBLA.8-149E11AEEvents.h"
#include "DurangoStats.h"
/////////////////// // Ds Item Event // ///////////////////
string DsItemEvent::nameMethods[] = { "NONE", "itemPickedUp", "itemCrafted", "itemTakenFromChest", "itemTakenFromEnderchest", "itemBought", "itemSmithed", "blockMined", "blockPlaced", "MAX"};
DsItemEvent::DsItemEvent(int id, const wstring &name) : Stat(id,name) {}
bool DsItemEvent::onLeaderboard(ELeaderboardId leaderboard, eAcquisitionMethod methodId, Param *param){ switch (methodId) { case eAcquisitionMethod_Pickedup: switch (param->itemId) { case Item::egg_Id: case Tile::mushroom_brown_Id: case Tile::mushroom_red_Id: return leaderboard == eLeaderboardId_FARMING; } break;
case eAcquisitionMethod_Mined: switch (param->itemId) { case Tile::dirt_Id: case Tile::stoneBrick_Id: case Tile::sand_Id: case Tile::stone_Id: case Tile::gravel_Id: case Tile::clay_Id: case Tile::obsidian_Id: return leaderboard == eLeaderboardId_MINING;
case Tile::wheat_Id: case Tile::pumpkin_Id: case Tile::reeds_Id: return leaderboard == eLeaderboardId_FARMING; } break; }
return false;}
// 4J-JEV, for tiles/items we want to record stats together.int DsItemEvent::mergeIds(int itemId){ switch (itemId) { default: return itemId;
case Tile::mushroom_brown_Id: case Tile::mushroom_red_Id: return Tile::mushroom_brown_Id;
case Tile::dirt_Id: case Tile::grass_Id: case Tile::farmland_Id: return Tile::dirt_Id;
case Tile::redstoneLight_Id: case Tile::redstoneLight_lit_Id: return Tile::redstoneLight_Id;
case Tile::redStoneOre_Id: case Tile::redStoneOre_lit_Id: return Tile::redStoneOre_Id; }}
void DsItemEvent::handleParamBlob(shared_ptr<LocalPlayer> player, byteArray paramBlob){ if (paramBlob.length == sizeof(Param)) { Param *param = (Param *) paramBlob.data;
// Combine block ids. param->itemId = mergeIds( param->itemId );
// Send farming leaderboard updates. if ( (param->methodId == eAcquisitionMethod_Pickedup && onLeaderboard(eLeaderboardId_FARMING, eAcquisitionMethod_Pickedup, param)) || (param->methodId == eAcquisitionMethod_Mined && onLeaderboard(eLeaderboardId_FARMING, eAcquisitionMethod_Mined, param)) ) { EventWriteLeaderboardTotals( DurangoStats::getUserId(player), //UserId DurangoStats::getPlayerSession(), // PlayerSessionId player->level->difficulty, // Difficulty, eLeaderboardId_FARMING, // ScoreboardId param->itemCount);
app.DebugPrintf("<%ls>\tscoreboardFarming(%i:%i:%i)\n", DurangoStats::getUserId(player), player->level->difficulty, eLeaderboardId_FARMING, param->itemCount); }
// Send mining leaderboard updates. if ( param->methodId == eAcquisitionMethod_Mined && onLeaderboard(eLeaderboardId_MINING, eAcquisitionMethod_Mined, param) ) { EventWriteLeaderboardTotals( DurangoStats::getUserId(player), //UserId DurangoStats::getPlayerSession(), // PlayerSessionId player->level->difficulty, // Difficulty, eLeaderboardId_MINING, // ScoreboardId param->itemCount); app.DebugPrintf("<%ls>\tscoreboardMining(%i:%i:%i)\n", DurangoStats::getUserId(player), player->level->difficulty, eLeaderboardId_MINING, param->itemCount); }
// Debug printout. string method = nameMethods[(int)param->methodId]; app.DebugPrintf("<%ls>\t%s(%i:%i:%i)\n", DurangoStats::getUserId(player), method.c_str(), param->itemId, param->itemAux, param->itemCount);
// Split on acquisition method, then send relevant events. if (param->methodId == eAcquisitionMethod_Placed) { EventWriteBlockPlaced( DurangoStats::getUserId(player), DurangoStats::getPlayerSession(), player->level->difficulty, param->itemId, param->itemAux, param->itemCount ); } else if (param->methodId == eAcquisitionMethod_Mined) { EventWriteBlockBroken( DurangoStats::getUserId(player), DurangoStats::getPlayerSession(), player->level->difficulty, param->itemId, param->itemAux, param->itemCount ); } else { EventWriteMcItemAcquired( DurangoStats::getUserId(player), 0, // TODO DurangoStats::getPlayerSession(), 0, 0, player->level->difficulty, param->itemId, param->methodId, 0, 0, 0, // (x,y,z) param->itemAux, param->itemCount ); } }}
/* 4J-JEV: note that mined events will only fire with 'Instant_Mine' on if you are carrying an appropriate * tool for the block that you are mining. */byteArray DsItemEvent::createParamBlob(eAcquisitionMethod eMethod, int itemId, int itemAux, int itemCount){ byteArray output; Param param = { eMethod, itemId, itemAux, itemCount }; output.data = (byte *) new Param(param); output.length = sizeof(Param); return output;}
/////////////////// // Ds Mob Killed // ///////////////////
DsMobKilled::DsMobKilled(int id, const wstring &name) : Stat(id,name) {}
void DsMobKilled::handleParamBlob(shared_ptr<LocalPlayer> player, byteArray paramBlob){ if (paramBlob.length == sizeof(Param)) { Param *param = (Param *) paramBlob.data;
if (param->mobType < 0) return;
if (EventWriteMobKilled(DurangoStats::getUserId(player), 0, DurangoStats::getPlayerSession(), DurangoStats::getMultiplayerCorrelationId(), 0, player->level->difficulty, DurangoStats::getPlayerSession(), // ROUND ID 0, param->weaponId, param->mobType, param->isRanged?1:0, 0, 0, 0, // (x,y,z), 0, param->distance, param->mobType) == 0) { app.DebugPrintf("<%ls>\t%s(%i:%i:%i:%i)\n", DurangoStats::getUserId(player), (param->isRanged?"mobShotWithEntity":"mobKilledInMelee"), param->mobType, param->weaponId, param->distance, param->damage); }
switch(EntityIO::getClass(param->mobType)) { case eTYPE_MONSTER: if(param->mobType != SPIDER_JOCKEY_ID) break; // Fallthrough is spider jockey case eTYPE_ZOMBIE: case eTYPE_SKELETON: case eTYPE_CREEPER: case eTYPE_SPIDER: case eTYPE_PIGZOMBIE: case eTYPE_SLIME:
if (EventWriteLeaderboardTotals( DurangoStats::getUserId(player), //UserId DurangoStats::getPlayerSession(), // PlayerSessionId player->level->difficulty, // Difficulty, eLeaderboardId_KILLING, // ScoreboardId 1) // Count == 0) { app.DebugPrintf("<%ls>\tscoreboardKills(%i:%i:1)\n", DurangoStats::getUserId(player), player->level->difficulty, eLeaderboardId_KILLING); } } }}
byteArray DsMobKilled::createParamBlob(shared_ptr<Player> player, shared_ptr<Mob> mob, DamageSource *dmgSrc){ // 4J-JEV: Get the id we use for Durango Server Stats. int mob_networking_id; eINSTANCEOF mobEType = mob->GetType(); if ( (mobEType == eTYPE_SPIDER) && (mob->rider.lock() != NULL) && (mob->rider.lock()->GetType() == eTYPE_SKELETON) && mob->rider.lock()->isAlive() ) { mob_networking_id = SPIDER_JOCKEY_ID; // Spider jockey only a concept for leaderboards. } else if ( (mobEType == eTYPE_SKELETON) && (mob->riding != NULL) && (mob->riding->GetType() == eTYPE_SPIDER) && mob->riding->isAlive() ) { mob_networking_id = SPIDER_JOCKEY_ID; // Spider jockey only a concept for leaderboards. } else { mob_networking_id = EntityIO::eTypeToIoid(mobEType); }
// Kill made with projectile, arrow/ghast/fireball/snowball. // NB: Snowball kills would make an awesome achievement. ("Not a snowball's chance...") if ( dmgSrc->isProjectile() ) { byteArray output; Param param = { DsMobKilled::RANGED, mob_networking_id, EntityIO::eTypeToIoid(dmgSrc->getDirectEntity()->GetType()), mob->distanceTo(player->x, player->y, player->z), 0/*not needed*/ }; output.data = (byte*) new Param(param); output.length = sizeof(Param); return output; } // Kill made in melee, use itemInHand as weapon. shared_ptr<ItemInstance> item = player->getCarriedItem(); byteArray output; Param param = { DsMobKilled::MELEE, mob_networking_id, (item != NULL ? item->getItem()->id : 0), mob->distanceTo(player->x, player->y, player->z), 0/*not needed*/ }; output.data = (byte*) new Param(param); output.length = sizeof(Param); return output;}
///////////////////// // Ds Mob Interact // /////////////////////
string DsMobInteract::nameInteract[] = { "unknownMobInteraction", "mobBred", "mobTamed", "mobCured", "mobCrafted", "mobSheared"};
DsMobInteract::DsMobInteract(int id, const wstring &name) : Stat(id,name) {}
void DsMobInteract::handleParamBlob(shared_ptr<LocalPlayer> player, byteArray paramBlob){ if (paramBlob.length == sizeof(Param)) { Param *param = (Param *) paramBlob.data;
if (param->mobId < 0) return;
app.DebugPrintf("<%ls>\t%s(%i)\n", DurangoStats::getUserId(player), nameInteract[param->interactionType].c_str(), param->mobId);
EventWriteMobInteract( DurangoStats::getUserId(player), DurangoStats::getPlayerSession(), param->mobId, param->interactionType ); }}
byteArray DsMobInteract::createParamBlob(eInteract interactionId, int entityId){ byteArray output; Param param = { interactionId, EntityIO::eTypeToIoid((eINSTANCEOF)entityId) }; output.data = (byte*) new Param(param); output.length = sizeof(Param); return output;}
/////////////// // Ds Travel // ///////////////
string DsTravel::nameMethods[eMethod_MAX] = { "Walk", "Swim", "Fall", "Climb", "Cart", "Boat", "Pig", "Time" };
unsigned int DsTravel::CACHE_SIZES[eMethod_MAX] = { 40, // WALK - Meters? 20, // SWIM - Meters? 0, // FALL - Meters? - Fall event naturally only sends on land, no caching necessary. 10, // CLIMB - Meters? 70, // CART - Meters? 70, // BOAT - Meters? 10, // PIG - Meters? 20*60*5, // TIME - GameTicks (20*60*5 ~ 5 mins) };
DsTravel::DsTravel(int id, const wstring &name) : Stat(id,name){ ZeroMemory(¶m_cache, sizeof(unsigned int)*eMethod_MAX*MAX_LOCAL_PLAYERS);}
void DsTravel::handleParamBlob(shared_ptr<LocalPlayer> player, byteArray paramBlob){ if (paramBlob.length == sizeof(Param)) { Param *param = (Param*) paramBlob.data;
int newDistance = cache(player->GetXboxPad(), *param);
if ( newDistance > 0 ) write(player, param->method, newDistance); }}
byteArray DsTravel::createParamBlob(eMethod method, int distance){ byteArray output; Param param = { method, distance }; output.data = (byte*) new Param(param); output.length = sizeof(Param); return output;}
int DsTravel::cache(int iPad, Param ¶m){ if ( (eMethod_walk <= param.method) && (param.method < eMethod_MAX) ) { param_cache[iPad][param.method] += param.distance;
if (param_cache[iPad][param.method] > CACHE_SIZES[param.method]) { int out = param_cache[iPad][param.method]; param_cache[iPad][param.method] = 0; return out; } }
return 0;}
void DsTravel::flush(shared_ptr<LocalPlayer> player){ int iPad = player->GetXboxPad(); for (int i = 0; i < eMethod_MAX; i++) { if (param_cache[iPad][i] > 0) { write( player, (eMethod) i, param_cache[iPad][i] ); param_cache[iPad][i] = 0; } }}
void DsTravel::write(shared_ptr<LocalPlayer> player, eMethod method, int distance){ if (player == nullptr) return;
app.DebugPrintf("<%ls>\t%s(%i)\n", DurangoStats::getUserId(player), nameMethods[method].c_str(), distance);
if (method == DsTravel::eMethod_time) { EventWriteIncTimePlayed( DurangoStats::getUserId(player), DurangoStats::getPlayerSession(), player->level->difficulty, distance ); } else if ( (eMethod_walk <= method) && (method < eMethod_MAX) ) { EventWriteIncDistanceTravelled( DurangoStats::getUserId(player), DurangoStats::getPlayerSession(), player->level->difficulty, distance, method );
switch(method) { case eMethod_walk: case eMethod_fall: case eMethod_minecart: case eMethod_boat: EventWriteLeaderboardTotals( DurangoStats::getUserId(player), //UserId DurangoStats::getPlayerSession(), // PlayerSessionId player->level->difficulty, // Difficulty, eLeaderboardId_TRAVELLING, // ScoreboardId distance); break; } }}
////////////////// // Ds Item Used // //////////////////
DsItemUsed::DsItemUsed(int id, const wstring &name) : Stat(id,name) {}
void DsItemUsed::handleParamBlob(shared_ptr<LocalPlayer> player, byteArray paramBlob){ if (paramBlob.length == sizeof(Param)) { Param *param = (Param*) paramBlob.data; app.DebugPrintf("<%ls>\titemUsed(%i,%i,%i)\n", DurangoStats::getUserId(player), param->itemId, param->aux, param->count );
EventWriteMcItemUsed( DurangoStats::getUserId(player), 0, // SectionId, DurangoStats::getPlayerSession(), 0, // MultiplayerCorrelationId, 0, // Gameplay Mode, player->level->difficulty, param->itemId, 0, 0, 0, // (x,y,z) param->aux, param->count, param->hunger ); }}
byteArray DsItemUsed::createParamBlob(int itemId, int aux, int count, int health, int hunger){ byteArray output; Param param = { itemId, aux, count, health, hunger }; output.data = (byte*) new Param(param); output.length = sizeof(Param); return output;}
//////////////////// // Ds Achievement // ////////////////////
DsAchievement::DsAchievement(int id, const wstring &name) : Stat(id,name) {}
void DsAchievement::handleParamBlob(shared_ptr<LocalPlayer> player, byteArray paramBlob){ if (paramBlob.length == sizeof(SmallParam)) { SmallParam *paramS = (SmallParam*) paramBlob.data; assert( DurangoStats::binaryAchievement(paramS->award) ); app.DebugPrintf("<%ls>\tAchievement(%i)\n", DurangoStats::getUserId(player), paramS->award); bool canAward = true; if(paramS->award == eAward_stayinFrosty) { canAward = !player->m_bHasAwardedStayinFrosty; player->m_bHasAwardedStayinFrosty = true; }
if(canAward) { EventWriteAchievementGet( DurangoStats::getUserId(player), DurangoStats::getPlayerSession(), paramS->award ); } } else if (paramBlob.length == sizeof(LargeParam)) { LargeParam *paramL = (LargeParam*) paramBlob.data; assert( DurangoStats::enhancedAchievement(paramL->award) );
switch(paramL->award) { case eAward_musicToMyEars: app.DebugPrintf("<%ls>\tmusicToMyEars(%i)\n", DurangoStats::getUserId(player), paramL->count); EventWritePlayedMusicDisc( DurangoStats::getUserId(player), DurangoStats::getPlayerSession(), paramL->count ); break;
case eAward_chestfulOfCobblestone: app.DebugPrintf("<%ls>\tchestfulOfCobblestone(%i)\n", DurangoStats::getUserId(player), paramL->count); EventWriteChestfulOfCobblestone( DurangoStats::getUserId(player), DurangoStats::getPlayerSession(), paramL->count ); break;
case eAward_overkill: app.DebugPrintf("<%ls>\toverkill(%i)\n", DurangoStats::getUserId(player), paramL->count); EventWriteOverkill( DurangoStats::getUserId(player), DurangoStats::getPlayerSession(), paramL->count ); break;
case eAward_OnARail: app.DebugPrintf("<%ls>\nonARail(%i)\n", DurangoStats::getUserId(player), paramL->count); EventWriteOnARail( DurangoStats::getUserId(player), DurangoStats::getPlayerSession(), paramL->count ); break; } } else assert(false); // Unsuitable paramBlob length.}
byteArray DsAchievement::createSmallParamBlob(eAward award){ byteArray output; SmallParam param = { award }; output.data = (byte*) new SmallParam(param); output.length = sizeof(SmallParam); return output;}
byteArray DsAchievement::createLargeParamBlob(eAward award, int count){ byteArray output; LargeParam param = { award, count }; output.data = (byte*) new LargeParam(param); output.length = sizeof(LargeParam); return output;}
////////////////////////// // Ds Changed Dimension // //////////////////////////
DsChangedDimension::DsChangedDimension(int id, const wstring &name) : Stat(id,name) {}
void DsChangedDimension::handleParamBlob(shared_ptr<LocalPlayer> player, byteArray paramBlob){ if (paramBlob.length == sizeof(Param)) { Param *param = (Param*) paramBlob.data; app.DebugPrintf("<%ls>\tchangedDimension(%i:%i)\n", DurangoStats::getUserId(player), param->fromDimId, param->toDimId);
// No longer used. }}
byteArray DsChangedDimension::createParamBlob(int fromDimId, int toDimId){ byteArray output; Param param = { fromDimId, toDimId }; output.data = (byte*) new Param(param); output.length = sizeof(Param); return output;}
////////////////////// // Ds Entered Biome // //////////////////////
DsEnteredBiome::DsEnteredBiome(int id, const wstring &name) : Stat(id,name) {}
void DsEnteredBiome::handleParamBlob(shared_ptr<LocalPlayer> player, byteArray paramBlob){ if (paramBlob.length == sizeof(Param)) { Param *param = (Param*) paramBlob.data; app.DebugPrintf("<%ls>\tenteredBiome(%i)\n", DurangoStats::getUserId(player), param->biomeId);
EventWriteEnteredNewBiome( DurangoStats::getUserId(player), DurangoStats::getPlayerSession(), param->biomeId ); }}
byteArray DsEnteredBiome::createParamBlob(int biomeId){ byteArray output; Param param = { biomeId }; output.data = (byte*) new Param(param); output.length = sizeof(Param); return output;}
//////////////////////// // DURANGO STATISTICS // ////////////////////////
DurangoStats::DurangoStats(){ // Hopefully only using the first parameter itemsAcquired = new DsItemEvent( itemsAcquired_Id, L"itemsAcquired" ); itemsAcquired->postConstruct();
itemUsed = new DsItemUsed( itemUsed_Id, L"itemUsed" ); itemUsed->postConstruct();
travel = new DsTravel( travel_Id, L"travel" ); travel->setAwardLocallyOnly()->postConstruct();
mobKilled = new DsMobKilled( mobKilled_Id, L"mobKilled" ); mobKilled->postConstruct();
mobInteract = new DsMobInteract( mobInteract_Id, L"mobInteract" ); mobInteract->postConstruct();
changedDimension = new DsChangedDimension( changedDimension_Id, L"changedDimension" ); changedDimension->postConstruct();
enteredBiome = new DsEnteredBiome( enteredBiome_Id, L"enteredBiome" ); enteredBiome->postConstruct();
achievement = new DsAchievement( binAchievement_Id, L"achievement" ); achievement->postConstruct();
achievementLocal = new DsAchievement( binAchievementLocal_Id, L"achievementLocal" ); achievementLocal->setAwardLocallyOnly(); achievementLocal->postConstruct();
EventRegisterXBLA_149E11AE();}
DurangoStats::~DurangoStats(){ EventUnregisterXBLA_149E11AE();}
Stat *DurangoStats::get_stat(int i){ switch (i) { case itemsAcquired_Id: return (Stat*) itemsAcquired; case itemUsed_Id: return (Stat*) itemUsed; case travel_Id: return (Stat*) travel; case mobKilled_Id: return (Stat*) mobKilled; case mobInteract_Id: return (Stat*) mobInteract; case changedDimension_Id: return (Stat*) changedDimension; case enteredBiome_Id: return (Stat*) enteredBiome; case binAchievement_Id: return (Stat*) achievement; case binAchievementLocal_Id: return (Stat*) achievementLocal;
// Unrecognised stat id default: assert(false); break; }
return NULL;}
Stat* DurangoStats::get_walkOneM(){ return travel;}
Stat* DurangoStats::get_swimOneM(){ return travel;}
Stat* DurangoStats::get_fallOneM(){ return travel;}
Stat* DurangoStats::get_climbOneM(){ return travel;}
Stat* DurangoStats::get_minecartOneM(){ return travel;}
Stat* DurangoStats::get_boatOneM(){ return travel;}
Stat* DurangoStats::get_pigOneM(){ return travel;}
Stat *DurangoStats::get_cowsMilked(){ return get_itemsCrafted(Item::bucket_milk_Id);}
Stat* DurangoStats::get_killMob(){ return mobKilled;}
Stat* DurangoStats::get_breedEntity(eINSTANCEOF entityId){ return mobInteract;}
Stat* DurangoStats::get_tamedEntity(eINSTANCEOF entityId){ return mobInteract;}
Stat* DurangoStats::get_curedEntity(eINSTANCEOF entityId){ return mobInteract;}
Stat* DurangoStats::get_craftedEntity(eINSTANCEOF entityId){ return mobInteract;}
Stat* DurangoStats::get_shearedEntity(eINSTANCEOF entityId){ return mobInteract;}
Stat* DurangoStats::get_timePlayed(){ return travel;}
Stat* DurangoStats::get_blocksPlaced(int blockId){ return (Stat*) itemsAcquired;}
Stat* DurangoStats::get_blocksMined(int blockId){ return (Stat*) itemsAcquired;}
Stat* DurangoStats::get_itemsCollected(int itemId, int itemAux){ return (Stat*) itemsAcquired;}
Stat* DurangoStats::get_itemsCrafted(int itemId){ switch (itemId) { // 4J-JEV: These items can be crafted trivially to and from their block equivalents, // 'Acquire Hardware' also relies on 'Count_Crafted(IronIngot) == Count_Forged(IronIngot)" on the Stats server. case Item::ironIngot_Id: case Item::goldIngot_Id: case Item::diamond_Id: case Item::redStone_Id: case Item::emerald_Id: return NULL;
case Item::dye_powder_Id: default: return (Stat*) itemsAcquired; } }
Stat* DurangoStats::get_itemsSmelted(int itemId){ // 4J-JEV: Context needed for itemCrafted for iron/gold being smelted. return (Stat*) itemsAcquired;}
Stat* DurangoStats::get_itemsUsed(int itemId){ return (Stat*) itemUsed;}
Stat *DurangoStats::get_itemsBought(int itemId){ return (Stat*) itemsAcquired;}
Stat* DurangoStats::get_changedDimension(int from, int to){ return (Stat*) changedDimension;}
Stat* DurangoStats::get_enteredBiome(int biomeId){ return (Stat*) enteredBiome;}
Stat* DurangoStats::get_achievement(eAward achievementId){ // Special case for 'binary' achievements. if ( binaryAchievement(achievementId) || enhancedAchievement(achievementId) ) { switch (achievementId) { case eAward_chestfulOfCobblestone: case eAward_TakingInventory: return achievementLocal;
default: return achievement; } } else if (achievementId == eAward_zombieDoctor) { return get_curedEntity(eTYPE_ZOMBIE); } // Other achievements awarded through more detailed generic events. return NULL;}
byteArray DurangoStats::getParam_walkOneM(int distance){ return DsTravel::createParamBlob(DsTravel::eMethod_walk, distance);}
byteArray DurangoStats::getParam_swimOneM(int distance){ return DsTravel::createParamBlob(DsTravel::eMethod_swim,distance);}
byteArray DurangoStats::getParam_fallOneM(int distance){ return DsTravel::createParamBlob(DsTravel::eMethod_fall,distance);}
byteArray DurangoStats::getParam_climbOneM(int distance){ return DsTravel::createParamBlob(DsTravel::eMethod_climb,distance);}
byteArray DurangoStats::getParam_minecartOneM(int distance){ return DsTravel::createParamBlob(DsTravel::eMethod_minecart,distance);}
byteArray DurangoStats::getParam_boatOneM(int distance){ return DsTravel::createParamBlob(DsTravel::eMethod_boat,distance);}
byteArray DurangoStats::getParam_pigOneM(int distance){ return DsTravel::createParamBlob(DsTravel::eMethod_pig,distance);}
byteArray DurangoStats::getParam_cowsMilked(){ return DsItemEvent::createParamBlob(DsItemEvent::eAcquisitionMethod_Crafted, Item::bucket_milk_Id, 0, 1);}
byteArray DurangoStats::getParam_blocksPlaced(int blockId, int data, int count){ return DsItemEvent::createParamBlob(DsItemEvent::eAcquisitionMethod_Placed, blockId, data, count);}
byteArray DurangoStats::getParam_blocksMined(int blockId, int data, int count){ return DsItemEvent::createParamBlob(DsItemEvent::eAcquisitionMethod_Mined, blockId, data, count);}
byteArray DurangoStats::getParam_itemsCollected(int id, int aux, int count){ return DsItemEvent::createParamBlob(DsItemEvent::eAcquisitionMethod_Pickedup, id, aux, count);}
byteArray DurangoStats::getParam_itemsCrafted(int id, int aux, int count){ return DsItemEvent::createParamBlob(DsItemEvent::eAcquisitionMethod_Crafted, id, aux, count);}
byteArray DurangoStats::getParam_itemsUsed(shared_ptr<Player> player, shared_ptr<ItemInstance> itm){ return DsItemUsed::createParamBlob( itm->getItem()->id, itm->getAuxValue(), itm->GetCount(), player->getHealth(), player->getFoodData()->getFoodLevel() );}
byteArray DurangoStats::getParam_itemsBought(int id, int aux, int count){ return DsItemEvent::createParamBlob(DsItemEvent::eAcquisitionMethod_Bought, id, aux, count);}
byteArray DurangoStats::getParam_mobKill(shared_ptr<Player> player, shared_ptr<Mob> mob, DamageSource *dmgSrc){ return DsMobKilled::createParamBlob(player,mob,dmgSrc);}
byteArray DurangoStats::getParam_breedEntity(eINSTANCEOF entityId){ return DsMobInteract::createParamBlob(DsMobInteract::eInteract_Breed, entityId);}
byteArray DurangoStats::getParam_tamedEntity(eINSTANCEOF entityId){ return DsMobInteract::createParamBlob(DsMobInteract::eInteract_Tamed, entityId);}
byteArray DurangoStats::getParam_curedEntity(eINSTANCEOF entityId){ return DsMobInteract::createParamBlob(DsMobInteract::eInteract_Cured, entityId);}
byteArray DurangoStats::getParam_craftedEntity(eINSTANCEOF entityId){ return DsMobInteract::createParamBlob(DsMobInteract::eInteract_Crafted, entityId);}
byteArray DurangoStats::getParam_shearedEntity(eINSTANCEOF entityId){ return DsMobInteract::createParamBlob(DsMobInteract::eInteract_Sheared, entityId); }
byteArray DurangoStats::getParam_time(int timediff){ return DsTravel::createParamBlob(DsTravel::eMethod_time, timediff);}
byteArray DurangoStats::getParam_changedDimension(int from, int to){ return DsChangedDimension::createParamBlob(from,to);}
byteArray DurangoStats::getParam_enteredBiome(int biomeId){ return DsEnteredBiome::createParamBlob(biomeId);}
byteArray DurangoStats::getParam_achievement(eAward id){ if (binaryAchievement(id)) { return DsAchievement::createSmallParamBlob(id); } else if (enhancedAchievement(id)) { assert(false); // Should be calling the appropriate getParam function. } else if (id == eAward_zombieDoctor) { return getParam_curedEntity(eTYPE_ZOMBIE); }
// If its not a binary achievement, // don't bother constructing the param blob. return getParam_noArgs();}
byteArray DurangoStats::getParam_onARail(int dist){ return DsAchievement::createLargeParamBlob(eAward_OnARail, dist);}
byteArray DurangoStats::getParam_chestfulOfCobblestone(int count){ return DsAchievement::createLargeParamBlob(eAward_chestfulOfCobblestone, count);}
byteArray DurangoStats::getParam_overkill(int dmg){ return DsAchievement::createLargeParamBlob(eAward_overkill, dmg);}
byteArray DurangoStats::getParam_musicToMyEars(int recordId){ return DsAchievement::createLargeParamBlob(eAward_musicToMyEars, recordId);}
bool DurangoStats::binaryAchievement(eAward achievementId){ switch (achievementId) { case eAward_InToTheNether: case eAward_theEnd: case eAward_WhenPigsFly: case eAward_diamondsToYou: case eAward_stayinFrosty: case eAward_renewableEnergy: case eAward_ironMan: case eAward_winGame: case /*maybe*/ eAward_TakingInventory: return true; default: return false; }}
/** 4J-JEV, Basically achievements with an inconsequential extra parameter that I thought best not to / prefered not to / couldn't be bothered to make class handlers for. (Motivation: it would be nice for players to see how close they were/are to achieving these things).*/bool DurangoStats::enhancedAchievement(eAward achievementId){ switch (achievementId) { //case eAward_TakingInventory: case eAward_musicToMyEars: case eAward_chestfulOfCobblestone: case eAward_overkill: case eAward_OnARail: return true; default: return false; }}
void DurangoStats::generatePlayerSession(){ DurangoStats *dsInstance = (DurangoStats *) GenericStats::getInstance(); CoCreateGuid( &dsInstance->playerSessionId );}
LPCGUID DurangoStats::getPlayerSession(){ DurangoStats *dsInstance = (DurangoStats *) GenericStats::getInstance(); LPCGUID lpcguid = &dsInstance->playerSessionId; return lpcguid;}
void DurangoStats::setMultiplayerCorrelationId(Platform::String^ mcpId){ ((DurangoStats*)GenericStats::getInstance())->multiplayerCorrelationId = mcpId;}
LPCWSTR DurangoStats::getMultiplayerCorrelationId(){ return ((DurangoStats*)GenericStats::getInstance())->multiplayerCorrelationId->Data();}
LPCWSTR DurangoStats::getUserId(shared_ptr<LocalPlayer> player){ return getUserId(player->GetXboxPad());}
LPCWSTR DurangoStats::getUserId(int iPad){ static wstring cache = L""; PlayerUID uid = INVALID_XUID; ProfileManager.GetXUID(iPad, &uid, true); cache = uid.toString(); return cache.c_str();}
void DurangoStats::playerSessionStart(PlayerUID uid, shared_ptr<Player> plr){ if (plr != NULL && plr->level != NULL && plr->level->getLevelData() != NULL) { //wprintf(uid.toString().c_str()); //EventWritePlayerSessionStart( app.DebugPrintf(">>>\tPlayerSessionStart(%ls,%s,%ls,%i,%i)\n", uid.toString(), DurangoStats::getPlayerSession(), DurangoStats::getMultiplayerCorrelationId(), plr->level->getLevelData()->getGameType()->isSurvival(), plr->level->difficulty );
EventWritePlayerSessionStart( uid.toString().c_str(), DurangoStats::getPlayerSession(), DurangoStats::getMultiplayerCorrelationId(), plr->level->getLevelData()->getGameType()->isSurvival(), plr->level->difficulty ); }}
void DurangoStats::playerSessionStart(int iPad){ PlayerUID puid; shared_ptr<Player> plr; ProfileManager.GetXUID(iPad, &puid, true); plr = Minecraft::GetInstance()->localplayers[iPad]; playerSessionStart(puid,plr);}
void DurangoStats::playerSessionPause(int iPad){ shared_ptr<MultiplayerLocalPlayer> plr = Minecraft::GetInstance()->localplayers[iPad]; if (plr != NULL && plr->level != NULL && plr->level->getLevelData() != NULL) { PlayerUID puid; ProfileManager.GetXUID(iPad, &puid, true);
//EventWritePlayerSessionPause( app.DebugPrintf(">>>\tPlayerSessionPause(%ls,%s,%ls)\n", puid.toString().c_str(), DurangoStats::getPlayerSession(), DurangoStats::getMultiplayerCorrelationId() );
EventWritePlayerSessionPause( puid.toString().c_str(), DurangoStats::getPlayerSession(), DurangoStats::getMultiplayerCorrelationId() ); }}
void DurangoStats::playerSessionResume(int iPad){ shared_ptr<MultiplayerLocalPlayer> plr = Minecraft::GetInstance()->localplayers[iPad]; if (plr != NULL && plr->level != NULL && plr->level->getLevelData() != NULL) { PlayerUID puid; ProfileManager.GetXUID(iPad, &puid, true);
//EventWritePlayerSessionResume( app.DebugPrintf(">>>\tPlayerSessionResume(%ls,%s,%ls,%i,%i)\n", puid.toString().c_str(), DurangoStats::getPlayerSession(), DurangoStats::getMultiplayerCorrelationId(), plr->level->getLevelData()->getGameType()->isSurvival(), plr->level->difficulty );
EventWritePlayerSessionResume( puid.toString().c_str(), DurangoStats::getPlayerSession(), DurangoStats::getMultiplayerCorrelationId(), plr->level->getLevelData()->getGameType()->isSurvival(), plr->level->difficulty ); }}
void DurangoStats::playerSessionEnd(int iPad){ shared_ptr<MultiplayerLocalPlayer> plr = Minecraft::GetInstance()->localplayers[iPad]; if (plr != NULL) { DurangoStats::getInstance()->travel->flush(plr); }}