From e21bbc47868b9816a6d8ed2e3d671a394efac92e Mon Sep 17 00:00:00 2001 From: JoKeRZH429 <83122870+JoKeRZH429@users.noreply.github.com> Date: Wed, 12 Aug 2026 20:02:47 +0500 Subject: [PATCH] feat: accept monthly elo and display it in ui --- .../GameNetwork/GameSpy/PersistentStorageThread.h | 1 + .../GameSpy/Thread/PersistentStorageThread.cpp | 1 + .../GUI/GUICallbacks/Menus/PopupPlayerInfo.cpp | 14 +++++++++++++- .../GUI/GUICallbacks/Menus/WOLGameSetupMenu.cpp | 12 ++++++------ .../GUI/GUICallbacks/Menus/WOLLobbyMenu.cpp | 4 +++- .../GUI/GUICallbacks/Menus/WOLQuickMatchMenu.cpp | 2 +- .../OnlineServices_StatsInterface.cpp | 2 ++ 7 files changed, 27 insertions(+), 9 deletions(-) diff --git a/Core/GameEngine/Include/GameNetwork/GameSpy/PersistentStorageThread.h b/Core/GameEngine/Include/GameNetwork/GameSpy/PersistentStorageThread.h index 182d23f7b9d..37131ac8e52 100644 --- a/Core/GameEngine/Include/GameNetwork/GameSpy/PersistentStorageThread.h +++ b/Core/GameEngine/Include/GameNetwork/GameSpy/PersistentStorageThread.h @@ -45,6 +45,7 @@ class PSPlayerStats #if defined(GENERALS_ONLINE) // Extra data added in GO int elo_rating; + int monthly_elo_rating; int elo_num_matches; #endif diff --git a/Core/GameEngine/Source/GameNetwork/GameSpy/Thread/PersistentStorageThread.cpp b/Core/GameEngine/Source/GameNetwork/GameSpy/Thread/PersistentStorageThread.cpp index 3f12dbb3bd7..e182c150b54 100644 --- a/Core/GameEngine/Source/GameNetwork/GameSpy/Thread/PersistentStorageThread.cpp +++ b/Core/GameEngine/Source/GameNetwork/GameSpy/Thread/PersistentStorageThread.cpp @@ -340,6 +340,7 @@ PSPlayerStats::PSPlayerStats( const PSPlayerStats& other ) #if defined(GENERALS_ONLINE) elo_rating = other.elo_rating; elo_num_matches = other.elo_num_matches; + monthly_elo_rating = other.monthly_elo_rating; #endif locale = other.locale; gamesAsRandom = other.gamesAsRandom; diff --git a/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/PopupPlayerInfo.cpp b/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/PopupPlayerInfo.cpp index 4d4a9287c56..f1e2d38018a 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/PopupPlayerInfo.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/PopupPlayerInfo.cpp @@ -957,11 +957,23 @@ void PopulatePlayerInfoWindows( AsciiString parentWindowName ) uStr.format(L"%d", numLosses); GadgetStaticTextSetText(win, uStr); } +#if defined(GENERALS_ONLINE) + win = findWindow(parentWindow, parentWindowName, "StaticTextDisconnects"); + if (win) + { + uStr.format(L"Monthly Elo:"); + GadgetStaticTextSetText(win, uStr); + } +#endif win = findWindow(parentWindow, parentWindowName, "StaticTextDisconnectsValue"); if (win) { +#if defined(GENERALS_ONLINE) + uStr.format(L"%d", stats.elo_rating, stats.monthly_elo_rating); +#else uStr.format(L"%d", numDiscons); - GadgetStaticTextSetText(win, uStr); +#endif + GadgetStaticTextSetText(win, uStr); } win = findWindow(parentWindow, parentWindowName, "StaticTextBestStreakValue"); diff --git a/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/WOLGameSetupMenu.cpp b/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/WOLGameSetupMenu.cpp index 5f2c41c451c..3861888802f 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/WOLGameSetupMenu.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/WOLGameSetupMenu.cpp @@ -540,8 +540,8 @@ static void playerTooltip(GameWindow *window, if (localPlayerID == slot->m_userID) { // local user wont have a connection - playerInfo.format(L"\nElo Rating: %d (in %d matches)\nWins: %d\nLosses: %d\nDisconnects: %d\nFavorite Army: %s", - stats.elo_rating, stats.elo_num_matches, totalWins, totalLosses, totalDiscons, favoriteSide.str()); + playerInfo.format(L"\nOverall Elo Rating: %d (in %d matches)\nMonthly Elo Rating: %d\nWins: %d\nLosses: %d\nDisconnects: %d\nFavorite Army: %s", + stats.elo_rating, stats.elo_num_matches, stats.monthly_elo_rating, totalWins, totalLosses, totalDiscons, favoriteSide.str()); } else if (bIsConnected) { @@ -550,14 +550,14 @@ static void playerTooltip(GameWindow *window, if (connectionLatency >= 0) latencyStr.format(L"%d ms", connectionLatency); else latencyStr = L"Unknown"; if (connectionJitter >= 0) jitterStr.format(L"%d ms", connectionJitter); else jitterStr = L"Unknown"; if (connectionQualityPct >= 0) qualityStr.format(L"%d%%", connectionQualityPct); else qualityStr = L"Unknown"; - playerInfo.format(L"\nConnection State: Connected (%hs)\nConnection Score: %s\nLatency: %s\nJitter: %s\nReliability: %s\nRegion: %hs\nElo Rating: %d (in %d matches)\nWins: %d\nLosses: %d\nDisconnects: %d\nFavorite Army: %s", + playerInfo.format(L"\nConnection State: Connected (%hs)\nConnection Score: %s\nLatency: %s\nJitter: %s\nReliability: %s\nRegion: %hs\nOverall Elo Rating: %d (in %d matches)\nMonthly Elo Rating: %d\nWins: %d\nLosses: %d\nDisconnects: %d\nFavorite Army: %s", strConnectionType.c_str(), scoreStr.str(), latencyStr.str(), jitterStr.str(), qualityStr.str(), - member.region.c_str(), stats.elo_rating, stats.elo_num_matches, totalWins, totalLosses, totalDiscons, favoriteSide.str()); + member.region.c_str(), stats.elo_rating, stats.elo_num_matches, stats.monthly_elo_rating, totalWins, totalLosses, totalDiscons, favoriteSide.str()); } else { - playerInfo.format(L"\nConnection State: Connecting...\nRegion: %hs\nElo Rating: %d (in %d matches)\nWins: %d\nLosses: %d\nDisconnects: %d\nFavorite Army: %s", - member.region.c_str(), stats.elo_rating, stats.elo_num_matches, totalWins, totalLosses, totalDiscons, favoriteSide.str()); + playerInfo.format(L"\nConnection State: Connecting...\nRegion: %hs\nOverall Elo Rating: %d (in %d matches)\nMonthly Elo Rating: %d\nWins: %d\nLosses: %d\nDisconnects: %d\nFavorite Army: %s", + member.region.c_str(), stats.elo_rating, stats.elo_num_matches, stats.monthly_elo_rating, totalWins, totalLosses, totalDiscons, favoriteSide.str()); } #else playerInfo.format(L"\nLatency: %d ms\nWins: %d\nLosses: %d\nDisconnects: %d\nFavorite Army: %s", diff --git a/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/WOLLobbyMenu.cpp b/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/WOLLobbyMenu.cpp index ca7b05a95fe..aa2d7be2c20 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/WOLLobbyMenu.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/WOLLobbyMenu.cpp @@ -388,7 +388,9 @@ static void playerTooltip(GameWindow *window, // ELO data UnicodeString tmp; - tmp.format(L"\n\nElo Rating: %d (in %d matches)", stats.elo_rating, stats.elo_num_matches); + tmp.format(L"\n\nOverall Elo Rating: %d (in %d matches)", stats.elo_rating, stats.elo_num_matches); + tooltip.concat(tmp); + tmp.format(L"\nMonthly Elo Rating: %d", stats.monthly_elo_rating); tooltip.concat(tmp); Int rankPoints = CalculateRank(stats); Int rank = 0; diff --git a/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/WOLQuickMatchMenu.cpp b/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/WOLQuickMatchMenu.cpp index 12af0a5caee..bea1ddea001 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/WOLQuickMatchMenu.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameClient/GUI/GUICallbacks/Menus/WOLQuickMatchMenu.cpp @@ -1156,7 +1156,7 @@ void WOLQuickMatchMenuInit( WindowLayout *layout, void *userData ) if (bSuccess) { UnicodeString eloStr; - eloStr.format(L"Your current Elo rating is %d after %d match(es)", stats.elo_rating, stats.elo_num_matches); + eloStr.format(L"Your current Elo rating is %d (monthly: %d) after %d match(es)", stats.elo_rating, stats.monthly_elo_rating, stats.elo_num_matches); GadgetListBoxAddEntryText(quickmatchTextWindow, eloStr, GameMakeColor(255, 194, 25, 255), -1, -1); } }, EStatsRequestPolicy::BYPASS_CACHE_FORCE_REQUEST); diff --git a/GeneralsMD/Code/GameEngine/Source/GameNetwork/GeneralsOnline/OnlineServices_StatsInterface.cpp b/GeneralsMD/Code/GameEngine/Source/GameNetwork/GeneralsOnline/OnlineServices_StatsInterface.cpp index b64c5ca6745..b0fb746baba 100644 --- a/GeneralsMD/Code/GameEngine/Source/GameNetwork/GeneralsOnline/OnlineServices_StatsInterface.cpp +++ b/GeneralsMD/Code/GameEngine/Source/GameNetwork/GeneralsOnline/OnlineServices_StatsInterface.cpp @@ -150,6 +150,7 @@ void NGMP_OnlineServices_StatsInterface::findPlayerStatsByID(int64_t userID, std // GO extra data jsonObjectRoot["EloRating"].get_to(stats.elo_rating); jsonObjectRoot["EloMatches"].get_to(stats.elo_num_matches); + jsonObjectRoot["MonthlyEloRating"].get_to(stats.monthly_elo_rating); #define PROCESS_JSON_PER_GENERAL_RESULT(name) i = 0; for (const auto& iter : jsonObjectRoot[#name]) { iter.get_to(stats.##name[i++]); } PROCESS_JSON_PER_GENERAL_RESULT(wins); @@ -286,6 +287,7 @@ void NGMP_OnlineServices_StatsInterface::findPlayerStatsByBatch(std::vector