From 60350635b657af2a03e56b5903295f554d746cb2 Mon Sep 17 00:00:00 2001 From: LillyJadeKatrin Date: Fri, 2 Jun 2023 23:38:33 -0400 Subject: [PATCH 1/3] Fixed Rich Presence bugs Refactored the Rich Presence two-minute trigger to clean it up and fix it. --- Source/Core/Core/AchievementManager.cpp | 12 +++++++++--- Source/Core/Core/AchievementManager.h | 3 ++- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/Source/Core/Core/AchievementManager.cpp b/Source/Core/Core/AchievementManager.cpp index 544af23368..b357e37466 100644 --- a/Source/Core/Core/AchievementManager.cpp +++ b/Source/Core/Core/AchievementManager.cpp @@ -176,6 +176,8 @@ void AchievementManager::LoadGameByFilenameAsync(const std::string& iso_path, } ActivateDeactivateLeaderboards(); ActivateDeactivateRichPresence(); + // Reset this to zero so that RP immediately triggers on the first frame + m_last_ping_time = 0; callback(fetch_game_data_response); }); @@ -255,9 +257,13 @@ void AchievementManager::DoFrame() }); if (!m_system) return; - u64 current_time = m_system->GetCoreTiming().GetTicks(); - if (current_time - m_last_ping_time > SystemTimers::GetTicksPerSecond() * 120) - m_queue.EmplaceItem([this] { PingRichPresence(GenerateRichPresence()); }); + time_t current_time = std::time(nullptr); + if (difftime(current_time, m_last_ping_time) > 120) + { + RichPresence rp = GenerateRichPresence(); + m_queue.EmplaceItem([this, rp] { PingRichPresence(rp); }); + m_last_ping_time = current_time; + } } u32 AchievementManager::MemoryPeeker(u32 address, u32 num_bytes, void* ud) diff --git a/Source/Core/Core/AchievementManager.h b/Source/Core/Core/AchievementManager.h index 8e01b9220e..f35cd5f659 100644 --- a/Source/Core/Core/AchievementManager.h +++ b/Source/Core/Core/AchievementManager.h @@ -5,6 +5,7 @@ #ifdef USE_RETRO_ACHIEVEMENTS #include +#include #include #include #include @@ -109,7 +110,7 @@ private: u32 m_game_id = 0; rc_api_fetch_game_data_response_t m_game_data{}; bool m_is_game_loaded = false; - u64 m_last_ping_time = 0; + time_t m_last_ping_time = 0; struct UnlockStatus { From 32f7873ee6ebadc65a7f93f9bae0ba52488ed483 Mon Sep 17 00:00:00 2001 From: LillyJadeKatrin Date: Fri, 2 Jun 2023 23:38:57 -0400 Subject: [PATCH 2/3] Added missing Leaderboard Canceled event --- Source/Core/Core/AchievementManager.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Source/Core/Core/AchievementManager.cpp b/Source/Core/Core/AchievementManager.cpp index b357e37466..1a05af90bc 100644 --- a/Source/Core/Core/AchievementManager.cpp +++ b/Source/Core/Core/AchievementManager.cpp @@ -304,6 +304,9 @@ void AchievementManager::AchievementEventHandler(const rc_runtime_event_t* runti case RC_RUNTIME_EVENT_LBOARD_STARTED: HandleLeaderboardStartedEvent(runtime_event); break; + case RC_RUNTIME_EVENT_LBOARD_CANCELED: + HandleLeaderboardCanceledEvent(runtime_event); + break; case RC_RUNTIME_EVENT_LBOARD_TRIGGERED: HandleLeaderboardTriggeredEvent(runtime_event); break; From e2d0ff718cde237199e754d9421a559b319973d6 Mon Sep 17 00:00:00 2001 From: LillyJadeKatrin Date: Thu, 1 Jun 2023 22:01:54 -0400 Subject: [PATCH 3/3] Fixed Missing DoFrame Call Somewhere in the process of getting the memory peeking right for achievements, the AchievementManager call to DoFrame went missing. This restores it properly. --- Source/Core/Core/Core.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Source/Core/Core/Core.cpp b/Source/Core/Core/Core.cpp index 1e940d1fed..514863b5f8 100644 --- a/Source/Core/Core/Core.cpp +++ b/Source/Core/Core/Core.cpp @@ -900,6 +900,10 @@ void Callback_NewField(Core::System& system) CallOnStateChangedCallbacks(Core::GetState()); } } + +#ifdef USE_RETRO_ACHIEVEMENTS + AchievementManager::GetInstance()->DoFrame(); +#endif // USE_RETRO_ACHIEVEMENTS } void UpdateTitle()