From 1853f3d643c93c7d45777262ea054e4ad5c3abda Mon Sep 17 00:00:00 2001 From: Kawe Mazidjatari <48657826+Mauler125@users.noreply.github.com> Date: Thu, 19 Jan 2023 20:48:41 +0100 Subject: [PATCH] CPlayer: Finish user command executor Command executor finished. Also improved the structure slightly to use CUserCmd instead of padded characters for 'm_LastCmd'. --- r5dev/game/server/player.cpp | 36 ++++++++++++++++++++++++++++++++---- r5dev/game/server/player.h | 18 +++++++++++++++--- 2 files changed, 47 insertions(+), 7 deletions(-) diff --git a/r5dev/game/server/player.cpp b/r5dev/game/server/player.cpp index 0de46995..9ab4eb51 100644 --- a/r5dev/game/server/player.cpp +++ b/r5dev/game/server/player.cpp @@ -7,21 +7,30 @@ #include "player.h" #include "gameinterface.h" #include "game/shared/shareddefs.h" +#include "game/shared/usercmd.h" +#include "game/server/movehelper_server.h" //------------------------------------------------------------------------------ // Purpose: executes a null command for this player //------------------------------------------------------------------------------ void CPlayer::RunNullCommand(void) { + CUserCmd cmd; + float flOldFrameTime = g_pGlobals->m_fFrameTime; float flOldCurTime = g_pGlobals->m_fCurTime; pl.fixangle = FIXANGLE_NONE; + EyeAngles(&cmd.viewangles); SetTimeBase(g_pGlobals->m_fCurTime); + MoveHelperServer()->SetHost(this); - // !TODO: Run command.. + PlayerRunCommand(&cmd, MoveHelperServer()); + SetLastUserCommand(&cmd); + + MoveHelperServer()->SetHost(NULL); g_pGlobals->m_fFrameTime = flOldFrameTime; g_pGlobals->m_fCurTime = flOldCurTime; @@ -29,12 +38,12 @@ void CPlayer::RunNullCommand(void) //------------------------------------------------------------------------------ // Purpose: gets the eye angles of this player -// Input : &angles - +// Input : *pAngles - // Output : QAngle* //------------------------------------------------------------------------------ -QAngle* CPlayer::EyeAngles(QAngle& angles) +QAngle* CPlayer::EyeAngles(QAngle* pAngles) { - return v_CPlayer__EyeAngles(this, &angles); + return v_CPlayer__EyeAngles(this, pAngles); } //------------------------------------------------------------------------------ @@ -94,3 +103,22 @@ void CPlayer::SetTotalExtraClientCmdTimeAttempted(float flAttemptedTime) m_totalExtraClientCmdTimeAttempted = flAttemptedTime; } } + +//------------------------------------------------------------------------------ +// Purpose: runs user command for this player +// Input : *pUserCmd - +// *pMover - +//------------------------------------------------------------------------------ +void CPlayer::PlayerRunCommand(CUserCmd* pUserCmd, IMoveHelper* pMover) +{ + v_CPlayer__PlayerRunCommand(this, pUserCmd, pMover); +} + +//------------------------------------------------------------------------------ +// Purpose: stores off a user command +// Input : *pUserCmd - +//------------------------------------------------------------------------------ +void CPlayer::SetLastUserCommand(CUserCmd* pUserCmd) +{ + m_LastCmd.Copy(pUserCmd); +} \ No newline at end of file diff --git a/r5dev/game/server/player.h b/r5dev/game/server/player.h index 87e26b92..1d8fad8b 100644 --- a/r5dev/game/server/player.h +++ b/r5dev/game/server/player.h @@ -14,6 +14,7 @@ #include "game/shared/animation.h" #include "game/shared/takedamageinfo.h" +#include "game/shared/usercmd.h" #include "playerlocaldata.h" #include "basecombatcharacter.h" #include @@ -233,12 +234,15 @@ class CPlayer : public CBaseCombatCharacter { public: void RunNullCommand(void); - QAngle* EyeAngles(QAngle& angles); + QAngle* EyeAngles(QAngle* pAngles); void SetTimeBase(float flTimeBase); void SetLastUCmdSimulationRemainderTime(float flRemainderTime); void SetTotalExtraClientCmdTimeAttempted(float flAttemptedTime); + void PlayerRunCommand(CUserCmd* pUserCmd, IMoveHelper* pMover); + void SetLastUserCommand(CUserCmd* pUserCmd); + private: int m_StuckLast; char gap_5a8c[4]; @@ -391,8 +395,8 @@ private: bool m_activeViewmodelModifiers[35]; bool m_activeViewmodelModifiersChanged; int m_hViewModels[3]; - char m_LastCmd[476]; - void* m_pCurrentCommand; + CUserCmd m_LastCmd; + CUserCmd* m_pCurrentCommand; float m_flStepSoundTime; int m_hThirdPersonEnt; bool m_thirdPersonShoulderView; @@ -771,10 +775,14 @@ private: char gap_7ee5[3]; int m_armsModelIndex; }; +static_assert(sizeof(CPlayer) == 0x7EF0); // !TODO: backwards compatibility. inline CMemory p_CPlayer__EyeAngles; inline auto v_CPlayer__EyeAngles = p_CPlayer__EyeAngles.RCast(); +inline CMemory p_CPlayer__PlayerRunCommand; +inline auto v_CPlayer__PlayerRunCommand = p_CPlayer__PlayerRunCommand.RCast(); + //inline CMemory p_CBaseEntity__GetBaseEntity; //inline auto v_CBaseEntity__GetBaseEntity = p_CBaseEntity__GetBaseEntity.RCast(); @@ -784,6 +792,7 @@ class VPlayer : public IDetour virtual void GetAdr(void) const { spdlog::debug("| FUN: CPlayer::EyeAngles : {:#18x} |\n", p_CPlayer__EyeAngles.GetPtr()); + spdlog::debug("| FUN: CPlayer::PlayerRunCommand : {:#18x} |\n", p_CPlayer__PlayerRunCommand.GetPtr()); //spdlog::debug("| FUN: CBaseEntity::GetBaseEntity : {:#18x} |\n", p_CBaseEntity__GetBaseEntity.GetPtr()); spdlog::debug("+----------------------------------------------------------------+\n"); } @@ -792,6 +801,9 @@ class VPlayer : public IDetour p_CPlayer__EyeAngles = g_GameDll.FindPatternSIMD("40 53 48 83 EC 30 F2 0F 10 05 ?? ?? ?? ??"); v_CPlayer__EyeAngles = p_CPlayer__EyeAngles.RCast(); + p_CPlayer__PlayerRunCommand = g_GameDll.FindPatternSIMD("E8 ?? ?? ?? ?? 8B 03 49 81 C6 ?? ?? ?? ??").FollowNearCallSelf(); + v_CPlayer__PlayerRunCommand = p_CPlayer__PlayerRunCommand.RCast(); + //p_CBaseEntity__GetBaseEntity = g_GameDll.FindPatternSIMD("8B 91 ?? ?? ?? ?? 83 FA FF 74 1F 0F B7 C2 48 8D 0D ?? ?? ?? ?? C1 EA 10 48 8D 04 40 48 03 C0 39 54 C1 08 75 05 48 8B 04 C1 C3 33 C0 C3 CC CC CC 48 8B 41 30"); //v_CBaseEntity__GetBaseEntity = p_CBaseEntity__GetBaseEntity.RCast(); }