//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: A clientside, visual only model that's positioned relative to players // //============================================================================= #include "cbase.h" #include "c_playerrelativemodel.h" //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- C_PlayerRelativeModel *C_PlayerRelativeModel::Create( const char *pszModelName, C_BaseEntity *pParent, Vector vecOffset, QAngle angleOffset, float flAnimSpeed, float flLifetime, int iFlags ) { C_PlayerRelativeModel *pFlash = new C_PlayerRelativeModel; if ( !pFlash ) return NULL; if ( !pFlash->Initialize( pszModelName, pParent, vecOffset, angleOffset, flAnimSpeed, flLifetime, iFlags ) ) return NULL; return pFlash; } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- bool C_PlayerRelativeModel::Initialize( const char *pszModelName, C_BaseEntity *pParent, Vector vecOffset, QAngle angleOffset, float flAnimSpeed, float flLifetime, int iFlags ) { AddEffects( EF_NORECEIVESHADOW | EF_NOSHADOW ); if ( InitializeAsClientEntity( pszModelName, RENDER_GROUP_OPAQUE_ENTITY ) == false ) { Release(); return false; } m_vecOffsetPos = vecOffset; m_angleOffset = angleOffset; SetParent( pParent, 0 ); SetLocalOrigin( vec3_origin ); SetLocalAngles( vec3_angle ); AddSolidFlags( FSOLID_NOT_SOLID ); SetLifetime( flLifetime ); SetNextClientThink( CLIENT_THINK_ALWAYS ); SetCycle( 0 ); m_qOffsetRotation = vec3_angle; m_flAnimSpeed = flAnimSpeed; m_iFlags = iFlags; return true; } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void C_PlayerRelativeModel::SetLifetime( float flLifetime ) { if ( flLifetime == PRM_PERMANENT ) { m_flExpiresAt = PRM_PERMANENT; } else { // Expire when the lifetime is up m_flExpiresAt = gpGlobals->curtime + flLifetime; } } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void C_PlayerRelativeModel::ClientThink( void ) { if ( !GetMoveParent() || (m_flExpiresAt != PRM_PERMANENT && gpGlobals->curtime > m_flExpiresAt) ) { Release(); return; } // Animate C_BaseEntity *pParent = GetMoveParent(); Vector out(0, 0, 0); if ( m_iFlags & PRM_SPIN_Z ) { m_qOffsetRotation += QAngle(0, gpGlobals->frametime * m_flAnimSpeed, 0); VectorRotate( m_vecOffsetPos, m_qOffsetRotation, out ); } SetAbsOrigin( pParent->GetAbsOrigin() + out ); SetAbsAngles( m_qOffsetRotation + m_angleOffset ); } //----------------------------------------------------------------------------- // C_MerasmusBombEffect //----------------------------------------------------------------------------- C_MerasmusBombEffect *C_MerasmusBombEffect::Create( const char *pszModelName, C_TFPlayer *pParent, Vector vecOffset, QAngle angleOffset, float flAnimSpeed, float flLifetime, int iFlags ) { C_MerasmusBombEffect *pFlash = new C_MerasmusBombEffect; if ( !pFlash ) return NULL; if ( !pFlash->Initialize( pszModelName, pParent, vecOffset, angleOffset, flAnimSpeed, flLifetime, iFlags ) ) return NULL; return pFlash; } //----------------------------------------------------------------------------- bool C_MerasmusBombEffect::Initialize( const char *pszModelName, C_TFPlayer *pParent, Vector vecOffset, QAngle angleOffset, float flAnimSpeed, float flLifetime, int iFlags ) { if ( !BaseClass::Initialize(pszModelName, pParent, vecOffset, angleOffset, flAnimSpeed, flLifetime, iFlags ) ) return false; // Create a particle effect const char *pszEffectName = "bombonomicon_spell_trail"; if ( m_pBombonomiconBeam ) { m_pBombonomiconBeam->StopEmission(); m_pBombonomiconBeam = NULL; } if ( m_pBombonomiconEffect ) { m_pBombonomiconEffect->StopEmission(); m_pBombonomiconEffect = NULL; } m_pBombonomiconBeam = ParticleProp()->Create( pszEffectName, PATTACH_ABSORIGIN_FOLLOW, INVALID_PARTICLE_ATTACHMENT, Vector(0,0,-10) ); if ( m_pBombonomiconBeam ) { ParticleProp()->AddControlPoint( m_pBombonomiconBeam, 1, pParent, PATTACH_POINT_FOLLOW, "head", Vector(0,0,0) ); } return true; } //----------------------------------------------------------------------------- void C_MerasmusBombEffect::ClientThink( void ) { if ( !GetMoveParent() || (m_flExpiresAt != PRM_PERMANENT && gpGlobals->curtime > m_flExpiresAt) ) { if ( m_pBombonomiconBeam ) { m_pBombonomiconBeam->StopEmission(); m_pBombonomiconBeam = NULL; } if ( m_pBombonomiconEffect ) { m_pBombonomiconEffect->StopEmission(); m_pBombonomiconEffect = NULL; } } BaseClass::ClientThink(); }