Fix and optimize custom CBaseCombatCharacter glow effects in TF2

This commit is contained in:
ALLEN-PC\acj30 2025-02-25 13:08:38 -06:00
parent 72a204ea31
commit 4849c2adc1
4 changed files with 61 additions and 12 deletions

View File

@ -35,7 +35,7 @@ C_BaseCombatCharacter::C_BaseCombatCharacter()
m_bGlowEnabled = false; m_bGlowEnabled = false;
m_bOldGlowEnabled = false; m_bOldGlowEnabled = false;
m_bClientSideGlowEnabled = false; m_bClientSideGlowEnabled = false;
m_GlowColor.Init( 0.76f, 0.76f, 0.76f ); m_GlowColor.Init( 0.0f, 0.0f, 0.0f );
m_OldGlowColor = m_GlowColor; m_OldGlowColor = m_GlowColor;
m_GlowAlpha = 1.0f; m_GlowAlpha = 1.0f;
m_OldGlowAlpha = 1.0f; m_OldGlowAlpha = 1.0f;
@ -113,13 +113,22 @@ void C_BaseCombatCharacter::DoMuzzleFlash()
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// Purpose: // Purpose:
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
void C_BaseCombatCharacter::GetGlowEffectColor( float *r, float *g, float *b, float *a ) void C_BaseCombatCharacter::GetGlowEffectColor( float *r, float *g, float *b )
{
*r = 0.76f;
*g = 0.76f;
*b = 0.76f;
}
//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void C_BaseCombatCharacter::GetCustomGlowEffectColor( float *r, float *g, float *b, float *a )
{ {
*r = m_GlowColor.x; *r = m_GlowColor.x;
*g = m_GlowColor.y; *g = m_GlowColor.y;
*b = m_GlowColor.z; *b = m_GlowColor.z;
if (a) *a = m_GlowAlpha;
*a = m_GlowAlpha;
} }
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@ -153,7 +162,16 @@ void C_BaseCombatCharacter::UpdateGlowEffect( void )
if ( m_bGlowEnabled || m_bClientSideGlowEnabled ) if ( m_bGlowEnabled || m_bClientSideGlowEnabled )
{ {
float r, g, b, a; float r, g, b, a;
GetGlowEffectColor( &r, &g, &b, &a );
if ( IsServerSideGlowEnabled() && IsCustomGlowColor() )
{
GetCustomGlowEffectColor( &r, &g, &b, &a );
}
else
{
GetGlowEffectColor( &r, &g, &b );
a = 1.0f;
}
m_pGlowEffect = new CGlowObject( this, Vector( r, g, b ), a, true ); m_pGlowEffect = new CGlowObject( this, Vector( r, g, b ), a, true );
} }
@ -179,6 +197,12 @@ BEGIN_RECV_TABLE_NOBASE( C_BaseCombatCharacter, DT_BCCLocalPlayerExclusive )
RecvPropTime( RECVINFO( m_flNextAttack ) ), RecvPropTime( RECVINFO( m_flNextAttack ) ),
END_RECV_TABLE(); END_RECV_TABLE();
#ifdef GLOWS_ENABLE
BEGIN_RECV_TABLE_NOBASE( C_BaseCombatCharacter, DT_BCCGlowData )
RecvPropVector( RECVINFO( m_GlowColor ) ),
RecvPropFloat( RECVINFO( m_GlowAlpha ) ),
END_RECV_TABLE();
#endif
BEGIN_RECV_TABLE(C_BaseCombatCharacter, DT_BaseCombatCharacter) BEGIN_RECV_TABLE(C_BaseCombatCharacter, DT_BaseCombatCharacter)
RecvPropDataTable( "bcc_localdata", 0, 0, &REFERENCE_RECV_TABLE(DT_BCCLocalPlayerExclusive) ), RecvPropDataTable( "bcc_localdata", 0, 0, &REFERENCE_RECV_TABLE(DT_BCCLocalPlayerExclusive) ),
@ -186,8 +210,7 @@ BEGIN_RECV_TABLE(C_BaseCombatCharacter, DT_BaseCombatCharacter)
RecvPropArray3( RECVINFO_ARRAY(m_hMyWeapons), RecvPropEHandle( RECVINFO( m_hMyWeapons[0] ) ) ), RecvPropArray3( RECVINFO_ARRAY(m_hMyWeapons), RecvPropEHandle( RECVINFO( m_hMyWeapons[0] ) ) ),
#ifdef GLOWS_ENABLE #ifdef GLOWS_ENABLE
RecvPropBool( RECVINFO( m_bGlowEnabled ) ), RecvPropBool( RECVINFO( m_bGlowEnabled ) ),
RecvPropVector( RECVINFO( m_GlowColor ) ), RecvPropDataTable( "bcc_glowdata", 0, 0, &REFERENCE_RECV_TABLE( DT_BCCGlowData ) ),
RecvPropFloat( RECVINFO( m_GlowAlpha ) ),
#endif // GLOWS_ENABLE #endif // GLOWS_ENABLE
#ifdef INVASION_CLIENT_DLL #ifdef INVASION_CLIENT_DLL

View File

@ -99,12 +99,15 @@ public:
#ifdef GLOWS_ENABLE #ifdef GLOWS_ENABLE
CGlowObject *GetGlowObject( void ){ return m_pGlowEffect; } CGlowObject *GetGlowObject( void ){ return m_pGlowEffect; }
virtual void GetGlowEffectColor( float *r, float *g, float *b, float *a ); virtual void GetGlowEffectColor( float *r, float *g, float *b );
virtual void GetGlowEffectColor( float *r, float *g, float *b ) { GetGlowEffectColor( r, g, b, NULL ); } void GetCustomGlowEffectColor( float *r, float *g, float *b, float *a );
// void EnableGlowEffect( float r, float g, float b ); // void EnableGlowEffect( float r, float g, float b );
void SetClientSideGlowEnabled( bool bEnabled ){ m_bClientSideGlowEnabled = bEnabled; UpdateGlowEffect(); } void SetClientSideGlowEnabled( bool bEnabled ){ m_bClientSideGlowEnabled = bEnabled; UpdateGlowEffect(); }
bool IsClientSideGlowEnabled( void ){ return m_bClientSideGlowEnabled; } bool IsClientSideGlowEnabled( void ){ return m_bClientSideGlowEnabled; }
bool IsServerSideGlowEnabled( void ){ return m_bGlowEnabled; }
bool IsCustomGlowColor() { return !m_GlowColor.IsZero(); }
#endif // GLOWS_ENABLE #endif // GLOWS_ENABLE
#ifdef MAPBASE_VSCRIPT #ifdef MAPBASE_VSCRIPT

View File

@ -3741,7 +3741,9 @@ IMPLEMENT_CLIENTCLASS_DT( C_TFPlayer, DT_TFPlayer, CTFPlayer )
RecvPropBool( RECVINFO( m_bForcedSkin ) ), RecvPropBool( RECVINFO( m_bForcedSkin ) ),
RecvPropInt( RECVINFO( m_nForcedSkin ) ), RecvPropInt( RECVINFO( m_nForcedSkin ) ),
#ifndef MAPBASE // Already received by C_BaseCombatCharacter
RecvPropBool( RECVINFO( m_bGlowEnabled ) ), RecvPropBool( RECVINFO( m_bGlowEnabled ) ),
#endif
RecvPropDataTable("TFSendHealersDataTable", 0, 0, &REFERENCE_RECV_TABLE( DT_TFSendHealersDataTable ) ), RecvPropDataTable("TFSendHealersDataTable", 0, 0, &REFERENCE_RECV_TABLE( DT_TFSendHealersDataTable ) ),
RecvPropFloat( RECVINFO( m_flKartNextAvailableBoost ) ), RecvPropFloat( RECVINFO( m_flKartNextAvailableBoost ) ),

View File

@ -300,14 +300,35 @@ BEGIN_SEND_TABLE_NOBASE( CBaseCombatCharacter, DT_BCCLocalPlayerExclusive )
SendPropTime( SENDINFO( m_flNextAttack ) ), SendPropTime( SENDINFO( m_flNextAttack ) ),
END_SEND_TABLE(); END_SEND_TABLE();
#ifdef GLOWS_ENABLE
void *SendProxy_SendBaseCombatCharacterGlowDataTable( const SendProp *pProp, const void *pStruct, const void *pVarData, CSendProxyRecipients *pRecipients, int objectID )
{
// Only send if our glow is active
CBaseCombatCharacter *pBCC = ( CBaseCombatCharacter * )pStruct;
if ( pBCC != NULL)
{
if ( pBCC->IsGlowEffectActive() )
{
return (void *)pVarData;
}
}
return NULL;
}
REGISTER_SEND_PROXY_NON_MODIFIED_POINTER( SendProxy_SendBaseCombatCharacterGlowDataTable );
BEGIN_SEND_TABLE_NOBASE( CBaseCombatCharacter, DT_BCCGlowData )
SendPropVector( SENDINFO( m_GlowColor ), 8, 0, 0, 1 ),
SendPropFloat( SENDINFO( m_GlowAlpha ) ),
END_SEND_TABLE();
#endif
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// This table encodes the CBaseCombatCharacter // This table encodes the CBaseCombatCharacter
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
IMPLEMENT_SERVERCLASS_ST(CBaseCombatCharacter, DT_BaseCombatCharacter) IMPLEMENT_SERVERCLASS_ST(CBaseCombatCharacter, DT_BaseCombatCharacter)
#ifdef GLOWS_ENABLE #ifdef GLOWS_ENABLE
SendPropBool( SENDINFO( m_bGlowEnabled ) ), SendPropBool( SENDINFO( m_bGlowEnabled ) ),
SendPropVector( SENDINFO( m_GlowColor ), 8, 0, 0, 1 ), SendPropDataTable( "bcc_glowdata", 0, &REFERENCE_SEND_TABLE( DT_BCCGlowData ), SendProxy_SendBaseCombatCharacterGlowDataTable ),
SendPropFloat( SENDINFO( m_GlowAlpha ) ),
#endif // GLOWS_ENABLE #endif // GLOWS_ENABLE
// Data that only gets sent to the local player. // Data that only gets sent to the local player.
SendPropDataTable( "bcc_localdata", 0, &REFERENCE_SEND_TABLE(DT_BCCLocalPlayerExclusive), SendProxy_SendBaseCombatCharacterLocalDataTable ), SendPropDataTable( "bcc_localdata", 0, &REFERENCE_SEND_TABLE(DT_BCCLocalPlayerExclusive), SendProxy_SendBaseCombatCharacterLocalDataTable ),
@ -893,7 +914,7 @@ CBaseCombatCharacter::CBaseCombatCharacter( void )
#ifdef GLOWS_ENABLE #ifdef GLOWS_ENABLE
m_bGlowEnabled.Set( false ); m_bGlowEnabled.Set( false );
m_GlowColor.GetForModify().Init( 0.76f, 0.76f, 0.76f ); m_GlowColor.GetForModify().Init( 0.0f, 0.0f, 0.0f );
m_GlowAlpha.Set(1.0f); m_GlowAlpha.Set(1.0f);
#endif // GLOWS_ENABLE #endif // GLOWS_ENABLE
} }