Added gameinfo keyvalues for default hands models + code to hide custom hands on weapons which don't support them

This commit is contained in:
Blixibon
2022-03-08 19:25:55 -06:00
parent 2282aedfa6
commit dbb0ed6f46
3 changed files with 77 additions and 10 deletions

View File

@@ -290,12 +290,15 @@ void CBaseViewModel::AddEffects( int nEffects )
}
#ifdef MAPBASE
// Apply effect changes to any viewmodel children as well
// (fixes hand models)
for (CBaseEntity *pChild = FirstMoveChild(); pChild != NULL; pChild = pChild->NextMovePeer())
if (GetOwningWeapon() && GetOwningWeapon()->UsesHands())
{
if (pChild->GetClassname()[0] == 'h')
pChild->AddEffects( nEffects );
// If using hands, apply effect changes to any viewmodel children as well
// (fixes hand models)
for (CBaseEntity *pChild = FirstMoveChild(); pChild != NULL; pChild = pChild->NextMovePeer())
{
if (pChild->GetClassname()[0] == 'h')
pChild->AddEffects( nEffects );
}
}
#endif
@@ -313,12 +316,15 @@ void CBaseViewModel::RemoveEffects( int nEffects )
}
#ifdef MAPBASE
// Apply effect changes to any viewmodel children as well
// (fixes hand models)
for (CBaseEntity *pChild = FirstMoveChild(); pChild != NULL; pChild = pChild->NextMovePeer())
if (GetOwningWeapon() && GetOwningWeapon()->UsesHands())
{
if (pChild->GetClassname()[0] == 'h')
pChild->RemoveEffects( nEffects );
// If using hands, apply effect changes to any viewmodel children as well
// (fixes hand models)
for (CBaseEntity *pChild = FirstMoveChild(); pChild != NULL; pChild = pChild->NextMovePeer())
{
if (pChild->GetClassname()[0] == 'h')
pChild->RemoveEffects( nEffects );
}
}
#endif
@@ -359,6 +365,18 @@ void CBaseViewModel::SetWeaponModel( const char *modelname, CBaseCombatWeapon *w
SetControlPanelsActive( showControlPanels );
}
#endif
#ifdef MAPBASE
// If our owning weapon doesn't support hands, disable the hands viewmodel(s)
bool bSupportsHands = weapon->UsesHands();
for (CBaseEntity *pChild = FirstMoveChild(); pChild != NULL; pChild = pChild->NextMovePeer())
{
if (pChild->GetClassname()[0] == 'h')
{
bSupportsHands ? pChild->RemoveEffects( EF_NODRAW ) : pChild->AddEffects( EF_NODRAW );
}
}
#endif
}
//-----------------------------------------------------------------------------
@@ -754,7 +772,13 @@ class CHandViewModel : public CBaseViewModel
DECLARE_CLASS( CHandViewModel, CBaseViewModel );
public:
DECLARE_NETWORKCLASS();
CBaseViewModel *GetVMOwner();
CBaseCombatWeapon *GetOwningWeapon( void );
private:
CHandle<CBaseViewModel> m_hVMOwner;
};
LINK_ENTITY_TO_CLASS(hand_viewmodel, CHandViewModel);
@@ -770,4 +794,26 @@ BEGIN_NETWORK_TABLE(CHandViewModel, DT_HandViewModel)
RecvPropInt(RECVINFO_NAME(m_hNetworkMoveParent, moveparent), 0, RecvProxy_IntToMoveParent),
#endif
END_NETWORK_TABLE()
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
CBaseViewModel *CHandViewModel::GetVMOwner()
{
if (!m_hVMOwner)
m_hVMOwner = assert_cast<CBaseViewModel*>(GetMoveParent());
return m_hVMOwner;
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
CBaseCombatWeapon *CHandViewModel::GetOwningWeapon()
{
CBaseViewModel *pVM = GetVMOwner();
if (pVM)
return pVM->GetOwningWeapon();
else
return NULL;
}
#endif

View File

@@ -86,6 +86,10 @@ char g_iszGameName[128];
// Default player configuration
char g_szDefaultPlayerModel[MAX_PATH];
bool g_bDefaultPlayerDrawExternally;
char g_szDefaultHandsModel[MAX_PATH];
int g_iDefaultHandsSkin;
int g_iDefaultHandsBody;
#endif
enum
@@ -226,6 +230,10 @@ public:
#ifdef GAME_DLL
Q_strncpy( g_szDefaultPlayerModel, gameinfo->GetString( "player_default_model", "models/player.mdl" ), sizeof( g_szDefaultPlayerModel ) );
g_bDefaultPlayerDrawExternally = gameinfo->GetBool( "player_default_draw_externally", false );
Q_strncpy( g_szDefaultHandsModel, gameinfo->GetString( "player_default_hands", "models/weapons/v_hands.mdl" ), sizeof( g_szDefaultHandsModel ) );
g_iDefaultHandsSkin = gameinfo->GetInt( "player_default_hands_skin", 0 );
g_iDefaultHandsBody = gameinfo->GetInt( "player_default_hands_body", 0 );
#endif
}
gameinfo->deleteThis();