Files
MinecraftConsoles/Minecraft.Client/Durango/Leaderboards/GameProgress.cpp
Loki Rautio 087b7e7abf Revert "Project modernization (#630)"
This code was not tested and breaks in Release builds, reverting to restore
functionality of the nightly. All in-game menus do not work and generating
a world crashes.

This reverts commit a9be52c41a.
2026-03-07 21:12:22 -06:00

107 lines
2.8 KiB
C++

#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;
}