[Kernel] AchievementManager: Added Interface for attaching custom implementations
This commit is contained in:
committed by
Radosław Gliński
parent
0368e06b71
commit
e93373660f
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user