From 998c221d8012a7888adfd04bf184f90f2288f725 Mon Sep 17 00:00:00 2001 From: Diavolo Date: Sun, 26 Jun 2022 14:58:45 +0200 Subject: [PATCH] [Dvars] Add flag to protect archive dvars --- README.md | 1 + src/Components/Modules/Dvar.cpp | 21 +++++++++++++++++++++ src/Components/Modules/Dvar.hpp | 1 + 3 files changed, 23 insertions(+) diff --git a/README.md b/README.md index e13fbcc9..16ebf5cd 100644 --- a/README.md +++ b/README.md @@ -42,6 +42,7 @@ | `-version` | Print IW4x build info on startup. | | `-zonebuilder` | Start the interactive zonebuilder tool console instead of starting the game. | | `-nosteam` | Disable friends feature and do not update Steam about the game's current status just like an invisible mode. | +| `-protect-saved-dvars` | Block the server from modifying saved/archive dvars. | ## Disclaimer diff --git a/src/Components/Modules/Dvar.cpp b/src/Components/Modules/Dvar.cpp index bb29d9fb..5a8fb845 100644 --- a/src/Components/Modules/Dvar.cpp +++ b/src/Components/Modules/Dvar.cpp @@ -283,6 +283,18 @@ namespace Components Game::Dvar_SetFromStringByNameFromSource(dvarName, string, Game::DvarSetSource::DVAR_SOURCE_EXTERNAL); } + bool Dvar::AreArchiveDvarsProtected() + { + static std::optional flag; + + if (!flag.has_value()) + { + flag.emplace(Flags::HasFlag("protect-saved-dvars")); + } + + return flag.value(); + } + void Dvar::SaveArchiveDvar(const Game::dvar_t* var) { if (!Utils::IO::FileExists(Dvar::ArchiveDvarPath)) @@ -301,6 +313,15 @@ namespace Components const auto* dvar = Game::Dvar_FindVar(dvarName); if (dvar != nullptr && dvar->flags & Game::dvar_flag::DVAR_ARCHIVE) { + if (Dvar::AreArchiveDvarsProtected()) + { + Logger::Print(Game::CON_CHANNEL_CONSOLEONLY, "Not allowing server to override saved dvar '{}'\n", dvarName); + return; + } + +#ifdef DEBUG_DVARS + Logger::Print(Game::CON_CHANNEL_CONSOLEONLY, "Server is overriding saved dvar '{}'\n", dvarName); +#endif Dvar::SaveArchiveDvar(dvar); } diff --git a/src/Components/Modules/Dvar.hpp b/src/Components/Modules/Dvar.hpp index 3a184db0..fb51fbcb 100644 --- a/src/Components/Modules/Dvar.hpp +++ b/src/Components/Modules/Dvar.hpp @@ -57,6 +57,7 @@ namespace Components static void SetFromStringByNameExternal(const char* dvar, const char* value); static void SetFromStringByNameSafeExternal(const char* dvar, const char* value); + static bool AreArchiveDvarsProtected(); static void SaveArchiveDvar(const Game::dvar_t* var); static void DvarSetFromStringByNameStub(const char* dvarName, const char* value); };