From 70a7467105084ce9a46c8191bff7a00c9a604929 Mon Sep 17 00:00:00 2001 From: momo5502 Date: Sat, 26 Jan 2019 12:30:19 +0100 Subject: [PATCH] Correctly handle fov --- src/game/game.cpp | 4 ++++ src/game/game.hpp | 3 +++ src/game/structs.hpp | 51 ++++++++++++++++++++++++++++++++++++++++++++ src/module/fov.cpp | 16 +++++++++++++- 4 files changed, 73 insertions(+), 1 deletion(-) diff --git a/src/game/game.cpp b/src/game/game.cpp index ec154f8..a3537fc 100644 --- a/src/game/game.cpp +++ b/src/game/game.cpp @@ -13,6 +13,8 @@ namespace game DB_LoadXAssets_t DB_LoadXAssets; + Dvar_SetFromStringByName_t Dvar_SetFromStringByName; + G_RunFrame_t G_RunFrame; MSG_ReadData_t MSG_ReadData; @@ -298,6 +300,8 @@ namespace game native::DB_LoadXAssets = native::DB_LoadXAssets_t(SELECT_VALUE(0x48A8E0, 0x4CD020, 0x44F770)); + native::Dvar_SetFromStringByName = native::Dvar_SetFromStringByName_t(SELECT_VALUE(0x4DD090, 0x5BF740, 0x518DF0)); + native::G_RunFrame = native::G_RunFrame_t(SELECT_VALUE(0x52EAA0, 0x50CB70, 0x48AD60)); native::MSG_ReadData = native::MSG_ReadData_t(SELECT_VALUE(0, 0x5592A0, 0)); diff --git a/src/game/game.hpp b/src/game/game.hpp index 59e5940..5399d17 100644 --- a/src/game/game.hpp +++ b/src/game/game.hpp @@ -21,6 +21,9 @@ namespace game typedef void (*DB_LoadXAssets_t)(XZoneInfo* zoneInfo, unsigned int zoneCount, int sync); extern DB_LoadXAssets_t DB_LoadXAssets; + typedef void (*Dvar_SetFromStringByName_t)(const char *dvarName, const char *string); + extern Dvar_SetFromStringByName_t Dvar_SetFromStringByName; + typedef int (*G_RunFrame_t)(int, int); extern G_RunFrame_t G_RunFrame; diff --git a/src/game/structs.hpp b/src/game/structs.hpp index 4633a1d..30a8826 100644 --- a/src/game/structs.hpp +++ b/src/game/structs.hpp @@ -495,5 +495,56 @@ namespace game char charId; const char* name; }; + + union DvarValue + { + bool enabled; + int integer; + unsigned int unsignedInt; + float value; + float vector[4]; + const char* string; + char color[4]; + }; + + struct enum_limit + { + int stringCount; + const char** strings; + }; + + struct int_limit + { + int min; + int max; + }; + + struct float_limit + { + float min; + float max; + }; + + union DvarLimits + { + enum_limit enumeration; + int_limit integer; + float_limit value; + float_limit vector; + }; + + struct dvar_t + { + const char* name; + unsigned int flags; + char type; + bool modified; + DvarValue current; + DvarValue latched; + DvarValue reset; + DvarLimits domain; + bool (__cdecl *domainFunc)(dvar_t*, DvarValue); + dvar_t* hashNext; + }; } } diff --git a/src/module/fov.cpp b/src/module/fov.cpp index 8c3ca39..ba87d60 100644 --- a/src/module/fov.cpp +++ b/src/module/fov.cpp @@ -10,12 +10,26 @@ public: { if (game::is_dedi()) return; - utils::hook::set(SELECT_VALUE(0x4302C5, 0x455155, 0), 0x41); + // Set dvar flag + utils::hook::set(SELECT_VALUE(0x4302C5, 0x455155, 0), 0x1 | (game::is_mp() ? 0x40 : 0)); if (game::is_mp()) { + // Set dvar limit static const auto cg_fov_limit = 90.0f; utils::hook::set(0x455148, &cg_fov_limit); + + // Prevent value change via internal scripts + utils::hook(0x4698BA, &set_server_command_dvar_stub, HOOK_CALL).install()->quick(); + } + } + +private: + static void set_server_command_dvar_stub(const char* dvar, const char* value) + { + if (strcmp(dvar, "cg_fov") != 0 || strcmp(value, "65") != 0) + { + game::native::Dvar_SetFromStringByName(dvar, value); } } };