r5sdk/r5dev/engine/host_state.h
Kawe Mazidjatari 5a2dfaf03a Server: add option to respect game state when performing auto reload
Can be toggled with the new cvar 'host_autoReloadRespectGameState', and used in combination with the new server script func 'SetAutoReloadState( bool state )'. This makes sure that even when the timer reaches 'host_autoReloadRate', it would wait with the reload until the game itself is finished (which is when SetAutoReloadState( true ) is being called from scripts).
2024-06-01 11:30:35 +02:00

91 lines
3.7 KiB
C++

#pragma once
#include "mathlib/vector.h"
enum class HostStates_t : int
{
HS_NEW_GAME = 0x0,
HS_LOAD_GAME = 0x1,
HS_CHANGE_LEVEL_SP = 0x2,
HS_CHANGE_LEVEL_MP = 0x3,
HS_RUN = 0x4,
HS_GAME_SHUTDOWN = 0x5,
HS_SHUTDOWN = 0x6,
HS_RESTART = 0x7,
};
class CHostState
{
public:
static void FrameUpdate(CHostState* pHostState, double flCurrentTime, float flFrameTime);
void LoadConfig(void) const;
void Init(void);
void Setup(void);
void Think(void) const;
void SetState(const HostStates_t newState);
void GameShutDown(void);
void State_NewGame(void);
void State_ChangeLevelSP(void);
void State_ChangeLevelMP(void);
void ResetLevelName(void);
public:
HostStates_t m_iCurrentState; //0x0000
HostStates_t m_iNextState; //0x0004
Vector3D m_vecLocation; //0x0008
QAngle m_angLocation; //0x0014
char m_levelName[MAX_MAP_NAME_HOST]; //0x0020
char m_mapGroupName[256]; //0x0060
char m_landMarkName[256]; //0x0160
float m_flShortFrameTime; //0x0260
bool m_bActiveGame; //0x0264
bool m_bRememberLocation; //0x0265
bool m_bBackgroundLevel; //0x0266
bool m_bWaitingForConnection; //0x0267
bool m_bSplitScreenConnect; //0x0268
bool m_bGameHasShutDownAndFlushedMemory; //0x0269
HostStates_t m_iServerState; //0x026C
};
/* ==== CHOSTSTATE ====================================================================================================================================================== */
inline void(*CHostState__FrameUpdate)(CHostState* pHostState, double flCurrentTime, float flFrameTime);
inline void(*CHostState__State_Run)(HostStates_t* pState, double flCurrentTime, float flFrameTime);
inline void(*CHostState__State_GameShutDown)(CHostState* thisptr);
inline void(*v_HostState_ChangeLevelMP)(char const* pNewLevel, char const* pLandmarkName);
///////////////////////////////////////////////////////////////////////////////
extern CHostState* g_pHostState;
#ifndef CLIENT_DLL
extern bool g_hostReloadState;
#endif // !CLIENT_DLL
///////////////////////////////////////////////////////////////////////////////
class VHostState : public IDetour
{
virtual void GetAdr(void) const
{
LogFunAdr("CHostState::FrameUpdate", CHostState__FrameUpdate);
LogFunAdr("CHostState::State_Run", CHostState__State_Run);
LogFunAdr("CHostState::State_GameShutDown", CHostState__State_GameShutDown);
LogFunAdr("HostState_ChangeLevelMP", v_HostState_ChangeLevelMP);
LogVarAdr("g_pHostState", g_pHostState);
}
virtual void GetFun(void) const
{
g_GameDll.FindPatternSIMD("48 89 5C 24 08 48 89 6C 24 20 F3 0F 11 54 24 18").GetPtr(CHostState__FrameUpdate);
g_GameDll.FindPatternSIMD("48 8B C4 48 89 58 10 48 89 70 18 48 89 78 20 55 41 54 41 55 41 56 41 57 48 8D A8 ?? ?? ?? ?? 48 81 EC ?? ?? ?? ?? 0F 29 70 C8 45 33 E4").GetPtr(CHostState__State_Run);
g_GameDll.FindPatternSIMD("48 89 5C 24 ?? 57 48 83 EC 20 48 8B D9 E8 ?? ?? ?? ?? 48 8B 0D ?? ?? ?? ??").GetPtr(CHostState__State_GameShutDown);
g_GameDll.FindPatternSIMD("48 89 5C 24 ?? 48 89 74 24 ?? 57 48 83 EC 20 48 8B F9 48 8B F2 8B 0D ?? ?? ?? ??").GetPtr(v_HostState_ChangeLevelMP);
}
virtual void GetVar(void) const
{
g_pHostState = CMemory(CHostState__FrameUpdate).FindPattern("48 8D ?? ?? ?? ?? 01", CMemory::Direction::DOWN, 100).ResolveRelativeAddressSelf(0x3, 0x7).RCast<CHostState*>();
}
virtual void GetCon(void) const { }
virtual void Detour(const bool bAttach) const;
};
///////////////////////////////////////////////////////////////////////////////