[XAM] Fixed enumeration of achievements once again

This commit is contained in:
Gliniak
2026-01-27 22:15:34 +01:00
committed by Radosław Gliński
parent 2ba82072fc
commit 603355ae5b
3 changed files with 9 additions and 13 deletions

View File

@@ -568,11 +568,11 @@ dword_result_t XamUserCreateAchievementEnumerator_entry(
} }
if (buffer_size_ptr) { if (buffer_size_ptr) {
*buffer_size_ptr = static_cast<uint32_t>(entry_size) * count; *buffer_size_ptr = static_cast<uint32_t>(entry_size * count);
} }
auto e = object_ref<XAchievementEnumerator>( auto e = object_ref<XAchievementEnumerator>(
new XAchievementEnumerator(kernel_state(), count, flags)); new XAchievementEnumerator(kernel_state(), count, offset, flags));
auto result = e->Initialize(user_index, 0xFB, 0xB000A, 0xB000B, 0); auto result = e->Initialize(user_index, 0xFB, 0xB000A, 0xB000B, 0);
if (XFAILED(result)) { if (XFAILED(result)) {
return result; return result;
@@ -595,15 +595,11 @@ dword_result_t XamUserCreateAchievementEnumerator_entry(
kernel_state()->achievement_manager()->GetTitleAchievements( kernel_state()->achievement_manager()->GetTitleAchievements(
requester_xuid, title_id_); requester_xuid, title_id_);
const auto requested_achievements = user_title_achievements | if (user_title_achievements.empty()) {
std::views::drop(offset) |
std::views::take(count);
if (requested_achievements.empty()) {
return X_ERROR_INVALID_PARAMETER; return X_ERROR_INVALID_PARAMETER;
} }
for (const auto& entry : requested_achievements) { for (const auto& entry : user_title_achievements) {
auto unlock_time = X_FILETIME(); auto unlock_time = X_FILETIME();
if (entry.IsUnlocked() && entry.unlock_time.is_valid()) { if (entry.IsUnlocked() && entry.unlock_time.is_valid()) {
unlock_time = entry.unlock_time; unlock_time = entry.unlock_time;

View File

@@ -83,13 +83,12 @@ uint32_t XStaticUntypedEnumerator::WriteItems(uint8_t* buffer_data,
uint32_t XAchievementEnumerator::WriteItems(uint8_t* buffer_data, uint32_t XAchievementEnumerator::WriteItems(uint8_t* buffer_data,
uint32_t buffer_size, uint32_t buffer_size,
uint32_t* written_count) { uint32_t* written_count) {
size_t count = std::min(items_.size() - current_item_, items_per_enumerate()); if (items_.size() - current_item_ <= 0) {
if (!count) {
return X_ERROR_NO_MORE_FILES; return X_ERROR_NO_MORE_FILES;
} }
size_t size = count * item_size(); const size_t count =
std::min(items_.size() - current_item_, items_per_enumerate());
auto details = reinterpret_cast<xam::X_ACHIEVEMENT_DETAILS*>(buffer_data); auto details = reinterpret_cast<xam::X_ACHIEVEMENT_DETAILS*>(buffer_data);
size_t string_offset = size_t string_offset =
items_per_enumerate() * sizeof(xam::X_ACHIEVEMENT_DETAILS); items_per_enumerate() * sizeof(xam::X_ACHIEVEMENT_DETAILS);

View File

@@ -139,12 +139,13 @@ class XStaticEnumerator : public XStaticUntypedEnumerator {
class XAchievementEnumerator : public XEnumerator { class XAchievementEnumerator : public XEnumerator {
public: public:
XAchievementEnumerator(KernelState* kernel_state, size_t items_per_enumerate, XAchievementEnumerator(KernelState* kernel_state, size_t items_per_enumerate,
uint32_t flags) size_t enumeration_offset, uint32_t flags)
: XEnumerator( : XEnumerator(
kernel_state, items_per_enumerate, kernel_state, items_per_enumerate,
sizeof(xam::X_ACHIEVEMENT_DETAILS) + sizeof(xam::X_ACHIEVEMENT_DETAILS) +
(!!(flags & 7) ? xam::X_ACHIEVEMENT_DETAILS::kStringBufferSize (!!(flags & 7) ? xam::X_ACHIEVEMENT_DETAILS::kStringBufferSize
: 0)), : 0)),
current_item_(enumeration_offset),
flags_(flags) {} flags_(flags) {}
void AppendItem(xam::AchievementDetails item) { void AppendItem(xam::AchievementDetails item) {