From 263e91b014ed3dc4e75b4f1fe23bd0388f23fea2 Mon Sep 17 00:00:00 2001 From: Adrian <78108584+AdrianCassar@users.noreply.github.com> Date: Tue, 20 Jan 2026 01:30:41 +0000 Subject: [PATCH] [XAM] Fixed XamUserCreateAchievementEnumerator starting index usage Fixed Vancouver 2010 spamming XamUserCreateAchievementEnumerator --- src/xenia/kernel/xam/xam_user.cc | 30 +++++++++++++++++++----------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/src/xenia/kernel/xam/xam_user.cc b/src/xenia/kernel/xam/xam_user.cc index 84a51b9b6..1ecfe7771 100644 --- a/src/xenia/kernel/xam/xam_user.cc +++ b/src/xenia/kernel/xam/xam_user.cc @@ -7,6 +7,8 @@ ****************************************************************************** */ +#include + #include "xenia/base/logging.h" #include "xenia/kernel/kernel_state.h" #include "xenia/kernel/util/shim_utils.h" @@ -593,20 +595,26 @@ dword_result_t XamUserCreateAchievementEnumerator_entry( kernel_state()->achievement_manager()->GetTitleAchievements( requester_xuid, title_id_); - if (!user_title_achievements.empty()) { - for (const auto& entry : user_title_achievements) { - auto unlock_time = X_FILETIME(); - if (entry.IsUnlocked() && entry.unlock_time.is_valid()) { - unlock_time = entry.unlock_time; - } + const auto requested_achievements = user_title_achievements | + std::views::drop(offset) | + std::views::take(count); - auto item = AchievementDetails( - entry.achievement_id, entry.achievement_name.c_str(), - entry.unlocked_description.c_str(), entry.locked_description.c_str(), - entry.image_id, entry.gamerscore, unlock_time, entry.flags); + if (requested_achievements.empty()) { + return X_ERROR_INVALID_PARAMETER; + } - e->AppendItem(item); + for (const auto& entry : requested_achievements) { + auto unlock_time = X_FILETIME(); + if (entry.IsUnlocked() && entry.unlock_time.is_valid()) { + unlock_time = entry.unlock_time; } + + auto item = AchievementDetails( + entry.achievement_id, entry.achievement_name.c_str(), + entry.unlocked_description.c_str(), entry.locked_description.c_str(), + entry.image_id, entry.gamerscore, unlock_time, entry.flags); + + e->AppendItem(item); } *handle_ptr = e->handle();