diff options
Diffstat (limited to 'game/shared/tf2/plasmaprojectile.h')
| -rw-r--r-- | game/shared/tf2/plasmaprojectile.h | 245 |
1 files changed, 245 insertions, 0 deletions
diff --git a/game/shared/tf2/plasmaprojectile.h b/game/shared/tf2/plasmaprojectile.h new file mode 100644 index 0000000..13427e6 --- /dev/null +++ b/game/shared/tf2/plasmaprojectile.h @@ -0,0 +1,245 @@ +//========= 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 |