mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-02-04 03:46:42 +01:00
Merge pull request #12028 from LillyJadeKatrin/retroachievements-bugfix
RetroAchievements - Add Rich Presence to Achievement Dialog Header
This commit is contained in:
commit
3b5b9e0fc0
@ -290,9 +290,11 @@ void AchievementManager::DoFrame()
|
|||||||
time_t current_time = std::time(nullptr);
|
time_t current_time = std::time(nullptr);
|
||||||
if (difftime(current_time, m_last_ping_time) > 120)
|
if (difftime(current_time, m_last_ping_time) > 120)
|
||||||
{
|
{
|
||||||
RichPresence rp = GenerateRichPresence();
|
GenerateRichPresence();
|
||||||
m_queue.EmplaceItem([this, rp] { PingRichPresence(rp); });
|
m_queue.EmplaceItem([this] { PingRichPresence(m_rich_presence); });
|
||||||
m_last_ping_time = current_time;
|
m_last_ping_time = current_time;
|
||||||
|
if (m_update_callback)
|
||||||
|
m_update_callback();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -305,17 +307,17 @@ u32 AchievementManager::MemoryPeeker(u32 address, u32 num_bytes, void* ud)
|
|||||||
{
|
{
|
||||||
case 1:
|
case 1:
|
||||||
return m_system->GetMMU()
|
return m_system->GetMMU()
|
||||||
.HostTryReadU8(threadguard, address)
|
.HostTryReadU8(threadguard, address, PowerPC::RequestedAddressSpace::Physical)
|
||||||
.value_or(PowerPC::ReadResult<u8>(false, 0u))
|
.value_or(PowerPC::ReadResult<u8>(false, 0u))
|
||||||
.value;
|
.value;
|
||||||
case 2:
|
case 2:
|
||||||
return m_system->GetMMU()
|
return m_system->GetMMU()
|
||||||
.HostTryReadU16(threadguard, address)
|
.HostTryReadU16(threadguard, address, PowerPC::RequestedAddressSpace::Physical)
|
||||||
.value_or(PowerPC::ReadResult<u16>(false, 0u))
|
.value_or(PowerPC::ReadResult<u16>(false, 0u))
|
||||||
.value;
|
.value;
|
||||||
case 4:
|
case 4:
|
||||||
return m_system->GetMMU()
|
return m_system->GetMMU()
|
||||||
.HostTryReadU32(threadguard, address)
|
.HostTryReadU32(threadguard, address, PowerPC::RequestedAddressSpace::Physical)
|
||||||
.value_or(PowerPC::ReadResult<u32>(false, 0u))
|
.value_or(PowerPC::ReadResult<u32>(false, 0u))
|
||||||
.value;
|
.value;
|
||||||
default:
|
default:
|
||||||
@ -411,6 +413,13 @@ void AchievementManager::GetAchievementProgress(AchievementId achievement_id, u3
|
|||||||
rc_runtime_get_achievement_measured(&m_runtime, achievement_id, value, target);
|
rc_runtime_get_achievement_measured(&m_runtime, achievement_id, value, target);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AchievementManager::RichPresence AchievementManager::GetRichPresence()
|
||||||
|
{
|
||||||
|
std::lock_guard lg{m_lock};
|
||||||
|
RichPresence rich_presence = m_rich_presence;
|
||||||
|
return rich_presence;
|
||||||
|
}
|
||||||
|
|
||||||
void AchievementManager::CloseGame()
|
void AchievementManager::CloseGame()
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
@ -585,18 +594,17 @@ void AchievementManager::ActivateDeactivateAchievement(AchievementId id, bool en
|
|||||||
rc_runtime_deactivate_achievement(&m_runtime, id);
|
rc_runtime_deactivate_achievement(&m_runtime, id);
|
||||||
}
|
}
|
||||||
|
|
||||||
AchievementManager::RichPresence AchievementManager::GenerateRichPresence()
|
void AchievementManager::GenerateRichPresence()
|
||||||
{
|
{
|
||||||
RichPresence rp_buffer;
|
|
||||||
Core::RunAsCPUThread([&] {
|
Core::RunAsCPUThread([&] {
|
||||||
|
std::lock_guard lg{m_lock};
|
||||||
rc_runtime_get_richpresence(
|
rc_runtime_get_richpresence(
|
||||||
&m_runtime, rp_buffer.data(), RP_SIZE,
|
&m_runtime, m_rich_presence.data(), RP_SIZE,
|
||||||
[](unsigned address, unsigned num_bytes, void* ud) {
|
[](unsigned address, unsigned num_bytes, void* ud) {
|
||||||
return static_cast<AchievementManager*>(ud)->MemoryPeeker(address, num_bytes, ud);
|
return static_cast<AchievementManager*>(ud)->MemoryPeeker(address, num_bytes, ud);
|
||||||
},
|
},
|
||||||
this, nullptr);
|
this, nullptr);
|
||||||
});
|
});
|
||||||
return rp_buffer;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
AchievementManager::ResponseType AchievementManager::AwardAchievement(AchievementId achievement_id)
|
AchievementManager::ResponseType AchievementManager::AwardAchievement(AchievementId achievement_id)
|
||||||
|
@ -94,6 +94,7 @@ public:
|
|||||||
rc_api_fetch_game_data_response_t* GetGameData();
|
rc_api_fetch_game_data_response_t* GetGameData();
|
||||||
UnlockStatus GetUnlockStatus(AchievementId achievement_id) const;
|
UnlockStatus GetUnlockStatus(AchievementId achievement_id) const;
|
||||||
void GetAchievementProgress(AchievementId achievement_id, u32* value, u32* target);
|
void GetAchievementProgress(AchievementId achievement_id, u32* value, u32* target);
|
||||||
|
RichPresence GetRichPresence();
|
||||||
|
|
||||||
void CloseGame();
|
void CloseGame();
|
||||||
void Logout();
|
void Logout();
|
||||||
@ -111,7 +112,7 @@ private:
|
|||||||
ResponseType FetchUnlockData(bool hardcore);
|
ResponseType FetchUnlockData(bool hardcore);
|
||||||
|
|
||||||
void ActivateDeactivateAchievement(AchievementId id, bool enabled, bool unofficial, bool encore);
|
void ActivateDeactivateAchievement(AchievementId id, bool enabled, bool unofficial, bool encore);
|
||||||
RichPresence GenerateRichPresence();
|
void GenerateRichPresence();
|
||||||
|
|
||||||
ResponseType AwardAchievement(AchievementId achievement_id);
|
ResponseType AwardAchievement(AchievementId achievement_id);
|
||||||
ResponseType SubmitLeaderboard(AchievementId leaderboard_id, int value);
|
ResponseType SubmitLeaderboard(AchievementId leaderboard_id, int value);
|
||||||
@ -137,6 +138,7 @@ private:
|
|||||||
u32 m_game_id = 0;
|
u32 m_game_id = 0;
|
||||||
rc_api_fetch_game_data_response_t m_game_data{};
|
rc_api_fetch_game_data_response_t m_game_data{};
|
||||||
bool m_is_game_loaded = false;
|
bool m_is_game_loaded = false;
|
||||||
|
RichPresence m_rich_presence;
|
||||||
time_t m_last_ping_time = 0;
|
time_t m_last_ping_time = 0;
|
||||||
|
|
||||||
std::unordered_map<AchievementId, UnlockStatus> m_unlock_map;
|
std::unordered_map<AchievementId, UnlockStatus> m_unlock_map;
|
||||||
|
@ -20,6 +20,7 @@
|
|||||||
#include <rcheevos/include/rc_runtime.h>
|
#include <rcheevos/include/rc_runtime.h>
|
||||||
|
|
||||||
#include "Core/AchievementManager.h"
|
#include "Core/AchievementManager.h"
|
||||||
|
#include "Core/Config/AchievementSettings.h"
|
||||||
#include "Core/Core.h"
|
#include "Core/Core.h"
|
||||||
|
|
||||||
#include "DolphinQt/QtUtils/ModalMessageBox.h"
|
#include "DolphinQt/QtUtils/ModalMessageBox.h"
|
||||||
@ -101,11 +102,9 @@ void AchievementHeaderWidget::UpdateData()
|
|||||||
m_game_progress_soft->setValue(point_spread.hard_unlocks);
|
m_game_progress_soft->setValue(point_spread.hard_unlocks);
|
||||||
m_game_progress_soft->setRange(0, point_spread.total_count);
|
m_game_progress_soft->setRange(0, point_spread.total_count);
|
||||||
m_game_progress_soft->setValue(point_spread.hard_unlocks + point_spread.soft_unlocks);
|
m_game_progress_soft->setValue(point_spread.hard_unlocks + point_spread.soft_unlocks);
|
||||||
// TODO: RP needs a minor refactor to work here, will be a future PR
|
m_rich_presence->setText(
|
||||||
// m_rich_presence->setText(QString::fromStdString(AchievementManager::GetInstance()->GenerateRichPresence()));
|
QString::fromUtf8(AchievementManager::GetInstance()->GetRichPresence().data()));
|
||||||
// m_rich_presence->setVisible(Config::Get(Config::RA_RICH_PRESENCE_ENABLED));
|
m_rich_presence->setVisible(Config::Get(Config::RA_RICH_PRESENCE_ENABLED));
|
||||||
m_rich_presence->setText(QString{});
|
|
||||||
m_rich_presence->setVisible(false);
|
|
||||||
|
|
||||||
m_user_box->setVisible(false);
|
m_user_box->setVisible(false);
|
||||||
m_game_box->setVisible(true);
|
m_game_box->setVisible(true);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user