From 2b1a7a54388d212a3ff17f975df8e5592713c424 Mon Sep 17 00:00:00 2001 From: s1lent Date: Sat, 27 Jan 2018 23:34:12 +0700 Subject: [PATCH] Update regamedll API and implemented hookschain's CSGameRules::CanPlayerHearPlayer, CBasePlayer::SwitchTeam, CBasePlayer::CanSwitchTeam, CBasePlayer::ThrowGrenade, CWeaponBox::SetModel, CGrenade::DefuseBombStart, CGrenade::DefuseBombEnd, CGrenade::ExplodeHeGrenade, CGrenade::ExplodeFlashbang, CGrenade::ExplodeSmokeGrenade, CGrenade::ExplodeBomb, ThrowHeGrenade, ThrowFlashbang, ThrowSmokeGrenade --- .../extra/amxmodx/scripting/include/reapi.inc | 6 +- .../scripting/include/reapi_gamedll_const.inc | 154 ++++++++++++++++- reapi/include/cssdk/dlls/gamerules.h | 1 + reapi/include/cssdk/dlls/regamedll_api.h | 77 ++++++++- reapi/msvc/reapi.vcxproj | 5 +- reapi/msvc/reapi.vcxproj.filters | 15 +- reapi/src/amxxmodule.h | 46 ++--- reapi/src/hook_callback.cpp | 160 ++++++++++++++++++ reapi/src/hook_callback.h | 17 ++ reapi/src/hook_list.cpp | 27 +++ reapi/src/hook_list.h | 34 ++++ reapi/src/member_list.cpp | 3 + reapi/src/member_list.h | 3 + 13 files changed, 513 insertions(+), 35 deletions(-) diff --git a/reapi/extra/amxmodx/scripting/include/reapi.inc b/reapi/extra/amxmodx/scripting/include/reapi.inc index 3d08674..d6d2f81 100644 --- a/reapi/extra/amxmodx/scripting/include/reapi.inc +++ b/reapi/extra/amxmodx/scripting/include/reapi.inc @@ -20,7 +20,9 @@ enum hooks_tables_e ht_animating, ht_player, ht_gamerules, - ht_rechecker + ht_rechecker, + ht_grenade, + ht_weaponbox }; enum members_tables_e @@ -132,7 +134,7 @@ enum HookChain * * @return Returns a hook handle. Use EnableHookChain/DisableHookChain to toggle the forward on or off */ -native HookChain:RegisterHookChain({EngineFunc, GamedllFunc, GamedllFunc_CBaseAnimating, GamedllFunc_CBasePlayer, GamedllFunc_CSGameRules, ReCheckerFunc}:function_id, const callback[], post = 0); +native HookChain:RegisterHookChain({EngineFunc, GamedllFunc, GamedllFunc_CBaseAnimating, GamedllFunc_CBasePlayer, GamedllFunc_CSGameRules, GamedllFunc_CGrenade, GamedllFunc_CWeaponBox, ReCheckerFunc}:function_id, const callback[], post = 0); /* * Stops a hook from triggering. diff --git a/reapi/extra/amxmodx/scripting/include/reapi_gamedll_const.inc b/reapi/extra/amxmodx/scripting/include/reapi_gamedll_const.inc index fb5d42c..2b783b1 100644 --- a/reapi/extra/amxmodx/scripting/include/reapi_gamedll_const.inc +++ b/reapi/extra/amxmodx/scripting/include/reapi_gamedll_const.inc @@ -6,7 +6,7 @@ /** * Returns true if round has ended by expired time -* +* * @note Use this for hookchain RG_RoundEnd with the parameter ScenarioEventEndRound:event */ #define IsRoundExpireEvent(%0) (((1<<_:(%0) + ScenarioEventEndRound:0)) & ((1<<_:ROUND_TARGET_SAVED) | (1<<_:ROUND_HOSTAGE_NOT_RESCUED) | (1<<_:ROUND_TERRORISTS_NOT_ESCAPED) | (1<<_:ROUND_VIP_NOT_ESCAPED) | (1<<_:ROUND_GAME_OVER))) != 0) @@ -28,6 +28,7 @@ #define RG_CSGameRules_DeadPlayerWeapons RG_CSGameRules_DeadPlayerWpn #define RG_CSGameRules_CheckMapConditions RG_CSGameRules_CheckMapCond #define RG_CSGameRules_CheckWinConditions RG_CSGameRules_CheckWinCond + #define RG_CSGameRules_CanPlayerHearPlayer RG_CSGameRules_CanPlrHearPlr #define RG_CBasePlayer_SetClientUserInfoModel RG_CBasePlayer_SetUserInfoModel #define RG_CBasePlayer_SetClientUserInfoName RG_CBasePlayer_SetUserInfoName #define m_Shield_hEntToIgnoreTouchesFrom m_Shield_EntToIgnoreTouchesFrom @@ -343,7 +344,35 @@ enum GamedllFunc * Return type: CBaseEntity * (Entity index of weapon) * Params: (const index, const WeaponIdType:weaponID) */ - RG_BuyWeaponByWeaponID + RG_BuyWeaponByWeaponID, + + /* + * Description: Called when a player throws the hegrenade. + * Return type: CGrenade * (Entity index of hegrenade) + * Params: (const index, Float:vecStart[3], Float:vecVelocity[3], Float:time, const team, const usEvent) + */ + RG_ThrowHeGrenade, + + /* + * Description: Called when a player throws the flashbang. + * Return type: CGrenade * (Entity index of flashbang) + * Params: (const index, Float:vecStart[3], Float:vecVelocity[3], Float:time) + */ + RG_ThrowFlashbang, + + /* + * Description: Called when a player throws the smokegrenade. + * Return type: CGrenade * (Entity index of smokegrenade) + * Params: (const index, Float:vecStart[3], Float:vecVelocity[3], Float:time, const usEvent) + */ + RG_ThrowSmokeGrenade, + + /* + * Description: Called when a player plant's the bomb on the ground. + * Return type: CGrenade * (Entity index of bomb) + * Params: (const index, Float:vecStart[3], Float:vecVelocity[3]) + */ + RG_PlantBomb }; /** @@ -358,6 +387,60 @@ enum GamedllFunc_CBaseAnimating RG_CBaseAnimating_ResetSequenceInfo = BEGIN_FUNC_REGION(animating) }; +/** +* GamedllFunc CGrenade +*/ +enum GamedllFunc_CGrenade +{ + /* + * Description: Called when a player goes to start defuse the bomb. + * Params: (const this, const player) + */ + RG_CGrenade_DefuseBombStart = BEGIN_FUNC_REGION(grenade), + + /* + * Description: Called when a player has ended to defuses the bomb or when the previous defuser has taken off or been killed. + * Params: (const this, const player, bool:bDefused) + */ + RG_CGrenade_DefuseBombEnd, + + /* + * Description: Called when a hegrenade detonates. + * Params: (const this, tracehandle, const bitsDamageType) + */ + RG_CGrenade_ExplodeHeGrenade, + + /* + * Description: Called when a flashbang detonates. + * Params: (const this, tracehandle, const bitsDamageType) + */ + RG_CGrenade_ExplodeFlashbang, + + /* + * Description: Called when a smokegrenade detonates. + * Params: (const this) + */ + RG_CGrenade_ExplodeSmokeGrenade, + + /* + * Description: Called when a C4 goes to explodes. + * Params: (const this, tracehandle, const bitsDamageType) + */ + RG_CGrenade_ExplodeBomb, +}; + +/** +* GamedllFunc CWeaponBox +*/ +enum GamedllFunc_CWeaponBox +{ + /* + * Description: Called when a player dies to pack up the appropriate weapons and ammo items, and creates a weaponbox that falls to floor with sets specify the model or when a player drop the item. + * Params: (const this, const szModelName[]) + */ + RG_CWeaponBox_SetModel = BEGIN_FUNC_REGION(weaponbox), +}; + /** * GamedllFunc CBasePlayer */ @@ -619,7 +702,28 @@ enum GamedllFunc_CBasePlayer * Description: Called when a player dying and goes into observer mode like StartObserver * Params: (const this) */ - RG_CBasePlayer_StartDeathCam + RG_CBasePlayer_StartDeathCam, + + /* + * Description: Called when a player goes switch to opposite team after auto-teambalance or caused by 3rd-party things. + * @note This doesn't register the event when a player switched manually + * Params: (const this) + */ + RG_CBasePlayer_SwitchTeam, + + /* + * Description: Can a player switch to team? + * Return type: bool + * Params: (const this, TeamName:teamToSwap) + */ + RG_CBasePlayer_CanSwitchTeam, + + /* + * Description: Called when a player throws the grenade. + * Return type: CGrenade * (Entity index of hegrenade) + * Params: (const this, const grenade, Float:vecSrc[3], Float:vecThrow[3], Float:time, const usEvent) + */ + RG_CBasePlayer_ThrowGrenade, }; /** @@ -629,24 +733,28 @@ enum GamedllFunc_CSGameRules { /* * Description: Should the player switch to this weapon? + * Return type: BOOL * Params: (const index, const weapon) */ RG_CSGameRules_FShouldSwitchWeapon = BEGIN_FUNC_REGION(gamerules), /* * Description: I can't use this weapon anymore, get me the next best one. + * Return type: BOOL * Params: (const index, const currentWeapon) */ RG_CSGameRules_GetNextBestWeapon, /* * Description: - + * Return type: float * Params: (const index) */ RG_CSGameRules_FlPlayerFallDamage, /* * Description: Can this player take damage from this attacker? + * Return type: float * Params: (const index, const attacker) */ RG_CSGameRules_FPlayerCanTakeDamage, @@ -659,12 +767,14 @@ enum GamedllFunc_CSGameRules /* * Description: Is this player allowed to respawn now? + * Return type: BOOL * Params: (const index) */ RG_CSGameRules_FPlayerCanRespawn, /* * Description: Place this player on his spawnspot and face him in the proper direction. + * Return type: edict_t * (Entity index of spawnspot) * Params: (const index) */ RG_CSGameRules_GetPlayerSpawnSpot, @@ -689,12 +799,14 @@ enum GamedllFunc_CSGameRules /* * Description: The player is touching a CBasePlayerItem, do I give it to him? + * Return type: BOOL * Params: (const index, const item) */ RG_CSGameRules_CanHavePlayerItem, /* * Description: What do I do with player's weapons when he's killed? + * Return type: int * Params: (const index) */ RG_CSGameRules_DeadPlayerWeapons, @@ -765,7 +877,14 @@ enum GamedllFunc_CSGameRules * Description: It's called when the freeze time ends. * Params: () */ - RG_CSGameRules_OnRoundFreezeEnd + RG_CSGameRules_OnRoundFreezeEnd, + + /* + * Description: It's called when a player hears another player. + * Return type: bool + * Params: (const listener, const sender) + */ + RG_CSGameRules_CanPlayerHearPlayer, }; /** @@ -1444,7 +1563,32 @@ enum CSGameRules_Members * Get params: Float:get_member_game(member); * Set params: set_member_game(member, Float:value); */ - m_flEscapeRatio + m_flEscapeRatio, + + /* + * Description: - + * Member type: float + * Get params: Float:get_member_game(member); + * Set params: set_member_game(member, Float:value); + */ + m_flTimeLimit, + + /* + * Description: Stores the start time of the game. + * @note The time resets when the game is restarting or the game commencing. + * Member type: float + * Get params: Float:get_member_game(member); + * Set params: set_member_game(member, Float:value); + */ + m_flGameStartTime, + + /* + * Description: TRUE = goes balance team, otherwise FALSE + * Member type: bool + * Get params: get_member_game(member); + * Set params: set_member_game(member, bool:value); + */ + m_bTeamBalanced, }; /** diff --git a/reapi/include/cssdk/dlls/gamerules.h b/reapi/include/cssdk/dlls/gamerules.h index 1555284..e4c184d 100644 --- a/reapi/include/cssdk/dlls/gamerules.h +++ b/reapi/include/cssdk/dlls/gamerules.h @@ -648,6 +648,7 @@ public: float m_flEscapeRatio; float m_flTimeLimit; float m_flGameStartTime; + bool m_bTeamBalanced; }; typedef struct mapcycle_item_s diff --git a/reapi/include/cssdk/dlls/regamedll_api.h b/reapi/include/cssdk/dlls/regamedll_api.h index d23e2a8..ddf93e9 100644 --- a/reapi/include/cssdk/dlls/regamedll_api.h +++ b/reapi/include/cssdk/dlls/regamedll_api.h @@ -38,7 +38,7 @@ #include #define REGAMEDLL_API_VERSION_MAJOR 5 -#define REGAMEDLL_API_VERSION_MINOR 4 +#define REGAMEDLL_API_VERSION_MINOR 5 // CBasePlayer::Spawn hook typedef IHookChainClass IReGameHook_CBasePlayer_Spawn; @@ -356,6 +356,10 @@ typedef IHookChainRegistry IReGameHookRegistry_CSGameRules_BalanceTeams; typedef IHookChain IReGameHook_CSGameRules_OnRoundFreezeEnd; typedef IHookChainRegistry IReGameHookRegistry_CSGameRules_OnRoundFreezeEnd; +// CSGameRules::CanPlayerHearPlayer hook +typedef IHookChain IReGameHook_CSGameRules_CanPlayerHearPlayer; +typedef IHookChainRegistry IReGameHookRegistry_CSGameRules_CanPlayerHearPlayer; + // PM_UpdateStepSound hook typedef IHookChain IReGameHook_PM_UpdateStepSound; typedef IHookChainRegistry IReGameHookRegistry_PM_UpdateStepSound; @@ -364,6 +368,62 @@ typedef IHookChainRegistry IReGameHookRegistry_PM_UpdateStepSound; typedef IHookChainClass IReGameHook_CBasePlayer_StartDeathCam; typedef IHookChainRegistryClass IReGameHookRegistry_CBasePlayer_StartDeathCam; +// CBasePlayer::SwitchTeam hook +typedef IHookChainClass IReGameHook_CBasePlayer_SwitchTeam; +typedef IHookChainRegistryClass IReGameHookRegistry_CBasePlayer_SwitchTeam; + +// CBasePlayer::CanSwitchTeam hook +typedef IHookChainClass IReGameHook_CBasePlayer_CanSwitchTeam; +typedef IHookChainRegistryClass IReGameHookRegistry_CBasePlayer_CanSwitchTeam; + +// CBasePlayer::ThrowGrenade hook +typedef IHookChainClass IReGameHook_CBasePlayer_ThrowGrenade; +typedef IHookChainRegistryClass IReGameHookRegistry_CBasePlayer_ThrowGrenade; + +// CWeaponBox::SetModel hook +typedef IHookChainClass IReGameHook_CWeaponBox_SetModel; +typedef IHookChainRegistryClass IReGameHookRegistry_CWeaponBox_SetModel; + +// CGrenade::DefuseBombStart hook +typedef IHookChainClass IReGameHook_CGrenade_DefuseBombStart; +typedef IHookChainRegistryClass IReGameHookRegistry_CGrenade_DefuseBombStart; + +// CGrenade::DefuseBombEnd hook +typedef IHookChainClass IReGameHook_CGrenade_DefuseBombEnd; +typedef IHookChainRegistryClass IReGameHookRegistry_CGrenade_DefuseBombEnd; + +// CGrenade::ExplodeHeGrenade hook +typedef IHookChainClass IReGameHook_CGrenade_ExplodeHeGrenade; +typedef IHookChainRegistryClass IReGameHookRegistry_CGrenade_ExplodeHeGrenade; + +// CGrenade::ExplodeFlashbang hook +typedef IHookChainClass IReGameHook_CGrenade_ExplodeFlashbang; +typedef IHookChainRegistryClass IReGameHookRegistry_CGrenade_ExplodeFlashbang; + +// CGrenade::ExplodeSmokeGrenade hook +typedef IHookChainClass IReGameHook_CGrenade_ExplodeSmokeGrenade; +typedef IHookChainRegistryClass IReGameHookRegistry_CGrenade_ExplodeSmokeGrenade; + +// CGrenade::ExplodeBomb hook +typedef IHookChainClass IReGameHook_CGrenade_ExplodeBomb; +typedef IHookChainRegistryClass IReGameHookRegistry_CGrenade_ExplodeBomb; + +// ThrowHeGrenade hook +typedef IHookChain IReGameHook_ThrowHeGrenade; +typedef IHookChainRegistry IReGameHookRegistry_ThrowHeGrenade; + +// ThrowFlashbang hook +typedef IHookChain IReGameHook_ThrowFlashbang; +typedef IHookChainRegistry IReGameHookRegistry_ThrowFlashbang; + +// ThrowSmokeGrenade hook +typedef IHookChain IReGameHook_ThrowSmokeGrenade; +typedef IHookChainRegistry IReGameHookRegistry_ThrowSmokeGrenade; + +// PlantBomb hook +typedef IHookChain IReGameHook_PlantBomb; +typedef IHookChainRegistry IReGameHookRegistry_PlantBomb; + class IReGameHookchains { public: virtual ~IReGameHookchains() {} @@ -454,6 +514,21 @@ public: virtual IReGameHookRegistry_CSGameRules_OnRoundFreezeEnd *CSGameRules_OnRoundFreezeEnd() = 0; virtual IReGameHookRegistry_PM_UpdateStepSound *PM_UpdateStepSound() = 0; virtual IReGameHookRegistry_CBasePlayer_StartDeathCam *CBasePlayer_StartDeathCam() = 0; + virtual IReGameHookRegistry_CBasePlayer_SwitchTeam *CBasePlayer_SwitchTeam() = 0; + virtual IReGameHookRegistry_CBasePlayer_CanSwitchTeam *CBasePlayer_CanSwitchTeam() = 0; + virtual IReGameHookRegistry_CBasePlayer_ThrowGrenade *CBasePlayer_ThrowGrenade() = 0; + virtual IReGameHookRegistry_CSGameRules_CanPlayerHearPlayer *CSGameRules_CanPlayerHearPlayer() = 0; + virtual IReGameHookRegistry_CWeaponBox_SetModel *CWeaponBox_SetModel() = 0; + virtual IReGameHookRegistry_CGrenade_DefuseBombStart *CGrenade_DefuseBombStart() = 0; + virtual IReGameHookRegistry_CGrenade_DefuseBombEnd *CGrenade_DefuseBombEnd() = 0; + virtual IReGameHookRegistry_CGrenade_ExplodeHeGrenade *CGrenade_ExplodeHeGrenade() = 0; + virtual IReGameHookRegistry_CGrenade_ExplodeFlashbang *CGrenade_ExplodeFlashbang() = 0; + virtual IReGameHookRegistry_CGrenade_ExplodeSmokeGrenade *CGrenade_ExplodeSmokeGrenade() = 0; + virtual IReGameHookRegistry_CGrenade_ExplodeBomb *CGrenade_ExplodeBomb() = 0; + virtual IReGameHookRegistry_ThrowHeGrenade *ThrowHeGrenade() = 0; + virtual IReGameHookRegistry_ThrowFlashbang *ThrowFlashbang() = 0; + virtual IReGameHookRegistry_ThrowSmokeGrenade *ThrowSmokeGrenade() = 0; + virtual IReGameHookRegistry_PlantBomb *PlantBomb() = 0; }; struct ReGameFuncs_t { diff --git a/reapi/msvc/reapi.vcxproj b/reapi/msvc/reapi.vcxproj index 661a1f4..49df2fe 100644 --- a/reapi/msvc/reapi.vcxproj +++ b/reapi/msvc/reapi.vcxproj @@ -285,12 +285,15 @@ + - + + + diff --git a/reapi/msvc/reapi.vcxproj.filters b/reapi/msvc/reapi.vcxproj.filters index a5480de..e078578 100644 --- a/reapi/msvc/reapi.vcxproj.filters +++ b/reapi/msvc/reapi.vcxproj.filters @@ -827,15 +827,24 @@ amxmodx\scripting\include - - amxmodx\scripting\include - amxmodx\scripting\include version + + amxmodx\scripting\include + + + amxmodx\scripting\include + + + amxmodx\scripting\include + + + amxmodx\scripting\include + diff --git a/reapi/src/amxxmodule.h b/reapi/src/amxxmodule.h index 1cae8e4..c83a6fd 100644 --- a/reapi/src/amxxmodule.h +++ b/reapi/src/amxxmodule.h @@ -264,44 +264,44 @@ typedef void * (*PFN_REQ_FNPTR)(const char *name); // ***** Module funcs stuff ***** enum ForwardExecType { - ET_IGNORE = 0, // Ignore return vaue + ET_IGNORE = 0, // Ignore return vaue ET_STOP, // Stop on PLUGIN_HANDLED ET_STOP2, // Stop on PLUGIN_HANDLED, continue on other values, return biggest return value - ET_CONTINUE, // Continue; return biggest return value + ET_CONTINUE, // Continue; return biggest return value }; enum ForwardParam { - FP_DONE = -1, // specify this as the last argument + FP_DONE = -1, // specify this as the last argument // only tells the function that there are no more arguments FP_CELL, // normal cell FP_FLOAT, // float; used as normal cell though FP_STRING, // string - FP_STRINGEX, // string; will be updated to the last function's value + FP_STRINGEX, // string; will be updated to the last function's value FP_ARRAY, // array; use the return value of prepareArray. }; enum PlayerProp { - Player_Name, //String - Player_Ip, //String - Player_Team, //String - Player_Ingame, //bool - Player_Authorized, //bool - Player_Vgui, //bool - Player_Time, //float - Player_Playtime, //float - Player_MenuExpire, //float - Player_Weapons, //struct{int,int}[32] - Player_CurrentWeapon, //int - Player_TeamID, //int - Player_Deaths, //int - Player_Aiming, //int - Player_Menu, //int - Player_Keys, //int - Player_Flags, //int[32] - Player_Newmenu, //int - Player_NewmenuPage, //int + Player_Name, // String + Player_Ip, // String + Player_Team, // String + Player_Ingame, // bool + Player_Authorized, // bool + Player_Vgui, // bool + Player_Time, // float + Player_Playtime, // float + Player_MenuExpire, // float + Player_Weapons, // struct{int,int}[32] + Player_CurrentWeapon, // int + Player_TeamID, // int + Player_Deaths, // int + Player_Aiming, // int + Player_Menu, // int + Player_Keys, // int + Player_Flags, // int[32] + Player_Newmenu, // int + Player_NewmenuPage, // int }; enum LibType diff --git a/reapi/src/hook_callback.cpp b/reapi/src/hook_callback.cpp index 74259a6..9b5ee44 100644 --- a/reapi/src/hook_callback.cpp +++ b/reapi/src/hook_callback.cpp @@ -480,6 +480,38 @@ void CBasePlayer_StartDeathCam(IReGameHook_CBasePlayer_StartDeathCam *chain, CBa callVoidForward(RG_CBasePlayer_StartDeathCam, original, indexOfEdict(pthis->pev)); } +void CBasePlayer_SwitchTeam(IReGameHook_CBasePlayer_SwitchTeam *chain, CBasePlayer *pthis) +{ + auto original = [chain](int _pthis) + { + chain->callNext(getPrivate(_pthis)); + }; + + callVoidForward(RG_CBasePlayer_CanSwitchTeam, original, indexOfEdict(pthis->pev)); +} + +bool CBasePlayer_CanSwitchTeam(IReGameHook_CBasePlayer_CanSwitchTeam *chain, CBasePlayer *pthis, TeamName teamToSwap) +{ + auto original = [chain](int _pthis, TeamName _teamToSwap) + { + return chain->callNext(getPrivate(_pthis), _teamToSwap); + }; + + return callForward(RG_CBasePlayer_CanSwitchTeam, original, indexOfEdict(pthis->pev), teamToSwap); +} + +CGrenade *CBasePlayer_ThrowGrenade(IReGameHook_CBasePlayer_ThrowGrenade *chain, CBasePlayer *pthis, CBasePlayerWeapon *pWeapon, Vector &vecSrc, Vector &vecThrow, float time, unsigned short usEvent) +{ + Vector vecSrcCopy(vecSrc), vecThrowCopy(vecThrow); + + auto original = [chain, &vecSrcCopy, &vecThrowCopy](int _pthis, int _pWeapon, cell _vecSrc, cell _vecThrow, float _time, unsigned short _usEvent) + { + return indexOfPDataAmx(chain->callNext(getPrivate(_pthis), getPrivate(_pWeapon), vecSrcCopy, vecThrowCopy, _time, _usEvent)); + }; + + return getPrivate(callForward(RG_CBasePlayer_ThrowGrenade, original, indexOfEdict(pthis->pev), indexOfEdict(pWeapon->pev), g_amxxapi.PrepareCellArrayA(reinterpret_cast(&vecSrcCopy), 3, true), g_amxxapi.PrepareCellArrayA(reinterpret_cast(&vecThrowCopy), 3, true), time, usEvent)); +} + void CBaseAnimating_ResetSequenceInfo(IReGameHook_CBaseAnimating_ResetSequenceInfo *chain, CBaseAnimating *pthis) { auto original = [chain](int _pthis) @@ -784,6 +816,86 @@ void CSGameRules_OnRoundFreezeEnd(IReGameHook_CSGameRules_OnRoundFreezeEnd *chai callVoidForward(RG_CSGameRules_OnRoundFreezeEnd, original); } +bool CSGameRules_CanPlayerHearPlayer(IReGameHook_CSGameRules_CanPlayerHearPlayer *chain, CBasePlayer *pListener, CBasePlayer *pSender) +{ + auto original = [chain](int _pListener, int _pSender) + { + return chain->callNext(getPrivate(_pListener), getPrivate(_pSender)); + }; + + return callForward(RG_CSGameRules_CanPlayerHearPlayer, original, indexOfEdict(pListener->pev), indexOfEdict(pSender->pev)); +} + +void CWeaponBox_SetModel(IReGameHook_CWeaponBox_SetModel *chain, CWeaponBox *pthis, const char *pszModelName) +{ + auto original = [chain](int _pthis, const char *_pszModelName) + { + chain->callNext(getPrivate(_pthis), _pszModelName); + }; + + callVoidForward(RG_CWeaponBox_SetModel, original, indexOfEdict(pthis->pev), pszModelName); +} + +void CGrenade_DefuseBombStart(IReGameHook_CGrenade_DefuseBombStart *chain, CGrenade *pthis, CBasePlayer *pPlayer) +{ + auto original = [chain](int _pthis, int _pPlayer) + { + chain->callNext(getPrivate(_pthis), getPrivate(_pPlayer)); + }; + + callVoidForward(RG_CGrenade_DefuseBombStart, original, indexOfEdict(pthis->pev), indexOfEdict(pPlayer->pev)); +} + +void CGrenade_DefuseBombEnd(IReGameHook_CGrenade_DefuseBombEnd *chain, CGrenade *pthis, CBasePlayer *pPlayer, bool bDefused) +{ + auto original = [chain](int _pthis, int _pPlayer, bool _bDefused) + { + chain->callNext(getPrivate(_pthis), getPrivate(_pPlayer), _bDefused); + }; + + callVoidForward(RG_CGrenade_DefuseBombEnd, original, indexOfEdict(pthis->pev), indexOfEdict(pPlayer->pev), bDefused); +} + +void CGrenade_ExplodeHeGrenade(IReGameHook_CGrenade_ExplodeHeGrenade *chain, CGrenade *pthis, TraceResult *ptr, int bitsDamageType) +{ + auto original = [chain](int _pthis, TraceResult *_ptr, int _bitsDamageType) + { + chain->callNext(getPrivate(_pthis), _ptr, _bitsDamageType); + }; + + callVoidForward(RG_CGrenade_ExplodeHeGrenade, original, indexOfEdict(pthis->pev), ptr, bitsDamageType); +} + +void CGrenade_ExplodeFlashbang(IReGameHook_CGrenade_ExplodeFlashbang *chain, CGrenade *pthis, TraceResult *ptr, int bitsDamageType) +{ + auto original = [chain](int _pthis, TraceResult *_ptr, int _bitsDamageType) + { + chain->callNext(getPrivate(_pthis), _ptr, _bitsDamageType); + }; + + callVoidForward(RG_CGrenade_ExplodeFlashbang, original, indexOfEdict(pthis->pev), ptr, bitsDamageType); +} + +void CGrenade_ExplodeSmokeGrenade(IReGameHook_CGrenade_ExplodeSmokeGrenade *chain, CGrenade *pthis) +{ + auto original = [chain](int _pthis) + { + chain->callNext(getPrivate(_pthis)); + }; + + callVoidForward(RG_CGrenade_ExplodeSmokeGrenade, original, indexOfEdict(pthis->pev)); +} + +void CGrenade_ExplodeBomb(IReGameHook_CGrenade_ExplodeBomb *chain, CGrenade *pthis, TraceResult *ptr, int bitsDamageType) +{ + auto original = [chain](int _pthis, TraceResult *_ptr, int _bitsDamageType) + { + chain->callNext(getPrivate(_pthis), _ptr, _bitsDamageType); + }; + + callVoidForward(RG_CGrenade_ExplodeBomb, original, indexOfEdict(pthis->pev), ptr, bitsDamageType); +} + void HandleMenu_ChooseAppearance(IReGameHook_HandleMenu_ChooseAppearance *chain, CBasePlayer *pPlayer, int slot) { auto original = [chain](int _pPlayer, int _slot) @@ -844,6 +956,54 @@ CBaseEntity *BuyWeaponByWeaponID(IReGameHook_BuyWeaponByWeaponID *chain, CBasePl return getPrivate(callForward(RG_BuyWeaponByWeaponID, original, indexOfEdict(pPlayer->pev), weaponID)); } +CGrenade *ThrowHeGrenade(IReGameHook_ThrowHeGrenade *chain, entvars_t *pevOwner, Vector &vecStart, Vector &vecVelocity, float time, int iTeam, unsigned short usEvent) +{ + Vector vecStartCopy(vecStart), vecVelocityCopy(vecVelocity); + + auto original = [chain, &vecStartCopy, &vecVelocityCopy](int _pevOwner, cell _vecStart, cell _vecVelocity, float _time, int _iTeam, unsigned short _usEvent) + { + return indexOfPDataAmx(chain->callNext(PEV(_pevOwner), vecStartCopy, vecVelocityCopy, _time, _iTeam, _usEvent)); + }; + + return getPrivate(callForward(RG_ThrowHeGrenade, original, indexOfEdict(pevOwner), g_amxxapi.PrepareCellArrayA(reinterpret_cast(&vecStartCopy), 3, true), g_amxxapi.PrepareCellArrayA(reinterpret_cast(&vecVelocityCopy), 3, true), time, iTeam, usEvent)); +} + +CGrenade *ThrowFlashbang(IReGameHook_ThrowFlashbang *chain, entvars_t *pevOwner, Vector &vecStart, Vector &vecVelocity, float time) +{ + Vector vecStartCopy(vecStart), vecVelocityCopy(vecVelocity); + + auto original = [chain, &vecStartCopy, &vecVelocityCopy](int _pevOwner, cell _vecStart, cell _vecVelocity, float _time) + { + return indexOfPDataAmx(chain->callNext(PEV(_pevOwner), vecStartCopy, vecVelocityCopy, _time)); + }; + + return getPrivate(callForward(RG_ThrowHeGrenade, original, indexOfEdict(pevOwner), g_amxxapi.PrepareCellArrayA(reinterpret_cast(&vecStartCopy), 3, true), g_amxxapi.PrepareCellArrayA(reinterpret_cast(&vecVelocityCopy), 3, true), time)); +} + +CGrenade *ThrowSmokeGrenade(IReGameHook_ThrowSmokeGrenade *chain, entvars_t *pevOwner, Vector &vecStart, Vector &vecVelocity, float time, unsigned short usEvent) +{ + Vector vecStartCopy(vecStart), vecVelocityCopy(vecVelocity); + + auto original = [chain, &vecStartCopy, &vecVelocityCopy](int _pevOwner, cell _vecStart, cell _vecVelocity, float _time, unsigned short _usEvent) + { + return indexOfPDataAmx(chain->callNext(PEV(_pevOwner), vecStartCopy, vecVelocityCopy, _time, _usEvent)); + }; + + return getPrivate(callForward(RG_ThrowSmokeGrenade, original, indexOfEdict(pevOwner), g_amxxapi.PrepareCellArrayA(reinterpret_cast(&vecStartCopy), 3, true), g_amxxapi.PrepareCellArrayA(reinterpret_cast(&vecVelocityCopy), 3, true), time, usEvent)); +} + +CGrenade *PlantBomb(IReGameHook_PlantBomb *chain, entvars_t *pevOwner, Vector &vecStart, Vector &vecVelocity) +{ + Vector vecStartCopy(vecStart), vecVelocityCopy(vecVelocity); + + auto original = [chain, &vecStartCopy, &vecVelocityCopy](int _pevOwner, cell _vecStart, cell _vecVelocity) + { + return indexOfPDataAmx(chain->callNext(PEV(_pevOwner), vecStartCopy, vecVelocityCopy)); + }; + + return getPrivate(callForward(RG_PlantBomb, original, indexOfEdict(pevOwner), g_amxxapi.PrepareCellArrayA(reinterpret_cast(&vecStartCopy), 3, true), g_amxxapi.PrepareCellArrayA(reinterpret_cast(&vecVelocityCopy), 3, true))); +} + int g_iClientStartSpeak, g_iClientStopSpeak; void OnClientStartSpeak(size_t clientIndex) diff --git a/reapi/src/hook_callback.h b/reapi/src/hook_callback.h index 8e5ecfc..fbdaa24 100644 --- a/reapi/src/hook_callback.h +++ b/reapi/src/hook_callback.h @@ -326,6 +326,10 @@ void ShowMenu(IReGameHook_ShowMenu *chain, CBasePlayer *pPlayer, int bitsValidSl void ShowVGUIMenu(IReGameHook_ShowVGUIMenu *chain, CBasePlayer *pPlayer, int MenuType, int BitMask, char *szOldMenu); bool BuyGunAmmo(IReGameHook_BuyGunAmmo *chain, CBasePlayer *player, CBasePlayerItem *weapon, bool bBlinkMoney); CBaseEntity *BuyWeaponByWeaponID(IReGameHook_BuyWeaponByWeaponID *chain, CBasePlayer *pPlayer, WeaponIdType weaponID); +CGrenade *ThrowHeGrenade(IReGameHook_ThrowHeGrenade *chain, entvars_t *pevOwner, Vector &vecStart, Vector &vecVelocity, float time, int iTeam, unsigned short usEvent); +CGrenade *ThrowFlashbang(IReGameHook_ThrowFlashbang *chain, entvars_t *pevOwner, Vector &vecStart, Vector &vecVelocity, float time); +CGrenade *ThrowSmokeGrenade(IReGameHook_ThrowSmokeGrenade *chain, entvars_t *pevOwner, Vector &vecStart, Vector &vecVelocity, float time, unsigned short usEvent); +CGrenade *PlantBomb(IReGameHook_PlantBomb *chain, entvars_t *pevOwner, Vector &vecStart, Vector &vecVelocity); // regamedll functions - player void CBasePlayer_Spawn(IReGameHook_CBasePlayer_Spawn *chain, CBasePlayer *pthis); @@ -370,6 +374,9 @@ bool CBasePlayer_MakeBomber(IReGameHook_CBasePlayer_MakeBomber *chain, CBasePlay void CBasePlayer_StartObserver(IReGameHook_CBasePlayer_StartObserver *chain, CBasePlayer *pthis, Vector &vecPosition, Vector &vecViewAngle); bool CBasePlayer_GetIntoGame(IReGameHook_CBasePlayer_GetIntoGame *chain, CBasePlayer *pthis); void CBasePlayer_StartDeathCam(IReGameHook_CBasePlayer_StartDeathCam *chain, CBasePlayer *pthis); +void CBasePlayer_SwitchTeam(IReGameHook_CBasePlayer_SwitchTeam *chain, CBasePlayer *pthis); +bool CBasePlayer_CanSwitchTeam(IReGameHook_CBasePlayer_CanSwitchTeam *chain, CBasePlayer *pthis, TeamName teamToSwap); +CGrenade *CBasePlayer_ThrowGrenade(IReGameHook_CBasePlayer_ThrowGrenade *chain, CBasePlayer *pthis, CBasePlayerWeapon *pWeapon, Vector &vecSrc, Vector &vecThrow, float time, unsigned short usEvent); void CBaseAnimating_ResetSequenceInfo(IReGameHook_CBaseAnimating_ResetSequenceInfo *chain, CBaseAnimating *pthis); @@ -396,6 +403,16 @@ void CSGameRules_ChangeLevel(IReGameHook_CSGameRules_ChangeLevel *chain); void CSGameRules_GoToIntermission(IReGameHook_CSGameRules_GoToIntermission *chain); void CSGameRules_BalanceTeams(IReGameHook_CSGameRules_BalanceTeams *chain); void CSGameRules_OnRoundFreezeEnd(IReGameHook_CSGameRules_OnRoundFreezeEnd *chain); +bool CSGameRules_CanPlayerHearPlayer(IReGameHook_CSGameRules_CanPlayerHearPlayer *chain, CBasePlayer *pListener, CBasePlayer *pSender); + +void CWeaponBox_SetModel(IReGameHook_CWeaponBox_SetModel *chain, CWeaponBox *pthis, const char *pszModelName); + +void CGrenade_DefuseBombStart(IReGameHook_CGrenade_DefuseBombStart *chain, CGrenade *pthis, CBasePlayer *pPlayer); +void CGrenade_DefuseBombEnd(IReGameHook_CGrenade_DefuseBombEnd *chain, CGrenade *pthis, CBasePlayer *pPlayer, bool bDefused); +void CGrenade_ExplodeHeGrenade(IReGameHook_CGrenade_ExplodeHeGrenade *chain, CGrenade *pthis, TraceResult *ptr, int bitsDamageType); +void CGrenade_ExplodeFlashbang(IReGameHook_CGrenade_ExplodeFlashbang *chain, CGrenade *pthis, TraceResult *ptr, int bitsDamageType); +void CGrenade_ExplodeSmokeGrenade(IReGameHook_CGrenade_ExplodeSmokeGrenade *chain, CGrenade *pthis); +void CGrenade_ExplodeBomb(IReGameHook_CGrenade_ExplodeBomb *chain, CGrenade *pthis, TraceResult *ptr, int bitsDamageType); extern int g_iClientStartSpeak; extern int g_iClientStopSpeak; diff --git a/reapi/src/hook_list.cpp b/reapi/src/hook_list.cpp index b210a62..ea1156d 100644 --- a/reapi/src/hook_list.cpp +++ b/reapi/src/hook_list.cpp @@ -3,8 +3,10 @@ inline size_t getFwdParamType(void(*)(int)) { return FP_CELL; } inline size_t getFwdParamType(void(*)(size_t)) { return FP_CELL; } inline size_t getFwdParamType(void(*)(short)) { return FP_CELL; } +inline size_t getFwdParamType(void(*)(unsigned short)) { 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(*)(TeamName)) { return FP_CELL; } inline size_t getFwdParamType(void(*)(PLAYER_ANIM)) { return FP_CELL; } inline size_t getFwdParamType(void(*)(WeaponIdType)) { return FP_CELL; } inline size_t getFwdParamType(void(*)(RewardType)) { return FP_CELL; } @@ -92,6 +94,10 @@ hook_t hooklist_gamedll[] = { DLL(ShowVGUIMenu), DLL(BuyGunAmmo), DLL(BuyWeaponByWeaponID), + DLL(ThrowHeGrenade), + DLL(ThrowFlashbang), + DLL(ThrowSmokeGrenade), + DLL(PlantBomb), }; hook_t hooklist_animating[] = { @@ -141,6 +147,9 @@ hook_t hooklist_player[] = { DLL(CBasePlayer_StartObserver), DLL(CBasePlayer_GetIntoGame), DLL(CBasePlayer_StartDeathCam), + DLL(CBasePlayer_SwitchTeam), + DLL(CBasePlayer_CanSwitchTeam), + DLL(CBasePlayer_ThrowGrenade), }; hook_t hooklist_gamerules[] = { @@ -167,6 +176,20 @@ hook_t hooklist_gamerules[] = { DLL(CSGameRules_GoToIntermission), DLL(CSGameRules_BalanceTeams), DLL(CSGameRules_OnRoundFreezeEnd), + DLL(CSGameRules_CanPlayerHearPlayer), +}; + +hook_t hooklist_grenade[] = { + DLL(CGrenade_DefuseBombStart), + DLL(CGrenade_DefuseBombEnd), + DLL(CGrenade_ExplodeHeGrenade), + DLL(CGrenade_ExplodeFlashbang), + DLL(CGrenade_ExplodeSmokeGrenade), + DLL(CGrenade_ExplodeBomb), +}; + +hook_t hooklist_weaponbox[] = { + DLL(CWeaponBox_SetModel), }; #define RCHECK(h,...) { {}, {}, #h, "ReChecker", [](){ return api_cfg.hasRechecker(); }, ((!(RC_##h & (MAX_REGION_RANGE - 1)) ? regfunc::current_cell = 1, true : false) || (RC_##h & (MAX_REGION_RANGE - 1)) == regfunc::current_cell++) ? regfunc(h##__VA_ARGS__) : regfunc(#h#__VA_ARGS__), [](){ g_RecheckerHookchains->##h##()->registerHook(&##h); }, [](){ g_RecheckerHookchains->##h##()->unregisterHook(&##h); }} @@ -190,6 +213,8 @@ hook_t* hooklist_t::getHookSafe(size_t hook) CASE(player) CASE(gamerules) CASE(rechecker) + CASE(grenade) + CASE(weaponbox) } return nullptr; @@ -205,6 +230,8 @@ void hooklist_t::clear() FOREACH_CLEAR(player); FOREACH_CLEAR(gamerules); FOREACH_CLEAR(rechecker); + FOREACH_CLEAR(grenade); + FOREACH_CLEAR(weaponbox); } void hook_t::clear() diff --git a/reapi/src/hook_list.h b/reapi/src/hook_list.h index c062177..fae9827 100644 --- a/reapi/src/hook_list.h +++ b/reapi/src/hook_list.h @@ -31,6 +31,8 @@ extern hook_t hooklist_animating[]; extern hook_t hooklist_player[]; extern hook_t hooklist_gamerules[]; extern hook_t hooklist_rechecker[]; +extern hook_t hooklist_grenade[]; +extern hook_t hooklist_weaponbox[]; enum { @@ -53,6 +55,8 @@ struct hooklist_t CASE(player) CASE(gamerules) CASE(rechecker) + CASE(grenade) + CASE(weaponbox) } return nullptr; @@ -69,6 +73,8 @@ struct hooklist_t ht_player, ht_gamerules, ht_rechecker, + ht_grenade, + ht_weaponbox, ht_end }; @@ -102,6 +108,11 @@ enum GamedllFunc RG_BuyGunAmmo, RG_BuyWeaponByWeaponID, + RG_ThrowHeGrenade, + RG_ThrowFlashbang, + RG_ThrowSmokeGrenade, + RG_PlantBomb + // [...] }; @@ -158,6 +169,28 @@ enum GamedllFunc_CBasePlayer RG_CBasePlayer_StartObserver, RG_CBasePlayer_GetIntoGame, RG_CBasePlayer_StartDeathCam, + RG_CBasePlayer_SwitchTeam, + RG_CBasePlayer_CanSwitchTeam, + RG_CBasePlayer_ThrowGrenade, + + // [...] +}; + +enum GamedllFunc_CGrenade +{ + RG_CGrenade_DefuseBombStart = BEGIN_FUNC_REGION(grenade), + RG_CGrenade_DefuseBombEnd, + RG_CGrenade_ExplodeHeGrenade, + RG_CGrenade_ExplodeFlashbang, + RG_CGrenade_ExplodeSmokeGrenade, + RG_CGrenade_ExplodeBomb, + + // [...] +}; + +enum GamedllFunc_CWeaponBox +{ + RG_CWeaponBox_SetModel = BEGIN_FUNC_REGION(weaponbox), // [...] }; @@ -188,6 +221,7 @@ enum GamedllFunc_CSGameRules RG_CSGameRules_GoToIntermission, RG_CSGameRules_BalanceTeams, RG_CSGameRules_OnRoundFreezeEnd, + RG_CSGameRules_CanPlayerHearPlayer, // [...] }; diff --git a/reapi/src/member_list.cpp b/reapi/src/member_list.cpp index 13f878f..f1a2950 100644 --- a/reapi/src/member_list.cpp +++ b/reapi/src/member_list.cpp @@ -227,6 +227,9 @@ member_t memberlist_gamerules[] = { GM_MEMBERS(m_bSkipShowMenu), GM_MEMBERS(m_bNeededPlayers), GM_MEMBERS(m_flEscapeRatio), + GM_MEMBERS(m_flTimeLimit), + GM_MEMBERS(m_flGameStartTime), + GM_MEMBERS(m_bTeamBalanced), }; member_t memberlist_base[] = { diff --git a/reapi/src/member_list.h b/reapi/src/member_list.h index ead87b8..16577e0 100644 --- a/reapi/src/member_list.h +++ b/reapi/src/member_list.h @@ -210,6 +210,9 @@ enum CSGameRules_Members m_bSkipShowMenu, m_bNeededPlayers, m_flEscapeRatio, + m_flTimeLimit, + m_flGameStartTime, + m_bTeamBalanced, }; // CBaseEntity