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.
147 lines
4.6 KiB
147 lines
4.6 KiB
5 years ago
|
//========= 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
|