From 53d26a7ea56989266428be5e01b635ee8dda1be0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Francisco=20Mu=C3=B1oz?= Date: Wed, 23 Aug 2023 10:27:35 -0400 Subject: [PATCH] `API`: CSPlayerWeapon integration + new members and functions (#850) - Member name changed to m_iStateSecondaryAttack - Member type changed to uint8_t which has same size of bool but allows more values than true or false (this wont break API compatibility) - Moved logic inside HasSecondaryAttack to correctly alter function return based on m_iStateSecondaryAttack, which can be (0) no value / null (1) set (2) block -Removed logic in CBasePlayerWeapon::Spawn that caches the return value of HasSecondaryAttack, as this can only be overridden when set, rather than always * Improve API compatibility --- regamedll/CMakeLists.txt | 1 + regamedll/dlls/API/CSPlayerWeapon.cpp | 54 +++++++++++++++++++ regamedll/dlls/weapons.cpp | 20 ++++--- regamedll/msvc/ReGameDLL.vcxproj | 4 ++ regamedll/msvc/ReGameDLL.vcxproj.filters | 3 ++ .../public/regamedll/API/CSPlayerWeapon.h | 18 ++++++- 6 files changed, 91 insertions(+), 9 deletions(-) create mode 100644 regamedll/dlls/API/CSPlayerWeapon.cpp diff --git a/regamedll/CMakeLists.txt b/regamedll/CMakeLists.txt index 1b329ca95..735d54fc8 100644 --- a/regamedll/CMakeLists.txt +++ b/regamedll/CMakeLists.txt @@ -226,6 +226,7 @@ set(GAMEDLL_SRCS "dlls/API/CSEntity.cpp" "dlls/API/CSPlayer.cpp" "dlls/API/CSPlayerItem.cpp" + "dlls/API/CSPlayerWeapon.cpp" "dlls/addons/item_airbox.cpp" "dlls/addons/point_command.cpp" "dlls/addons/trigger_random.cpp" diff --git a/regamedll/dlls/API/CSPlayerWeapon.cpp b/regamedll/dlls/API/CSPlayerWeapon.cpp new file mode 100644 index 000000000..51a5fd806 --- /dev/null +++ b/regamedll/dlls/API/CSPlayerWeapon.cpp @@ -0,0 +1,54 @@ +/* +* +* This program is free software; you can redistribute it and/or modify it +* under the terms of the GNU General Public License as published by the +* Free Software Foundation; either version 2 of the License, or (at +* your option) any later version. +* +* This program is distributed in the hope that it will be useful, but +* WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +* General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with this program; if not, write to the Free Software Foundation, +* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +* +* In addition, as a special exception, the author gives permission to +* link the code of this program with the Half-Life Game Engine ("HL +* Engine") and Modified Game Libraries ("MODs") developed by Valve, +* L.L.C ("Valve"). You must obey the GNU General Public License in all +* respects for all of the code used other than the HL Engine and MODs +* from Valve. If you modify this file, you may extend this exception +* to your version of the file, but you are not obligated to do so. If +* you do not wish to do so, delete this exception statement from your +* version. +* +*/ + +#include "precompiled.h" + +EXT_FUNC BOOL CCSPlayerWeapon::DefaultDeploy(char *szViewModel, char *szWeaponModel, int iAnim, char *szAnimExt, int skiplocal) +{ + return BasePlayerWeapon()->DefaultDeploy(szViewModel, szWeaponModel, iAnim, szAnimExt, skiplocal); +} + +EXT_FUNC int CCSPlayerWeapon::DefaultReload(int iClipSize, int iAnim, float fDelay) +{ + return BasePlayerWeapon()->DefaultReload(iClipSize, iAnim, fDelay); +} + +EXT_FUNC bool CCSPlayerWeapon::DefaultShotgunReload(int iAnim, int iStartAnim, float fDelay, float fStartDelay, const char *pszReloadSound1, const char *pszReloadSound2) +{ + return BasePlayerWeapon()->DefaultShotgunReload(iAnim, iStartAnim, fDelay, fStartDelay, pszReloadSound1, pszReloadSound2); +} + +EXT_FUNC void CCSPlayerWeapon::KickBack(float up_base, float lateral_base, float up_modifier, float lateral_modifier, float up_max, float lateral_max, int direction_change) +{ + BasePlayerWeapon()->KickBack(up_base, lateral_base, up_modifier, lateral_modifier, up_max, lateral_max, direction_change); +} + +EXT_FUNC void CCSPlayerWeapon::SendWeaponAnim(int iAnim, int skiplocal) +{ + BasePlayerWeapon()->SendWeaponAnim(iAnim, skiplocal); +} diff --git a/regamedll/dlls/weapons.cpp b/regamedll/dlls/weapons.cpp index ac9aaea90..e341b1b7e 100644 --- a/regamedll/dlls/weapons.cpp +++ b/regamedll/dlls/weapons.cpp @@ -814,17 +814,25 @@ BOOL CanAttack(float attack_time, float curtime, BOOL isPredicted) bool CBasePlayerWeapon::HasSecondaryAttack() { - if (m_pPlayer && m_pPlayer->HasShield()) +#ifdef REGAMEDLL_API + if (CSPlayerWeapon()->m_iStateSecondaryAttack != WEAPON_SECONDARY_ATTACK_NONE) { - return true; + switch (CSPlayerWeapon()->m_iStateSecondaryAttack) + { + case WEAPON_SECONDARY_ATTACK_SET: + return true; + case WEAPON_SECONDARY_ATTACK_BLOCK: + return false; + default: + break; + } } +#endif -#ifdef REGAMEDLL_API - if (CSPlayerWeapon()->m_bHasSecondaryAttack) + if (m_pPlayer && m_pPlayer->HasShield()) { return true; } -#endif switch (m_iId) { @@ -1195,8 +1203,6 @@ void CBasePlayerWeapon::Spawn() if (GetItemInfo(&info)) { CSPlayerItem()->SetItemInfo(&info); } - - CSPlayerWeapon()->m_bHasSecondaryAttack = HasSecondaryAttack(); #endif } diff --git a/regamedll/msvc/ReGameDLL.vcxproj b/regamedll/msvc/ReGameDLL.vcxproj index 6c43a5775..b3227cd45 100644 --- a/regamedll/msvc/ReGameDLL.vcxproj +++ b/regamedll/msvc/ReGameDLL.vcxproj @@ -46,6 +46,10 @@ + + + + diff --git a/regamedll/msvc/ReGameDLL.vcxproj.filters b/regamedll/msvc/ReGameDLL.vcxproj.filters index d8c27981d..3e9c67f15 100644 --- a/regamedll/msvc/ReGameDLL.vcxproj.filters +++ b/regamedll/msvc/ReGameDLL.vcxproj.filters @@ -540,6 +540,9 @@ dlls\API + + dlls\API + regamedll diff --git a/regamedll/public/regamedll/API/CSPlayerWeapon.h b/regamedll/public/regamedll/API/CSPlayerWeapon.h index 70317c931..22c020464 100644 --- a/regamedll/public/regamedll/API/CSPlayerWeapon.h +++ b/regamedll/public/regamedll/API/CSPlayerWeapon.h @@ -28,19 +28,32 @@ #pragma once +enum SecondaryAtkState : uint8_t +{ + WEAPON_SECONDARY_ATTACK_NONE = 0, + WEAPON_SECONDARY_ATTACK_SET, + WEAPON_SECONDARY_ATTACK_BLOCK +}; + class CBasePlayerWeapon; class CCSPlayerWeapon: public CCSPlayerItem { public: CCSPlayerWeapon() : - m_bHasSecondaryAttack(false) + m_iStateSecondaryAttack(WEAPON_SECONDARY_ATTACK_NONE) { } + virtual BOOL DefaultDeploy(char *szViewModel, char *szWeaponModel, int iAnim, char *szAnimExt, int skiplocal = 0); + virtual int DefaultReload(int iClipSize, int iAnim, float fDelay); + virtual bool DefaultShotgunReload(int iAnim, int iStartAnim, float fDelay, float fStartDelay, const char *pszReloadSound1 = nullptr, const char *pszReloadSound2 = nullptr); + virtual void KickBack(float up_base, float lateral_base, float up_modifier, float lateral_modifier, float up_max, float lateral_max, int direction_change); + virtual void SendWeaponAnim(int iAnim, int skiplocal = 0); + CBasePlayerWeapon *BasePlayerWeapon() const; public: - bool m_bHasSecondaryAttack; + SecondaryAtkState m_iStateSecondaryAttack; float m_flBaseDamage; }; @@ -49,3 +62,4 @@ inline CBasePlayerWeapon *CCSPlayerWeapon::BasePlayerWeapon() const { return reinterpret_cast(this->m_pContainingEntity); } +