From 0b02fab0711e36dc010b9b3b634bde810fa66cc3 Mon Sep 17 00:00:00 2001 From: Federico Cecchetto Date: Thu, 6 Jan 2022 23:13:23 +0100 Subject: [PATCH] Prevent cg_fov/scale from being reset --- src/client/component/patches.cpp | 35 ++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/src/client/component/patches.cpp b/src/client/component/patches.cpp index 973f3ea8..48ef8868 100644 --- a/src/client/component/patches.cpp +++ b/src/client/component/patches.cpp @@ -5,11 +5,15 @@ #include "game/dvars.hpp" #include +#include namespace patches { namespace { + utils::hook::detour gscr_set_save_dvar_hook; + utils::hook::detour dvar_register_float_hook; + void* sub_46148() { static uint64_t off_11C52460 = 0xAD0C58_b; @@ -21,6 +25,30 @@ namespace patches component_loader::pre_destroy(); exit(0); } + + void gscr_set_save_dvar_stub() + { + const auto string = utils::string::to_lower(utils::hook::invoke(0x5C7C20_b, 0)); + if (string == "cg_fov" || string == "cg_fovscale") + { + return; + } + + gscr_set_save_dvar_hook.invoke(); + } + + game::dvar_t* dvar_register_float_stub(int hash, const char* dvarName, float value, float min, float max, unsigned int flags) + { + static const auto cg_fov_hash = game::generateHashValue("cg_fov"); + static const auto cg_fov_scale_hash = game::generateHashValue("cg_fovscale"); + + if (hash == cg_fov_hash || hash == cg_fov_scale_hash) + { + flags |= game::DvarFlags::DVAR_FLAG_SAVED; + } + + return dvar_register_float_hook.invoke(hash, dvarName, value, min, max, flags); + } } class component final : public component_interface @@ -40,6 +68,13 @@ namespace patches // Disable battle net popup utils::hook::nop(0x5F4496_b, 5); + + // Prevent game from overriding cg_fov and cg_fovscale values + gscr_set_save_dvar_hook.create(0x504C60_b, &gscr_set_save_dvar_stub); + // Make cg_fov and cg_fovscale saved dvars + dvar_register_float_hook.create(game::Dvar_RegisterFloat.get(), dvar_register_float_stub); + // Don't make the game reset cg_fov and cg_fovscale along with other dvars + utils::hook::nop(0x4C8A08_b, 5); } }; }