2023-11-21 20:02:34 +01:00

120 lines
3.1 KiB
C++

#include <std_include.hpp>
#include "loader/component_loader.hpp"
#include "game/game.hpp"
#include "game/dvars.hpp"
#include "dvars.hpp"
#include <utils/hook.hpp>
#include <utils/string.hpp>
namespace patches
{
namespace
{
utils::hook::detour gscr_set_save_dvar_hook;
utils::hook::detour dvar_register_float_hook;
DECLSPEC_NORETURN void quit_stub()
{
utils::hook::invoke<void>(0x1408B1BA0);
}
void gscr_set_save_dvar_stub()
{
const auto dvar = game::Scr_GetString(0);
if (dvar == nullptr)
{
return;
}
const auto string = utils::string::to_lower(dvar);
if (string == "cg_fov" || string == "cg_fovscale")
{
return;
}
gscr_set_save_dvar_hook.invoke<void>();
}
void vid_restart_stub()
{
// free stuff
*reinterpret_cast<void**>(0x141E584D8) = nullptr; // free material
utils::hook::invoke<void>(0x1406926B0); // free scripted viewmodel xanim stuff
utils::hook::invoke<void>(0x14032A540); // properly free lui memory
utils::hook::invoke<void>(0x1405A6480);
}
void exec_config_stub(void* a1)
{
dvars::register_string("name", "Unknown Soldier", game::DVAR_FLAG_SAVED, "Player name");
utils::hook::invoke<void>(0x1405A35E0, a1);
}
const char* dvar_get_hash_stub(game::dvar_t* dvar)
{
const auto info = dvars::get_dvar_info_from_hash(dvar->hash);
if (info.has_value())
{
const auto& value = info.value();
return utils::string::va("%s", value.name.data());
}
else
{
return utils::hook::invoke<const char*>(0x140619240, dvar);
}
}
}
class component final : public component_interface
{
public:
void post_unpack() override
{
// Fix shutdown crash
utils::hook::jump(0x1408B1CD0, 0x1408B1BA0);
// Disable splash screen
utils::hook::nop(0x14064F546, 5);
// Unlock fps in main menu
utils::hook::set<BYTE>(0x1403D8E1B, 0xEB);
// Allow kbam input when gamepad is enabled
utils::hook::nop(0x1403D2F8E, 2);
utils::hook::nop(0x1403D0C9C, 6);
// Prevent game from overriding cg_fov and cg_fovscale values
gscr_set_save_dvar_hook.create(0x140504C60, &gscr_set_save_dvar_stub);
// fix vid_restart crashing
utils::hook::call(0x1403D7413, vid_restart_stub);
// cinematicingameloopresident -> cinematicingameloop (fix ingame cinematics)
utils::hook::jump(0x140502140, 0x1405020C0);
// override dvar flags
dvars::override::register_float("cg_fovScale", 1.f, 0.1f, 2.f, game::DVAR_FLAG_SAVED);
dvars::override::register_float("cg_fov", 65.f, 40.f, 200.f, game::DVAR_FLAG_SAVED);
dvars::override::register_bool("snd_musicDisabledForCustomSoundtrack", false, game::DVAR_FLAG_SAVED);
// make "name" saved
utils::hook::call(0x1405A4960, exec_config_stub);
dvars::override::register_string("name", "Unknown Soldier", game::DVAR_FLAG_SAVED);
utils::hook::call(0x1405A7CB7, dvar_get_hash_stub);
// fix vehicle hud compass color
utils::hook::set<float>(0x140948F40, 1.f);
utils::hook::set<float>(0x140948F44, 1.f);
utils::hook::set<float>(0x140948F48, 1.f);
utils::hook::nop(0x14037B8AE, 7);
}
};
}
REGISTER_COMPONENT(patches::component)