1
0
Fork 0
mirror of https://github.com/Detanup01/gbe_fork.git synced 2025-03-28 14:56:24 +01:00

properly implement Steam_User_Stats::ResetAllStats()

This commit is contained in:
otavepto 2024-04-01 02:37:17 +02:00 committed by otavepto
parent 51197c5348
commit 0672139f46
2 changed files with 117 additions and 6 deletions

View file

@ -131,6 +131,7 @@ private:
void request_user_leaderboard_entry(const Steam_Leaderboard &board, const CSteamID &steamid);
// change stats/achievements without sending back to server
bool clear_stats_internal();
InternalSetResult<int32> set_stat_internal( const char *pchName, int32 nData );
InternalSetResult<std::pair<GameServerStats_Messages::StatInfo::Stat_Type, float>> set_stat_internal( const char *pchName, float fData );
InternalSetResult<std::pair<GameServerStats_Messages::StatInfo::Stat_Type, float>> update_avg_rate_stat_internal( const char *pchName, float flCountThisSession, double dSessionLength );

View file

@ -330,6 +330,78 @@ void Steam_User_Stats::request_user_leaderboard_entry(const Steam_Leaderboard &b
// change stats/achievements without sending back to server
bool Steam_User_Stats::clear_stats_internal()
{
PRINT_DEBUG("Steam_User_Stats::clear_stats_internal\n");
std::lock_guard<std::recursive_mutex> lock(global_mutex);
bool notify_server = false;
stats_cache_int.clear();
stats_cache_float.clear();
for (const auto &stat : settings->getStats()) {
std::string stat_name(common_helpers::ascii_to_lowercase(stat.first));
switch (stat.second.type)
{
case GameServerStats_Messages::StatInfo::STAT_TYPE_INT: {
auto data = stat.second.default_value_int;
bool needs_disk_write = false;
auto it_res = stats_cache_int.find(stat_name);
if (stats_cache_int.end() == it_res || it_res->second != data) {
needs_disk_write = true;
notify_server = true;
}
stats_cache_int[stat_name] = data;
auto stat_trigger = achievement_stat_trigger.find(stat_name);
if (stat_trigger != achievement_stat_trigger.end()) {
for (auto &t : stat_trigger->second) {
if (t.check_triggered(data)) {
set_achievement_internal(t.name.c_str());
}
}
}
if (needs_disk_write) local_storage->store_data(Local_Storage::stats_storage_folder, stat_name, (char *)&data, sizeof(data));
}
break;
case GameServerStats_Messages::StatInfo::STAT_TYPE_FLOAT:
case GameServerStats_Messages::StatInfo::STAT_TYPE_AVGRATE: {
auto data = stat.second.default_value_float;
bool needs_disk_write = false;
auto it_res = stats_cache_float.find(stat_name);
if (stats_cache_float.end() == it_res || it_res->second != data) {
needs_disk_write = true;
notify_server = true;
}
stats_cache_float[stat_name] = data;
auto stat_trigger = achievement_stat_trigger.find(stat_name);
if (stat_trigger != achievement_stat_trigger.end()) {
for (auto &t : stat_trigger->second) {
if (t.check_triggered(data)) {
set_achievement_internal(t.name.c_str());
}
}
}
if (needs_disk_write) local_storage->store_data(Local_Storage::stats_storage_folder, stat_name, (char *)&data, sizeof(data));
}
break;
default: PRINT_DEBUG("Steam_User_Stats::clear_stats_internal unhandled type %i\n", (int)stat.second.type); break;
}
}
return notify_server;
}
Steam_User_Stats::InternalSetResult<int32> Steam_User_Stats::set_stat_internal( const char *pchName, int32 nData )
{
PRINT_DEBUG("Steam_User_Stats::set_stat_internal <int32> '%s' = %i\n", pchName, nData);
@ -1160,14 +1232,52 @@ bool Steam_User_Stats::ResetAllStats( bool bAchievementsToo )
{
PRINT_DEBUG("Steam_User_Stats::ResetAllStats\n");
std::lock_guard<std::recursive_mutex> lock(global_mutex);
//TODO
if (bAchievementsToo) {
std::for_each(user_achievements.begin(), user_achievements.end(), [](nlohmann::json& v) {
v["earned"] = false;
v["earned_time"] = 0;
});
clear_stats_internal();
if (!settings->disable_sharing_stats_with_gameserver) {
for (const auto &stat : settings->getStats()) {
std::string stat_name(common_helpers::ascii_to_lowercase(stat.first));
auto &new_stat = (*pending_server_updates.mutable_user_stats())[stat_name];
new_stat.set_stat_type(stat.second.type);
switch (stat.second.type)
{
case GameServerStats_Messages::StatInfo::STAT_TYPE_INT:
new_stat.set_value_int(stat.second.default_value_int);
break;
case GameServerStats_Messages::StatInfo::STAT_TYPE_AVGRATE:
case GameServerStats_Messages::StatInfo::STAT_TYPE_FLOAT:
new_stat.set_value_float(stat.second.default_value_float);
break;
default: PRINT_DEBUG("Steam_User_Stats::ResetAllStats unhandled type %i\n", (int)stat.second.type); break;
}
}
}
if (bAchievementsToo) {
bool needs_disk_write = false;
for (auto &item : user_achievements) {
// assume "earned" is true in case the json obj exists, but the key is absent
if (item.value("earned", true) == true) needs_disk_write = true;
item["earned"] = false;
item["earned_time"] = 0;
}
if (needs_disk_write) save_achievements();
if (!settings->disable_sharing_stats_with_gameserver) {
for (const auto &item : user_achievements.items()) {
auto &new_ach = (*pending_server_updates.mutable_user_achievements())[item.key()];
new_ach.set_achieved(false);
}
}
}
if (!settings->disable_sharing_stats_with_gameserver && settings->immediate_gameserver_stats) send_updated_stats();
return true;
}