diff options
| author | daoge_cmd <3523206925@qq.com> | 2026-03-01 12:16:08 +0800 |
|---|---|---|
| committer | daoge_cmd <3523206925@qq.com> | 2026-03-01 12:16:08 +0800 |
| commit | b691c43c44ff180d10e7d4a9afc83b98551ff586 (patch) | |
| tree | 3e9849222cbc6ba49f2f1fc6e5fe7179632c7390 /Minecraft.Client/Durango/Leaderboards/GameProgress.cpp | |
| parent | def8cb415354ac390b7e89052a50605285f1aca9 (diff) | |
Initial commit
Diffstat (limited to 'Minecraft.Client/Durango/Leaderboards/GameProgress.cpp')
| -rw-r--r-- | Minecraft.Client/Durango/Leaderboards/GameProgress.cpp | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/Minecraft.Client/Durango/Leaderboards/GameProgress.cpp b/Minecraft.Client/Durango/Leaderboards/GameProgress.cpp new file mode 100644 index 00000000..dd07f3e9 --- /dev/null +++ b/Minecraft.Client/Durango/Leaderboards/GameProgress.cpp @@ -0,0 +1,107 @@ +#include "stdafx.h" + +#include "Durango\ServiceConfig\Events-XBLA.8-149E11AEEvents.h" + +#include "..\Minecraft.World\DurangoStats.h" + +#include "GameProgress.h" + +namespace WFC = Windows::Foundation::Collections; +namespace MXSA = Microsoft::Xbox::Services::Achievements; +namespace CC = concurrency; + +GameProgress *GameProgress::instance = NULL; + +void GameProgress::Flush(int iPad) +{ + if (instance == NULL) + instance = new GameProgress(); + + instance->updatePlayer(iPad); +} + +void GameProgress::Tick() +{ + if (instance == NULL) + instance = new GameProgress(); + + long long currentTime = System::currentTimeMillis(); + if ( (currentTime - instance->m_lastUpdate) > (UPDATE_FREQUENCY / 4) ) + { + instance->updatePlayer(instance->m_nextPad); + instance->m_nextPad = ++instance->m_nextPad % MAX_LOCAL_PLAYERS; + instance->m_lastUpdate = currentTime; + } +} + +GameProgress::GameProgress() +{ + m_nextPad = 0; + m_lastUpdate = 0; +} + +void GameProgress::updatePlayer(int iPad) +{ + if ( ProfileManager.IsGuest(iPad) || !ProfileManager.IsSignedInLive(iPad) ) return; + + PlayerUID uid; + ProfileManager.GetXUID(iPad, &uid, true); + + WXS::User^ user = ProfileManager.GetUser(iPad); + + if (user == nullptr) return; + + MXS::XboxLiveContext ^xlc = ref new MXS::XboxLiveContext(user); + + // Get these while they are still valid. + LPCGUID playerSession = DurangoStats::getPlayerSession(); + + CC::create_task( + xlc->AchievementService->GetAchievementsForTitleIdAsync( + ref new Platform::String(uid.toString().c_str()), // Xuid + 0x149E11AE, // TitleId + MXSA::AchievementType::Persistent, // Use regular achievements (not challenges) + false, // Unlocked only + MXSA::AchievementOrderBy::UnlockTime, // Order (we don't really care) + 0, // skipItems (start index) + 200 // MaxItems + ) + ).then( [this,iPad,uid,playerSession] (CC::task<MXSA::AchievementsResult^> resultTask) + { + try + { + int achievementsUnlocked = 0; + + MXSA::AchievementsResult^ result = resultTask.get(); + if(result) + { + for (unsigned int i = 0, iMax = result->Items->Size; i < iMax; i++) + { + MXSA::Achievement^ ach = result->Items->GetAt(i); + if (ach->ProgressState == MXSA::AchievementProgressState::Achieved) + achievementsUnlocked++; + } + + float gameprogress; + if (EventWriteGameProgress( + uid.toString().c_str(), + playerSession, + gameprogress = calcGameProgress(achievementsUnlocked) ) + == 0) + { + app.DebugPrintf("<%ls> GameProgress(%.1f)\n", uid.toString().c_str(), gameprogress); + } + } + } + catch (Platform::Exception ^ex) + { + app.DebugPrintf("GameProgress:: Error, couldn't contact the achievments service (?): %ls", ex->Message->Data()); + } + }); + +} + +float GameProgress::calcGameProgress(int achievementsUnlocked) +{ + return (float) achievementsUnlocked / 0.60f; +}
\ No newline at end of file |
