[XAM] Fixed enumeration of achievements once again
This commit is contained in:
committed by
Radosław Gliński
parent
2ba82072fc
commit
603355ae5b
@@ -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;
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
Reference in New Issue
Block a user