diff --git a/src/Features/AutoSubmit.cpp b/src/Features/AutoSubmit.cpp index 2c1f4bd6..a1206c97 100644 --- a/src/Features/AutoSubmit.cpp +++ b/src/Features/AutoSubmit.cpp @@ -1,6 +1,7 @@ #include "AutoSubmit.hpp" #include "../Games/Portal2.hpp" +#include "../Modules/Client.hpp" #include "Cheats.hpp" #include "Command.hpp" #include "Event.hpp" @@ -29,6 +30,7 @@ #define OLD_API_KEY_FILE "autosubmit_key.txt" bool AutoSubmit::g_cheated = false; +int AutoSubmit::g_paused = 0; std::string AutoSubmit::g_partner_name = ""; ON_EVENT(SESSION_START) { @@ -47,10 +49,12 @@ ON_INIT { ON_EVENT(SESSION_START) { AutoSubmit::g_cheated = sv_cheats.GetBool(); + AutoSubmit::g_paused = 0; } ON_EVENT(PRE_TICK) { if (sv_cheats.GetBool()) AutoSubmit::g_cheated = true; + if (engine->IsGamePaused() && SpeedrunTimer::IsRunning() && !client->g_leaderboardOpen) AutoSubmit::g_paused++; } static std::string g_api_base; @@ -581,6 +585,13 @@ void AutoSubmit::FinishRun(float final_time, const char *demopath, std::optional return; } + int allowedPauses = 0; + if (sar_disable_challenge_stats_hud.GetInt() != -1) allowedPauses = 1; + if (AutoSubmit::g_paused > allowedPauses && engine->GetCurrentMapName() == "sp_a1_wakeup") { + console->Print("Pause detected in Wakeup (pause abuse is not allowed in CM); not autosubmitting\nManually submit this demo if you believe this was a mistake\n"); + return; + } + #if defined(SAR_DEV_BUILD) console->Print("Dev SAR build; not autosubmitting\n"); return; diff --git a/src/Features/AutoSubmit.hpp b/src/Features/AutoSubmit.hpp index 77737631..fa008eab 100644 --- a/src/Features/AutoSubmit.hpp +++ b/src/Features/AutoSubmit.hpp @@ -6,6 +6,7 @@ namespace AutoSubmit { extern bool g_cheated; + extern int g_paused; extern std::string g_partner_name; void LoadApiKey(bool output_nonexist); diff --git a/src/Modules/Client.cpp b/src/Modules/Client.cpp index a4f5d0be..b4514608 100644 --- a/src/Modules/Client.cpp +++ b/src/Modules/Client.cpp @@ -350,18 +350,16 @@ DETOUR_T(const char *, Client::GetName) { return Client::GetName(thisptr); } -static bool g_leaderboardOpen = false; -static bool g_leaderboardWillClose = false; DETOUR_COMMAND(Client::openleaderboard) { Client::openleaderboard_callback(args); if (args.ArgC() == 2 && !strcmp(args[1], "4") && client->GetChallengeStatus() == CMStatus::CHALLENGE) { - g_leaderboardOpen = true; + client->g_leaderboardOpen = true; auto ticks = 6; if (sar_disable_challenge_stats_hud.GetInt() > 1) ticks = sar_disable_challenge_stats_hud.GetInt(); Scheduler::InHostTicks(ticks, []() { - if (sar.game->Is(SourceGame_Portal2) && sar_disable_challenge_stats_hud.GetInt() > 0 && (!engine->IsCoop() || engine->IsOrange() || g_leaderboardWillClose)) { - g_leaderboardWillClose = false; + if (sar.game->Is(SourceGame_Portal2) && sar_disable_challenge_stats_hud.GetInt() > 0 && (!engine->IsCoop() || engine->IsOrange() || client->g_leaderboardWillClose)) { + client->g_leaderboardWillClose = false; engine->ExecuteCommand("-leaderboard"); } }); @@ -466,7 +464,7 @@ ON_INIT { NetMessage::RegisterHandler(LEADERBOARD_MESSAGE_TYPE, +[](const void *data, size_t size) { // TODO: Investigate why this sometimes doesn't work - AMJ 2024-04-25 if (sar_disable_challenge_stats_hud_partner.GetBool()) { - g_leaderboardWillClose = true; + client->g_leaderboardWillClose = true; engine->ExecuteCommand("-leaderboard"); } }); } @@ -480,8 +478,8 @@ DETOUR_COMMAND(Client::closeleaderboard) { Client::closeleaderboard_callback(args); - if (g_leaderboardOpen) { - g_leaderboardOpen = false; + if (client->g_leaderboardOpen) { + client->g_leaderboardOpen = false; NetMessage::SendMsg(LEADERBOARD_MESSAGE_TYPE, 0, 0); } } diff --git a/src/Modules/Client.hpp b/src/Modules/Client.hpp index 516c730f..74f0b645 100644 --- a/src/Modules/Client.hpp +++ b/src/Modules/Client.hpp @@ -72,6 +72,9 @@ class Client : public Module { int *nNumSPChapters; int *nNumMPChapters; + bool g_leaderboardOpen = false; + bool g_leaderboardWillClose = false; + std::string lastLevelName; void **gamerules;