Skip to content

Commit

Permalink
Add E:Z2 parameters to protagonist system
Browse files Browse the repository at this point in the history
  • Loading branch information
Blixibon committed Jan 31, 2025
1 parent 8bb477d commit 45748a3
Show file tree
Hide file tree
Showing 6 changed files with 140 additions and 12 deletions.
19 changes: 19 additions & 0 deletions sp/src/game/server/hl2/hl2_player.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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 ),
Expand Down Expand Up @@ -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 );

Expand Down Expand Up @@ -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)
Expand All @@ -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 );
Expand Down
2 changes: 2 additions & 0 deletions sp/src/game/server/hl2/hl2_player.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
16 changes: 5 additions & 11 deletions sp/src/game/shared/hl2/basehlcombatweapon_shared.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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:
//-----------------------------------------------------------------------------
Expand Down Expand Up @@ -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 );
}

Expand Down
1 change: 0 additions & 1 deletion sp/src/game/shared/hl2/basehlcombatweapon_shared.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
94 changes: 94 additions & 0 deletions sp/src/game/shared/mapbase/protagonist_system.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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
//----------------------------------------------------------------------------
Expand Down Expand Up @@ -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)
{
Expand Down Expand Up @@ -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 );
Expand Down Expand Up @@ -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)
Expand All @@ -515,6 +601,14 @@ const char *CProtagonistSystem::DoGetProtagonist_ViewModel( ProtagonistData_t &p
if (!FStrEq( pProtag.dictWpnData.GetElementName( i ), const_cast<CBaseCombatWeapon*>(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<const CBaseHLCombatWeapon*>(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;
Expand Down
20 changes: 20 additions & 0 deletions sp/src/game/shared/mapbase/protagonist_system.h
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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
Expand All @@ -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;
Expand All @@ -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

Expand Down

0 comments on commit 45748a3

Please sign in to comment.