Implement Check* Hooks

- CheckGameOver
- CheckTimeLimit
- CheckFragLimit
- CheckMaxRounds
- CheckWinLimit
This commit is contained in:
Szabó Erhard Pál 2024-05-25 15:56:10 +02:00
parent c08e6d0180
commit 190ceece1f
5 changed files with 89 additions and 10 deletions

View File

@ -337,6 +337,12 @@ GAMEHOOK_REGISTRY(CBasePlayer_PlayerDeathThink);
GAMEHOOK_REGISTRY(CBasePlayer_Observer_Think); GAMEHOOK_REGISTRY(CBasePlayer_Observer_Think);
GAMEHOOK_REGISTRY(CBasePlayer_RemoveAllItems); GAMEHOOK_REGISTRY(CBasePlayer_RemoveAllItems);
GAMEHOOK_REGISTRY(CSGameRules_CheckGameOver);
GAMEHOOK_REGISTRY(CSGameRules_CheckTimeLimit);
GAMEHOOK_REGISTRY(CSGameRules_CheckFragLimit);
GAMEHOOK_REGISTRY(CSGameRules_CheckMaxRounds);
GAMEHOOK_REGISTRY(CSGameRules_CheckWinLimit);
int CReGameApi::GetMajorVersion() { int CReGameApi::GetMajorVersion() {
return REGAMEDLL_API_VERSION_MAJOR; return REGAMEDLL_API_VERSION_MAJOR;
} }

View File

@ -749,6 +749,26 @@ typedef IHookChainRegistryClassImpl<void, CBasePlayer> CReGameHookRegistry_CBase
typedef IHookChainClassImpl<void, CBasePlayer, BOOL> CReGameHook_CBasePlayer_RemoveAllItems; typedef IHookChainClassImpl<void, CBasePlayer, BOOL> CReGameHook_CBasePlayer_RemoveAllItems;
typedef IHookChainRegistryClassImpl<void, CBasePlayer, BOOL> CReGameHookRegistry_CBasePlayer_RemoveAllItems; typedef IHookChainRegistryClassImpl<void, CBasePlayer, BOOL> CReGameHookRegistry_CBasePlayer_RemoveAllItems;
// CHalfLifeMultiplay::CheckGameOver hook
typedef IHookChainClassImpl<BOOL, class CHalfLifeMultiplay> CReGameHook_CSGameRules_CheckGameOver;
typedef IHookChainRegistryClassEmptyImpl<BOOL, class CHalfLifeMultiplay> CReGameHookRegistry_CSGameRules_CheckGameOver;
// CHalfLifeMultiplay::CheckTimeLimit hook
typedef IHookChainClassImpl<BOOL, class CHalfLifeMultiplay> CReGameHook_CSGameRules_CheckTimeLimit;
typedef IHookChainRegistryClassEmptyImpl<BOOL, class CHalfLifeMultiplay> CReGameHookRegistry_CSGameRules_CheckTimeLimit;
// CHalfLifeMultiplay::CheckFragLimit hook
typedef IHookChainClassImpl<BOOL, class CHalfLifeMultiplay> CReGameHook_CSGameRules_CheckFragLimit;
typedef IHookChainRegistryClassEmptyImpl<BOOL, class CHalfLifeMultiplay> CReGameHookRegistry_CSGameRules_CheckFragLimit;
// CHalfLifeMultiplay::CheckMaxRounds hook
typedef IHookChainClassImpl<BOOL, class CHalfLifeMultiplay> CReGameHook_CSGameRules_CheckMaxRounds;
typedef IHookChainRegistryClassEmptyImpl<BOOL, class CHalfLifeMultiplay> CReGameHookRegistry_CSGameRules_CheckMaxRounds;
// CHalfLifeMultiplay::CheckWinLimit hook
typedef IHookChainClassImpl<BOOL, class CHalfLifeMultiplay> CReGameHook_CSGameRules_CheckWinLimit;
typedef IHookChainRegistryClassEmptyImpl<BOOL, class CHalfLifeMultiplay> CReGameHookRegistry_CSGameRules_CheckWinLimit;
class CReGameHookchains: public IReGameHookchains { class CReGameHookchains: public IReGameHookchains {
public: public:
// CBasePlayer virtual // CBasePlayer virtual
@ -911,6 +931,12 @@ public:
CReGameHookRegistry_CBasePlayer_Observer_Think m_CBasePlayer_Observer_Think; CReGameHookRegistry_CBasePlayer_Observer_Think m_CBasePlayer_Observer_Think;
CReGameHookRegistry_CBasePlayer_RemoveAllItems m_CBasePlayer_RemoveAllItems; CReGameHookRegistry_CBasePlayer_RemoveAllItems m_CBasePlayer_RemoveAllItems;
CReGameHookRegistry_CSGameRules_CheckGameOver m_CSGameRules_CheckGameOver;
CReGameHookRegistry_CSGameRules_CheckTimeLimit m_CSGameRules_CheckTimeLimit;
CReGameHookRegistry_CSGameRules_CheckFragLimit m_CSGameRules_CheckFragLimit;
CReGameHookRegistry_CSGameRules_CheckMaxRounds m_CSGameRules_CheckMaxRounds;
CReGameHookRegistry_CSGameRules_CheckWinLimit m_CSGameRules_CheckWinLimit;
public: public:
virtual IReGameHookRegistry_CBasePlayer_Spawn *CBasePlayer_Spawn(); virtual IReGameHookRegistry_CBasePlayer_Spawn *CBasePlayer_Spawn();
virtual IReGameHookRegistry_CBasePlayer_Precache *CBasePlayer_Precache(); virtual IReGameHookRegistry_CBasePlayer_Precache *CBasePlayer_Precache();
@ -1070,6 +1096,12 @@ public:
virtual IReGameHookRegistry_CBasePlayer_PlayerDeathThink *CBasePlayer_PlayerDeathThink(); virtual IReGameHookRegistry_CBasePlayer_PlayerDeathThink *CBasePlayer_PlayerDeathThink();
virtual IReGameHookRegistry_CBasePlayer_Observer_Think *CBasePlayer_Observer_Think(); virtual IReGameHookRegistry_CBasePlayer_Observer_Think *CBasePlayer_Observer_Think();
virtual IReGameHookRegistry_CBasePlayer_RemoveAllItems *CBasePlayer_RemoveAllItems(); virtual IReGameHookRegistry_CBasePlayer_RemoveAllItems *CBasePlayer_RemoveAllItems();
virtual IReGameHookRegistry_CSGameRules_CheckGameOver *CSGameRules_CheckGameOver();
virtual IReGameHookRegistry_CSGameRules_CheckTimeLimit *CSGameRules_CheckTimeLimit();
virtual IReGameHookRegistry_CSGameRules_CheckFragLimit *CSGameRules_CheckFragLimit();
virtual IReGameHookRegistry_CSGameRules_CheckMaxRounds *CSGameRules_CheckMaxRounds();
virtual IReGameHookRegistry_CSGameRules_CheckWinLimit *CSGameRules_CheckWinLimit();
}; };
extern CReGameHookchains g_ReGameHookchains; extern CReGameHookchains g_ReGameHookchains;

View File

@ -618,6 +618,11 @@ public:
BOOL TeamStacked_OrigFunc(int newTeam_id, int curTeam_id); BOOL TeamStacked_OrigFunc(int newTeam_id, int curTeam_id);
void PlayerGotWeapon_OrigFunc(CBasePlayer *pPlayer, CBasePlayerItem *pWeapon); void PlayerGotWeapon_OrigFunc(CBasePlayer *pPlayer, CBasePlayerItem *pWeapon);
void SendDeathMessage_OrigFunc(CBaseEntity *pKiller, CBasePlayer *pVictim, CBasePlayer *pAssister, entvars_t *pevInflictor, const char *killerWeaponName, int iDeathMessageFlags, int iRarityOfKill); void SendDeathMessage_OrigFunc(CBaseEntity *pKiller, CBasePlayer *pVictim, CBasePlayer *pAssister, entvars_t *pevInflictor, const char *killerWeaponName, int iDeathMessageFlags, int iRarityOfKill);
BOOL CheckGameOver_OrigFunc();
BOOL CheckTimeLimit_OrigFunc();
BOOL CheckFragLimit_OrigFunc();
BOOL CheckMaxRounds_OrigFunc();
BOOL CheckWinLimit_OrigFunc();
#endif #endif
public: public:
@ -672,11 +677,11 @@ public:
bool Hostage_NotRescued(float tmDelay); bool Hostage_NotRescued(float tmDelay);
// Check various conditions to end the map. // Check various conditions to end the map.
bool CheckGameOver(); VFUNC BOOL CheckGameOver();
bool CheckTimeLimit(); VFUNC BOOL CheckTimeLimit();
bool CheckFragLimit(); VFUNC BOOL CheckFragLimit();
bool CheckMaxRounds(); VFUNC BOOL CheckMaxRounds();
bool CheckWinLimit(); VFUNC BOOL CheckWinLimit();
void CheckFreezePeriodExpired(); void CheckFreezePeriodExpired();
void CheckRoundTimeExpired(); void CheckRoundTimeExpired();

View File

@ -2612,7 +2612,9 @@ void EXT_FUNC CHalfLifeMultiplay::__API_HOOK(Think)()
} }
} }
bool CHalfLifeMultiplay::CheckGameOver() LINK_HOOK_CLASS_CUSTOM_CHAIN2(BOOL, CHalfLifeMultiplay, CSGameRules, CheckGameOver)
BOOL EXT_FUNC CHalfLifeMultiplay::__API_HOOK(CheckGameOver)()
{ {
// someone else quit the game already // someone else quit the game already
if (m_bGameOver) if (m_bGameOver)
@ -2649,7 +2651,9 @@ bool CHalfLifeMultiplay::CheckGameOver()
return false; return false;
} }
bool CHalfLifeMultiplay::CheckTimeLimit() LINK_HOOK_CLASS_CUSTOM_CHAIN2(BOOL, CHalfLifeMultiplay, CSGameRules, CheckTimeLimit)
BOOL EXT_FUNC CHalfLifeMultiplay::__API_HOOK(CheckTimeLimit)()
{ {
if (timelimit.value < 0) if (timelimit.value < 0)
{ {
@ -2687,7 +2691,9 @@ bool CHalfLifeMultiplay::CheckTimeLimit()
return false; return false;
} }
bool CHalfLifeMultiplay::CheckMaxRounds() LINK_HOOK_CLASS_CUSTOM_CHAIN2(BOOL, CHalfLifeMultiplay, CSGameRules, CheckMaxRounds)
BOOL EXT_FUNC CHalfLifeMultiplay::__API_HOOK(CheckMaxRounds)()
{ {
if (m_iMaxRounds != 0 && m_iTotalRoundsPlayed >= m_iMaxRounds) if (m_iMaxRounds != 0 && m_iTotalRoundsPlayed >= m_iMaxRounds)
{ {
@ -2699,7 +2705,9 @@ bool CHalfLifeMultiplay::CheckMaxRounds()
return false; return false;
} }
bool CHalfLifeMultiplay::CheckWinLimit() LINK_HOOK_CLASS_CUSTOM_CHAIN2(BOOL, CHalfLifeMultiplay, CSGameRules, CheckWinLimit)
BOOL EXT_FUNC CHalfLifeMultiplay::__API_HOOK(CheckWinLimit)()
{ {
// has one team won the specified number of rounds? // has one team won the specified number of rounds?
if (m_iMaxRoundsWon != 0 && (m_iNumCTWins >= m_iMaxRoundsWon || m_iNumTerroristWins >= m_iMaxRoundsWon)) if (m_iMaxRoundsWon != 0 && (m_iNumCTWins >= m_iMaxRoundsWon || m_iNumTerroristWins >= m_iMaxRoundsWon))
@ -2715,7 +2723,9 @@ bool CHalfLifeMultiplay::CheckWinLimit()
return false; return false;
} }
bool CHalfLifeMultiplay::CheckFragLimit() LINK_HOOK_CLASS_CUSTOM_CHAIN2(BOOL, CHalfLifeMultiplay, CSGameRules, CheckFragLimit)
BOOL EXT_FUNC CHalfLifeMultiplay::__API_HOOK(CheckFragLimit)()
{ {
#ifdef REGAMEDLL_ADD #ifdef REGAMEDLL_ADD
int fragsRemaining = 0; int fragsRemaining = 0;

View File

@ -628,6 +628,26 @@ typedef IHookChainRegistryClass<void, class CBasePlayer> IReGameHookRegistry_CBa
typedef IHookChainClass<void, class CBasePlayer, BOOL> IReGameHook_CBasePlayer_RemoveAllItems; typedef IHookChainClass<void, class CBasePlayer, BOOL> IReGameHook_CBasePlayer_RemoveAllItems;
typedef IHookChainRegistryClass<void, class CBasePlayer, BOOL> IReGameHookRegistry_CBasePlayer_RemoveAllItems; typedef IHookChainRegistryClass<void, class CBasePlayer, BOOL> IReGameHookRegistry_CBasePlayer_RemoveAllItems;
// CHalfLifeMultiplay::CheckGameOver hook
typedef IHookChain<BOOL> IReGameHook_CSGameRules_CheckGameOver;
typedef IHookChainRegistry<BOOL> IReGameHookRegistry_CSGameRules_CheckGameOver;
// CHalfLifeMultiplay::CheckTimeLimit hook
typedef IHookChain<BOOL> IReGameHook_CSGameRules_CheckTimeLimit;
typedef IHookChainRegistry<BOOL> IReGameHookRegistry_CSGameRules_CheckTimeLimit;
// CHalfLifeMultiplay::CheckFragLimit hook
typedef IHookChain<BOOL> IReGameHook_CSGameRules_CheckFragLimit;
typedef IHookChainRegistry<BOOL> IReGameHookRegistry_CSGameRules_CheckFragLimit;
// CHalfLifeMultiplay::CheckMaxRounds hook
typedef IHookChain<BOOL> IReGameHook_CSGameRules_CheckMaxRounds;
typedef IHookChainRegistry<BOOL> IReGameHookRegistry_CSGameRules_CheckMaxRounds;
// CHalfLifeMultiplay::CheckWinLimit hook
typedef IHookChain<BOOL> IReGameHook_CSGameRules_CheckWinLimit;
typedef IHookChainRegistry<BOOL> IReGameHookRegistry_CSGameRules_CheckWinLimit;
class IReGameHookchains { class IReGameHookchains {
public: public:
virtual ~IReGameHookchains() {} virtual ~IReGameHookchains() {}
@ -790,6 +810,12 @@ public:
virtual IReGameHookRegistry_CBasePlayer_PlayerDeathThink *CBasePlayer_PlayerDeathThink() = 0; virtual IReGameHookRegistry_CBasePlayer_PlayerDeathThink *CBasePlayer_PlayerDeathThink() = 0;
virtual IReGameHookRegistry_CBasePlayer_Observer_Think *CBasePlayer_Observer_Think() = 0; virtual IReGameHookRegistry_CBasePlayer_Observer_Think *CBasePlayer_Observer_Think() = 0;
virtual IReGameHookRegistry_CBasePlayer_RemoveAllItems *CBasePlayer_RemoveAllItems() = 0; virtual IReGameHookRegistry_CBasePlayer_RemoveAllItems *CBasePlayer_RemoveAllItems() = 0;
virtual IReGameHookRegistry_CSGameRules_CheckGameOver *CSGameRules_CheckGameOver() = 0;
virtual IReGameHookRegistry_CSGameRules_CheckTimeLimit *CSGameRules_CheckTimeLimit() = 0;
virtual IReGameHookRegistry_CSGameRules_CheckFragLimit *CSGameRules_CheckFragLimit() = 0;
virtual IReGameHookRegistry_CSGameRules_CheckMaxRounds *CSGameRules_CheckMaxRounds() = 0;
virtual IReGameHookRegistry_CSGameRules_CheckWinLimit *CSGameRules_CheckWinLimit() = 0;
}; };
struct ReGameFuncs_t { struct ReGameFuncs_t {