[Kernel] AchievementManager: Added Interface for attaching custom implementations

This commit is contained in:
Gliniak
2024-12-10 19:13:47 +01:00
committed by Radosław Gliński
parent 0368e06b71
commit e93373660f
10 changed files with 423 additions and 82 deletions

View File

@@ -609,32 +609,35 @@ dword_result_t XamUserCreateAchievementEnumerator_entry(
return result;
}
const auto user = kernel_state()->xam_state()->GetUserProfile(user_index);
if (!user) {
return X_ERROR_INVALID_PARAMETER;
}
uint64_t requester_xuid = user->xuid();
if (xuid) {
requester_xuid = xuid;
}
const util::XdbfGameData db = kernel_state()->title_xdbf();
uint32_t title_id_ = title_id ? title_id : kernel_state()->title_id();
if (db.is_valid()) {
const XLanguage language =
db.GetExistingLanguage(static_cast<XLanguage>(cvars::user_language));
const std::vector<util::XdbfAchievementTableEntry> achievement_list =
db.GetAchievements();
for (const util::XdbfAchievementTableEntry& entry : achievement_list) {
auto is_unlocked =
kernel_state()->achievement_manager()->IsAchievementUnlocked(
entry.id);
auto unlock_time =
kernel_state()->achievement_manager()->GetAchievementUnlockTime(
entry.id);
const auto user_title_achievements =
kernel_state()->achievement_manager()->GetTitleAchievements(
requester_xuid, title_id_);
if (user_title_achievements) {
for (const auto& entry : *user_title_achievements) {
auto item = XAchievementEnumerator::AchievementDetails{
entry.id,
xe::to_utf16(db.GetStringTableEntry(language, entry.label_id)),
xe::to_utf16(db.GetStringTableEntry(language, entry.description_id)),
xe::to_utf16(db.GetStringTableEntry(language, entry.unachieved_id)),
entry.achievement_id,
xe::load_and_swap<std::u16string>(entry.achievement_name.c_str()),
xe::load_and_swap<std::u16string>(entry.unlocked_description.c_str()),
xe::load_and_swap<std::u16string>(entry.locked_description.c_str()),
entry.image_id,
entry.gamerscore,
(uint32_t)(unlock_time << 31),
(uint32_t)unlock_time,
is_unlocked ? entry.flags | 0x20000 : entry.flags};
entry.unlock_time.high_part,
entry.unlock_time.low_part,
entry.flags};
e->AppendItem(item);
}