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.
146 lines
4.6 KiB
146 lines
4.6 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $NoKeywords: $ |
|
//=============================================================================// |
|
|
|
#ifndef TF_SHIELD_H |
|
#define TF_SHIELD_H |
|
|
|
#ifdef _WIN32 |
|
#pragma once |
|
#endif |
|
|
|
#include "baseentity.h" |
|
#include "utlvector.h" |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// forward declarations |
|
//----------------------------------------------------------------------------- |
|
class Vector; |
|
class CGameTrace; |
|
typedef CGameTrace trace_t; |
|
struct edict_t; |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Base class for shield entities |
|
//----------------------------------------------------------------------------- |
|
class CShield : public CBaseEntity |
|
{ |
|
public: |
|
DECLARE_CLASS( CShield, CBaseEntity ); |
|
DECLARE_SERVERCLASS(); |
|
|
|
CShield(); |
|
~CShield(); |
|
|
|
public: |
|
void Precache(); |
|
void Spawn( void ); |
|
|
|
virtual void Think( void ); |
|
|
|
// Sets the desired center direction |
|
virtual void SetCenterAngles( const QAngle &angles ) {} |
|
virtual void SetAlwaysOrient( bool bOrient ) {} |
|
virtual bool IsAlwaysOrienting( ) { return false; } |
|
|
|
// Used by the mobile shield. |
|
|
|
// Change the angular spring constant. This affects how fast the shield rotates to face the angles |
|
// given in SetAngles. Higher numbers are more responsive, but if you go too high (around 40), it will |
|
// jump past the specified angles and wiggle a little bit. |
|
virtual void SetAngularSpringConstant( float flConstant ) {} |
|
|
|
// Move the shield out a certain amount. |
|
virtual void SetFrontDistance( float flDistance ) {} |
|
|
|
// Called when we hit something that we deflect... |
|
void RegisterDeflection(const Vector& vecDir, int bitsDamageType, trace_t *ptr); |
|
|
|
// Called when we hit something that we let through... |
|
void RegisterPassThru(const Vector& vecDir, int bitsDamageType, trace_t *ptr); |
|
|
|
// Activates/deactivates a shield for collision purposes |
|
void ActivateCollisions( bool activate ); |
|
|
|
// Does this shield protect from a particular damage type? |
|
float ProtectionAmount( int weaponType ) const; |
|
|
|
// Deactivates all shields of players on a particular team |
|
// If you don't specify a team, it'll affect all shields |
|
static void ActivateShields( bool activate, int team = -1 ); |
|
|
|
// For collision testing |
|
bool TestCollision( const Ray_t& ray, unsigned int mask, trace_t& trace ); |
|
|
|
// Called when the shield has moved |
|
virtual void ShieldMoved() {} |
|
|
|
// Called when the shield is EMPed (or de-EMPed) |
|
virtual void SetEMPed( bool isEmped ); |
|
|
|
// Indicates the visual center of the shape, may not be the actual center |
|
// (best example is the dome: it projects from a point which is not |
|
// at the center of the hemisphere). |
|
virtual void SetGeometryOffset( const Vector& vector ) {}; |
|
|
|
// Shield power & recharging |
|
void SetupRecharge( float flPower, float flDelay, float flAmount, float flTickTime ); |
|
float GetPower( void ) { return m_flPower; } |
|
void SetPower( float flPower ); |
|
// Make the shield recharge it's health |
|
void ShieldRechargeThink( void ); |
|
|
|
// Is this ray blocked by any shields? |
|
static bool IsBlockedByShields( const Vector& src, const Vector& end ); |
|
|
|
virtual void SetOwnerEntity( CBaseEntity *pOwner ); |
|
|
|
virtual void SetThetaPhi( float flTheta, float flPhi ) { } |
|
virtual void SetAttachmentIndex( int nAttachmentIndex ) {} |
|
|
|
protected: |
|
// |
|
// derived classes must implement these |
|
// |
|
virtual int Width() { return 0; } |
|
virtual int Height() { return 0; } |
|
virtual bool IsPanelActive( int x, int y ) { return true; } |
|
virtual const Vector& GetPoint( int x, int y ) { return vec3_origin; } |
|
bool IsEMPed() const { return m_bIsEMPed; } |
|
|
|
float m_flPower; |
|
float m_flMaxPower; |
|
CNetworkVar( float, m_flPowerLevel ); // m_flPower mapped to 0->1 range for networking |
|
float m_flRechargeDelay; |
|
float m_flRechargeAmount; |
|
float m_flRechargeTime; |
|
float m_flNextRechargeTime; |
|
|
|
private: |
|
int m_iBuckshotHitsThisFrame; |
|
float m_flLastProbeTime; |
|
CNetworkVar( bool, m_bIsEMPed ); |
|
CNetworkVar( int, m_nOwningPlayerIndex ); |
|
|
|
// List of all active shields |
|
static CUtlVector< CShield* > s_Shields; |
|
}; |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Class factory methods to create the various versions of the shield |
|
//----------------------------------------------------------------------------- |
|
CShield* CreateMobileShield( CBaseEntity *owner, float flFrontDistance = 0 ); |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Returns true if the entity is a shield |
|
//----------------------------------------------------------------------------- |
|
bool IsShield( CBaseEntity *pEnt ); |
|
|
|
#endif // TF_SHIELD_H
|
|
|