iw5-mod/src/module/bullet.cpp
2022-05-12 19:45:29 +01:00

57 lines
1.6 KiB
C++

#include <std_include.hpp>
#include <loader/module_loader.hpp>
#include "game/game.hpp"
#include <utils/hook.hpp>
#include "bullet.hpp"
const game::native::dvar_t* bullet::bg_bulletRange;
const game::native::dvar_t* bullet::bg_surfacePenetration;
DWORD bullet::bullet_fire_addr;
utils::hook::detour bullet::bg_get_surface_penetration_depth_hook;
__declspec(naked) void bullet::bullet_fire_stub()
{
__asm
{
push eax
mov eax, bg_bulletRange
fld dword ptr [eax + 0xC] //dvar_t.current
pop eax
jmp bullet_fire_addr
}
}
float bullet::bg_get_surface_penetration_depth_stub(const game::native::Weapon weapon, bool is_alternate, int surface_type)
{
const auto value = bg_surfacePenetration->current.value;
if (value > 0.0f)
{
return value;
}
return bg_get_surface_penetration_depth_hook.invoke<float>(weapon, is_alternate, surface_type);
}
void bullet::post_load()
{
bg_bulletRange = game::native::Dvar_RegisterFloat("bg_bulletRange", 8192.0f, 0.0f,
std::numeric_limits<float>::max(), game::native::DVAR_CODINFO,
"Max range used when calculating the bullet end position");
bg_surfacePenetration = game::native::Dvar_RegisterFloat("bg_surfacePenetration", 0.0f,
0.0f, std::numeric_limits<float>::max(), game::native::DVAR_CODINFO,
"Set to a value greater than 0 to override the surface penetration depth");
bullet_fire_addr = SELECT_VALUE(0x5B6442, 0x4F6C5C, 0x46CFFA);
utils::hook(SELECT_VALUE(0x5B643C, 0x4F6C56, 0x46CFF4), &bullet_fire_stub, HOOK_JUMP).install()->quick();
bg_get_surface_penetration_depth_hook.create(SELECT_VALUE(0x43BDE0, 0x42F4D0, 0x421610), &bg_get_surface_penetration_depth_stub);
}
REGISTER_MODULE(bullet)