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.
245 lines
6.8 KiB
245 lines
6.8 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $NoKeywords: $ |
|
//=============================================================================// |
|
|
|
#ifndef PLASMAPROJECTILE_H |
|
#define PLASMAPROJECTILE_H |
|
#ifdef _WIN32 |
|
#pragma once |
|
#endif |
|
|
|
#include "predictable_entity.h" |
|
|
|
#include "baseparticleentity.h" |
|
#include "plasmaprojectile_shared.h" |
|
|
|
#if !defined( CLIENT_DLL ) |
|
#include "iscorer.h" |
|
#else |
|
#include "particle_prototype.h" |
|
#include "particles_simple.h" |
|
#include "particle_util.h" |
|
#include "c_baseplayer.h" |
|
#include "fx_sparks.h" |
|
#endif |
|
|
|
#if defined( CLIENT_DLL ) |
|
#define CBasePlasmaProjectile C_BasePlasmaProjectile |
|
#endif |
|
|
|
#define MAX_HISTORY 5 |
|
#define GUIDED_FADE_TIME 0.25f |
|
#define GUIDED_WIDTH 3 |
|
|
|
struct PositionHistory_t |
|
{ |
|
DECLARE_PREDICTABLE(); |
|
|
|
Vector m_Position; |
|
float m_Time; |
|
}; |
|
|
|
// ------------------------------------------------------------------------ // |
|
// CBasePlasmaProjectile |
|
// ------------------------------------------------------------------------ // |
|
class CBasePlasmaProjectile : public CBaseParticleEntity |
|
#if !defined( CLIENT_DLL ) |
|
, public IScorer |
|
#endif |
|
{ |
|
DECLARE_CLASS( CBasePlasmaProjectile, CBaseParticleEntity ); |
|
public: |
|
CBasePlasmaProjectile(); |
|
~CBasePlasmaProjectile(); |
|
|
|
DECLARE_PREDICTABLE(); |
|
DECLARE_NETWORKCLASS(); |
|
|
|
#if !defined( CLIENT_DLL ) |
|
DECLARE_DATADESC(); |
|
#endif |
|
|
|
virtual bool ProjectileHitShield( CBaseEntity *pOther, trace_t& tr ); |
|
virtual void HandleShieldImpact( CBaseEntity *pOther, trace_t& tr ); |
|
|
|
virtual void Spawn( void ); |
|
virtual void Precache( void ); |
|
virtual void Activate( void ); |
|
|
|
virtual void MissileTouch( CBaseEntity *pOther ); |
|
virtual float GetDamage( void ); |
|
virtual void SetDamage( float flDamage ); |
|
virtual void SetMaxRange( float flRange ); |
|
virtual void SetExplosive( float flRadius ); |
|
virtual void PerformCustomPhysics( Vector *pNewPosition, Vector *pNewVelocity, QAngle *pNewAngles, QAngle *pNewAngVelocity ); |
|
|
|
// Purpose: Returns the type of damage that this entity inflicts. |
|
int GetDamageType() const |
|
{ |
|
return m_DamageType; |
|
} |
|
|
|
virtual float GetSize( void ) { return 6.0; }; |
|
|
|
// FIXME!!!! Override the think of the baseparticle Think functions |
|
virtual void Think( void ) { CBaseEntity::Think(); } |
|
|
|
void SetupProjectile( const Vector &vecOrigin, const Vector &vecForward, int damageType, CBaseEntity *pOwner = NULL ); |
|
static CBasePlasmaProjectile *Create( const Vector &vecOrigin, const Vector &vecForward, int damageType, CBaseEntity *pOwner ); |
|
static CBasePlasmaProjectile *CreatePredicted( const Vector &vecOrigin, const Vector &vecForward, const Vector& gunOffset, int damageType, CBasePlayer *pOwner ); |
|
|
|
void RecalculatePositions( Vector *pNewPosition, Vector *pNewVelocity, QAngle *pNewAngles, QAngle *pNewAngVelocity ); |
|
|
|
// IScorer |
|
public: |
|
// Return the entity that should receive the score |
|
virtual CBasePlayer *GetScorer( void ); |
|
// Return the entity that should get assistance credit |
|
virtual CBasePlayer *GetAssistant( void ) { return NULL; }; |
|
|
|
protected: |
|
void Detonate( void ); |
|
|
|
// A derived class should return true here so that weapon sounds, etc, can |
|
// apply the proper filter |
|
virtual bool IsPredicted( void ) const |
|
{ |
|
return true; |
|
} |
|
|
|
#if defined( CLIENT_DLL ) |
|
virtual bool ShouldPredict( void ) |
|
{ |
|
if ( GetOwnerEntity() && |
|
GetOwnerEntity() == C_BasePlayer::GetLocalPlayer() ) |
|
return true; |
|
|
|
return BaseClass::ShouldPredict(); |
|
} |
|
|
|
virtual void OnDataChanged(DataUpdateType_t updateType); |
|
virtual void Start(CParticleMgr *pParticleMgr, IPrototypeArgAccess *pArgs); |
|
virtual bool SimulateAndRender(Particle *pParticle, ParticleDraw *pDraw, float &sortKey); |
|
|
|
// Add the position to the history |
|
void AddPositionToHistory( const Vector& org, float flSimTime ); |
|
void ResetPositionHistories( const Vector& org ); |
|
// Adjustments for shots straight out of local player's eyes |
|
void RemapPosition( Vector &vecStart, float curtime, Vector& outpos ); |
|
|
|
// Scale |
|
virtual float UpdateScale( SimpleParticle *pParticle, float timeDelta ) |
|
{ |
|
return (float)pParticle->m_uchStartSize + RandomInt( -2,2 ); |
|
} |
|
|
|
// Alpha |
|
virtual float UpdateAlpha( SimpleParticle *pParticle, float timeDelta ) |
|
{ |
|
return (pParticle->m_uchStartAlpha + RandomInt( -50, 0 ) ) / 255.0f; |
|
} |
|
virtual float UpdateRoll( SimpleParticle *pParticle, float timeDelta ) |
|
{ |
|
pParticle->m_flRoll += pParticle->m_flRollDelta * timeDelta; |
|
|
|
return pParticle->m_flRoll; |
|
} |
|
virtual Vector UpdateColor( SimpleParticle *pParticle, float timeDelta ) |
|
{ |
|
static Vector cColor; |
|
|
|
cColor[0] = pParticle->m_uchColor[0] / 255.0f; |
|
cColor[1] = pParticle->m_uchColor[1] / 255.0f; |
|
cColor[2] = pParticle->m_uchColor[2] / 255.0f; |
|
|
|
return cColor; |
|
} |
|
|
|
// Should this object cast shadows? |
|
virtual ShadowType_t ShadowCastType() { return SHADOWS_NONE; } |
|
|
|
virtual void ClientThink( void ); |
|
virtual bool OnPredictedEntityRemove( bool isbeingremoved, C_BaseEntity *predicted ); |
|
|
|
protected: |
|
SimpleParticle *m_pHeadParticle; |
|
TrailParticle *m_pTrailParticle; |
|
CParticleMgr *m_pParticleMgr; |
|
float m_flNextSparkEffect; |
|
#endif |
|
public: |
|
EHANDLE m_hOwner; |
|
|
|
protected: |
|
CNetworkVarEmbedded( CPlasmaProjectileShared, m_Shared ); |
|
|
|
Vector m_vecGunOriginOffset; |
|
|
|
CNetworkVar( float, m_flPower ); |
|
|
|
// Explosive radius |
|
float m_flExplosiveRadius; |
|
|
|
// Maximum range |
|
float m_flMaxRange; |
|
|
|
float m_flDamage; |
|
int m_DamageType; |
|
|
|
Vector m_vecTargetOffset; |
|
|
|
PositionHistory_t m_pPreviousPositions[MAX_HISTORY]; |
|
|
|
private: |
|
CBasePlasmaProjectile( const CBasePlasmaProjectile & ); |
|
}; |
|
|
|
#if defined( CLIENT_DLL ) |
|
#define CPowerPlasmaProjectile C_PowerPlasmaProjectile |
|
#endif |
|
|
|
// ------------------------------------------------------------------------ // |
|
// Plasma projectile that has a concept of variable power |
|
// ------------------------------------------------------------------------ // |
|
class CPowerPlasmaProjectile : public CBasePlasmaProjectile |
|
{ |
|
DECLARE_CLASS( CPowerPlasmaProjectile, CBasePlasmaProjectile ); |
|
public: |
|
DECLARE_NETWORKCLASS(); |
|
DECLARE_PREDICTABLE(); |
|
|
|
CPowerPlasmaProjectile(); |
|
|
|
void SetPower( float flPower ) { m_flPower = flPower; }; |
|
static CPowerPlasmaProjectile* Create( const Vector &vecOrigin, const Vector &vecForward, int damageType, CBaseEntity *pOwner ); |
|
static CPowerPlasmaProjectile* CreatePredicted( const Vector &vecOrigin, const Vector &vecForward, const Vector& gunOffset, int damageType, CBasePlayer *pOwner ); |
|
|
|
virtual float GetSize( void ); |
|
|
|
// A derived class should return true here so that weapon sounds, etc, can |
|
// apply the proper filter |
|
virtual bool IsPredicted( void ) const |
|
{ |
|
return true; |
|
} |
|
|
|
#if defined( CLIENT_DLL ) |
|
virtual bool ShouldPredict( void ) |
|
{ |
|
if ( GetOwnerEntity() && |
|
GetOwnerEntity() == C_BasePlayer::GetLocalPlayer() ) |
|
return true; |
|
|
|
return BaseClass::ShouldPredict(); |
|
} |
|
#endif |
|
|
|
private: |
|
CPowerPlasmaProjectile( const CPowerPlasmaProjectile & ); |
|
|
|
}; |
|
|
|
#endif // PLASMAPROJECTILE_H
|
|
|