From ea3522083833aca97ff21eb6e99c39622d837390 Mon Sep 17 00:00:00 2001 From: s1lentq Date: Mon, 25 Apr 2016 00:33:12 +0600 Subject: [PATCH] Added api hook RG_RoundEnd Added natives rg_round_end, rg_update_teamscores --- .../extra/amxmodx/scripting/include/reapi.inc | 12 +- .../scripting/include/reapi_gamedll.inc | 3 + .../scripting/include/reapi_gamedll_const.inc | 95 +++++++++++----- reapi/include/cssdk/dlls/gamerules.h | 14 ++- reapi/include/cssdk/dlls/hookchains.h | 10 ++ reapi/include/cssdk/dlls/regamedll_api.h | 7 ++ .../include/cssdk/dlls/regamedll_interfaces.h | 14 +-- reapi/msvc/reapi.vcxproj | 1 + reapi/msvc/reapi.vcxproj.filters | 3 + reapi/src/amxxmodule.h | 2 +- reapi/src/hook_callback.cpp | 74 +++++++------ reapi/src/hook_callback.h | 9 +- reapi/src/hook_list.cpp | 21 ++-- reapi/src/hook_list.h | 103 ++++++------------ reapi/src/hook_manager.cpp | 10 +- reapi/src/member_list.cpp | 4 +- reapi/src/meta_api.cpp | 2 + reapi/src/natives_hookchains.cpp | 4 +- reapi/src/natives_misc.cpp | 74 +++++++++++++ reapi/src/reapi_utils.cpp | 36 ++++++ reapi/src/reapi_utils.h | 4 + 21 files changed, 337 insertions(+), 165 deletions(-) create mode 100644 reapi/src/reapi_utils.cpp diff --git a/reapi/extra/amxmodx/scripting/include/reapi.inc b/reapi/extra/amxmodx/scripting/include/reapi.inc index 42175f2..50bb268 100644 --- a/reapi/extra/amxmodx/scripting/include/reapi.inc +++ b/reapi/extra/amxmodx/scripting/include/reapi.inc @@ -17,13 +17,13 @@ #include // NOTE: only for ReHLDS #include // NOTE: only for gamedll Counter-Strike (ReGameDLL_CS) -// return constants +// hookchain return type enum { - HC_CONTINUE = 0, - HC_OVERRIDE, - HC_SUPERCEDE, - HC_BREAK + HC_CONTINUE = 0, // plugin didn't take any action + HC_OVERRIDE, // call real function, but use my return value + HC_SUPERCEDE, // skip real function, use my return value + HC_BREAK // skip a call each forward in AMXX plugins }; // hookchain types @@ -80,7 +80,7 @@ native bool:EnableHookChain(HookChain:hook); * * native SetHookChainReturn(AType:type, any:...); */ -native SetHookChainReturn(HookChainReturn:type, any:...); +native SetHookChainReturn(AType:type, any:...); /* * Gets the return value of a hookchain. diff --git a/reapi/extra/amxmodx/scripting/include/reapi_gamedll.inc b/reapi/extra/amxmodx/scripting/include/reapi_gamedll.inc index df1bb13..21f10c3 100644 --- a/reapi/extra/amxmodx/scripting/include/reapi_gamedll.inc +++ b/reapi/extra/amxmodx/scripting/include/reapi_gamedll.inc @@ -65,3 +65,6 @@ native rg_multidmg_add(inflictor, victim, Float:flDamage, bitsDamageType); native rg_fire_bullets(inflictor, attacker, shots, Float:vecSrc[3], Float:vecDirShooting[3], Float:vecSpread[3], Float:flDistance, iBulletType, iTracerFreq, iDamage); native Float:[3] rg_fire_bullets3(inflictor, attacker, Float:vecSrc[3], Float:vecDirShooting[3], Float:vecSpread, Float:flDistance, iPenetration, iBulletType, iDamage, Float:flRangeModifier, bool:bPistol, shared_rand); + +native rg_round_end(Float:tmDelay, WinStatus:st, ScenarionEventEndRound:event = ROUND_NONE, const message[] = "default", const sentence[] = "default"); +native rg_update_teamscores(iCtsWins = 0, iTsWins = 0, bool:bAdd = true); diff --git a/reapi/extra/amxmodx/scripting/include/reapi_gamedll_const.inc b/reapi/extra/amxmodx/scripting/include/reapi_gamedll_const.inc index 7fff0e9..86f140f 100644 --- a/reapi/extra/amxmodx/scripting/include/reapi_gamedll_const.inc +++ b/reapi/extra/amxmodx/scripting/include/reapi_gamedll_const.inc @@ -11,6 +11,35 @@ #define SIGNAL_ESCAPE (1<<3) #define SIGNAL_VIPSAFETY (1<<4) +enum WinStatus +{ + WINSTATUS_CTS = 1, + WINSTATUS_TERRORISTS, + WINSTATUS_DRAW, +}; + +// used for EndRoundMessage() logged messages +enum ScenarionEventEndRound +{ + ROUND_NONE, + ROUND_TARGET_BOMB, + ROUND_VIP_ESCAPED, + ROUND_VIP_ASSASSINATED, + ROUND_TERRORISTS_ESCAPED, + ROUND_CTS_PREVENT_ESCAPE, + ROUND_ESCAPING_TERRORISTS_NEUTRALIZED, + ROUND_BOMB_DEFUSED, + ROUND_CTS_WIN, + ROUND_TERRORISTS_WIN, + ROUND_END_DRAW, + ROUND_ALL_HOSTAGES_RESCUED, + ROUND_TARGET_SAVED, + ROUND_HOSTAGE_NOT_RESCUED, + ROUND_TERRORISTS_NOT_ESCAPED, + ROUND_VIP_NOT_ESCAPED, + ROUND_GAME_COMMENCE, +}; + enum PLAYER_ANIM { PLAYER_IDLE, @@ -33,22 +62,28 @@ enum GamedllFunc * Return type: int * Params: (const pObserver) */ - RH_GetForceCamera = 1024, + RG_GetForceCamera = 1024, /** * Description: - * Params: (const index, const inflictor, const attacker, const Float:fadeTime, const Float:fadeHold, const alpha, Float:color[3]) */ - RH_PlayerBlind, + RG_PlayerBlind, /** * Description: - * Params: (const index, inflictor, attacker, Float:vecSrc[3], Float:vecSpot[3], tracehandle) */ - RH_RadiusFlash_TraceLine, + RG_RadiusFlash_TraceLine, + + /** + * Description: - + * Params: (WinStatus:status, ScenarionEventEndRound:event, Float:tmDelay) + */ + RG_RoundEnd, // [...] - RH_GameDLL_End + RG_End }; enum GamedllFunc_CBaseAnimating @@ -57,10 +92,10 @@ enum GamedllFunc_CBaseAnimating * Description: - * Params: (const this) */ - RH_CBaseAnimating_ResetSequenceInfo = 2048, + RG_CBaseAnimating_ResetSequenceInfo = 2048, // [...] - RH_CBaseAnimating_End + RG_CBaseAnimating_End }; enum GamedllFunc_CBasePlayer @@ -69,20 +104,20 @@ enum GamedllFunc_CBasePlayer * Description: - * Params: (const this) */ - RH_CBasePlayer_Spawn = 3072, + RG_CBasePlayer_Spawn = 3072, /** * Description: - * Params: (const this) */ - RH_CBasePlayer_Precache, + RG_CBasePlayer_Precache, /** * Description: - * Return type: int * Params: (const this) */ - RH_CBasePlayer_ObjectCaps, + RG_CBasePlayer_ObjectCaps, /** @@ -90,128 +125,128 @@ enum GamedllFunc_CBasePlayer * Return type: int * Params: (const this) */ - RH_CBasePlayer_Classify, + RG_CBasePlayer_Classify, /** * Description: - * Params: (const this, pevAttacker, Float:flDamage, Float:vecDir[3], tracehandle, bitsDamageType) */ - RH_CBasePlayer_TraceAttack, + RG_CBasePlayer_TraceAttack, /** * Description: - * Return type: int * Params: (const this, pevInflictor, pevAttacker, Float:flDamage, bitsDamageType) */ - RH_CBasePlayer_TakeDamage, + RG_CBasePlayer_TakeDamage, /** * Description: - * Params: (const this, Float:flHealth, bitsDamageType) */ - RH_CBasePlayer_TakeHealth, + RG_CBasePlayer_TakeHealth, /** * Description: - * Params: (const this, pevAttacker, iGib) */ - RH_CBasePlayer_Killed, + RG_CBasePlayer_Killed, /** * Description: - * Params: (const this, score, bAllowNegativeScore) */ - RH_CBasePlayer_AddPoints, + RG_CBasePlayer_AddPoints, /** * Description: - * Params: (const this, score, bAllowNegativeScore) */ - RH_CBasePlayer_AddPointsToTeam, + RG_CBasePlayer_AddPointsToTeam, /** * Description: - * Return type: BOOL * Params: (const this, const pItem) */ - RH_CBasePlayer_AddPlayerItem, + RG_CBasePlayer_AddPlayerItem, /** * Description: - * Return type: BOOL * Params: (const this, const pItem) */ - RH_CBasePlayer_RemovePlayerItem, + RG_CBasePlayer_RemovePlayerItem, /** * Description: - * Return type: int * Params: (const this, iAmount, szName[], iMax) */ - RH_CBasePlayer_GiveAmmo, + RG_CBasePlayer_GiveAmmo, /** * Description: - * Params: (const this) */ - RH_CBasePlayer_ResetMaxSpeed, + RG_CBasePlayer_ResetMaxSpeed, /** * Description: - * Params: (const this) */ - RH_CBasePlayer_Jump, + RG_CBasePlayer_Jump, /** * Description: - * Params: (const this) */ - RH_CBasePlayer_Duck, + RG_CBasePlayer_Duck, /** * Description: - * Params: (const this) */ - RH_CBasePlayer_PreThink, + RG_CBasePlayer_PreThink, /** * Description: - * Params: (const this) */ - RH_CBasePlayer_PostThink, + RG_CBasePlayer_PostThink, /** * Description: - * Params: (const this) */ - RH_CBasePlayer_UpdateClientData, + RG_CBasePlayer_UpdateClientData, /** * Description: - * Params: (const this) */ - RH_CBasePlayer_ImpulseCommands, + RG_CBasePlayer_ImpulseCommands, /** * Description: - * Params: (const this) */ - RH_CBasePlayer_RoundRespawn, + RG_CBasePlayer_RoundRespawn, /** * Description: - * Params: (const this, Float:flUntilTime, Float:flHoldTime, Float:flFadeTime, iAlpha) */ - RH_CBasePlayer_Blind, + RG_CBasePlayer_Blind, /** * Description: - * Params: (const this, iPlayerIndex, bool:bSameTeam) */ - RH_CBasePlayer_Observer_IsValidTarget, + RG_CBasePlayer_Observer_IsValidTarget, // [...] - RH_CBasePlayer_End + RG_CBasePlayer_End }; // CSGameRules diff --git a/reapi/include/cssdk/dlls/gamerules.h b/reapi/include/cssdk/dlls/gamerules.h index c4914fd..a3eef12 100644 --- a/reapi/include/cssdk/dlls/gamerules.h +++ b/reapi/include/cssdk/dlls/gamerules.h @@ -71,7 +71,8 @@ enum // used for EndRoundMessage() logged messages enum ScenarionEventEndRound { - ROUND_TARGET_BOMB = 1, + ROUND_NONE, + ROUND_TARGET_BOMB, ROUND_VIP_ESCAPED, ROUND_VIP_ASSASSINATED, ROUND_TERRORISTS_ESCAPED, @@ -375,6 +376,13 @@ public: void MarkSpawnSkipped() { m_bSkipSpawn = false; } float TimeRemaining() { return m_iRoundTimeSecs - gpGlobals->time + m_fRoundCount; } bool IsMatchStarted() { return (m_fTeamCount != 0.0f || m_fCareerRoundMenuTime != 0.0f || m_fCareerMatchMenuTime != 0.0f); } + + inline void TerminateRound(float tmDelay, int iWinStatus) + { + m_iRoundWinStatus = iWinStatus; + m_fTeamCount = gpGlobals->time + tmDelay; + m_bRoundTerminating = true; + } public: CVoiceGameMgr m_VoiceGameMgr; float m_fTeamCount; // m_flRestartRoundTime, the global time when the round is supposed to end, if this is not 0 @@ -458,6 +466,10 @@ public: int m_iRoundWinDifference; float m_fCareerMatchMenuTime; bool m_bSkipSpawn; + + // custom + bool m_bNeededPlayers; + float m_flEscapeRatio; }; typedef struct mapcycle_item_s diff --git a/reapi/include/cssdk/dlls/hookchains.h b/reapi/include/cssdk/dlls/hookchains.h index f2993e8..b4190a1 100644 --- a/reapi/include/cssdk/dlls/hookchains.h +++ b/reapi/include/cssdk/dlls/hookchains.h @@ -68,6 +68,16 @@ public: virtual void unregisterHook(hookfunc_t hook) = 0; }; +// Hook chain registry(for hooks [un]registration) +template +class IHookChainRegistryClassEmpty { +public: + typedef t_ret(*hookfunc_t)(IHookChain*, t_args...); + + virtual void registerHook(hookfunc_t hook) = 0; + virtual void unregisterHook(hookfunc_t hook) = 0; +}; + // Hook chain registry(for hooks [un]registration) template class IVoidHookChainRegistry { diff --git a/reapi/include/cssdk/dlls/regamedll_api.h b/reapi/include/cssdk/dlls/regamedll_api.h index ef3a47d..02be70b 100644 --- a/reapi/include/cssdk/dlls/regamedll_api.h +++ b/reapi/include/cssdk/dlls/regamedll_api.h @@ -170,6 +170,10 @@ typedef IVoidHookChainRegistry IReGameHook_RadiusFlash_TraceLine; typedef IVoidHookChainRegistry IReGameHookRegistry_RadiusFlash_TraceLine; +// RoundEnd hook +typedef IHookChain IReGameHook_RoundEnd; +typedef IHookChainRegistryClassEmpty IReGameHookRegistry_RoundEnd; + class IReGameHookchains { public: virtual ~IReGameHookchains() {} @@ -211,6 +215,7 @@ public: virtual IReGameHookRegistry_GetForceCamera* GetForceCamera() = 0; virtual IReGameHookRegistry_PlayerBlind* PlayerBlind() = 0; virtual IReGameHookRegistry_RadiusFlash_TraceLine* RadiusFlash_TraceLine() = 0; + virtual IReGameHookRegistry_RoundEnd* RoundEnd() = 0; }; @@ -229,6 +234,8 @@ struct ReGameFuncs_t { void (*ApplyMultiDamage)(entvars_t *pevInflictor, entvars_t *pevAttacker); void (*AddMultiDamage)(entvars_t *pevInflictor, CBaseEntity *pEntity, float flDamage, int bitsDamageType); + void (*EndRoundMessage)(const char *sentence, int event); + }; class IReGameApi { diff --git a/reapi/include/cssdk/dlls/regamedll_interfaces.h b/reapi/include/cssdk/dlls/regamedll_interfaces.h index 6c411cd..e2d3fd0 100644 --- a/reapi/include/cssdk/dlls/regamedll_interfaces.h +++ b/reapi/include/cssdk/dlls/regamedll_interfaces.h @@ -68,12 +68,12 @@ public: virtual void SetObjectCollisionBox() = 0; virtual int Classify() = 0; virtual void DeathNotice(struct entvars_s *pevChild) = 0; - virtual void TraceAttack(struct entvars_s *pevAttacker, float flDamage, Vector vecDir, struct TraceResult *ptr, int bitsDamageType) = 0; + virtual void TraceAttack(struct entvars_s *pevAttacker, float flDamage, Vector &vecDir, struct TraceResult *ptr, int bitsDamageType) = 0; virtual int TakeDamage(struct entvars_s *pevInflictor, struct entvars_s *pevAttacker, float flDamage, int bitsDamageType) = 0; virtual int TakeHealth(float flHealth, int bitsDamageType) = 0; virtual void Killed(struct entvars_s *pevAttacker, int iGib) = 0; virtual int BloodColor() = 0; - virtual void TraceBleed(float flDamage, Vector vecDir, struct TraceResult *ptr, int bitsDamageType) = 0; + virtual void TraceBleed(float flDamage, Vector &vecDir, struct TraceResult *ptr, int bitsDamageType) = 0; virtual bool IsTriggered(CCSEntity *pActivator) = 0; virtual ICSMonster *MyMonsterPointer() = 0; virtual ICSquadMonster *MySquadMonsterPointer() = 0; @@ -118,8 +118,8 @@ public: public: virtual struct entvars_s *GetEntVars() const = 0; virtual class CBaseEntity *GetEntity() const = 0; - virtual void FireBullets(int iShots, Vector vecSrc, Vector vecDirShooting, Vector vecSpread, float flDistance, int iBulletType, int iTracerFreq, int iDamage, entvars_t *pevAttacker) = 0; - virtual Vector FireBullets3(Vector vecSrc, Vector vecDirShooting, float vecSpread, float flDistance, int iPenetration, int iBulletType, int iDamage, float flRangeModifier, entvars_t *pevAttacker, bool bPistol, int shared_rand) = 0; + virtual void FireBullets(int iShots, Vector &vecSrc, Vector &vecDirShooting, Vector &vecSpread, float flDistance, int iBulletType, int iTracerFreq, int iDamage, entvars_t *pevAttacker) = 0; + virtual Vector FireBullets3(Vector &vecSrc, Vector &vecDirShooting, float vecSpread, float flDistance, int iPenetration, int iBulletType, int iDamage, float flRangeModifier, entvars_t *pevAttacker, bool bPistol, int shared_rand) = 0; }; class ICSDelay: public ICSEntity { @@ -208,7 +208,7 @@ public: class ICSMonster: public ICSToggle { public: virtual void KeyValue(struct KeyValueData_s *pkvd) = 0; - virtual void TraceAttack(struct entvars_s *pevAttacker, float flDamage, Vector vecDir, struct TraceResult *ptr, int bitsDamageType) = 0; + virtual void TraceAttack(struct entvars_s *pevAttacker, float flDamage, Vector &vecDir, struct TraceResult *ptr, int bitsDamageType) = 0; virtual int TakeDamage(struct entvars_s *pevInflictor, struct entvars_s *pevAttacker, float flDamage, int bitsDamageType) = 0; virtual int TakeHealth(float flHealth, int bitsDamageType) = 0; virtual void Killed(struct entvars_s *pevAttacker, int iGib) = 0; @@ -260,7 +260,7 @@ public: virtual int Restore(CRestore &restore) = 0; virtual int ObjectCaps() = 0; virtual int Classify() = 0; - virtual void TraceAttack(struct entvars_s *pevAttacker, float flDamage, Vector vecDir, struct TraceResult *ptr, int bitsDamageType) = 0; + virtual void TraceAttack(struct entvars_s *pevAttacker, float flDamage, Vector &vecDir, struct TraceResult *ptr, int bitsDamageType) = 0; virtual int TakeDamage(struct entvars_s *pevInflictor, struct entvars_s *pevAttacker, float flDamage, int bitsDamageType) = 0; virtual int TakeHealth(float flHealth, int bitsDamageType) = 0; virtual void Killed(struct entvars_s *pevAttacker, int iGib) = 0; @@ -846,7 +846,7 @@ public: virtual int Save(CSave &save) = 0; virtual int Restore(CRestore &restore) = 0; virtual int ObjectCaps() = 0; - virtual void TraceAttack(struct entvars_s *pevAttacker, float flDamage, Vector vecDir, struct TraceResult *ptr, int bitsDamageType) = 0; + virtual void TraceAttack(struct entvars_s *pevAttacker, float flDamage, Vector &vecDir, struct TraceResult *ptr, int bitsDamageType) = 0; virtual int TakeDamage(struct entvars_s *pevInflictor, struct entvars_s *pevAttacker, float flDamage, int bitsDamageType) = 0; virtual int DamageDecal(int bitsDamageType) = 0; virtual void Use(CCSEntity *pActivator, CCSEntity *pCaller, USE_TYPE useType, float value) = 0; diff --git a/reapi/msvc/reapi.vcxproj b/reapi/msvc/reapi.vcxproj index ff0239e..7b9a12e 100644 --- a/reapi/msvc/reapi.vcxproj +++ b/reapi/msvc/reapi.vcxproj @@ -245,6 +245,7 @@ Create Create + diff --git a/reapi/msvc/reapi.vcxproj.filters b/reapi/msvc/reapi.vcxproj.filters index 456aa95..f00d7b0 100644 --- a/reapi/msvc/reapi.vcxproj.filters +++ b/reapi/msvc/reapi.vcxproj.filters @@ -698,6 +698,9 @@ src\natives + + src + diff --git a/reapi/src/amxxmodule.h b/reapi/src/amxxmodule.h index 8977a22..11cadba 100644 --- a/reapi/src/amxxmodule.h +++ b/reapi/src/amxxmodule.h @@ -55,7 +55,7 @@ struct amxx_module_info_s /* calling convention for native functions */ #if !defined AMX_NATIVE_CALL -#define AMX_NATIVE_CALL +#define AMX_NATIVE_CALL FORCE_STACK_ALIGN #endif /* calling convention for all interface functions and callback functions */ #if !defined AMXAPI diff --git a/reapi/src/hook_callback.cpp b/reapi/src/hook_callback.cpp index ec729b5..2d330a4 100644 --- a/reapi/src/hook_callback.cpp +++ b/reapi/src/hook_callback.cpp @@ -55,7 +55,7 @@ void CBasePlayer_Spawn(IReGameHook_CBasePlayer_Spawn *chain, CBasePlayer *pthis) chain->callNext(); }; - callVoidForward(RH_CBasePlayer_Spawn, original, pthis->entindex()); + callVoidForward(RG_CBasePlayer_Spawn, original, pthis->entindex()); } void CBasePlayer_Precache(IReGameHook_CBasePlayer_Precache *chain, CBasePlayer *pthis) @@ -65,7 +65,7 @@ void CBasePlayer_Precache(IReGameHook_CBasePlayer_Precache *chain, CBasePlayer * chain->callNext(); }; - callVoidForward(RH_CBasePlayer_Precache, original, pthis->entindex()); + callVoidForward(RG_CBasePlayer_Precache, original, pthis->entindex()); } int CBasePlayer_ObjectCaps(IReGameHook_CBasePlayer_ObjectCaps *chain, CBasePlayer *pthis) @@ -75,7 +75,7 @@ int CBasePlayer_ObjectCaps(IReGameHook_CBasePlayer_ObjectCaps *chain, CBasePlaye return chain->callNext(); }; - return callForward(RH_CBasePlayer_ObjectCaps, original, pthis->entindex()); + return callForward(RG_CBasePlayer_ObjectCaps, original, pthis->entindex()); } int CBasePlayer_Classify(IReGameHook_CBasePlayer_Classify *chain, CBasePlayer *pthis) @@ -85,7 +85,7 @@ int CBasePlayer_Classify(IReGameHook_CBasePlayer_Classify *chain, CBasePlayer *p return chain->callNext(); }; - return callForward(RH_CBasePlayer_Classify, original, pthis->entindex()); + return callForward(RG_CBasePlayer_Classify, original, pthis->entindex()); } void CBasePlayer_TraceAttack(IReGameHook_CBasePlayer_TraceAttack *chain, CBasePlayer *pthis, entvars_t *pevAttacker, float flDamage, Vector& vecDir, TraceResult *ptr, int bitsDamageType) @@ -97,7 +97,7 @@ void CBasePlayer_TraceAttack(IReGameHook_CBasePlayer_TraceAttack *chain, CBasePl chain->callNext(PEV(_pevAttacker), _flDamage, vecDirCopy, (TraceResult *)_ptr, _bitsDamageType); }; - callVoidForward(RH_CBasePlayer_TraceAttack, original, pthis->entindex(), indexOfEdict(pevAttacker), flDamage, g_amxxapi.PrepareCellArrayA(reinterpret_cast(&vecDirCopy), 3, true), int(ptr), bitsDamageType); + callVoidForward(RG_CBasePlayer_TraceAttack, original, pthis->entindex(), indexOfEdict(pevAttacker), flDamage, g_amxxapi.PrepareCellArrayA(reinterpret_cast(&vecDirCopy), 3, true), int(ptr), bitsDamageType); } int CBasePlayer_TakeDamage(IReGameHook_CBasePlayer_TakeDamage *chain, CBasePlayer *pthis, entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, int bitsDamageType) @@ -107,7 +107,7 @@ int CBasePlayer_TakeDamage(IReGameHook_CBasePlayer_TakeDamage *chain, CBasePlaye return chain->callNext(PEV(_pevInflictor), PEV(_pevAttacker), _flDamage, _bitsDamageType); }; - return callForward(RH_CBasePlayer_TakeDamage, original, pthis->entindex(), indexOfEdict(pevInflictor), indexOfEdict(pevAttacker), flDamage, bitsDamageType); + return callForward(RG_CBasePlayer_TakeDamage, original, pthis->entindex(), indexOfEdict(pevInflictor), indexOfEdict(pevAttacker), flDamage, bitsDamageType); } int CBasePlayer_TakeHealth(IReGameHook_CBasePlayer_TakeHealth *chain, CBasePlayer *pthis, float flHealth, int bitsDamageType) @@ -117,7 +117,7 @@ int CBasePlayer_TakeHealth(IReGameHook_CBasePlayer_TakeHealth *chain, CBasePlaye return chain->callNext(_flHealth, _bitsDamageType); }; - return callForward(RH_CBasePlayer_TakeHealth, original, pthis->entindex(), flHealth, bitsDamageType); + return callForward(RG_CBasePlayer_TakeHealth, original, pthis->entindex(), flHealth, bitsDamageType); } void CBasePlayer_Killed(IReGameHook_CBasePlayer_Killed *chain, CBasePlayer *pthis, entvars_t *pevAttacker, int iGib) @@ -127,7 +127,7 @@ void CBasePlayer_Killed(IReGameHook_CBasePlayer_Killed *chain, CBasePlayer *pthi chain->callNext(PEV(_pevAttacker), _iGib); }; - callVoidForward(RH_CBasePlayer_Killed, original, pthis->entindex(), indexOfEdict(pevAttacker), iGib); + callVoidForward(RG_CBasePlayer_Killed, original, pthis->entindex(), indexOfEdict(pevAttacker), iGib); } void CBasePlayer_AddPoints(IReGameHook_CBasePlayer_AddPoints *chain, CBasePlayer *pthis, int score, BOOL bAllowNegativeScore) @@ -137,7 +137,7 @@ void CBasePlayer_AddPoints(IReGameHook_CBasePlayer_AddPoints *chain, CBasePlayer chain->callNext(_score, _bAllowNegativeScore); }; - callVoidForward(RH_CBasePlayer_AddPoints, original, pthis->entindex(), score, bAllowNegativeScore); + callVoidForward(RG_CBasePlayer_AddPoints, original, pthis->entindex(), score, bAllowNegativeScore); } void CBasePlayer_AddPointsToTeam(IReGameHook_CBasePlayer_AddPointsToTeam *chain, CBasePlayer *pthis, int score, BOOL bAllowNegativeScore) @@ -147,7 +147,7 @@ void CBasePlayer_AddPointsToTeam(IReGameHook_CBasePlayer_AddPointsToTeam *chain, chain->callNext(_score, _bAllowNegativeScore); }; - callVoidForward(RH_CBasePlayer_AddPointsToTeam, original, pthis->entindex(), score, bAllowNegativeScore); + callVoidForward(RG_CBasePlayer_AddPointsToTeam, original, pthis->entindex(), score, bAllowNegativeScore); } BOOL CBasePlayer_AddPlayerItem(IReGameHook_CBasePlayer_AddPlayerItem *chain, CBasePlayer *pthis, CBasePlayerItem *pItem) @@ -157,7 +157,7 @@ BOOL CBasePlayer_AddPlayerItem(IReGameHook_CBasePlayer_AddPlayerItem *chain, CBa return chain->callNext(getPrivate(_pItem)); }; - return callForward(RH_CBasePlayer_AddPlayerItem, original, pthis->entindex(), pItem->entindex()); + return callForward(RG_CBasePlayer_AddPlayerItem, original, pthis->entindex(), pItem->entindex()); } BOOL CBasePlayer_RemovePlayerItem(IReGameHook_CBasePlayer_RemovePlayerItem *chain, CBasePlayer *pthis, CBasePlayerItem *pItem) @@ -167,7 +167,7 @@ BOOL CBasePlayer_RemovePlayerItem(IReGameHook_CBasePlayer_RemovePlayerItem *chai return chain->callNext(getPrivate(_pItem)); }; - return callForward(RH_CBasePlayer_RemovePlayerItem, original, pthis->entindex(), pItem->entindex()); + return callForward(RG_CBasePlayer_RemovePlayerItem, original, pthis->entindex(), pItem->entindex()); } int CBasePlayer_GiveAmmo(IReGameHook_CBasePlayer_GiveAmmo *chain, CBasePlayer *pthis, int iAmount, char *szName, int iMax) @@ -177,7 +177,7 @@ int CBasePlayer_GiveAmmo(IReGameHook_CBasePlayer_GiveAmmo *chain, CBasePlayer *p return chain->callNext(_iAmount, _szName, _iMax); }; - return callForward(RH_CBasePlayer_GiveAmmo, original, pthis->entindex(), iAmount, szName, iMax); + return callForward(RG_CBasePlayer_GiveAmmo, original, pthis->entindex(), iAmount, szName, iMax); } void CBasePlayer_ResetMaxSpeed(IReGameHook_CBasePlayer_ResetMaxSpeed *chain, CBasePlayer *pthis) @@ -187,7 +187,7 @@ void CBasePlayer_ResetMaxSpeed(IReGameHook_CBasePlayer_ResetMaxSpeed *chain, CBa chain->callNext(); }; - callVoidForward(RH_CBasePlayer_ResetMaxSpeed, original, pthis->entindex()); + callVoidForward(RG_CBasePlayer_ResetMaxSpeed, original, pthis->entindex()); } void CBasePlayer_Jump(IReGameHook_CBasePlayer_Jump *chain, CBasePlayer *pthis) @@ -197,7 +197,7 @@ void CBasePlayer_Jump(IReGameHook_CBasePlayer_Jump *chain, CBasePlayer *pthis) chain->callNext(); }; - callVoidForward(RH_CBasePlayer_Jump, original, pthis->entindex()); + callVoidForward(RG_CBasePlayer_Jump, original, pthis->entindex()); } void CBasePlayer_Duck(IReGameHook_CBasePlayer_Duck *chain, CBasePlayer *pthis) @@ -207,7 +207,7 @@ void CBasePlayer_Duck(IReGameHook_CBasePlayer_Duck *chain, CBasePlayer *pthis) chain->callNext(); }; - callVoidForward(RH_CBasePlayer_Duck, original, pthis->entindex()); + callVoidForward(RG_CBasePlayer_Duck, original, pthis->entindex()); } void CBasePlayer_PreThink(IReGameHook_CBasePlayer_PreThink *chain, CBasePlayer *pthis) @@ -217,7 +217,7 @@ void CBasePlayer_PreThink(IReGameHook_CBasePlayer_PreThink *chain, CBasePlayer * chain->callNext(); }; - callVoidForward(RH_CBasePlayer_PreThink, original, pthis->entindex()); + callVoidForward(RG_CBasePlayer_PreThink, original, pthis->entindex()); } void CBasePlayer_PostThink(IReGameHook_CBasePlayer_PostThink *chain, CBasePlayer *pthis) @@ -227,7 +227,7 @@ void CBasePlayer_PostThink(IReGameHook_CBasePlayer_PostThink *chain, CBasePlayer chain->callNext(); }; - callVoidForward(RH_CBasePlayer_PostThink, original, pthis->entindex()); + callVoidForward(RG_CBasePlayer_PostThink, original, pthis->entindex()); } void CBasePlayer_UpdateClientData(IReGameHook_CBasePlayer_UpdateClientData *chain, CBasePlayer *pthis) @@ -237,7 +237,7 @@ void CBasePlayer_UpdateClientData(IReGameHook_CBasePlayer_UpdateClientData *chai chain->callNext(); }; - callVoidForward(RH_CBasePlayer_UpdateClientData, original, pthis->entindex()); + callVoidForward(RG_CBasePlayer_UpdateClientData, original, pthis->entindex()); } void CBasePlayer_ImpulseCommands(IReGameHook_CBasePlayer_ImpulseCommands *chain, CBasePlayer *pthis) @@ -247,7 +247,7 @@ void CBasePlayer_ImpulseCommands(IReGameHook_CBasePlayer_ImpulseCommands *chain, chain->callNext(); }; - callVoidForward(RH_CBasePlayer_ImpulseCommands, original, pthis->entindex()); + callVoidForward(RG_CBasePlayer_ImpulseCommands, original, pthis->entindex()); } void CBasePlayer_RoundRespawn(IReGameHook_CBasePlayer_RoundRespawn *chain, CBasePlayer *pthis) @@ -257,7 +257,7 @@ void CBasePlayer_RoundRespawn(IReGameHook_CBasePlayer_RoundRespawn *chain, CBase chain->callNext(); }; - callVoidForward(RH_CBasePlayer_RoundRespawn, original, pthis->entindex()); + callVoidForward(RG_CBasePlayer_RoundRespawn, original, pthis->entindex()); } void CBasePlayer_Blind(IReGameHook_CBasePlayer_Blind *chain, CBasePlayer *pthis, float flUntilTime, float flHoldTime, float flFadeTime, int iAlpha) @@ -267,7 +267,7 @@ void CBasePlayer_Blind(IReGameHook_CBasePlayer_Blind *chain, CBasePlayer *pthis, chain->callNext(_flUntilTime, _flHoldTime, _flFadeTime, _iAlpha); }; - callVoidForward(RH_CBasePlayer_Blind, original, pthis->entindex(), flUntilTime, flHoldTime, flFadeTime, iAlpha); + callVoidForward(RG_CBasePlayer_Blind, original, pthis->entindex(), flUntilTime, flHoldTime, flFadeTime, iAlpha); } CBaseEntity *CBasePlayer_Observer_IsValidTarget(IReGameHook_CBasePlayer_Observer_IsValidTarget *chain, CBasePlayer *pthis, int iPlayerIndex, bool bSameTeam) @@ -277,7 +277,7 @@ CBaseEntity *CBasePlayer_Observer_IsValidTarget(IReGameHook_CBasePlayer_Observer return chain->callNext(_iPlayerIndex, _bSameTeam); }; - return callForward(RH_CBasePlayer_Observer_IsValidTarget, original, pthis->entindex(), iPlayerIndex, bSameTeam); + return callForward(RG_CBasePlayer_Observer_IsValidTarget, original, pthis->entindex(), iPlayerIndex, bSameTeam); } void CBasePlayer_SetAnimation(IReGameHook_CBasePlayer_SetAnimation *chain, CBasePlayer *pthis, PLAYER_ANIM playerAnim) @@ -287,7 +287,7 @@ void CBasePlayer_SetAnimation(IReGameHook_CBasePlayer_SetAnimation *chain, CBase chain->callNext(_playerAnim); }; - callVoidForward(RH_CBasePlayer_SetAnimation, original, pthis->entindex(), playerAnim); + callVoidForward(RG_CBasePlayer_SetAnimation, original, pthis->entindex(), playerAnim); } void CBasePlayer_GiveDefaultItems(IReGameHook_CBasePlayer_GiveDefaultItems *chain, CBasePlayer *pthis) @@ -297,7 +297,7 @@ void CBasePlayer_GiveDefaultItems(IReGameHook_CBasePlayer_GiveDefaultItems *chai chain->callNext(); }; - callVoidForward(RH_CBasePlayer_GiveDefaultItems, original, pthis->entindex()); + callVoidForward(RG_CBasePlayer_GiveDefaultItems, original, pthis->entindex()); } void CBasePlayer_GiveNamedItem(IReGameHook_CBasePlayer_GiveNamedItem *chain, CBasePlayer *pthis, const char *pszName) @@ -307,7 +307,7 @@ void CBasePlayer_GiveNamedItem(IReGameHook_CBasePlayer_GiveNamedItem *chain, CBa chain->callNext(_pszName); }; - callVoidForward(RH_CBasePlayer_GiveNamedItem, original, pthis->entindex(), pszName); + callVoidForward(RG_CBasePlayer_GiveNamedItem, original, pthis->entindex(), pszName); } void CBasePlayer_AddAccount(IReGameHook_CBasePlayer_AddAccount *chain, CBasePlayer *pthis, int amount, bool bTrackChange) @@ -317,7 +317,7 @@ void CBasePlayer_AddAccount(IReGameHook_CBasePlayer_AddAccount *chain, CBasePlay chain->callNext(_amount, _bTrackChange); }; - callVoidForward(RH_CBasePlayer_AddAccount, original, pthis->entindex(), amount, bTrackChange); + callVoidForward(RG_CBasePlayer_AddAccount, original, pthis->entindex(), amount, bTrackChange); } void CBasePlayer_GiveShield(IReGameHook_CBasePlayer_GiveShield *chain, CBasePlayer *pthis, bool bDeploy) @@ -327,7 +327,7 @@ void CBasePlayer_GiveShield(IReGameHook_CBasePlayer_GiveShield *chain, CBasePlay chain->callNext(_bDeploy); }; - callVoidForward(RH_CBasePlayer_GiveShield, original, pthis->entindex(), bDeploy); + callVoidForward(RG_CBasePlayer_GiveShield, original, pthis->entindex(), bDeploy); } void CBaseAnimating_ResetSequenceInfo(IReGameHook_CBaseAnimating_ResetSequenceInfo *chain, CBaseAnimating *pthis) @@ -337,7 +337,7 @@ void CBaseAnimating_ResetSequenceInfo(IReGameHook_CBaseAnimating_ResetSequenceIn chain->callNext(); }; - callVoidForward(RH_CBaseAnimating_ResetSequenceInfo, original, pthis->entindex()); + callVoidForward(RG_CBaseAnimating_ResetSequenceInfo, original, pthis->entindex()); } int GetForceCamera(IReGameHook_GetForceCamera *chain, CBasePlayer *pObserver) @@ -347,7 +347,7 @@ int GetForceCamera(IReGameHook_GetForceCamera *chain, CBasePlayer *pObserver) return chain->callNext(getPrivate(_pObserver)); }; - return callForward(RH_GetForceCamera, original, pObserver->entindex()); + return callForward(RG_GetForceCamera, original, pObserver->entindex()); } void PlayerBlind(IReGameHook_PlayerBlind *chain, CBasePlayer *pPlayer, entvars_t *pevInflictor, entvars_t *pevAttacker, float fadeTime, float fadeHold, int alpha, Vector& color) @@ -359,7 +359,7 @@ void PlayerBlind(IReGameHook_PlayerBlind *chain, CBasePlayer *pPlayer, entvars_t chain->callNext(getPrivate(_pPlayer), PEV(_pevInflictor), PEV(_pevAttacker), _fadeTime, _fadeHold, _alpha, colorCopy); }; - callVoidForward(RH_PlayerBlind, original, pPlayer->entindex(), indexOfEdict(pevInflictor), indexOfEdict(pevAttacker), fadeTime, fadeHold, alpha, g_amxxapi.PrepareCellArrayA(reinterpret_cast(&colorCopy), 3, true)); + callVoidForward(RG_PlayerBlind, original, pPlayer->entindex(), indexOfEdict(pevInflictor), indexOfEdict(pevAttacker), fadeTime, fadeHold, alpha, g_amxxapi.PrepareCellArrayA(reinterpret_cast(&colorCopy), 3, true)); } void RadiusFlash_TraceLine(IReGameHook_RadiusFlash_TraceLine *chain, CBasePlayer *pPlayer, entvars_t *pevInflictor, entvars_t *pevAttacker, Vector& vecSrc, Vector& vecSpot, TraceResult *ptr) @@ -371,5 +371,15 @@ void RadiusFlash_TraceLine(IReGameHook_RadiusFlash_TraceLine *chain, CBasePlayer chain->callNext(getPrivate(_pPlayer), PEV(_pevInflictor), PEV(_pevAttacker), vecSrcCopy, vecSpotCopy, (TraceResult *)_ptr); }; - callVoidForward(RH_RadiusFlash_TraceLine, original, pPlayer->entindex(), indexOfEdict(pevInflictor), indexOfEdict(pevAttacker), g_amxxapi.PrepareCellArrayA(reinterpret_cast(&vecSrcCopy), 3, true), g_amxxapi.PrepareCellArrayA(reinterpret_cast(&vecSpotCopy), 3, true), int(ptr)); + callVoidForward(RG_RadiusFlash_TraceLine, original, pPlayer->entindex(), indexOfEdict(pevInflictor), indexOfEdict(pevAttacker), g_amxxapi.PrepareCellArrayA(reinterpret_cast(&vecSrcCopy), 3, true), g_amxxapi.PrepareCellArrayA(reinterpret_cast(&vecSpotCopy), 3, true), int(ptr)); +} + +bool RoundEnd(IReGameHook_RoundEnd *chain, int winStatus, ScenarionEventEndRound event, float tmDelay) +{ + auto original = [chain](int _winStatus, ScenarionEventEndRound _event, float _tmDelay) + { + return chain->callNext(_winStatus, _event, _tmDelay); + }; + + return callForward(RG_RoundEnd, original, winStatus, event, tmDelay); } diff --git a/reapi/src/hook_callback.h b/reapi/src/hook_callback.h index 7820b84..215eeb7 100644 --- a/reapi/src/hook_callback.h +++ b/reapi/src/hook_callback.h @@ -3,10 +3,10 @@ // hookchain return type enum HookChainState { - HC_CONTINUE = 0, - HC_OVERRIDE, - HC_SUPERCEDE, - HC_BREAK + HC_CONTINUE = 0, // plugin didn't take any action + HC_OVERRIDE, // call real function, but use my return value + HC_SUPERCEDE, // skip real function, use my return value + HC_BREAK // skip all forwards and real function, use my return value }; // api types @@ -200,6 +200,7 @@ void Cvar_DirectSet(IRehldsHook_Cvar_DirectSet *chain, cvar_t *var, const char * int GetForceCamera(IReGameHook_GetForceCamera *chain, CBasePlayer *pObserver); void PlayerBlind(IReGameHook_PlayerBlind *chain, CBasePlayer *pPlayer, entvars_t *pevInflictor, entvars_t *pevAttacker, float fadeTime, float fadeHold, int alpha, Vector& color); void RadiusFlash_TraceLine(IReGameHook_RadiusFlash_TraceLine *chain, CBasePlayer *pPlayer, entvars_t *pevInflictor, entvars_t *pevAttacker, Vector& vecSrc, Vector& vecSpot, TraceResult *ptr); +bool RoundEnd(IReGameHook_RoundEnd *chain, int winStatus, ScenarionEventEndRound event, float tmDelay); // regamedll functions - player void CBasePlayer_Spawn(IReGameHook_CBasePlayer_Spawn *chain, CBasePlayer *pthis); diff --git a/reapi/src/hook_list.cpp b/reapi/src/hook_list.cpp index 76f6e25..9925c30 100644 --- a/reapi/src/hook_list.cpp +++ b/reapi/src/hook_list.cpp @@ -1,14 +1,16 @@ #include "precompiled.h" -inline size_t getFwdParamType(void(*)(int)) { return FP_CELL; } -inline size_t getFwdParamType(void(*)(bool)) { return FP_CELL; } -inline size_t getFwdParamType(void(*)(Vector&)) { return FP_CELL; } -inline size_t getFwdParamType(void(*)(PLAYER_ANIM)) { return FP_CELL; } -inline size_t getFwdParamType(void(*)(float)) { return FP_FLOAT; } -inline size_t getFwdParamType(void(*)(const char *)) { return FP_STRING; } +inline size_t getFwdParamType(void(*)(int)) { return FP_CELL; } +inline size_t getFwdParamType(void(*)(bool)) { return FP_CELL; } +inline size_t getFwdParamType(void(*)(Vector&)) { return FP_ARRAY; } +inline size_t getFwdParamType(void(*)(PLAYER_ANIM)) { return FP_CELL; } +inline size_t getFwdParamType(void(*)(ScenarionEventEndRound)) { return FP_CELL; } +inline size_t getFwdParamType(void(*)(float)) { return FP_FLOAT; } +inline size_t getFwdParamType(void(*)(const char *)) { return FP_STRING; } +inline size_t getFwdParamType(void(*)(char *)) { return FP_STRING; } template -inline size_t getFwdParamType(void(*)(T *)) { return FP_CELL; } +inline size_t getFwdParamType(void(*)(T *)) { return FP_CELL; } template void setupParamTypes(size_t param_types[], void (*)()) @@ -66,11 +68,12 @@ hook_t hooklist_engine[] = { ENG(Cvar_DirectSet) }; -#define DLL(h) { {}, {}, #h, "ReGameDLL", [](){ return api_cfg.hasReGameDLL(); }, ((!(RH_##h & (MAX_REGION_RANGE - 1)) ? regfunc::current_cell = 1, true : false) || (RH_##h & (MAX_REGION_RANGE - 1)) == regfunc::current_cell++) ? regfunc(h) : regfunc(#h " doesn't match hook definition"), [](){ g_ReGameHookchains->##h##()->registerHook(&##h); }, [](){ g_ReGameHookchains->##h##()->unregisterHook(&##h); }} +#define DLL(h) { {}, {}, #h, "ReGameDLL", [](){ return api_cfg.hasReGameDLL(); }, ((!(RG_##h & (MAX_REGION_RANGE - 1)) ? regfunc::current_cell = 1, true : false) || (RG_##h & (MAX_REGION_RANGE - 1)) == regfunc::current_cell++) ? regfunc(h) : regfunc(#h " doesn't match hook definition"), [](){ g_ReGameHookchains->##h##()->registerHook(&##h); }, [](){ g_ReGameHookchains->##h##()->unregisterHook(&##h); }} hook_t hooklist_gamedll[] = { DLL(GetForceCamera), DLL(PlayerBlind), - DLL(RadiusFlash_TraceLine) + DLL(RadiusFlash_TraceLine), + DLL(RoundEnd) }; hook_t hooklist_animating[] = { diff --git a/reapi/src/hook_list.h b/reapi/src/hook_list.h index 78a4be2..21e40c7 100644 --- a/reapi/src/hook_list.h +++ b/reapi/src/hook_list.h @@ -63,42 +63,10 @@ struct hooklist_t enum EngineFunc { - //RH_Steam_NotifyClientConnect = 0, - //RH_SV_ConnectClient, - //RH_SV_GetIDString, - //RH_SV_SendServerinfo, - //RH_SV_CheckProtocol, - //RH_SVC_GetChallenge, - //RH_SV_CheckKeyInfo, - //RH_SV_CheckIPRestrictions, - //RH_SV_FinishCertificateCheck, - //RH_Steam_NotifyBotConnect, - //RH_SV_SerializeSteamid, - //RH_SV_CompareUserID, - //RH_Steam_NotifyClientDisconnect, - //RH_NET_GetPacketPreprocessor, - //RH_ValidateCommand, - //RH_ClientConnected, - //RH_SV_HandleClientMessage, - //RH_Mod_LoadBrushModel, - //RH_Mod_LoadStudioModel, - //RH_ExecuteServerStringCmd, - //RH_SV_EmitEvents, - //RH_EV_PlayReliableEvent, RH_SV_StartSound = BEGIN_FUNC_REGION(engine), - //RH_PF_Remove_I, - //RH_PF_BuildSoundMsg_I, - //RH_SV_WriteFullClientUpdate, - //RH_SV_CheckConsistencyResponse, RH_SV_DropClient, RH_SV_ActivateServer, - //RH_SV_WriteVoiceCodec, - //RH_Steam_GSGetSteamID, - //RH_SV_TransferConsistencyInfo, - //RH_Steam_GSBUpdateUserData, RH_Cvar_DirectSet, - //RH_SV_EstablishTimeBase, - //RH_SV_Spawn_f, // [...] RH_EngineFunc_End @@ -106,55 +74,56 @@ enum EngineFunc enum GamedllFunc { - RH_GetForceCamera = BEGIN_FUNC_REGION(gamedll), - RH_PlayerBlind, - RH_RadiusFlash_TraceLine, + RG_GetForceCamera = BEGIN_FUNC_REGION(gamedll), + RG_PlayerBlind, + RG_RadiusFlash_TraceLine, + RG_RoundEnd, // [...] - RH_GameDLL_End + RG_End }; enum GamedllFunc_CBaseAnimating { - RH_CBaseAnimating_ResetSequenceInfo = BEGIN_FUNC_REGION(animating), + RG_CBaseAnimating_ResetSequenceInfo = BEGIN_FUNC_REGION(animating), // [...] - RH_CBaseAnimating_End + RG_CBaseAnimating_End }; enum GamedllFunc_CBasePlayer { // CBasePlayer virtual - RH_CBasePlayer_Spawn = BEGIN_FUNC_REGION(player), - RH_CBasePlayer_Precache, - RH_CBasePlayer_ObjectCaps, - RH_CBasePlayer_Classify, - RH_CBasePlayer_TraceAttack, - RH_CBasePlayer_TakeDamage, - RH_CBasePlayer_TakeHealth, - RH_CBasePlayer_Killed, - RH_CBasePlayer_AddPoints, - RH_CBasePlayer_AddPointsToTeam, - RH_CBasePlayer_AddPlayerItem, - RH_CBasePlayer_RemovePlayerItem, - RH_CBasePlayer_GiveAmmo, - RH_CBasePlayer_ResetMaxSpeed, - RH_CBasePlayer_Jump, - RH_CBasePlayer_Duck, - RH_CBasePlayer_PreThink, - RH_CBasePlayer_PostThink, - RH_CBasePlayer_UpdateClientData, - RH_CBasePlayer_ImpulseCommands, - RH_CBasePlayer_RoundRespawn, - RH_CBasePlayer_Blind, + RG_CBasePlayer_Spawn = BEGIN_FUNC_REGION(player), + RG_CBasePlayer_Precache, + RG_CBasePlayer_ObjectCaps, + RG_CBasePlayer_Classify, + RG_CBasePlayer_TraceAttack, + RG_CBasePlayer_TakeDamage, + RG_CBasePlayer_TakeHealth, + RG_CBasePlayer_Killed, + RG_CBasePlayer_AddPoints, + RG_CBasePlayer_AddPointsToTeam, + RG_CBasePlayer_AddPlayerItem, + RG_CBasePlayer_RemovePlayerItem, + RG_CBasePlayer_GiveAmmo, + RG_CBasePlayer_ResetMaxSpeed, + RG_CBasePlayer_Jump, + RG_CBasePlayer_Duck, + RG_CBasePlayer_PreThink, + RG_CBasePlayer_PostThink, + RG_CBasePlayer_UpdateClientData, + RG_CBasePlayer_ImpulseCommands, + RG_CBasePlayer_RoundRespawn, + RG_CBasePlayer_Blind, - RH_CBasePlayer_Observer_IsValidTarget, - RH_CBasePlayer_SetAnimation, - RH_CBasePlayer_GiveDefaultItems, - RH_CBasePlayer_GiveNamedItem, - RH_CBasePlayer_AddAccount, - RH_CBasePlayer_GiveShield, + RG_CBasePlayer_Observer_IsValidTarget, + RG_CBasePlayer_SetAnimation, + RG_CBasePlayer_GiveDefaultItems, + RG_CBasePlayer_GiveNamedItem, + RG_CBasePlayer_AddAccount, + RG_CBasePlayer_GiveShield, // [...] - RH_CBasePlayer_End + RG_CBasePlayer_End }; diff --git a/reapi/src/hook_manager.cpp b/reapi/src/hook_manager.cpp index f1ca6dc..f181add 100644 --- a/reapi/src/hook_manager.cpp +++ b/reapi/src/hook_manager.cpp @@ -41,14 +41,16 @@ void CAmxxHook::SetState(fwdstate st) void CHookManager::clearHandlers() const { #define CLEAR_HOOKLIST(__END__, __START__)\ - for (size_t i = BEGIN_FUNC_REGION(__START__); i < RH_##__END__##_End; ++i) {\ + for (size_t i = BEGIN_FUNC_REGION(__START__); i < ##__END__; ++i) {\ if (m_hooklist[i])\ m_hooklist[i]->clear();\ } - CLEAR_HOOKLIST(EngineFunc, engine); - CLEAR_HOOKLIST(GameDLL, gamedll); - CLEAR_HOOKLIST(CBasePlayer, player); + CLEAR_HOOKLIST(RH_EngineFunc_End, engine); + + CLEAR_HOOKLIST(RG_End, gamedll); + CLEAR_HOOKLIST(RG_CBaseAnimating_End, animating); + CLEAR_HOOKLIST(RG_CBasePlayer_End, player); } hook_t* CHookManager::getHook(size_t func) const diff --git a/reapi/src/member_list.cpp b/reapi/src/member_list.cpp index a545ac3..d0de29a 100644 --- a/reapi/src/member_list.cpp +++ b/reapi/src/member_list.cpp @@ -31,7 +31,7 @@ int regmember::current_cell = 1; #define GM_MEMBERS(mx, mtype) ((!(mx & (MAX_REGION_RANGE - 1)) ? regmember::current_cell = 1, true : false) || (mx & (MAX_REGION_RANGE - 1)) == regmember::current_cell++) ? regmember(((CHalfLifeMultiplay *)&mem_dummy)->##mx, sizeof(((CHalfLifeMultiplay *)&mem_dummy)->##mx), offsetof(CHalfLifeMultiplay, mx), mtype) : regmember(#mx " doesn't match member definition") #define GM_VOICE_MEMBERS(mx, mtype) ((!(mx & (MAX_REGION_RANGE - 1)) ? regmember::current_cell = 1, true : false) || (mx & (MAX_REGION_RANGE - 1)) == regmember::current_cell++) ? regmember(((CVoiceGameMgr *)&mem_dummy)->##mx, sizeof(((CVoiceGameMgr *)&mem_dummy)->##mx), offsetof(CVoiceGameMgr, mx), mtype) : regmember(#mx " doesn't match member definition") -member_t memberlist_gamerules[] = { +member_t memberlist_gamerules[] = { GM_MEMBERS(m_bFreezePeriod, MEMBER_INTEGER), GM_MEMBERS(m_bBombDropped, MEMBER_INTEGER), // m_VoiceGameMgr -> @@ -348,7 +348,7 @@ member_t memberlist_player[] = { memberlist_t memberlist; member_t *memberlist_t::operator[](size_t members) const -{ +{ #define CASE(h) case ht_##h: if (index < arraysize(memberlist_##h)) return &memberlist_##h[index]; else break; const auto table = members_tables_e(members / MAX_REGION_RANGE); diff --git a/reapi/src/meta_api.cpp b/reapi/src/meta_api.cpp index e6ad744..4eaedb8 100644 --- a/reapi/src/meta_api.cpp +++ b/reapi/src/meta_api.cpp @@ -4,6 +4,7 @@ meta_globals_t *gpMetaGlobals; gamedll_funcs_t *gpGamedllFuncs; mutil_funcs_t *gpMetaUtilFuncs; +enginefuncs_t *g_pengfuncsTable; plugin_info_t Plugin_info = { @@ -51,6 +52,7 @@ C_DLLEXPORT int Meta_Attach(PLUG_LOADTIME now, META_FUNCTIONS *pFunctionTable, m return FALSE; } + GET_HOOK_TABLES(PLID, &g_pengfuncsTable, nullptr, nullptr); memcpy(pFunctionTable, &gMetaFunctionTable, sizeof(META_FUNCTIONS)); return TRUE; } diff --git a/reapi/src/natives_hookchains.cpp b/reapi/src/natives_hookchains.cpp index 8519ec6..0012cee 100644 --- a/reapi/src/natives_hookchains.cpp +++ b/reapi/src/natives_hookchains.cpp @@ -136,7 +136,7 @@ static cell AMX_NATIVE_CALL SetHookChainReturn(AMX *amx, cell *params) case ATYPE_FLOAT: retVal._interger = *srcAddr; break; - + case ATYPE_STRING: { if (retVal._string != nullptr) @@ -271,7 +271,7 @@ AMX_NATIVE_INFO HookChain_Natives[] = { "EnableHookChain", EnableHookChain }, { "DisableHookChain", DisableHookChain }, - + { "SetHookChainReturn", SetHookChainReturn }, { "GetHookChainReturn", GetHookChainReturn }, diff --git a/reapi/src/natives_misc.cpp b/reapi/src/natives_misc.cpp index 2a99d75..0523d23 100644 --- a/reapi/src/natives_misc.cpp +++ b/reapi/src/natives_misc.cpp @@ -164,6 +164,77 @@ static cell AMX_NATIVE_CALL rg_fire_bullets3(AMX *amx, cell *params) return TRUE; } +struct { + const char *msg; + const char *sentence; + size_t status; +} msg_sentence_list[] = { + { "", "" }, // ROUND_NONE + { "#Target_Bombed", "terwin", WINSTATUS_TERRORISTS }, // ROUND_TARGET_BOMB + { "#VIP_Escaped", "ctwin", WINSTATUS_CTS }, // ROUND_VIP_ESCAPED + { "#VIP_Assassinated", "terwin", WINSTATUS_TERRORISTS }, // ROUND_VIP_ASSASSINATED + { "#Terrorists_Escaped", "terwin", WINSTATUS_TERRORISTS }, // ROUND_TERRORISTS_ESCAPED + { "#CTs_PreventEscape", "ctwin", WINSTATUS_CTS }, // ROUND_CTS_PREVENT_ESCAPE + { "#Escaping_Terrorists_Neutralized", "ctwin", WINSTATUS_CTS }, // ROUND_ESCAPING_TERRORISTS_NEUTRALIZED + { "#Bomb_Defused", "ctwin", WINSTATUS_CTS }, // ROUND_BOMB_DEFUSED + { "#CTs_Win", "ctwin", WINSTATUS_CTS }, // ROUND_CTS_WIN + { "#Terrorists_Win", "terwin", WINSTATUS_TERRORISTS }, // ROUND_TERRORISTS_WIN + { "#Round_Draw", "rounddraw", WINSTATUS_DRAW }, // ROUND_END_DRAW + { "#All_Hostages_Rescued", "ctwin", WINSTATUS_CTS }, // ROUND_ALL_HOSTAGES_RESCUED + { "#Target_Saved", "ctwin", WINSTATUS_CTS }, // ROUND_TARGET_SAVED + { "#Hostages_Not_Rescued", "terwin", WINSTATUS_TERRORISTS }, // ROUND_HOSTAGE_NOT_RESCUED + { "#Terrorists_Not_Escaped", "ctwin", WINSTATUS_CTS }, // ROUND_TERRORISTS_NOT_ESCAPED + { "#VIP_Not_Escaped", "terwin", WINSTATUS_TERRORISTS }, // ROUND_VIP_NOT_ESCAPED + { "#Game_Commencing", "", WINSTATUS_DRAW }, // ROUND_GAME_COMMENCE +}; + +// native rg_round_end(Float:tmDelay, WinStatus:st, ScenarionEventEndRound:event = ROUND_NONE, const message[] = "default", const sentence[] = "default"); +static cell AMX_NATIVE_CALL rg_round_end(AMX *amx, cell *params) +{ + enum args_e { arg_count, arg_delay, arg_win, arg_event, arg_message, arg_sentence, arg_silent }; + + size_t winstatus = params[arg_win]; + if (winstatus <= 0) { + MF_LogError(amx, AMX_ERR_NATIVE, "rg_round_end: unknown win-status %i", winstatus); + return FALSE; + } + + const char *_sentence, *_message; + ScenarionEventEndRound event = static_cast(params[arg_event]); + + _sentence = getAmxString(amx, params[arg_sentence]); + _message = getAmxString(amx, params[arg_message]); + + if (event != ROUND_NONE) { + auto& lst = msg_sentence_list[event]; + if (strcmp(_sentence, "default") == 0) + _sentence = lst.sentence; + if (strcmp(_message, "default") == 0) + _message = lst.msg; + } + + if (_sentence[0]) + Broadcast(_sentence); + + if (_message[0]) + g_ReGameFuncs->EndRoundMessage(_message, event); + + (*g_pCSGameRules)->TerminateRound(*(float *)¶ms[arg_delay], winstatus); + return TRUE; +} + +// native rg_update_teamscores(iCtsWins = 0, iTsWins = 0, bool:bAdd = true); +static cell AMX_NATIVE_CALL rg_update_teamscores(AMX *amx, cell *params) +{ + enum args_e { arg_count, arg_cts, arg_ts, arg_add }; + + (*g_pCSGameRules)->m_iNumCTWins = ((params[arg_add] != 0) ? (*g_pCSGameRules)->m_iNumCTWins : 0) + params[arg_cts]; + (*g_pCSGameRules)->m_iNumTerroristWins = ((params[arg_add] != 0) ? (*g_pCSGameRules)->m_iNumTerroristWins : 0) + params[arg_ts]; + UpdateTeamScores(); + + return TRUE; +} + AMX_NATIVE_INFO Misc_Natives[] = { { "rg_set_animation", rg_set_animation }, @@ -180,6 +251,9 @@ AMX_NATIVE_INFO Misc_Natives[] = { "rg_fire_bullets", rg_fire_bullets }, { "rg_fire_bullets3", rg_fire_bullets3 }, + { "rg_round_end", rg_round_end }, + { "rg_update_teamscores", rg_update_teamscores }, + { nullptr, nullptr } }; diff --git a/reapi/src/reapi_utils.cpp b/reapi/src/reapi_utils.cpp new file mode 100644 index 0000000..452fba6 --- /dev/null +++ b/reapi/src/reapi_utils.cpp @@ -0,0 +1,36 @@ +#include "precompiled.h" + +void Broadcast(const char *sentence) +{ + char text[32]; + + strcpy(text, "%!MRAD_"); + strcat(text, UTIL_VarArgs("%s", sentence)); + + static int gmsgSendAudio = 0; + if (gmsgSendAudio == 0 && !(gmsgSendAudio = REG_USER_MSG("SendAudio", -1))) + return; + + g_pengfuncsTable->pfnMessageBegin(MSG_BROADCAST, REG_USER_MSG("SendAudio", -1), NULL, NULL); + g_pengfuncsTable->pfnWriteByte(0); + g_pengfuncsTable->pfnWriteString(text); + g_pengfuncsTable->pfnWriteShort(100); + g_pengfuncsTable->pfnMessageEnd(); +} + +void UpdateTeamScores() +{ + static int gmsgTeamScore = 0; + if (gmsgTeamScore == 0 && !(gmsgTeamScore = REG_USER_MSG("TeamScore", -1))) + return; + + g_pengfuncsTable->pfnMessageBegin(MSG_ALL, gmsgTeamScore, NULL, NULL); + g_pengfuncsTable->pfnWriteString("CT"); + g_pengfuncsTable->pfnWriteShort((*g_pCSGameRules)->m_iNumCTWins); + g_pengfuncsTable->pfnMessageEnd(); + + g_pengfuncsTable->pfnMessageBegin(MSG_ALL, gmsgTeamScore, NULL, NULL); + g_pengfuncsTable->pfnWriteString("TERRORIST"); + g_pengfuncsTable->pfnWriteShort((*g_pCSGameRules)->m_iNumTerroristWins); + g_pengfuncsTable->pfnMessageEnd(); +} diff --git a/reapi/src/reapi_utils.h b/reapi/src/reapi_utils.h index acd8882..b2b91d2 100644 --- a/reapi/src/reapi_utils.h +++ b/reapi/src/reapi_utils.h @@ -8,6 +8,7 @@ char(&ArraySizeHelper(T(&array)[N]))[N]; #define ENTINDEX indexOfEdict extern edict_t* g_pEdicts; +extern enginefuncs_t* g_pengfuncsTable; inline size_t indexOfEdict(edict_t* ed) { @@ -78,4 +79,7 @@ inline T get_member_direct(edict_t *pEntity, int offset, int element = 0, int si return get_member_direct(pEntity->pvPrivateData, offset, element, size); } +void Broadcast(const char *sentence); +void UpdateTeamScores(); + extern void __declspec(noreturn) UTIL_SysError(const char *fmt, ...);