patch fov to behave like older games
This commit is contained in:
parent
e90301acd9
commit
b360d8f718
73
src/client/component/fov.cpp
Normal file
73
src/client/component/fov.cpp
Normal file
@ -0,0 +1,73 @@
|
|||||||
|
#include <std_include.hpp>
|
||||||
|
#include "loader/component_loader.hpp"
|
||||||
|
|
||||||
|
#include "game/game.hpp"
|
||||||
|
#include "game/dvars.hpp"
|
||||||
|
|
||||||
|
#include "scheduler.hpp"
|
||||||
|
#include "dvars.hpp"
|
||||||
|
|
||||||
|
#include <utils/hook.hpp>
|
||||||
|
|
||||||
|
namespace fov
|
||||||
|
{
|
||||||
|
constexpr float max_fov = 160.0f;
|
||||||
|
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
game::dvar_t* cg_fov;
|
||||||
|
game::dvar_t* cg_fovScale;
|
||||||
|
game::dvar_t* cg_use_fov_comp;
|
||||||
|
|
||||||
|
utils::hook::detour cg_view_calc_fov_compensation_hook;
|
||||||
|
|
||||||
|
float cg_view_calc_fov_compensation_stub(game::cg_s* blob)
|
||||||
|
{
|
||||||
|
if (!cg_use_fov_comp->current.enabled)
|
||||||
|
{
|
||||||
|
return 0.0f;
|
||||||
|
}
|
||||||
|
|
||||||
|
return cg_view_calc_fov_compensation_hook.invoke<float>(blob);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class component final : public component_interface
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
void post_unpack() override
|
||||||
|
{
|
||||||
|
if (game::environment::is_dedi())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
cg_fov = game::Dvar_RegisterFloat("cg_fov", 65.0f, 1.0f, 160.f, game::DVAR_FLAG_SAVED,
|
||||||
|
"The field of view angle in degrees");
|
||||||
|
cg_fovScale = game::Dvar_RegisterFloat("cg_fovScale", 1.0f, 0.1f, 2.0f, game::DVAR_FLAG_SAVED,
|
||||||
|
"Scale applied to the field of view");
|
||||||
|
|
||||||
|
*reinterpret_cast<game::dvar_t**>(0x141FA6DA0) = cg_fov;
|
||||||
|
dvars::disable::re_register("cg_fov");
|
||||||
|
dvars::disable::de_register("cg_fov");
|
||||||
|
|
||||||
|
*reinterpret_cast<game::dvar_t**>(0x141FA6DB0) = cg_fovScale;
|
||||||
|
dvars::disable::re_register("cg_fovScale");
|
||||||
|
dvars::disable::de_register("cg_fovScale");
|
||||||
|
|
||||||
|
// don't reset our fov
|
||||||
|
utils::hook::set<uint8_t>(0x1408A6160, 0xC3);
|
||||||
|
|
||||||
|
// disable FOV compensation by default
|
||||||
|
cg_use_fov_comp = game::Dvar_RegisterBool("cg_use_fov_comp", false, game::DVAR_FLAG_SAVED, "Use FOV offset compensation for the viewmodel");
|
||||||
|
cg_view_calc_fov_compensation_hook.create(0x140889B60, cg_view_calc_fov_compensation_stub);
|
||||||
|
|
||||||
|
// patch max fov values
|
||||||
|
utils::hook::inject(0x14087E08B + 4, &max_fov);
|
||||||
|
utils::hook::inject(0x140898C4B + 4, &max_fov); // mp max
|
||||||
|
utils::hook::inject(0x140898C55 + 4, &max_fov); // sp max
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
REGISTER_COMPONENT(fov::component)
|
@ -101,7 +101,7 @@ namespace gameplay
|
|||||||
|
|
||||||
void cg_calculate_weapon_movement_debug_stub(game::cg_s* glob, float* origin)
|
void cg_calculate_weapon_movement_debug_stub(game::cg_s* glob, float* origin)
|
||||||
{
|
{
|
||||||
// Retrieve the hook value
|
// CG_View_CalcFovCompensation
|
||||||
float value = utils::hook::invoke<float>(0x140889B60, glob, origin);
|
float value = utils::hook::invoke<float>(0x140889B60, glob, origin);
|
||||||
|
|
||||||
// Initialize values
|
// Initialize values
|
||||||
|
@ -38,28 +38,14 @@ namespace patches
|
|||||||
{
|
{
|
||||||
game::dvar_t* name_dvar;
|
game::dvar_t* name_dvar;
|
||||||
game::dvar_t* com_maxfps;
|
game::dvar_t* com_maxfps;
|
||||||
game::dvar_t* cg_fov;
|
|
||||||
game::dvar_t* cg_fovScale;
|
|
||||||
|
|
||||||
name_dvar = game::Dvar_RegisterString("name", get_login_username().data(), game::DVAR_FLAG_SAVED, "Player name.");
|
name_dvar = game::Dvar_RegisterString("name", get_login_username().data(), game::DVAR_FLAG_SAVED, "Player name.");
|
||||||
com_maxfps = game::Dvar_RegisterInt("com_maxfps", 0, 0, 1000, game::DVAR_FLAG_SAVED, "Cap frames per second");
|
com_maxfps = game::Dvar_RegisterInt("com_maxfps", 0, 0, 1000, game::DVAR_FLAG_SAVED, "Cap frames per second");
|
||||||
cg_fov = game::Dvar_RegisterFloat("cg_fov", 65.0f, 1.0f, 160.f, game::DVAR_FLAG_SAVED,
|
|
||||||
"The field of view angle in degrees");
|
|
||||||
cg_fovScale = game::Dvar_RegisterFloat("cg_fovScale", 1.0f, 0.1f, 2.0f, game::DVAR_FLAG_SAVED,
|
|
||||||
"Scale applied to the field of view");
|
|
||||||
|
|
||||||
*reinterpret_cast<game::dvar_t**>(0x146005758) = com_maxfps;
|
*reinterpret_cast<game::dvar_t**>(0x146005758) = com_maxfps;
|
||||||
dvars::disable::re_register("com_maxfps");
|
dvars::disable::re_register("com_maxfps");
|
||||||
dvars::disable::de_register("com_maxfps");
|
dvars::disable::de_register("com_maxfps");
|
||||||
|
|
||||||
*reinterpret_cast<game::dvar_t**>(0x141FA6DA0) = cg_fov;
|
|
||||||
dvars::disable::re_register("cg_fov");
|
|
||||||
dvars::disable::de_register("cg_fov");
|
|
||||||
|
|
||||||
*reinterpret_cast<game::dvar_t**>(0x141FA6DB0) = cg_fovScale;
|
|
||||||
dvars::disable::re_register("cg_fovScale");
|
|
||||||
dvars::disable::de_register("cg_fovScale");
|
|
||||||
|
|
||||||
return com_register_common_dvars_hook.invoke<void>();
|
return com_register_common_dvars_hook.invoke<void>();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -266,9 +252,6 @@ namespace patches
|
|||||||
// Add cheat override to exec
|
// Add cheat override to exec
|
||||||
utils::hook::call(0x140B7CF11, cbuf_execute_buffer_internal_stub);
|
utils::hook::call(0x140B7CF11, cbuf_execute_buffer_internal_stub);
|
||||||
|
|
||||||
// don't reset our fov
|
|
||||||
utils::hook::set<uint8_t>(0x1408A6160, 0xC3);
|
|
||||||
|
|
||||||
// don't register every replicated dvar as a network dvar
|
// don't register every replicated dvar as a network dvar
|
||||||
init_network_dvars_hook.create(0x140B7A920, init_network_dvars_stub);
|
init_network_dvars_hook.create(0x140B7A920, init_network_dvars_stub);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user