You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
164 lines
4.9 KiB
164 lines
4.9 KiB
5 years ago
|
//========= 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();
|
||
|
}
|