From 5f31797eb57df3334ccd41b39d5c39aa50d61a34 Mon Sep 17 00:00:00 2001 From: momo5502 Date: Sun, 9 Jul 2017 13:36:13 +0200 Subject: [PATCH] [Dvar] Allow certain protected dvars to be set --- src/Components/Modules/Dvar.cpp | 34 +++++++++++++++++++++++++++++++-- src/Components/Modules/Dvar.hpp | 1 + 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/Components/Modules/Dvar.cpp b/src/Components/Modules/Dvar.cpp index e76f0b83..d5b408f8 100644 --- a/src/Components/Modules/Dvar.cpp +++ b/src/Components/Modules/Dvar.cpp @@ -186,6 +186,31 @@ namespace Components return Dvar::Register(name, username.data(), Dvar::Flag(flag | Game::dvar_flag::DVAR_FLAG_SAVED).val, description).get(); } + Game::dvar_t* Dvar::SetFromStringByNameSafeExternal(const char* dvar, const char* value) + { + static const char* exceptions[] = + { + "ui_showEndOfGame", + "systemlink", + "splitscreen", + "onlinegame", + "party_maxplayers", + "xblive_privateserver", + "xblive_rankedmatch", + "ui_mptype", + }; + + for (int i = 0; i < ARRAYSIZE(exceptions); ++i) + { + if (Utils::String::ToLower(dvar) == Utils::String::ToLower(exceptions[i])) + { + return Game::Dvar_SetFromStringByName(dvar, value); + } + } + + return Dvar::SetFromStringByNameExternal(dvar, value); + } + Game::dvar_t* Dvar::SetFromStringByNameExternal(const char* dvar, const char* value) { return Game::Dvar_SetFromStringByNameFromSource(dvar, value, Game::DvarSetSource::DVAR_SOURCE_EXTERNAL); @@ -231,11 +256,16 @@ namespace Components Utils::Hook(0x63CA96, Dvar::SetFromStringByNameExternal, HOOK_CALL).install()->quick(); Utils::Hook(0x63CDB5, Dvar::SetFromStringByNameExternal, HOOK_CALL).install()->quick(); Utils::Hook(0x635E47, Dvar::SetFromStringByNameExternal, HOOK_CALL).install()->quick(); - Utils::Hook(0x63444C, Dvar::SetFromStringByNameExternal, HOOK_CALL).install()->quick(); + + // SetDvar + Utils::Hook(0x63444C, Dvar::SetFromStringByNameSafeExternal, HOOK_CALL).install()->quick(); + + // Slider Utils::Hook(0x636159, Dvar::SetFromStringByNameExternal, HOOK_CALL).install()->quick(); Utils::Hook(0x636189, Dvar::SetFromStringByNameExternal, HOOK_CALL).install()->quick(); - Utils::Hook(0x636207, Dvar::SetFromStringByNameExternal, HOOK_CALL).install()->quick(); Utils::Hook(0x6364EA, Dvar::SetFromStringByNameExternal, HOOK_CALL).install()->quick(); + + Utils::Hook(0x636207, Dvar::SetFromStringByNameExternal, HOOK_CALL).install()->quick(); Utils::Hook(0x636608, Dvar::SetFromStringByNameExternal, HOOK_CALL).install()->quick(); Utils::Hook(0x636695, Dvar::SetFromStringByNameExternal, HOOK_CALL).install()->quick(); diff --git a/src/Components/Modules/Dvar.hpp b/src/Components/Modules/Dvar.hpp index 4b64738f..3f2e3bb4 100644 --- a/src/Components/Modules/Dvar.hpp +++ b/src/Components/Modules/Dvar.hpp @@ -55,5 +55,6 @@ namespace Components static Game::dvar_t* RegisterName(const char* name, const char* defaultVal, Game::dvar_flag flag, const char* description); static Game::dvar_t* SetFromStringByNameExternal(const char* dvar, const char* value); + static Game::dvar_t* SetFromStringByNameSafeExternal(const char* dvar, const char* value); }; }