From 45748a363162a3d55c1c4f33185684d7b3ea6351 Mon Sep 17 00:00:00 2001 From: "ALLEN-PC\\acj30" Date: Fri, 31 Jan 2025 09:22:46 -0600 Subject: [PATCH] Add E:Z2 parameters to protagonist system --- sp/src/game/server/hl2/hl2_player.cpp | 19 ++++ sp/src/game/server/hl2/hl2_player.h | 2 + .../shared/hl2/basehlcombatweapon_shared.cpp | 16 +--- .../shared/hl2/basehlcombatweapon_shared.h | 1 - .../shared/mapbase/protagonist_system.cpp | 94 +++++++++++++++++++ .../game/shared/mapbase/protagonist_system.h | 20 ++++ 6 files changed, 140 insertions(+), 12 deletions(-) diff --git a/sp/src/game/server/hl2/hl2_player.cpp b/sp/src/game/server/hl2/hl2_player.cpp index 85545c298f..bd30d53068 100644 --- a/sp/src/game/server/hl2/hl2_player.cpp +++ b/sp/src/game/server/hl2/hl2_player.cpp @@ -632,6 +632,8 @@ BEGIN_DATADESC( CHL2_Player ) DEFINE_FIELD( m_flNextKickAttack , FIELD_TIME ), DEFINE_FIELD( m_bKickWeaponLowered, FIELD_BOOLEAN ), DEFINE_FIELD( m_LegModelName, FIELD_STRING ), + DEFINE_FIELD( m_nLegSkin, FIELD_INTEGER ), + DEFINE_FIELD( m_nLegBody, FIELD_INTEGER ), #endif DEFINE_FIELD( m_flTimeIgnoreFallDamage, FIELD_TIME ), @@ -5007,6 +5009,8 @@ void CHL2_Player::StartKickAnimation( void ) if ( vm ) { vm->SetWeaponModel( STRING( m_LegModelName ), NULL ); + vm->m_nSkin = m_nLegSkin; + vm->m_nBody = m_nLegBody; int idealSequence = vm->SelectWeightedSequence( ACT_VM_PRIMARYATTACK ); @@ -5329,6 +5333,12 @@ void CHL2_Player::ResetProtagonist() vm->m_nBody = 0; } +#ifdef EZ2 + m_LegModelName = AllocPooledString( sv_player_kick_default_modelname.GetString() ); + m_nLegSkin = 0; + m_nLegBody = 0; +#endif + // RemoveContext will automatically remove contexts by name, regardless of how values are specified const char *pszProtagContexts = g_ProtagonistSystem.GetProtagonist_ResponseContexts( this ); if (pszProtagContexts) @@ -5355,6 +5365,15 @@ void CHL2_Player::RefreshProtagonistData() m_nSkin = g_ProtagonistSystem.GetProtagonist_PlayerModelSkin( this ); m_nBody = g_ProtagonistSystem.GetProtagonist_PlayerModelBody( this ); +#ifdef EZ2 + const char *pszLegModel = g_ProtagonistSystem.GetProtagonist_LegModel( this ); + if (pszLegModel) + m_LegModelName = MAKE_STRING( pszLegModel ); + + m_nLegSkin = g_ProtagonistSystem.GetProtagonist_LegModelSkin( this ); + m_nLegBody = g_ProtagonistSystem.GetProtagonist_LegModelBody( this ); +#endif + const char *pszProtagContexts = g_ProtagonistSystem.GetProtagonist_ResponseContexts( this ); if (pszProtagContexts) AddContext( pszProtagContexts ); diff --git a/sp/src/game/server/hl2/hl2_player.h b/sp/src/game/server/hl2/hl2_player.h index 64da13e2af..b7b3205934 100644 --- a/sp/src/game/server/hl2/hl2_player.h +++ b/sp/src/game/server/hl2/hl2_player.h @@ -493,6 +493,8 @@ class CHL2_Player : public CBasePlayer bool m_bKickWeaponLowered; string_t m_LegModelName; + int m_nLegSkin; + int m_nLegBody; #endif // Aiming heuristics code diff --git a/sp/src/game/shared/hl2/basehlcombatweapon_shared.cpp b/sp/src/game/shared/hl2/basehlcombatweapon_shared.cpp index e5e59eb6e8..ca7b47b6ef 100644 --- a/sp/src/game/shared/hl2/basehlcombatweapon_shared.cpp +++ b/sp/src/game/shared/hl2/basehlcombatweapon_shared.cpp @@ -302,17 +302,6 @@ void CBaseHLCombatWeapon::ItemPostFrame( void ) BaseClass::ItemPostFrame(); } -//----------------------------------------------------------------------------- -// Purpose: -//----------------------------------------------------------------------------- -const char *CBaseHLCombatWeapon::GetViewModel( int viewmodelindex ) const -{ - if (GetLeftHandGun() && GetWpnData().szViewModelDual[0]) - return GetWpnData().szViewModelDual; - - return BaseClass::GetViewModel( viewmodelindex ); -} - //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- @@ -866,6 +855,11 @@ const char *CBaseHLCombatWeapon::GetViewModel( int viewmodelindex ) const return pszProtagVM; } +#ifdef EZ2 + if (GetLeftHandGun() && GetWpnData().szViewModelDual[0]) + return GetWpnData().szViewModelDual; +#endif + return BaseClass::GetViewModel( viewmodelindex ); } diff --git a/sp/src/game/shared/hl2/basehlcombatweapon_shared.h b/sp/src/game/shared/hl2/basehlcombatweapon_shared.h index ecfe77962a..fb69f51c45 100644 --- a/sp/src/game/shared/hl2/basehlcombatweapon_shared.h +++ b/sp/src/game/shared/hl2/basehlcombatweapon_shared.h @@ -65,7 +65,6 @@ class CBaseHLCombatWeapon : public CBaseCombatWeapon // Dual wielding // virtual void ItemPostFrame( void ); - virtual const char *GetViewModel( int viewmodelindex = 0 ) const; virtual CHudTexture const *GetSpriteActive( void ) const; virtual CHudTexture const *GetSpriteInactive( void ) const; diff --git a/sp/src/game/shared/mapbase/protagonist_system.cpp b/sp/src/game/shared/mapbase/protagonist_system.cpp index c22a20fab6..a3a2e1a1dd 100644 --- a/sp/src/game/shared/mapbase/protagonist_system.cpp +++ b/sp/src/game/shared/mapbase/protagonist_system.cpp @@ -11,6 +11,9 @@ #include "weapon_parse.h" #include "filesystem.h" #include "hl2_player_shared.h" +#ifdef EZ2 +#include "basehlcombatweapon_shared.h" +#endif CProtagonistSystem g_ProtagonistSystem; @@ -159,6 +162,31 @@ void CProtagonistSystem::LoadProtagonistFile( const char *pszFile ) } } +#ifdef EZ2 + //---------------------------------------------------------------------------- + // Leg + //---------------------------------------------------------------------------- + else if (V_strnicmp( pszSubKeyName, "leg", 3 ) == 0) + { + pszSubKeyName += 3; + if (!pszSubKeyName[0]) + { + // Model + pProtag->pszLegModel = AllocateString( pSubKey->GetString() ); + } + else if (FStrEq( pszSubKeyName, "_skin" )) + { + // Skin + pProtag->nLegSkin = pSubKey->GetInt(); + } + else if (FStrEq( pszSubKeyName, "_body" )) + { + // Bodygroup + pProtag->nLegBody = pSubKey->GetInt(); + } + } +#endif + //---------------------------------------------------------------------------- // Responses //---------------------------------------------------------------------------- @@ -197,6 +225,12 @@ void CProtagonistSystem::LoadProtagonistFile( const char *pszFile ) if (pszVM) pProtag->dictWpnData[i].pszVM = AllocateString( pszVM ); +#ifdef EZ2 + pszVM = pWeaponKey->GetString( "viewmodel_dual", NULL ); + if (pszVM) + pProtag->dictWpnData[i].pszDualVM = AllocateString( pszVM ); +#endif + const char *pszHandRig = pWeaponKey->GetString( "hand_rig", NULL ); if (pszHandRig) { @@ -361,6 +395,23 @@ int CProtagonistSystem::GetProtagonist_HandModelBody( const CBasePlayer *pPlayer GetProtagonistParam( DoGetProtagonist_HandModelBody, pWeapon ) } +#ifdef EZ2 +const char *CProtagonistSystem::GetProtagonist_LegModel( const CBasePlayer *pPlayer ) +{ + GetProtagonistParam( DoGetProtagonist_LegModel ) +} + +int CProtagonistSystem::GetProtagonist_LegModelSkin( const CBasePlayer *pPlayer ) +{ + GetProtagonistParam( DoGetProtagonist_LegModelSkin ) +} + +int CProtagonistSystem::GetProtagonist_LegModelBody( const CBasePlayer *pPlayer ) +{ + GetProtagonistParam( DoGetProtagonist_LegModelBody ) +} +#endif + const char *CProtagonistSystem::GetProtagonist_ResponseContexts( const CBasePlayer *pPlayer ) { ProtagonistData_t *pProtag = g_ProtagonistSystem.GetPlayerProtagonist( pPlayer ); @@ -494,6 +545,41 @@ int CProtagonistSystem::DoGetProtagonist_HandModelBody( ProtagonistData_t &pProt return NULL; } +#ifdef EZ2 +const char *CProtagonistSystem::DoGetProtagonist_LegModel( ProtagonistData_t &pProtag ) +{ + if (pProtag.pszLegModel != NULL) + return pProtag.pszLegModel; + + // Recursively search parent protagonists + GetProtagonistRecurse( DoGetProtagonist_LegModel ) + + return NULL; +} + +int CProtagonistSystem::DoGetProtagonist_LegModelSkin( ProtagonistData_t &pProtag ) +{ + if (pProtag.nLegSkin >= 0) + return pProtag.nLegSkin; + + // Recursively search parent protagonists + GetProtagonistRecurse( DoGetProtagonist_LegModelSkin ) + + return NULL; +} + +int CProtagonistSystem::DoGetProtagonist_LegModelBody( ProtagonistData_t &pProtag ) +{ + if (pProtag.nLegBody >= 0) + return pProtag.nLegBody; + + // Recursively search parent protagonists + GetProtagonistRecurse( DoGetProtagonist_LegModelBody ) + + return NULL; +} +#endif + void CProtagonistSystem::DoGetProtagonist_ResponseContexts( ProtagonistData_t &pProtag, char *pszContexts, int nContextsSize ) { if (pProtag.pszResponseContexts) @@ -515,6 +601,14 @@ const char *CProtagonistSystem::DoGetProtagonist_ViewModel( ProtagonistData_t &p if (!FStrEq( pProtag.dictWpnData.GetElementName( i ), const_cast(pWeapon)->GetClassname() )) continue; +#ifdef EZ2 + // Protagonist override code is currently handled in CBaseHLCombatWeapon, so a static cast is safe. + // Please change this if protagonist overrides are extended to other classes. + const CBaseHLCombatWeapon *pHLWeapon = assert_cast(pWeapon); + if (pHLWeapon && pHLWeapon->GetLeftHandGun() && pProtag.dictWpnData[i].pszDualVM) + return pProtag.dictWpnData[i].pszDualVM; +#endif + if (pProtag.dictWpnData[i].pszVM) return pProtag.dictWpnData[i].pszVM; break; diff --git a/sp/src/game/shared/mapbase/protagonist_system.h b/sp/src/game/shared/mapbase/protagonist_system.h index 4b73cc8057..eb873964a0 100644 --- a/sp/src/game/shared/mapbase/protagonist_system.h +++ b/sp/src/game/shared/mapbase/protagonist_system.h @@ -54,6 +54,11 @@ class CProtagonistSystem : public CAutoGameSystem const char *GetProtagonist_HandModel( const CBasePlayer *pPlayer, const CBaseCombatWeapon *pWeapon ); int GetProtagonist_HandModelSkin( const CBasePlayer *pPlayer, const CBaseCombatWeapon *pWeapon ); int GetProtagonist_HandModelBody( const CBasePlayer *pPlayer, const CBaseCombatWeapon *pWeapon ); +#ifdef EZ2 + const char *GetProtagonist_LegModel( const CBasePlayer *pPlayer ); + int GetProtagonist_LegModelSkin( const CBasePlayer *pPlayer ); + int GetProtagonist_LegModelBody( const CBasePlayer *pPlayer ); +#endif const char *GetProtagonist_ResponseContexts( const CBasePlayer *pPlayer ); #endif @@ -94,6 +99,13 @@ class CProtagonistSystem : public CAutoGameSystem int nHandSkin = -1; int nHandBody = -1; +#ifdef EZ2 + // Leg + const char *pszLegModel = NULL; + int nLegSkin = -1; + int nLegBody = -1; +#endif + // Responses const char *pszResponseContexts = NULL; #endif @@ -102,6 +114,9 @@ class CProtagonistSystem : public CAutoGameSystem struct WeaponDataOverride_t { const char *pszVM = NULL; +#ifdef EZ2 + const char *pszDualVM = NULL; +#endif bool bUsesHands = false; int nHandRig = 0; float flVMFOV = 0.0f; @@ -123,6 +138,11 @@ class CProtagonistSystem : public CAutoGameSystem const char *DoGetProtagonist_HandModel( ProtagonistData_t &pProtag, const CBaseCombatWeapon *pWeapon ); int DoGetProtagonist_HandModelSkin( ProtagonistData_t &pProtag, const CBaseCombatWeapon *pWeapon ); int DoGetProtagonist_HandModelBody( ProtagonistData_t &pProtag, const CBaseCombatWeapon *pWeapon ); +#ifdef EZ2 + const char *DoGetProtagonist_LegModel( ProtagonistData_t &pProtag ); + int DoGetProtagonist_LegModelSkin( ProtagonistData_t &pProtag ); + int DoGetProtagonist_LegModelBody( ProtagonistData_t &pProtag ); +#endif void DoGetProtagonist_ResponseContexts( ProtagonistData_t &pProtag, char *pszContexts, int nContextsSize ); #endif