Restore cg_thirdperson
This commit is contained in:
parent
1998940550
commit
c220834231
84
src/client/component/thirdperson.cpp
Normal file
84
src/client/component/thirdperson.cpp
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
#include <std_include.hpp>
|
||||||
|
#include "loader/component_loader.hpp"
|
||||||
|
|
||||||
|
#include "game/game.hpp"
|
||||||
|
#include "game/dvars.hpp"
|
||||||
|
|
||||||
|
#include "scheduler.hpp"
|
||||||
|
|
||||||
|
#include <utils/hook.hpp>
|
||||||
|
|
||||||
|
namespace thirdperson
|
||||||
|
{
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
game::dvar_t* cg_thirdPerson = nullptr;
|
||||||
|
game::dvar_t* cg_thirdPersonRange = nullptr;
|
||||||
|
game::dvar_t* cg_thirdPersonAngle = nullptr;
|
||||||
|
|
||||||
|
namespace mp
|
||||||
|
{
|
||||||
|
__int64 sub_1D5950_stub([[maybe_unused]] int local_client_num, game::mp::cg_s* a2)
|
||||||
|
{
|
||||||
|
auto next_snap = a2->nextSnap;
|
||||||
|
if (next_snap->ps.pm_type < 7u)
|
||||||
|
{
|
||||||
|
int link_flags = next_snap->ps.linkFlags;
|
||||||
|
if ((link_flags & 2) == 0 && (next_snap->ps.otherFlags & 4) == 0)
|
||||||
|
{
|
||||||
|
auto client_globals = a2;
|
||||||
|
if (!client_globals->unk2 || !client_globals->unk3)
|
||||||
|
{
|
||||||
|
if (cg_thirdPerson && cg_thirdPerson->current.enabled)
|
||||||
|
{
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!(link_flags & (1 << 0xE)) || client_globals->unk3)
|
||||||
|
return (link_flags >> 27) & 1;
|
||||||
|
if (link_flags & (1 << 0x1D))
|
||||||
|
return 0;
|
||||||
|
if (!(link_flags & (1 << 0x1C)))
|
||||||
|
return a2->unk1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void sub_10C280_stub(int local_client_num, float angle, float range, int a4, int a5, int a6, int a7)
|
||||||
|
{
|
||||||
|
angle = cg_thirdPersonAngle->current.value;
|
||||||
|
range = cg_thirdPersonRange->current.value;
|
||||||
|
utils::hook::invoke<void>(0x10C280_b, local_client_num, angle, range, a4, a5, a6, a7);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
class component final : public component_interface
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
void post_unpack() override
|
||||||
|
{
|
||||||
|
if (!game::environment::is_mp())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
scheduler::once([]()
|
||||||
|
{
|
||||||
|
cg_thirdPerson = dvars::register_bool("cg_thirdPerson", 0, 4, "Use third person view");
|
||||||
|
cg_thirdPersonAngle = dvars::register_float("cg_thirdPersonAngle", 356.0f, -180.0f, 360.0f, 4,
|
||||||
|
"The angle of the camera from the player in third person view");
|
||||||
|
cg_thirdPersonRange = dvars::register_float("cg_thirdPersonRange", 120.0f, 0.0f, 1024, 4,
|
||||||
|
"The range of the camera from the player in third person view");
|
||||||
|
}, scheduler::main);
|
||||||
|
|
||||||
|
utils::hook::jump(0x1D5950_b, mp::sub_1D5950_stub);
|
||||||
|
utils::hook::call(0x10C26B_b, mp::sub_10C280_stub);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
REGISTER_COMPONENT(thirdperson::component)
|
@ -1931,16 +1931,20 @@ namespace game
|
|||||||
{
|
{
|
||||||
char __pad0[2];
|
char __pad0[2];
|
||||||
char pm_type; // 2
|
char pm_type; // 2
|
||||||
char __pad1[18573];
|
char __pad1[297];
|
||||||
|
float angles[3]; // 300 304 308
|
||||||
|
char __pad2[18264];
|
||||||
sessionState_t sessionState;
|
sessionState_t sessionState;
|
||||||
char __pad2[220]; // 254
|
char __pad3[220]; // 254
|
||||||
team_t team;
|
team_t team;
|
||||||
char __pad3[30];
|
char __pad4[30];
|
||||||
char name[32]; // 18834
|
char name[32]; // 18834
|
||||||
char __pad4[622];
|
char __pad5[622];
|
||||||
int flags; // 19488
|
int flags; // 19488
|
||||||
}; // size = ?
|
}; // size = ?
|
||||||
|
|
||||||
|
static_assert(offsetof(gclient_s, angles) == 300);
|
||||||
|
static_assert(offsetof(gclient_s, sessionState) == 18576);
|
||||||
static_assert(offsetof(gclient_s, team) == 18800);
|
static_assert(offsetof(gclient_s, team) == 18800);
|
||||||
static_assert(offsetof(gclient_s, name) == 18834);
|
static_assert(offsetof(gclient_s, name) == 18834);
|
||||||
static_assert(offsetof(gclient_s, flags) == 19488);
|
static_assert(offsetof(gclient_s, flags) == 19488);
|
||||||
@ -1974,14 +1978,58 @@ namespace game
|
|||||||
|
|
||||||
struct playerState_s
|
struct playerState_s
|
||||||
{
|
{
|
||||||
int clientNum;
|
char clientNum;
|
||||||
char __pad0[116];
|
char __pad0[1];
|
||||||
|
char pm_type;
|
||||||
|
char __pad1[44];
|
||||||
|
int otherFlags;
|
||||||
|
char __pad2[28];
|
||||||
|
int pm_time;
|
||||||
|
int pm_flags;
|
||||||
|
int eFlags;
|
||||||
|
int linkFlags;
|
||||||
|
char __pad3[24];
|
||||||
vec3_t origin;
|
vec3_t origin;
|
||||||
vec3_t velocity;
|
vec3_t velocity;
|
||||||
char __pad1[312];
|
char __pad4[312];
|
||||||
int sprintButtonUpRequired;
|
int sprintButtonUpRequired;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static_assert(offsetof(playerState_s, pm_type) == 2);
|
||||||
|
//static_assert(offsetof(playerState_s, groundEntityNum) == 34);
|
||||||
|
static_assert(offsetof(playerState_s, otherFlags) == 48);
|
||||||
|
static_assert(offsetof(playerState_s, pm_time) == 80);
|
||||||
|
static_assert(offsetof(playerState_s, pm_flags) == 84);
|
||||||
|
static_assert(offsetof(playerState_s, eFlags) == 88);
|
||||||
|
static_assert(offsetof(playerState_s, linkFlags) == 92);
|
||||||
|
static_assert(offsetof(playerState_s, origin) == 120);
|
||||||
|
static_assert(offsetof(playerState_s, velocity) == 132);
|
||||||
|
static_assert(offsetof(playerState_s, sprintButtonUpRequired) == 456);
|
||||||
|
|
||||||
|
struct snapshot_s
|
||||||
|
{
|
||||||
|
playerState_s ps;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct cg_s
|
||||||
|
{
|
||||||
|
char __pad0[18680];
|
||||||
|
snapshot_s* nextSnap;
|
||||||
|
char __pad1[582400];
|
||||||
|
int unk1;
|
||||||
|
int renderingThirdPerson;
|
||||||
|
char __pad2[378580];
|
||||||
|
int unk2;
|
||||||
|
char __pad3[16];
|
||||||
|
int unk3;
|
||||||
|
};
|
||||||
|
|
||||||
|
static_assert(offsetof(cg_s, nextSnap) == 18680);
|
||||||
|
static_assert(offsetof(cg_s, unk1) == 601088);
|
||||||
|
static_assert(offsetof(cg_s, renderingThirdPerson) == 601092);
|
||||||
|
static_assert(offsetof(cg_s, unk2) == 979676);
|
||||||
|
static_assert(offsetof(cg_s, unk3) == 979696);
|
||||||
|
|
||||||
struct pmove_t
|
struct pmove_t
|
||||||
{
|
{
|
||||||
playerState_s* ps;
|
playerState_s* ps;
|
||||||
|
Loading…
Reference in New Issue
Block a user