[Dvar]: Add argument to protect dvars (#823)

This commit is contained in:
Edo 2023-03-10 01:03:50 +00:00 committed by GitHub
parent 602f8e741e
commit d6c23efe68
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 56 additions and 8 deletions

View File

@ -298,8 +298,25 @@ namespace Components
return flag.value();
}
bool Dvar::IsSettingArchiveDvarsDisabled()
{
static std::optional<bool> flag;
if (!flag.has_value())
{
flag.emplace(Flags::HasFlag("protect-dvars"));
}
return flag.value();
}
void Dvar::DvarSetFromStringByName_Stub(const char* dvarName, const char* value)
{
if (IsSettingArchiveDvarsDisabled())
{
return;
}
// Save the dvar original value if it has the archive flag
const auto* dvar = Game::Dvar_FindVar(dvarName);
if (dvar && dvar->flags & Game::DVAR_ARCHIVE)

View File

@ -48,6 +48,7 @@ namespace Components
static void SetFromStringByNameSafeExternal(const char* dvarName, const char* string);
static bool AreArchiveDvarsUnprotected();
static bool IsSettingArchiveDvarsDisabled();
static void DvarSetFromStringByName_Stub(const char* dvarName, const char* value);
static void OnRegisterVariant(Game::dvar_t* dvar);

View File

@ -10,6 +10,8 @@
#include <version.hpp>
#define CL_MOD_LOADING
namespace Components
{
class JoinContainer
@ -448,13 +450,13 @@ namespace Components
Container.valid = false;
Container.info = info;
Container.matchType = atoi(info.get("matchtype").data());
auto securityLevel = static_cast<std::uint32_t>(atoi(info.get("securityLevel").data()));
Container.matchType = std::strtol(info.get("matchtype").data(), nullptr, 10);
auto securityLevel = std::strtoul(info.get("securityLevel").data(), nullptr, 10);
bool isUsermap = !info.get("usermaphash").empty();
auto usermapHash = static_cast<std::uint32_t>(atoi(info.get("usermaphash").data()));
auto usermapHash = std::strtoul(info.get("usermaphash").data(), nullptr, 10);
#ifdef CL_MOD_LOADING
std::string mod = (*Game::fs_gameDirVar)->current.string;
#endif
// set fast server stuff here so its updated when we go to download stuff
if (info.get("wwwDownload") == "1"s)
{
@ -497,6 +499,7 @@ namespace Components
Command::Execute("closemenu popup_reconnectingtoparty");
Download::InitiateMapDownload(info.get("mapname"), info.get("isPrivate") == "1");
}
#ifdef CL_MOD_LOADING
else if (!info.get("fs_game").empty() && Utils::String::ToLower(mod) != Utils::String::ToLower(info.get("fs_game")))
{
Command::Execute("closemenu popup_reconnectingtoparty");
@ -513,6 +516,7 @@ namespace Components
Command::Execute("reconnect", false);
}
#endif
else
{
if (!Maps::CheckMapInstalled(Container.info.get("mapname"), true)) return;

View File

@ -281,6 +281,27 @@ namespace Components
}
}
bool QuickPatch::CL_ShouldSendNotify_Hk(const char* cmd)
{
if (!cmd)
{
return false;
}
static std::vector<std::string> exceptions =
{
"vstr",
"wait",
};
if (std::ranges::find(exceptions, cmd) != exceptions.end())
{
return false;
}
return Utils::Hook::Call<bool(const char*)>(0x47A640)(cmd);
}
Game::dvar_t* QuickPatch::Dvar_RegisterConMinicon(const char* dvarName, [[maybe_unused]] bool value, unsigned __int16 flags, const char* description)
{
#ifdef _DEBUG
@ -347,6 +368,9 @@ namespace Components
Utils::Hook::Set<const char*>(0x4876C6, "Successfully read stats data\n");
// Protect players from invasive servers
Utils::Hook(0x434BD4, CL_ShouldSendNotify_Hk, HOOK_CALL).install()->quick(); // CL_CheckNotify
// Numerical ping (cg_scoreboardPingText 1)
Utils::Hook::Set<BYTE>(0x45888E, 1);
Utils::Hook::Set<BYTE>(0x45888C, Game::DVAR_CHEAT);
@ -597,18 +621,18 @@ namespace Components
for (int i = 0; i < ARRAYSIZE(Game::MaterialTechniqueSet::techniques); ++i)
{
Game::MaterialTechnique* technique = asset.techniqueSet->techniques[i];
auto* technique = asset.techniqueSet->techniques[i];
if (technique)
{
// Size-check is obsolete, as the structure is dynamic
buffer.align(Utils::Stream::ALIGN_4);
Game::MaterialTechnique* destTechnique = buffer.dest<Game::MaterialTechnique>();
auto* destTechnique = buffer.dest<Game::MaterialTechnique>();
buffer.save(technique, 8);
// Save_MaterialPassArray
Game::MaterialPass* destPasses = buffer.dest<Game::MaterialPass>();
auto* destPasses = buffer.dest<Game::MaterialPass>();
buffer.saveArray(technique->passArray, technique->passCount);
for (std::uint16_t j = 0; j < technique->passCount; ++j)

View File

@ -34,6 +34,8 @@ namespace Components
static void SND_GetAliasOffset_Stub();
static bool CL_ShouldSendNotify_Hk(const char* cmd);
static Game::dvar_t* Dvar_RegisterConMinicon(const char* dvarName, bool value, unsigned __int16 flags, const char* description);
};
}