From 2629e304647399f83ef97d7e97523cb949d8ffdd Mon Sep 17 00:00:00 2001 From: StevenKal Date: Thu, 28 Oct 2021 23:22:13 +0200 Subject: [PATCH 01/13] Update CAPI_Impl.cpp Changes reasons: No need to have those "*_api" functions for standard functions which do not have a different code/format, this is useless. Besides, passing the "real function used internally by the game" into the list of the structure "ReGameFuncs_t" will allow to retrieve the "real function address". So, we could "memhack it" and make a hook of the "real function", which is the internal one we want on a hook, not the API one which will only be called when we trigger those API functions. To finish, this ensures reliability of the function address, and, no need to search it via symbol or signature of bytes where the last can easily be broken. -> void *pfnAddMultiDamage = (void *)g_pReGameDLLCSFunctions->AddMultiDamage; --- regamedll/dlls/API/CAPI_Impl.cpp | 365 ++++++++++--------------------- 1 file changed, 110 insertions(+), 255 deletions(-) diff --git a/regamedll/dlls/API/CAPI_Impl.cpp b/regamedll/dlls/API/CAPI_Impl.cpp index 0fe10a490..4e7d1e93e 100644 --- a/regamedll/dlls/API/CAPI_Impl.cpp +++ b/regamedll/dlls/API/CAPI_Impl.cpp @@ -26,274 +26,129 @@ * */ -#include "precompiled.h" +#pragma once -CReGameHookchains g_ReGameHookchains; +#include +#include -int EXT_FUNC Cmd_Argc_api() { - return CMD_ARGC_(); -} - -const char *EXT_FUNC Cmd_Argv_api(int i) { - return CMD_ARGV_(i); -} - -CGrenade *PlantBomb_api(entvars_t *pevOwner, Vector &vecStart, Vector &vecVelocity) { - return CGrenade::ShootSatchelCharge(pevOwner, vecStart, vecVelocity); -} - -CGib *SpawnHeadGib_api(entvars_t *pevVictim) { - return CGib::SpawnHeadGib(pevVictim); -} - -void SpawnRandomGibs_api(entvars_t *pevVictim, int cGibs, int human) { - CGib::SpawnRandomGibs(pevVictim, cGibs, human); -} - -ReGameFuncs_t g_ReGameApiFuncs = { - &CREATE_NAMED_ENTITY, - - &Regamedll_ChangeString_api, - - &RadiusDamage_api, - &ClearMultiDamage_api, - &ApplyMultiDamage_api, - &AddMultiDamage_api, - - &UTIL_FindEntityByString, - - &AddEntityHashValue, - &RemoveEntityHashValue, - - Cmd_Argc_api, - Cmd_Argv_api, - - PlantBomb_api, - - SpawnHeadGib_api, - SpawnRandomGibs_api +enum WeaponInfiniteAmmoMode +{ + WPNMODE_INFINITE_CLIP = 1, + WPNMODE_INFINITE_BPAMMO }; -GAMEHOOK_REGISTRY(CBasePlayer_Spawn); -GAMEHOOK_REGISTRY(CBasePlayer_Precache); -GAMEHOOK_REGISTRY(CBasePlayer_ObjectCaps); -GAMEHOOK_REGISTRY(CBasePlayer_Classify); -GAMEHOOK_REGISTRY(CBasePlayer_TraceAttack); -GAMEHOOK_REGISTRY(CBasePlayer_TakeDamage); -GAMEHOOK_REGISTRY(CBasePlayer_TakeHealth); -GAMEHOOK_REGISTRY(CBasePlayer_Killed); -GAMEHOOK_REGISTRY(CBasePlayer_AddPoints); -GAMEHOOK_REGISTRY(CBasePlayer_AddPointsToTeam); -GAMEHOOK_REGISTRY(CBasePlayer_AddPlayerItem); -GAMEHOOK_REGISTRY(CBasePlayer_RemovePlayerItem); -GAMEHOOK_REGISTRY(CBasePlayer_GiveAmmo); -GAMEHOOK_REGISTRY(CBasePlayer_ResetMaxSpeed); -GAMEHOOK_REGISTRY(CBasePlayer_Jump); -GAMEHOOK_REGISTRY(CBasePlayer_Duck); -GAMEHOOK_REGISTRY(CBasePlayer_PreThink); -GAMEHOOK_REGISTRY(CBasePlayer_PostThink); -GAMEHOOK_REGISTRY(CBasePlayer_UpdateClientData); -GAMEHOOK_REGISTRY(CBasePlayer_ImpulseCommands); -GAMEHOOK_REGISTRY(CBasePlayer_RoundRespawn); -GAMEHOOK_REGISTRY(CBasePlayer_Blind); - -GAMEHOOK_REGISTRY(CBasePlayer_Observer_IsValidTarget); -GAMEHOOK_REGISTRY(CBasePlayer_SetAnimation); -GAMEHOOK_REGISTRY(CBasePlayer_GiveDefaultItems); -GAMEHOOK_REGISTRY(CBasePlayer_GiveNamedItem); -GAMEHOOK_REGISTRY(CBasePlayer_AddAccount); -GAMEHOOK_REGISTRY(CBasePlayer_GiveShield); -GAMEHOOK_REGISTRY(CBasePlayer_SetClientUserInfoModel); -GAMEHOOK_REGISTRY(CBasePlayer_SetClientUserInfoName); -GAMEHOOK_REGISTRY(CBasePlayer_HasRestrictItem); -GAMEHOOK_REGISTRY(CBasePlayer_DropPlayerItem); -GAMEHOOK_REGISTRY(CBasePlayer_DropShield); -GAMEHOOK_REGISTRY(CBasePlayer_OnSpawnEquip); -GAMEHOOK_REGISTRY(CBasePlayer_Radio); -GAMEHOOK_REGISTRY(CBasePlayer_Disappear); -GAMEHOOK_REGISTRY(CBasePlayer_MakeVIP); -GAMEHOOK_REGISTRY(CBasePlayer_MakeBomber); -GAMEHOOK_REGISTRY(CBasePlayer_StartObserver); -GAMEHOOK_REGISTRY(CBasePlayer_GetIntoGame); - -GAMEHOOK_REGISTRY(CBaseAnimating_ResetSequenceInfo); - -GAMEHOOK_REGISTRY(GetForceCamera); -GAMEHOOK_REGISTRY(PlayerBlind); -GAMEHOOK_REGISTRY(RadiusFlash_TraceLine); -GAMEHOOK_REGISTRY(RoundEnd); -GAMEHOOK_REGISTRY(InstallGameRules); -GAMEHOOK_REGISTRY(PM_Init); -GAMEHOOK_REGISTRY(PM_Move); -GAMEHOOK_REGISTRY(PM_AirMove); -GAMEHOOK_REGISTRY(HandleMenu_ChooseAppearance); -GAMEHOOK_REGISTRY(HandleMenu_ChooseTeam); -GAMEHOOK_REGISTRY(ShowMenu); -GAMEHOOK_REGISTRY(ShowVGUIMenu); -GAMEHOOK_REGISTRY(BuyGunAmmo); -GAMEHOOK_REGISTRY(BuyWeaponByWeaponID); -GAMEHOOK_REGISTRY(InternalCommand); - -GAMEHOOK_REGISTRY(CSGameRules_FShouldSwitchWeapon); -GAMEHOOK_REGISTRY(CSGameRules_GetNextBestWeapon); -GAMEHOOK_REGISTRY(CSGameRules_FlPlayerFallDamage); -GAMEHOOK_REGISTRY(CSGameRules_FPlayerCanTakeDamage); -GAMEHOOK_REGISTRY(CSGameRules_PlayerSpawn); -GAMEHOOK_REGISTRY(CSGameRules_FPlayerCanRespawn); -GAMEHOOK_REGISTRY(CSGameRules_GetPlayerSpawnSpot); -GAMEHOOK_REGISTRY(CSGameRules_ClientUserInfoChanged); -GAMEHOOK_REGISTRY(CSGameRules_PlayerKilled); -GAMEHOOK_REGISTRY(CSGameRules_DeathNotice); -GAMEHOOK_REGISTRY(CSGameRules_CanHavePlayerItem); -GAMEHOOK_REGISTRY(CSGameRules_DeadPlayerWeapons); -GAMEHOOK_REGISTRY(CSGameRules_ServerDeactivate); -GAMEHOOK_REGISTRY(CSGameRules_CheckMapConditions); -GAMEHOOK_REGISTRY(CSGameRules_CleanUpMap); -GAMEHOOK_REGISTRY(CSGameRules_RestartRound); -GAMEHOOK_REGISTRY(CSGameRules_CheckWinConditions); -GAMEHOOK_REGISTRY(CSGameRules_RemoveGuns); -GAMEHOOK_REGISTRY(CSGameRules_GiveC4); -GAMEHOOK_REGISTRY(CSGameRules_ChangeLevel); -GAMEHOOK_REGISTRY(CSGameRules_GoToIntermission); -GAMEHOOK_REGISTRY(CSGameRules_BalanceTeams); -GAMEHOOK_REGISTRY(CSGameRules_OnRoundFreezeEnd); -GAMEHOOK_REGISTRY(PM_UpdateStepSound); -GAMEHOOK_REGISTRY(CBasePlayer_StartDeathCam); -GAMEHOOK_REGISTRY(CBasePlayer_SwitchTeam); -GAMEHOOK_REGISTRY(CBasePlayer_CanSwitchTeam); -GAMEHOOK_REGISTRY(CBasePlayer_ThrowGrenade); -GAMEHOOK_REGISTRY(CSGameRules_CanPlayerHearPlayer); -GAMEHOOK_REGISTRY(CWeaponBox_SetModel); -GAMEHOOK_REGISTRY(CGrenade_DefuseBombStart); -GAMEHOOK_REGISTRY(CGrenade_DefuseBombEnd); -GAMEHOOK_REGISTRY(CGrenade_ExplodeHeGrenade); -GAMEHOOK_REGISTRY(CGrenade_ExplodeFlashbang); -GAMEHOOK_REGISTRY(CGrenade_ExplodeSmokeGrenade); -GAMEHOOK_REGISTRY(CGrenade_ExplodeBomb); -GAMEHOOK_REGISTRY(ThrowHeGrenade); -GAMEHOOK_REGISTRY(ThrowFlashbang); -GAMEHOOK_REGISTRY(ThrowSmokeGrenade); -GAMEHOOK_REGISTRY(PlantBomb); -GAMEHOOK_REGISTRY(CBasePlayer_SetSpawnProtection); -GAMEHOOK_REGISTRY(CBasePlayer_RemoveSpawnProtection); -GAMEHOOK_REGISTRY(IsPenetrableEntity); -GAMEHOOK_REGISTRY(CBasePlayer_HintMessageEx); -GAMEHOOK_REGISTRY(CBasePlayer_UseEmpty); -GAMEHOOK_REGISTRY(CBasePlayerWeapon_CanDeploy); -GAMEHOOK_REGISTRY(CBasePlayerWeapon_DefaultDeploy); -GAMEHOOK_REGISTRY(CBasePlayerWeapon_DefaultReload); -GAMEHOOK_REGISTRY(CBasePlayerWeapon_DefaultShotgunReload); -GAMEHOOK_REGISTRY(CBasePlayer_DropIdlePlayer); - -GAMEHOOK_REGISTRY(CreateWeaponBox); - -GAMEHOOK_REGISTRY(SpawnHeadGib); -GAMEHOOK_REGISTRY(SpawnRandomGibs); -GAMEHOOK_REGISTRY(CGib_Spawn); -GAMEHOOK_REGISTRY(CGib_BounceGibTouch); -GAMEHOOK_REGISTRY(CGib_WaitTillLand); - -GAMEHOOK_REGISTRY(CBaseEntity_FireBullets); -GAMEHOOK_REGISTRY(CBaseEntity_FireBuckshots); -GAMEHOOK_REGISTRY(CBaseEntity_FireBullets3); - -GAMEHOOK_REGISTRY(CBasePlayer_Observer_SetMode); -GAMEHOOK_REGISTRY(CBasePlayer_Observer_FindNextPlayer); - -GAMEHOOK_REGISTRY(CBasePlayer_Pain); -GAMEHOOK_REGISTRY(CBasePlayer_DeathSound); -GAMEHOOK_REGISTRY(CBasePlayer_JoiningThink); - -int CReGameApi::GetMajorVersion() { - return REGAMEDLL_API_VERSION_MAJOR; -} - -int CReGameApi::GetMinorVersion() { - return REGAMEDLL_API_VERSION_MINOR; -} - -const ReGameFuncs_t *CReGameApi::GetFuncs() { - return &g_ReGameApiFuncs; -} - -IReGameHookchains *CReGameApi::GetHookchains() { - return &g_ReGameHookchains; -} - -CGameRules *CReGameApi::GetGameRules() { - return g_pGameRules; -} - -WeaponInfoStruct *CReGameApi::GetWeaponInfo(int weaponID) { - return ::GetWeaponInfo(weaponID); -} - -WeaponInfoStruct *CReGameApi::GetWeaponInfo(const char *weaponName) { - return ::GetWeaponInfo(weaponName); -} - -playermove_t *CReGameApi::GetPlayerMove() { - return pmove; -} - -WeaponSlotInfo *CReGameApi::GetWeaponSlot(WeaponIdType weaponID) { return ::GetWeaponSlot(weaponID); } -WeaponSlotInfo *CReGameApi::GetWeaponSlot(const char *weaponName) { return ::GetWeaponSlot(weaponName); } - -ItemInfo *CReGameApi::GetItemInfo(WeaponIdType weaponID) { return &CBasePlayerItem::m_ItemInfoArray[weaponID]; } -AmmoInfo *CReGameApi::GetAmmoInfo(AmmoType ammoID) { return &CBasePlayerItem::m_AmmoInfoArray[ammoID]; } - -AmmoInfoStruct *CReGameApi::GetAmmoInfoEx(AmmoType ammoID) { return ::GetAmmoInfo(ammoID); } -AmmoInfoStruct *CReGameApi::GetAmmoInfoEx(const char *ammoName) { return ::GetAmmoInfo(ammoName); } - -bool CReGameApi::BGetICSEntity(const char *pchVersion) const -{ - if (!Q_stricmp(pchVersion, CSENTITY_API_INTERFACE_VERSION)) +class CCSPlayer: public CCSMonster { +public: + CCSPlayer() : + m_bForceShowMenu(false), + m_flRespawnPending(0), + m_flSpawnProtectionEndTime(0), + m_iWeaponInfiniteAmmo(0), + m_iWeaponInfiniteIds(0), + m_bCanShootOverride(false), + m_bGameForcingRespawn(false), + m_bAutoBunnyHopping(false), + m_bMegaBunnyJumping(false), + m_bPlantC4Anywhere(false) { - return true; + m_szModel[0] = '\0'; } - return false; -} - -bool CReGameApi::BGetIGameRules(const char *pchVersion) const -{ - if (!Q_stricmp(pchVersion, GAMERULES_API_INTERFACE_VERSION)) + virtual bool IsConnected() const; + virtual void SetAnimation(PLAYER_ANIM playerAnim); + virtual void AddAccount(int amount, RewardType type = RT_NONE, bool bTrackChange = true); + virtual CBaseEntity *GiveNamedItem(const char *pszName); + virtual CBaseEntity *GiveNamedItemEx(const char *pszName); + virtual void GiveDefaultItems(); + virtual void GiveShield(bool bDeploy = true); + virtual CBaseEntity *DropShield(bool bDeploy = true); + virtual CBaseEntity *DropPlayerItem(const char *pszItemName); + virtual bool RemoveShield(); + virtual void RemoveAllItems(bool bRemoveSuit); + virtual bool RemovePlayerItem(const char* pszItemName); + virtual void SetPlayerModel(bool bHasC4); + virtual void SetPlayerModelEx(const char *modelName); + virtual void SetNewPlayerModel(const char *modelName); + virtual void ClientCommand(const char *cmd, const char *arg1 = nullptr, const char *arg2 = nullptr, const char *arg3 = nullptr); + virtual void SetProgressBarTime(int time); + virtual void SetProgressBarTime2(int time, float timeElapsed); + virtual struct edict_s *EntSelectSpawnPoint(); + virtual void SetBombIcon(bool bFlash = false); + virtual void SetScoreAttrib(CBasePlayer *dest); + virtual void SendItemStatus(); + virtual void ReloadWeapons(CBasePlayerItem *pWeapon = nullptr, bool bForceReload = false, bool bForceRefill = false); + virtual void Observer_SetMode(int iMode); + virtual bool SelectSpawnSpot(const char *pEntClassName, CBaseEntity* &pSpot); + virtual bool SwitchWeapon(CBasePlayerItem *pWeapon); + virtual void SwitchTeam(); + virtual bool JoinTeam(TeamName team); + virtual void StartObserver(Vector& vecPosition, Vector& vecViewAngle); + virtual void TeamChangeUpdate(); + virtual void DropSecondary(); + virtual void DropPrimary(); + virtual bool HasPlayerItem(CBasePlayerItem *pCheckItem); + virtual bool HasNamedPlayerItem(const char *pszItemName); + virtual CBasePlayerItem *GetItemById(WeaponIdType weaponID); + virtual CBasePlayerItem *GetItemByName(const char *itemName); + virtual void Disappear(); + virtual void MakeVIP(); + virtual bool MakeBomber(); + virtual void ResetSequenceInfo(); + virtual void StartDeathCam(); + virtual bool RemovePlayerItemEx(const char* pszItemName, bool bRemoveAmmo); + virtual void SetSpawnProtection(float flProtectionTime); + virtual void RemoveSpawnProtection(); + virtual bool HintMessageEx(const char *pMessage, float duration = 6.0f, bool bDisplayIfPlayerDead = false, bool bOverride = false); + + void Reset(); + + void OnSpawn(); + void OnKilled(); + + CBasePlayer *BasePlayer() const; + +public: + enum EProtectionState { - return true; - } - - return false; -} - -EXT_FUNC void Regamedll_ChangeString_api(char *&dest, const char *source) -{ - size_t len = Q_strlen(source); - if (dest == nullptr || Q_strlen(dest) != len) { - delete [] dest; - dest = new char [len + 1]; - } - - Q_strcpy(dest, source); -} + ProtectionSt_NoSet, + ProtectionSt_Active, + ProtectionSt_Expired, + }; + + EProtectionState GetProtectionState() const; + bool CheckActivityInGame(); + +public: + char m_szModel[32]; + bool m_bForceShowMenu; + float m_flRespawnPending; + float m_flSpawnProtectionEndTime; + Vector m_vecOldvAngle; + int m_iWeaponInfiniteAmmo; + int m_iWeaponInfiniteIds; + bool m_bCanShootOverride; + bool m_bGameForcingRespawn; + bool m_bAutoBunnyHopping; + bool m_bMegaBunnyJumping; + bool m_bPlantC4Anywhere; +}; -EXT_FUNC void RadiusDamage_api(Vector vecSrc, entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, float flRadius, int iClassIgnore, int bitsDamageType) +// Inlines +inline CBasePlayer *CCSPlayer::BasePlayer() const { - RadiusDamage(vecSrc, pevInflictor, pevAttacker, flDamage, flRadius, iClassIgnore, bitsDamageType); + return reinterpret_cast(this->m_pContainingEntity); } -EXT_FUNC void ClearMultiDamage_api() +inline CCSPlayer::EProtectionState CCSPlayer::GetProtectionState() const { - ClearMultiDamage(); -} + // no protection set + if (m_flSpawnProtectionEndTime <= 0.0f) + return ProtectionSt_NoSet; -EXT_FUNC void ApplyMultiDamage_api(entvars_t *pevInflictor, entvars_t *pevAttacker) -{ - ApplyMultiDamage(pevInflictor, pevAttacker); -} + // check if end time of protection isn't expired yet + if (m_flSpawnProtectionEndTime >= gpGlobals->time) + return ProtectionSt_Active; -EXT_FUNC void AddMultiDamage_api(entvars_t *pevInflictor, CBaseEntity *pEntity, float flDamage, int bitsDamageType) -{ - AddMultiDamage(pevInflictor, pEntity, flDamage, bitsDamageType); + // has expired + return ProtectionSt_Expired; } - -EXPOSE_SINGLE_INTERFACE(CReGameApi, IReGameApi, VRE_GAMEDLL_API_VERSION); From ab49b14972d346708dfd9e6b38e7fad26886230a Mon Sep 17 00:00:00 2001 From: StevenKal Date: Thu, 28 Oct 2021 23:23:02 +0200 Subject: [PATCH 02/13] Update CAPI_Impl.h Changes reasons: No need to have those "*_api" functions for standard functions which do not have a different code/format, this is useless. Besides, passing the "real function used internally by the game" into the list of the structure "ReGameFuncs_t" will allow to retrieve the "real function address". So, we could "memhack it" and make a hook of the "real function", which is the internal one we want on a hook, not the API one which will only be called when we trigger those API functions. To finish, this ensures reliability of the function address, and, no need to search it via symbol or signature of bytes where the last can easily be broken. -> void *pfnAddMultiDamage = (void *)g_pReGameDLLCSFunctions->AddMultiDamage; --- regamedll/dlls/API/CAPI_Impl.h | 7 ------- 1 file changed, 7 deletions(-) diff --git a/regamedll/dlls/API/CAPI_Impl.h b/regamedll/dlls/API/CAPI_Impl.h index 1be3dd232..66dc15d55 100644 --- a/regamedll/dlls/API/CAPI_Impl.h +++ b/regamedll/dlls/API/CAPI_Impl.h @@ -930,10 +930,3 @@ class CReGameApi: public IReGameApi { EXT_FUNC virtual bool BGetICSEntity(const char *pchVersion) const; EXT_FUNC virtual bool BGetIGameRules(const char *pchVersion) const; }; - -void Regamedll_ChangeString_api(char *&dest, const char *source); -void RadiusDamage_api(Vector vecSrc, entvars_t *pevInflictor, entvars_t *pevAttacker, float flDamage, float flRadius, int iClassIgnore, int bitsDamageType); - -void ClearMultiDamage_api(); -void ApplyMultiDamage_api(entvars_t *pevInflictor, entvars_t *pevAttacker); -void AddMultiDamage_api(entvars_t *pevInflictor, CBaseEntity *pEntity, float flDamage, int bitsDamageType); From d7de0ff2995ad040eff99d2fbd58989703274034 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Thu, 28 Oct 2021 23:25:07 +0200 Subject: [PATCH 03/13] Update CSPlayer.cpp Changes: Add new member "m_bPlantC4Anywhere" to the function "CCSPlayer::Reset". Update function "CCSPlayer::JoinTeam" in order to drop the C4 when we move a player to spectator (fix issue s1lentq#498). Update functions "CCSPlayer::DropShield" & "CCSPlayer::DropPlayerItem" by adding return value of the entity created, and provided by ReGameDLL_CS (not the case for the legit CS binary). --- regamedll/dlls/API/CSPlayer.cpp | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/regamedll/dlls/API/CSPlayer.cpp b/regamedll/dlls/API/CSPlayer.cpp index 6b11725fe..9d669e068 100644 --- a/regamedll/dlls/API/CSPlayer.cpp +++ b/regamedll/dlls/API/CSPlayer.cpp @@ -43,6 +43,11 @@ EXT_FUNC bool CCSPlayer::JoinTeam(TeamName team) pPlayer->pev->deadflag = DEAD_DEAD; pPlayer->pev->health = 0; + // Drop the C4 when we move toward spectator! + if(pPlayer->m_bHasC4) + { + pPlayer->DropPlayerItem("weapon_c4"); + } pPlayer->RemoveAllItems(TRUE); pPlayer->m_bHasC4 = false; @@ -303,14 +308,14 @@ EXT_FUNC void CCSPlayer::GiveShield(bool bDeploy) BasePlayer()->GiveShield(bDeploy); } -EXT_FUNC void CCSPlayer::DropShield(bool bDeploy) +EXT_FUNC CBaseEntity *CCSPlayer::DropShield(bool bDeploy) { - BasePlayer()->DropShield(bDeploy); + return BasePlayer()->DropShield(bDeploy); } -EXT_FUNC void CCSPlayer::DropPlayerItem(const char *pszItemName) +EXT_FUNC CBaseEntity *CCSPlayer::DropPlayerItem(const char *pszItemName) { - BasePlayer()->DropPlayerItem(pszItemName); + return BasePlayer()->DropPlayerItem(pszItemName); } EXT_FUNC bool CCSPlayer::RemoveShield() @@ -532,7 +537,7 @@ void CCSPlayer::Reset() m_bForceShowMenu = false; m_flRespawnPending = - m_flSpawnProtectionEndTime = 0.0f; + m_flSpawnProtectionEndTime = 0.0f; m_vecOldvAngle = g_vecZero; m_iWeaponInfiniteAmmo = 0; @@ -541,6 +546,7 @@ void CCSPlayer::Reset() m_bGameForcingRespawn = false; m_bAutoBunnyHopping = false; m_bMegaBunnyJumping = false; + m_bPlantC4Anywhere = false; } void CCSPlayer::OnSpawn() From e7c101c04cdeb4b7f3f8363eab78e772439b0ebe Mon Sep 17 00:00:00 2001 From: StevenKal Date: Thu, 28 Oct 2021 23:26:32 +0200 Subject: [PATCH 04/13] Update CSPlayer.h Changes: Update functions "CCSPlayer::DropShield" & "CCSPlayer::DropPlayerItem" by adding return value of the entity created, and provided by ReGameDLL_CS (not the case for the legit CS binary). --- regamedll/public/regamedll/API/CSPlayer.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/regamedll/public/regamedll/API/CSPlayer.h b/regamedll/public/regamedll/API/CSPlayer.h index 8410d95f7..4e7d1e93e 100644 --- a/regamedll/public/regamedll/API/CSPlayer.h +++ b/regamedll/public/regamedll/API/CSPlayer.h @@ -61,8 +61,8 @@ class CCSPlayer: public CCSMonster { virtual CBaseEntity *GiveNamedItemEx(const char *pszName); virtual void GiveDefaultItems(); virtual void GiveShield(bool bDeploy = true); - virtual void DropShield(bool bDeploy = true); - virtual void DropPlayerItem(const char *pszItemName); + virtual CBaseEntity *DropShield(bool bDeploy = true); + virtual CBaseEntity *DropPlayerItem(const char *pszItemName); virtual bool RemoveShield(); virtual void RemoveAllItems(bool bRemoveSuit); virtual bool RemovePlayerItem(const char* pszItemName); From 21c140ce7e403cb66a2e4c83fabf51ab4b05ea07 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Thu, 28 Oct 2021 23:29:45 +0200 Subject: [PATCH 05/13] Update client.cpp Fix condition validity for #define "PLAYER_FREEZE_TIME_OVER" (freeze time over means it is over so we can play, so "!" forgotten). --- regamedll/dlls/client.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/regamedll/dlls/client.cpp b/regamedll/dlls/client.cpp index 5ddf63adb..3e37ce114 100644 --- a/regamedll/dlls/client.cpp +++ b/regamedll/dlls/client.cpp @@ -4926,7 +4926,7 @@ void EXT_FUNC UpdateClientData(const edict_t *ent, int sendweapons, struct clien (pPlayer->m_bCanShoot && !pPlayer->m_bIsDefusing)) iUser3 |= PLAYER_CAN_SHOOT; - if (g_pGameRules->IsFreezePeriod()) + if (!g_pGameRules->IsFreezePeriod()) iUser3 |= PLAYER_FREEZE_TIME_OVER; if (pPlayer->m_signals.GetState() & SIGNAL_BOMB) From ee2da6dcbe209b440991b94024edef8fe8ba4f8d Mon Sep 17 00:00:00 2001 From: StevenKal Date: Thu, 28 Oct 2021 23:37:09 +0200 Subject: [PATCH 06/13] Update CAPI_Impl.cpp Changes reasons: No need to have those "*_api" functions for standard functions which do not have a different code/format, this is useless. Besides, passing the "real function used internally by the game" into the list of the structure "ReGameFuncs_t" will allow to retrieve the "real function address". So, we could "memhack it" and make a hook of the "real function", which is the internal one we want on a hook, not the API one which will only be called when we trigger those API functions. To finish, this ensures reliability of the function address, and, no need to search it via symbol or signature of bytes where the last can easily be broken. -> void *pfnAddMultiDamage = (void *)g_pReGameDLLCSFunctions->AddMultiDamage; --- regamedll/dlls/API/CAPI_Impl.cpp | 343 +++++++++++++++++++++---------- 1 file changed, 230 insertions(+), 113 deletions(-) diff --git a/regamedll/dlls/API/CAPI_Impl.cpp b/regamedll/dlls/API/CAPI_Impl.cpp index 4e7d1e93e..47532642b 100644 --- a/regamedll/dlls/API/CAPI_Impl.cpp +++ b/regamedll/dlls/API/CAPI_Impl.cpp @@ -26,129 +26,246 @@ * */ -#pragma once +#include "precompiled.h" -#include -#include +CReGameHookchains g_ReGameHookchains; -enum WeaponInfiniteAmmoMode +void Regamedll_ChangeString_api(char *&dest, const char *source) { - WPNMODE_INFINITE_CLIP = 1, - WPNMODE_INFINITE_BPAMMO -}; - -class CCSPlayer: public CCSMonster { -public: - CCSPlayer() : - m_bForceShowMenu(false), - m_flRespawnPending(0), - m_flSpawnProtectionEndTime(0), - m_iWeaponInfiniteAmmo(0), - m_iWeaponInfiniteIds(0), - m_bCanShootOverride(false), - m_bGameForcingRespawn(false), - m_bAutoBunnyHopping(false), - m_bMegaBunnyJumping(false), - m_bPlantC4Anywhere(false) - { - m_szModel[0] = '\0'; + size_t len = Q_strlen(source); + if (dest == nullptr || Q_strlen(dest) != len) { + delete [] dest; + dest = new char [len + 1]; } - virtual bool IsConnected() const; - virtual void SetAnimation(PLAYER_ANIM playerAnim); - virtual void AddAccount(int amount, RewardType type = RT_NONE, bool bTrackChange = true); - virtual CBaseEntity *GiveNamedItem(const char *pszName); - virtual CBaseEntity *GiveNamedItemEx(const char *pszName); - virtual void GiveDefaultItems(); - virtual void GiveShield(bool bDeploy = true); - virtual CBaseEntity *DropShield(bool bDeploy = true); - virtual CBaseEntity *DropPlayerItem(const char *pszItemName); - virtual bool RemoveShield(); - virtual void RemoveAllItems(bool bRemoveSuit); - virtual bool RemovePlayerItem(const char* pszItemName); - virtual void SetPlayerModel(bool bHasC4); - virtual void SetPlayerModelEx(const char *modelName); - virtual void SetNewPlayerModel(const char *modelName); - virtual void ClientCommand(const char *cmd, const char *arg1 = nullptr, const char *arg2 = nullptr, const char *arg3 = nullptr); - virtual void SetProgressBarTime(int time); - virtual void SetProgressBarTime2(int time, float timeElapsed); - virtual struct edict_s *EntSelectSpawnPoint(); - virtual void SetBombIcon(bool bFlash = false); - virtual void SetScoreAttrib(CBasePlayer *dest); - virtual void SendItemStatus(); - virtual void ReloadWeapons(CBasePlayerItem *pWeapon = nullptr, bool bForceReload = false, bool bForceRefill = false); - virtual void Observer_SetMode(int iMode); - virtual bool SelectSpawnSpot(const char *pEntClassName, CBaseEntity* &pSpot); - virtual bool SwitchWeapon(CBasePlayerItem *pWeapon); - virtual void SwitchTeam(); - virtual bool JoinTeam(TeamName team); - virtual void StartObserver(Vector& vecPosition, Vector& vecViewAngle); - virtual void TeamChangeUpdate(); - virtual void DropSecondary(); - virtual void DropPrimary(); - virtual bool HasPlayerItem(CBasePlayerItem *pCheckItem); - virtual bool HasNamedPlayerItem(const char *pszItemName); - virtual CBasePlayerItem *GetItemById(WeaponIdType weaponID); - virtual CBasePlayerItem *GetItemByName(const char *itemName); - virtual void Disappear(); - virtual void MakeVIP(); - virtual bool MakeBomber(); - virtual void ResetSequenceInfo(); - virtual void StartDeathCam(); - virtual bool RemovePlayerItemEx(const char* pszItemName, bool bRemoveAmmo); - virtual void SetSpawnProtection(float flProtectionTime); - virtual void RemoveSpawnProtection(); - virtual bool HintMessageEx(const char *pMessage, float duration = 6.0f, bool bDisplayIfPlayerDead = false, bool bOverride = false); - - void Reset(); - - void OnSpawn(); - void OnKilled(); - - CBasePlayer *BasePlayer() const; - -public: - enum EProtectionState - { - ProtectionSt_NoSet, - ProtectionSt_Active, - ProtectionSt_Expired, - }; - - EProtectionState GetProtectionState() const; - bool CheckActivityInGame(); - -public: - char m_szModel[32]; - bool m_bForceShowMenu; - float m_flRespawnPending; - float m_flSpawnProtectionEndTime; - Vector m_vecOldvAngle; - int m_iWeaponInfiniteAmmo; - int m_iWeaponInfiniteIds; - bool m_bCanShootOverride; - bool m_bGameForcingRespawn; - bool m_bAutoBunnyHopping; - bool m_bMegaBunnyJumping; - bool m_bPlantC4Anywhere; + Q_strcpy(dest, source); +} + +CGrenade *PlantBomb_api(entvars_t *pevOwner, Vector &vecStart, Vector &vecVelocity) { + return CGrenade::ShootSatchelCharge(pevOwner, vecStart, vecVelocity); +} + +CGib *SpawnHeadGib_api(entvars_t *pevVictim) { + return CGib::SpawnHeadGib(pevVictim); +} + +void SpawnRandomGibs_api(entvars_t *pevVictim, int cGibs, int human) { + CGib::SpawnRandomGibs(pevVictim, cGibs, human); +} + +ReGameFuncs_t g_ReGameApiFuncs = { + CREATE_NAMED_ENTITY, + + Regamedll_ChangeString_api, + + RadiusDamage, + ClearMultiDamage, + ApplyMultiDamage, + AddMultiDamage, + + UTIL_FindEntityByString, + + AddEntityHashValue, + RemoveEntityHashValue, + + CMD_ARGC_, + CMD_ARGV_, + + PlantBomb_api, + + SpawnHeadGib_api, + SpawnRandomGibs_api }; -// Inlines -inline CBasePlayer *CCSPlayer::BasePlayer() const -{ - return reinterpret_cast(this->m_pContainingEntity); +GAMEHOOK_REGISTRY(CBasePlayer_Spawn); +GAMEHOOK_REGISTRY(CBasePlayer_Precache); +GAMEHOOK_REGISTRY(CBasePlayer_ObjectCaps); +GAMEHOOK_REGISTRY(CBasePlayer_Classify); +GAMEHOOK_REGISTRY(CBasePlayer_TraceAttack); +GAMEHOOK_REGISTRY(CBasePlayer_TakeDamage); +GAMEHOOK_REGISTRY(CBasePlayer_TakeHealth); +GAMEHOOK_REGISTRY(CBasePlayer_Killed); +GAMEHOOK_REGISTRY(CBasePlayer_AddPoints); +GAMEHOOK_REGISTRY(CBasePlayer_AddPointsToTeam); +GAMEHOOK_REGISTRY(CBasePlayer_AddPlayerItem); +GAMEHOOK_REGISTRY(CBasePlayer_RemovePlayerItem); +GAMEHOOK_REGISTRY(CBasePlayer_GiveAmmo); +GAMEHOOK_REGISTRY(CBasePlayer_ResetMaxSpeed); +GAMEHOOK_REGISTRY(CBasePlayer_Jump); +GAMEHOOK_REGISTRY(CBasePlayer_Duck); +GAMEHOOK_REGISTRY(CBasePlayer_PreThink); +GAMEHOOK_REGISTRY(CBasePlayer_PostThink); +GAMEHOOK_REGISTRY(CBasePlayer_UpdateClientData); +GAMEHOOK_REGISTRY(CBasePlayer_ImpulseCommands); +GAMEHOOK_REGISTRY(CBasePlayer_RoundRespawn); +GAMEHOOK_REGISTRY(CBasePlayer_Blind); + +GAMEHOOK_REGISTRY(CBasePlayer_Observer_IsValidTarget); +GAMEHOOK_REGISTRY(CBasePlayer_SetAnimation); +GAMEHOOK_REGISTRY(CBasePlayer_GiveDefaultItems); +GAMEHOOK_REGISTRY(CBasePlayer_GiveNamedItem); +GAMEHOOK_REGISTRY(CBasePlayer_AddAccount); +GAMEHOOK_REGISTRY(CBasePlayer_GiveShield); +GAMEHOOK_REGISTRY(CBasePlayer_SetClientUserInfoModel); +GAMEHOOK_REGISTRY(CBasePlayer_SetClientUserInfoName); +GAMEHOOK_REGISTRY(CBasePlayer_HasRestrictItem); +GAMEHOOK_REGISTRY(CBasePlayer_DropPlayerItem); +GAMEHOOK_REGISTRY(CBasePlayer_DropShield); +GAMEHOOK_REGISTRY(CBasePlayer_OnSpawnEquip); +GAMEHOOK_REGISTRY(CBasePlayer_Radio); +GAMEHOOK_REGISTRY(CBasePlayer_Disappear); +GAMEHOOK_REGISTRY(CBasePlayer_MakeVIP); +GAMEHOOK_REGISTRY(CBasePlayer_MakeBomber); +GAMEHOOK_REGISTRY(CBasePlayer_StartObserver); +GAMEHOOK_REGISTRY(CBasePlayer_GetIntoGame); + +GAMEHOOK_REGISTRY(CBaseAnimating_ResetSequenceInfo); + +GAMEHOOK_REGISTRY(GetForceCamera); +GAMEHOOK_REGISTRY(PlayerBlind); +GAMEHOOK_REGISTRY(RadiusFlash_TraceLine); +GAMEHOOK_REGISTRY(RoundEnd); +GAMEHOOK_REGISTRY(InstallGameRules); +GAMEHOOK_REGISTRY(PM_Init); +GAMEHOOK_REGISTRY(PM_Move); +GAMEHOOK_REGISTRY(PM_AirMove); +GAMEHOOK_REGISTRY(HandleMenu_ChooseAppearance); +GAMEHOOK_REGISTRY(HandleMenu_ChooseTeam); +GAMEHOOK_REGISTRY(ShowMenu); +GAMEHOOK_REGISTRY(ShowVGUIMenu); +GAMEHOOK_REGISTRY(BuyGunAmmo); +GAMEHOOK_REGISTRY(BuyWeaponByWeaponID); +GAMEHOOK_REGISTRY(InternalCommand); + +GAMEHOOK_REGISTRY(CSGameRules_FShouldSwitchWeapon); +GAMEHOOK_REGISTRY(CSGameRules_GetNextBestWeapon); +GAMEHOOK_REGISTRY(CSGameRules_FlPlayerFallDamage); +GAMEHOOK_REGISTRY(CSGameRules_FPlayerCanTakeDamage); +GAMEHOOK_REGISTRY(CSGameRules_PlayerSpawn); +GAMEHOOK_REGISTRY(CSGameRules_FPlayerCanRespawn); +GAMEHOOK_REGISTRY(CSGameRules_GetPlayerSpawnSpot); +GAMEHOOK_REGISTRY(CSGameRules_ClientUserInfoChanged); +GAMEHOOK_REGISTRY(CSGameRules_PlayerKilled); +GAMEHOOK_REGISTRY(CSGameRules_DeathNotice); +GAMEHOOK_REGISTRY(CSGameRules_CanHavePlayerItem); +GAMEHOOK_REGISTRY(CSGameRules_DeadPlayerWeapons); +GAMEHOOK_REGISTRY(CSGameRules_ServerDeactivate); +GAMEHOOK_REGISTRY(CSGameRules_CheckMapConditions); +GAMEHOOK_REGISTRY(CSGameRules_CleanUpMap); +GAMEHOOK_REGISTRY(CSGameRules_RestartRound); +GAMEHOOK_REGISTRY(CSGameRules_CheckWinConditions); +GAMEHOOK_REGISTRY(CSGameRules_RemoveGuns); +GAMEHOOK_REGISTRY(CSGameRules_GiveC4); +GAMEHOOK_REGISTRY(CSGameRules_ChangeLevel); +GAMEHOOK_REGISTRY(CSGameRules_GoToIntermission); +GAMEHOOK_REGISTRY(CSGameRules_BalanceTeams); +GAMEHOOK_REGISTRY(CSGameRules_OnRoundFreezeEnd); +GAMEHOOK_REGISTRY(PM_UpdateStepSound); +GAMEHOOK_REGISTRY(CBasePlayer_StartDeathCam); +GAMEHOOK_REGISTRY(CBasePlayer_SwitchTeam); +GAMEHOOK_REGISTRY(CBasePlayer_CanSwitchTeam); +GAMEHOOK_REGISTRY(CBasePlayer_ThrowGrenade); +GAMEHOOK_REGISTRY(CSGameRules_CanPlayerHearPlayer); +GAMEHOOK_REGISTRY(CWeaponBox_SetModel); +GAMEHOOK_REGISTRY(CGrenade_DefuseBombStart); +GAMEHOOK_REGISTRY(CGrenade_DefuseBombEnd); +GAMEHOOK_REGISTRY(CGrenade_ExplodeHeGrenade); +GAMEHOOK_REGISTRY(CGrenade_ExplodeFlashbang); +GAMEHOOK_REGISTRY(CGrenade_ExplodeSmokeGrenade); +GAMEHOOK_REGISTRY(CGrenade_ExplodeBomb); +GAMEHOOK_REGISTRY(ThrowHeGrenade); +GAMEHOOK_REGISTRY(ThrowFlashbang); +GAMEHOOK_REGISTRY(ThrowSmokeGrenade); +GAMEHOOK_REGISTRY(PlantBomb); +GAMEHOOK_REGISTRY(CBasePlayer_SetSpawnProtection); +GAMEHOOK_REGISTRY(CBasePlayer_RemoveSpawnProtection); +GAMEHOOK_REGISTRY(IsPenetrableEntity); +GAMEHOOK_REGISTRY(CBasePlayer_HintMessageEx); +GAMEHOOK_REGISTRY(CBasePlayer_UseEmpty); +GAMEHOOK_REGISTRY(CBasePlayerWeapon_CanDeploy); +GAMEHOOK_REGISTRY(CBasePlayerWeapon_DefaultDeploy); +GAMEHOOK_REGISTRY(CBasePlayerWeapon_DefaultReload); +GAMEHOOK_REGISTRY(CBasePlayerWeapon_DefaultShotgunReload); +GAMEHOOK_REGISTRY(CBasePlayer_DropIdlePlayer); + +GAMEHOOK_REGISTRY(CreateWeaponBox); + +GAMEHOOK_REGISTRY(SpawnHeadGib); +GAMEHOOK_REGISTRY(SpawnRandomGibs); +GAMEHOOK_REGISTRY(CGib_Spawn); +GAMEHOOK_REGISTRY(CGib_BounceGibTouch); +GAMEHOOK_REGISTRY(CGib_WaitTillLand); + +GAMEHOOK_REGISTRY(CBaseEntity_FireBullets); +GAMEHOOK_REGISTRY(CBaseEntity_FireBuckshots); +GAMEHOOK_REGISTRY(CBaseEntity_FireBullets3); + +GAMEHOOK_REGISTRY(CBasePlayer_Observer_SetMode); +GAMEHOOK_REGISTRY(CBasePlayer_Observer_FindNextPlayer); + +GAMEHOOK_REGISTRY(CBasePlayer_Pain); +GAMEHOOK_REGISTRY(CBasePlayer_DeathSound); +GAMEHOOK_REGISTRY(CBasePlayer_JoiningThink); + +int CReGameApi::GetMajorVersion() { + return REGAMEDLL_API_VERSION_MAJOR; +} + +int CReGameApi::GetMinorVersion() { + return REGAMEDLL_API_VERSION_MINOR; +} + +const ReGameFuncs_t *CReGameApi::GetFuncs() { + return &g_ReGameApiFuncs; +} + +IReGameHookchains *CReGameApi::GetHookchains() { + return &g_ReGameHookchains; +} + +CGameRules *CReGameApi::GetGameRules() { + return g_pGameRules; +} + +WeaponInfoStruct *CReGameApi::GetWeaponInfo(int weaponID) { + return ::GetWeaponInfo(weaponID); +} + +WeaponInfoStruct *CReGameApi::GetWeaponInfo(const char *weaponName) { + return ::GetWeaponInfo(weaponName); } -inline CCSPlayer::EProtectionState CCSPlayer::GetProtectionState() const +playermove_t *CReGameApi::GetPlayerMove() { + return pmove; +} + +WeaponSlotInfo *CReGameApi::GetWeaponSlot(WeaponIdType weaponID) { return ::GetWeaponSlot(weaponID); } +WeaponSlotInfo *CReGameApi::GetWeaponSlot(const char *weaponName) { return ::GetWeaponSlot(weaponName); } + +ItemInfo *CReGameApi::GetItemInfo(WeaponIdType weaponID) { return &CBasePlayerItem::m_ItemInfoArray[weaponID]; } +AmmoInfo *CReGameApi::GetAmmoInfo(AmmoType ammoID) { return &CBasePlayerItem::m_AmmoInfoArray[ammoID]; } + +AmmoInfoStruct *CReGameApi::GetAmmoInfoEx(AmmoType ammoID) { return ::GetAmmoInfo(ammoID); } +AmmoInfoStruct *CReGameApi::GetAmmoInfoEx(const char *ammoName) { return ::GetAmmoInfo(ammoName); } + +bool CReGameApi::BGetICSEntity(const char *pchVersion) const { - // no protection set - if (m_flSpawnProtectionEndTime <= 0.0f) - return ProtectionSt_NoSet; + if (!Q_stricmp(pchVersion, CSENTITY_API_INTERFACE_VERSION)) + { + return true; + } - // check if end time of protection isn't expired yet - if (m_flSpawnProtectionEndTime >= gpGlobals->time) - return ProtectionSt_Active; + return false; +} + +bool CReGameApi::BGetIGameRules(const char *pchVersion) const +{ + if (!Q_stricmp(pchVersion, GAMERULES_API_INTERFACE_VERSION)) + { + return true; + } - // has expired - return ProtectionSt_Expired; + return false; } + +EXPOSE_SINGLE_INTERFACE(CReGameApi, IReGameApi, VRE_GAMEDLL_API_VERSION); From 35683acaab1148e1ad5764b60e939bef5117de83 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Thu, 28 Oct 2021 23:45:15 +0200 Subject: [PATCH 07/13] Update CSPlayer.cpp Changes: Add new member "m_bPlantC4Anywhere" to the function "CCSPlayer::Reset" (but I hope it will be changed later into an integer for better control). Update function "CCSPlayer::JoinTeam" in order to drop the C4 when we move a player to spectator (fix issue s1lentq#498). Update functions "CCSPlayer::DropShield" & "CCSPlayer::DropPlayerItem" by adding return value of the entity created, and provided by ReGameDLL_CS (not the case for the legit CS binary). --- regamedll/dlls/API/CSPlayer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/regamedll/dlls/API/CSPlayer.cpp b/regamedll/dlls/API/CSPlayer.cpp index 9d669e068..8173b44a8 100644 --- a/regamedll/dlls/API/CSPlayer.cpp +++ b/regamedll/dlls/API/CSPlayer.cpp @@ -536,7 +536,7 @@ void CCSPlayer::Reset() m_szModel[0] = '\0'; m_bForceShowMenu = false; - m_flRespawnPending = + m_flRespawnPending = 0.0f; m_flSpawnProtectionEndTime = 0.0f; m_vecOldvAngle = g_vecZero; From 4ccf10974001e75848461b1047b65f73f5e1d0d3 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Fri, 29 Oct 2021 02:33:32 +0200 Subject: [PATCH 08/13] Update client.cpp --- regamedll/dlls/client.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/regamedll/dlls/client.cpp b/regamedll/dlls/client.cpp index 3e37ce114..5ddf63adb 100644 --- a/regamedll/dlls/client.cpp +++ b/regamedll/dlls/client.cpp @@ -4926,7 +4926,7 @@ void EXT_FUNC UpdateClientData(const edict_t *ent, int sendweapons, struct clien (pPlayer->m_bCanShoot && !pPlayer->m_bIsDefusing)) iUser3 |= PLAYER_CAN_SHOOT; - if (!g_pGameRules->IsFreezePeriod()) + if (g_pGameRules->IsFreezePeriod()) iUser3 |= PLAYER_FREEZE_TIME_OVER; if (pPlayer->m_signals.GetState() & SIGNAL_BOMB) From a0c4762b30f176cdf4930bf3926a820ca8be5509 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Fri, 29 Oct 2021 11:47:32 +0200 Subject: [PATCH 09/13] Update version.h Specify this requires a higher version as info (new CCSPlayer's functions format + new member addition). --- regamedll/version/version.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/regamedll/version/version.h b/regamedll/version/version.h index ba22bb751..b65ba1ab2 100644 --- a/regamedll/version/version.h +++ b/regamedll/version/version.h @@ -6,5 +6,5 @@ #pragma once #define VERSION_MAJOR 5 -#define VERSION_MINOR 21 +#define VERSION_MINOR 22 #define VERSION_MAINTENANCE 0 From b0ff07fd6080800ba5c927972bd654388ad1cd37 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Fri, 29 Oct 2021 11:48:08 +0200 Subject: [PATCH 10/13] Update regamedll_api.h --- regamedll/public/regamedll/regamedll_api.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/regamedll/public/regamedll/regamedll_api.h b/regamedll/public/regamedll/regamedll_api.h index ba7a8517c..79aec7c5c 100644 --- a/regamedll/public/regamedll/regamedll_api.h +++ b/regamedll/public/regamedll/regamedll_api.h @@ -38,7 +38,7 @@ #include #define REGAMEDLL_API_VERSION_MAJOR 5 -#define REGAMEDLL_API_VERSION_MINOR 21 +#define REGAMEDLL_API_VERSION_MINOR 22 // CBasePlayer::Spawn hook typedef IHookChainClass IReGameHook_CBasePlayer_Spawn; From 48dedd3898caf372d0139bc1791b239d67616a8b Mon Sep 17 00:00:00 2001 From: StevenKal Date: Sun, 31 Oct 2021 07:00:43 +0100 Subject: [PATCH 11/13] Update CAPI_Impl.h Export those famous global variables in order to allow an external memhack module to retrieve address and easily get the address of the functions list (but mainly useful for "g_ReGameApiFuncs" here). --- regamedll/dlls/API/CAPI_Impl.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/regamedll/dlls/API/CAPI_Impl.h b/regamedll/dlls/API/CAPI_Impl.h index 66dc15d55..311f612ed 100644 --- a/regamedll/dlls/API/CAPI_Impl.h +++ b/regamedll/dlls/API/CAPI_Impl.h @@ -906,8 +906,8 @@ class CReGameHookchains: public IReGameHookchains { virtual IReGameHookRegistry_CBasePlayer_JoiningThink *CBasePlayer_JoiningThink(); }; -extern CReGameHookchains g_ReGameHookchains; -extern ReGameFuncs_t g_ReGameApiFuncs; +C_DLLEXPORT CReGameHookchains g_ReGameHookchains; +C_DLLEXPORT ReGameFuncs_t g_ReGameApiFuncs; class CReGameApi: public IReGameApi { public: From e7dbada825221bd5ad76cad302522cbe857eec7c Mon Sep 17 00:00:00 2001 From: StevenKal Date: Thu, 4 Nov 2021 04:30:20 +0100 Subject: [PATCH 12/13] Update CSPlayer.cpp Changes: Update function "CCSPlayer::RemovePlayerItemEx" in order to be "more logic", and support possible blocking of "CBasePlayer::RemovePlayerItem" via modules/plugins (just like they are sometimes used to block "AddPlayerItem", the reverse case should be supported properly...), then force BP ammo removal for exhaustible weapons (granadas), to avoid problems when buying (like the message "You can not carry anymore!" while you no longer have the item, etc.).. --- regamedll/dlls/API/CSPlayer.cpp | 39 +++++++++++++++++---------------- 1 file changed, 20 insertions(+), 19 deletions(-) diff --git a/regamedll/dlls/API/CSPlayer.cpp b/regamedll/dlls/API/CSPlayer.cpp index 8173b44a8..dd5dda750 100644 --- a/regamedll/dlls/API/CSPlayer.cpp +++ b/regamedll/dlls/API/CSPlayer.cpp @@ -205,7 +205,6 @@ EXT_FUNC bool CCSPlayer::RemovePlayerItemEx(const char* pszItemName, bool bRemov return true; } - else if (FStrEq(pszItemName, "weapon_shield")) { return RemoveShield(); @@ -214,33 +213,35 @@ EXT_FUNC bool CCSPlayer::RemovePlayerItemEx(const char* pszItemName, bool bRemov auto pItem = GetItemByName(pszItemName); if (pItem) { - if (FClassnameIs(pItem->pev, "weapon_c4")) { - pPlayer->m_bHasC4 = false; - pPlayer->pev->body = 0; - pPlayer->SetBombIcon(FALSE); - pPlayer->SetProgressBarTime(0); - } - - if (pItem->IsWeapon()) - { - if (pItem == pPlayer->m_pActiveItem) { - ((CBasePlayerWeapon *)pItem)->RetireWeapon(); - } - - if (bRemoveAmmo) { - pPlayer->m_rgAmmo[ pItem->PrimaryAmmoIndex() ] = 0; - } - } + CBasePlayerItem *pActiveItem = pPlayer->m_pActiveItem; if (pPlayer->RemovePlayerItem(pItem)) { pPlayer->pev->weapons &= ~(1 << pItem->m_iId); - // No more weapon + // No more weapon. if ((pPlayer->pev->weapons & ~(1 << WEAPON_SUIT)) == 0) { pPlayer->m_iHideHUD |= HIDEHUD_WEAPONS; } pItem->Kill(); + if (pItem->IsWeapon()) { + if (pItem == pActiveItem) { + g_pGameRules->GetNextBestWeapon(pPlayer, pActiveItem); + } + + // Critical if we share BP ammo with others, a mode like <0|1|2> where "1" check if no other weapon use such ammo type would have been better. + if (bRemoveAmmo || (pItem->iFlags() & ITEM_FLAG_EXHAUSTIBLE)) { + pPlayer->m_rgAmmo[ pItem->PrimaryAmmoIndex() ] = 0; + } + } + + if (FClassnameIs(pItem->pev, "weapon_c4")) { + pPlayer->m_bHasC4 = false; + pPlayer->pev->body = 0; + pPlayer->SetBombIcon(FALSE); + pPlayer->SetProgressBarTime(0); + } + if (!pPlayer->m_rgpPlayerItems[PRIMARY_WEAPON_SLOT]) { pPlayer->m_bHasPrimary = false; } From 68193b2ed661400a98d3fd86ab5fd848fa8a3712 Mon Sep 17 00:00:00 2001 From: StevenKal Date: Thu, 17 Feb 2022 00:12:43 +0000 Subject: [PATCH 13/13] Update build.yml --- .github/workflows/build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 78a8b7d3f..ca1c0f7df 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -14,7 +14,7 @@ on: jobs: windows: name: 'Windows' - runs-on: windows-latest + runs-on: windows-2019 env: solution: 'msvc/ReGameDLL.sln'