iw4x-client/src/Components/Modules/Elevators.cpp

124 lines
2.9 KiB
C++
Raw Normal View History

2021-11-29 07:26:53 -05:00
#include "STDInclude.hpp"
namespace Components
{
2021-12-26 11:25:13 -05:00
Dvar::Var Elevators::BG_Elevators;
2021-11-29 07:26:53 -05:00
2021-12-22 10:25:58 -05:00
int Elevators::PM_CorrectAllSolid(Game::pmove_s* pm, Game::pml_t* pml, Game::trace_t* trace)
2021-11-29 12:16:18 -05:00
{
2021-12-22 10:25:58 -05:00
assert(pm != nullptr);
assert(pm->ps != nullptr);
Game::vec3_t point;
auto* ps = pm->ps;
auto i = 0;
2021-12-26 11:25:13 -05:00
const auto elevatorSetting = Elevators::BG_Elevators.get<int>();
while (true)
2021-11-29 12:16:18 -05:00
{
2021-12-22 10:25:58 -05:00
point[0] = ps->origin[0] + Game::CorrectSolidDeltas[i][0];
point[1] = ps->origin[1] + Game::CorrectSolidDeltas[i][1];
point[2] = ps->origin[2] + Game::CorrectSolidDeltas[i][2];
Game::PM_playerTrace(pm, trace, point, point, &pm->bounds, ps->clientNum, pm->tracemask);
// If the player wishes to glitch without effort they can do so
2021-12-26 11:25:13 -05:00
if (!trace->startsolid || elevatorSetting == Elevators::EASY)
2021-12-22 10:25:58 -05:00
{
ps->origin[0] = point[0];
ps->origin[1] = point[1];
ps->origin[2] = point[2];
point[2] = (ps->origin[2] - 1.0f) - 0.25f;
Game::PM_playerTrace(pm, trace, ps->origin, point, &pm->bounds, ps->clientNum, pm->tracemask);
// If elevators are disabled we need to check that startsolid is false before proceeding
// like later versions of the game do
2021-12-26 11:25:13 -05:00
if (!trace->startsolid || elevatorSetting >= Elevators::ENABLED)
2021-12-22 10:25:58 -05:00
{
pml->groundTrace = *trace;
2021-12-22 10:25:58 -05:00
const auto fraction = trace->fraction;
ps->origin[0] += fraction * (point[0] - ps->origin[0]);
ps->origin[1] += fraction * (point[1] - ps->origin[1]);
ps->origin[2] += fraction * (point[2] - ps->origin[2]);
break;
}
}
i += 1;
if (i >= 26)
{
ps->groundEntityNum = Game::ENTITYNUM_NONE;
pml->groundPlane = 0;
pml->almostGroundPlane = 0;
pml->walking = 0;
Game::Jump_ClearState(ps);
return 0;
}
}
return 1;
}
2021-11-29 12:16:18 -05:00
2021-12-26 11:25:13 -05:00
void Elevators::PM_Trace_Hk(Game::pmove_s* pm, Game::trace_t* trace, const float* f3,
2021-12-22 10:25:58 -05:00
const float* f4, const Game::Bounds* bounds, int a6, int a7)
{
Game::PM_Trace(pm, trace, f3, f4, bounds, a6, a7);
2021-11-29 12:16:18 -05:00
2021-12-22 10:40:30 -05:00
// Allow the player to stand even when there is no headroom
2021-12-26 11:25:13 -05:00
if (Elevators::BG_Elevators.get<int>() == Elevators::EASY)
2021-12-22 10:25:58 -05:00
{
trace->allsolid = false;
}
}
2021-11-29 12:16:18 -05:00
2021-12-22 10:25:58 -05:00
__declspec(naked) void Elevators::PM_CorrectAllSolidStub()
{
__asm
{
push eax
pushad
2021-11-29 12:16:18 -05:00
2021-12-22 10:25:58 -05:00
push [esp + 0x8 + 0x24]
push [esp + 0x8 + 0x24]
push eax
call Elevators::PM_CorrectAllSolid
add esp, 0xC
2021-11-29 12:16:18 -05:00
2021-12-22 10:25:58 -05:00
mov [esp + 0x20], eax
popad
pop eax
2021-11-29 12:16:18 -05:00
2021-12-22 10:25:58 -05:00
ret
2021-11-29 12:16:18 -05:00
}
}
2021-11-29 07:26:53 -05:00
Elevators::Elevators()
{
Dvar::OnInit([]
{
2021-12-22 10:25:58 -05:00
static const char* values[] =
{
2021-12-26 11:25:13 -05:00
"off",
"normal",
"easy",
2021-12-22 10:25:58 -05:00
nullptr
};
2021-12-26 11:25:13 -05:00
Elevators::BG_Elevators = Game::Dvar_RegisterEnum("bg_elevators", values,
2021-12-22 10:25:58 -05:00
Elevators::ENABLED, Game::DVAR_FLAG_REPLICATED, "Elevators glitch settings");
2021-11-29 07:26:53 -05:00
});
2021-12-22 10:40:30 -05:00
//Replace PM_CorrectAllSolid
2021-12-22 10:25:58 -05:00
Utils::Hook(0x57369E, Elevators::PM_CorrectAllSolidStub, HOOK_CALL).install()->quick();
2021-12-22 10:40:30 -05:00
// Place hook in PM_CheckDuck
2021-12-26 11:25:13 -05:00
Utils::Hook(0x570EC5, Elevators::PM_Trace_Hk, HOOK_CALL).install()->quick();
2021-11-29 07:26:53 -05:00
}
Elevators::~Elevators()
{
}
}