Modified source engine (2017) developed by valve and leaked in 2020. Not for commercial purporses
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

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