#include "STDInclude.hpp" namespace Components { Dvar::Var Movement::PlayerDuckedSpeedScale; Dvar::Var Movement::PlayerLastStandCrawlSpeedScale; Dvar::Var Movement::PlayerProneSpeedScale; int Movement::PMGetEffectiveStance(Game::playerState_s* ps) { auto heightTarget = ps->viewHeightTarget; if (heightTarget == 0x16) return Game::PM_EFF_STANCE_LASTSTANDCRAWL; if (heightTarget == 0x28) return Game::PM_EFF_STANCE_DUCKED; if (heightTarget == 0xB) return Game::PM_EFF_STANCE_PRONE; return Game::PM_EFF_STANCE_DEFAULT; } float Movement::PMCmdScaleForStance(Game::pmove_s* move) { auto* playerState = move->ps; float scale; if (playerState->viewHeightLerpTime != 0 && playerState->viewHeightLerpTarget == 0xB) { scale = move->cmd.serverTime - playerState->viewHeightLerpTime / 400.0f; if (0.0f <= scale) { auto flags = 0; if (scale < 1.0f) { flags |= 1 << 8; } if (scale == 1.0f) { flags |= 1 << 14; } if (flags == 0) { scale = 1.0f; return scale * 0.15f + (1.0f - scale) * 0.65f; } if (scale != 0.0f) { return scale * 0.15f + (1.0f - scale) * 0.65f; } } } if ((playerState->viewHeightLerpTime != 0 && playerState->viewHeightLerpTarget == 0x28) && playerState->viewHeightLerpDown == 0) { scale = 400.0f / move->cmd.serverTime - playerState->viewHeightLerpTime; if (0.0f <= scale) { auto flags = 0; if (scale < 1.0f) { flags |= 1 << 8; } if (scale == 1.0f) { flags |= 1 << 14; } if (flags == 0) { scale = 1.0f; } else if (scale != 0.0f) { return scale * 0.65f + (1.0f - scale) * 0.15f; } } } scale = 1.0f; auto stance = Movement::PMGetEffectiveStance(playerState); if (stance == Game::PM_EFF_STANCE_PRONE) { scale = Movement::PlayerProneSpeedScale.get(); } else if (stance == Game::PM_EFF_STANCE_DUCKED) { scale = Movement::PlayerDuckedSpeedScale.get(); } else if (stance == Game::PM_EFF_STANCE_LASTSTANDCRAWL) { scale = Movement::PlayerLastStandCrawlSpeedScale.get(); } return scale; } __declspec(naked) void Movement::PMCmdScaleForStanceStub() { __asm { pushad push edx call Movement::PMCmdScaleForStance add esp, 4 popad ret } } Movement::Movement() { Dvar::OnInit([] { Movement::PlayerDuckedSpeedScale = Dvar::Register("player_duckedSpeedScale", 0.65f, 0.0f, 5.0f, Game::DVAR_FLAG_CHEAT | Game::DVAR_FLAG_REPLICATED, "The scale applied to the player speed when ducking"); Movement::PlayerLastStandCrawlSpeedScale = Dvar::Register("player_lastStandCrawlSpeedScale", 0.2f, 0.0f, 5.0f, Game::DVAR_FLAG_CHEAT | Game::DVAR_FLAG_REPLICATED, "The scale applied to the player speed when crawling in last stand"); Movement::PlayerProneSpeedScale = Dvar::Register("player_proneSpeedScale", 0.15f, 0.0f, 5.0f, Game::DVAR_FLAG_CHEAT | Game::DVAR_FLAG_REPLICATED, "The scale applied to the player speed when crawling"); }); Utils::Hook(0x572F34, Movement::PMCmdScaleForStanceStub, HOOK_CALL).install()->quick(); Utils::Hook(0x57395F, Movement::PMCmdScaleForStanceStub, HOOK_CALL).install()->quick(); } Movement::~Movement() { } }