From aaba9cbcc5686ae015b2787a5fd7cec3adc929cd Mon Sep 17 00:00:00 2001 From: Skull <86374920+skkuull@users.noreply.github.com> Date: Sat, 8 Oct 2022 00:19:02 +0300 Subject: [PATCH] add bounces & gravity dvars --- src/client/component/gameplay.cpp | 77 +++++++++++++++++++++++++++++++ src/client/game/dvars.cpp | 3 ++ src/client/game/dvars.hpp | 3 ++ 3 files changed, 83 insertions(+) create mode 100644 src/client/component/gameplay.cpp diff --git a/src/client/component/gameplay.cpp b/src/client/component/gameplay.cpp new file mode 100644 index 00000000..382a42f8 --- /dev/null +++ b/src/client/component/gameplay.cpp @@ -0,0 +1,77 @@ +#include +#include "loader/component_loader.hpp" + +#include "dvars.hpp" + +#include "game/game.hpp" +#include "game/dvars.hpp" + +#include +#include +#include + +namespace gameplay +{ + namespace + { + void* bg_bounces_stub() + { + return utils::hook::assemble([](utils::hook::assembler& a) + { + const auto no_bounce = a.newLabel(); + const auto loc_70FB6F = a.newLabel(); + + a.push(rax); + + a.mov(rax, qword_ptr(reinterpret_cast(&dvars::bg_bounces))); + a.mov(al, byte_ptr(rax, 0x10)); + a.cmp(ptr(rbp, -0x66), al); + + a.pop(rax); + a.jz(no_bounce); + a.jmp(0x70FBF0_b); + + a.bind(no_bounce); + a.cmp(ptr(rsp, 0x44), r14d); + a.jnz(loc_70FB6F); + a.jmp(0x70FBE1_b); + + a.bind(loc_70FB6F); + a.jmp(0x70FB6F_b); + }); + } + + void* bg_gravity_stub() + { + return utils::hook::assemble([](utils::hook::assembler& a) + { + a.mov(rax, qword_ptr(reinterpret_cast(&dvars::bg_gravity))); + a.mov(eax, dword_ptr(rax, 0x10)); + a.mov(dword_ptr(rdi, 0x78), eax); + + a.call(0xBB3030_b); + a.mov(ptr(rdi, 0x32C), eax); + + a.jmp(0xAFA342_b); + }); + } + } + + class component final : public component_interface + { + public: + void post_unpack() override + { + // Implement bounces + dvars::bg_bounces = game::Dvar_RegisterBool("bg_bounces", false, game::DVAR_FLAG_REPLICATED, "Enables bouncing"); + utils::hook::jump(0x70FBB7_b, bg_bounces_stub(), true); + + // Implement gravity dvar + dvars::bg_gravity = game::Dvar_RegisterInt("bg_gravity", 800, 0, 1000, game::DVAR_FLAG_REPLICATED, "Game gravity in inches per second squared"); + utils::hook::nop(0xAFA330_b, 13); + utils::hook::jump(0xAFA330_b, bg_gravity_stub(), true); + } + }; +} + +REGISTER_COMPONENT(gameplay::component) \ No newline at end of file diff --git a/src/client/game/dvars.cpp b/src/client/game/dvars.cpp index 1b74ecf1..63f32ba1 100644 --- a/src/client/game/dvars.cpp +++ b/src/client/game/dvars.cpp @@ -25,6 +25,9 @@ namespace dvars game::dvar_t* r_fullbright = nullptr; + game::dvar_t* bg_bounces = nullptr; + game::dvar_t* bg_gravity = nullptr; + std::string dvar_get_vector_domain(const int components, const game::DvarLimits& domain) { if (domain.vector.min == -FLT_MAX) diff --git a/src/client/game/dvars.hpp b/src/client/game/dvars.hpp index b7dfd342..8534c176 100644 --- a/src/client/game/dvars.hpp +++ b/src/client/game/dvars.hpp @@ -21,6 +21,9 @@ namespace dvars extern game::dvar_t* r_fullbright; + extern game::dvar_t* bg_bounces; + extern game::dvar_t* bg_gravity; + std::string dvar_get_vector_domain(const int components, const game::DvarLimits& domain); std::string dvar_get_domain(const game::DvarType type, const game::DvarLimits& domain); std::string dvar_get_name(const game::dvar_t* dvar);