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.
199 lines
5.3 KiB
199 lines
5.3 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: Client's sheild entity |
|
// |
|
// $Workfile: $ |
|
// $Date: $ |
|
// $NoKeywords: $ |
|
//=============================================================================// |
|
|
|
#ifndef C_SHIELD_H |
|
#define C_SHIELD_H |
|
|
|
#ifdef _WIN32 |
|
#pragma once |
|
#endif |
|
|
|
#include "SplinePatch.h" |
|
|
|
//----------------------------------------------------------------------------- |
|
// Shield: |
|
//----------------------------------------------------------------------------- |
|
class C_Shield : public C_BaseEntity |
|
{ |
|
public: |
|
DECLARE_CLASS( C_Shield, C_BaseEntity ); |
|
DECLARE_CLIENTCLASS(); |
|
|
|
// constructor, destructor |
|
C_Shield(); |
|
~C_Shield(); |
|
|
|
// Inherited classes should call this in their constructor to indicate size... |
|
void InitShield( int w, int h, int subdivisions ); |
|
|
|
void OnDataChanged( DataUpdateType_t updateType ); |
|
int DrawModel( int flags ); |
|
void ReceiveMessage( int classID, bf_read &msg ); |
|
|
|
void CreateShieldDeflection( int hitgroup, const Vector &dir, bool partialBlock ); |
|
|
|
virtual bool ShouldDraw(); |
|
virtual bool IsTransparent() { return true; } |
|
virtual void SetAlwaysOrient( bool bOrient ) {} |
|
virtual bool IsAlwaysOrienting( ) { return false; } |
|
virtual void SetCenterAngles( const QAngle & ) {} |
|
virtual void SetAttachmentIndex( int nAttachmentIndex ) {} |
|
|
|
// returns the address of a variable that stores the material animation frame |
|
float GetTextureAnimationStartTime(); |
|
|
|
// Indicates that a texture animation has wrapped |
|
void TextureAnimationWrapped(); |
|
|
|
virtual bool ShouldCollide( int collisionGroup, int contentsMask ) const; |
|
|
|
// Collision detection |
|
// Activates/deactivates a shield for collision purposes |
|
void ActivateCollisions( bool activate ); |
|
|
|
// 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 ); |
|
virtual const Vector& GetPoint( int x, int y ) { return vec3_origin; } |
|
|
|
// For collision testing |
|
bool TestCollision( const Ray_t& ray, unsigned int mask, trace_t& trace ); |
|
|
|
// Called when we hit something that we deflect... |
|
void RegisterDeflection(const Vector& vecDir, int bitsDamageType, trace_t *ptr); |
|
|
|
float GetPowerLevel( void ) { return m_flPowerLevel; } |
|
|
|
bool IsEMPed() const; |
|
void SetEMPed( bool bIsEmped ); |
|
|
|
protected: |
|
// |
|
// Inheriting classes must implement these methods!!! |
|
// |
|
|
|
// Return true if the panel is active |
|
virtual bool IsPanelActive( int x, int y ) { assert(0); return false; } |
|
|
|
// Gets at the control point data; who knows how it was made? |
|
virtual void GetShieldData( Vector const** ppVerts, float* pOpacity, float* pBlend ) { assert(0); } |
|
|
|
private: |
|
void DrawWireframeModel( Vector const** pPositions ); |
|
void ComputePoint( float s, float t, Vector& pt, Vector& normal, float& opacity ); |
|
void ComputeShieldPoints( Vector* pt, Vector* normal, float* opacity ); |
|
void RippleShieldPoints( Vector* pt, float* opacity ); |
|
void DrawShieldPoints(Vector* pt, Vector* normal, float* opacity); |
|
void DrawShieldDecals(Vector* pt, bool hitDecals ); |
|
void SetCurrentDecal( int idx ); |
|
|
|
int Width() const; |
|
int Height() const; |
|
|
|
protected: |
|
// Used to fade out the shield |
|
float m_FadeValue; |
|
|
|
// Used to make the shield more or less curvy |
|
float m_CurveValue; |
|
|
|
private: |
|
// no copy constructor |
|
C_Shield( const C_Shield& ); |
|
|
|
// Data needs to ripple the shield control points |
|
struct Ripple_t |
|
{ |
|
float m_RippleU; |
|
float m_RippleV; |
|
float m_Amplitude; |
|
float m_Radius; |
|
float m_StartTime; |
|
Vector m_Direction; |
|
}; |
|
|
|
struct Decal_t |
|
{ |
|
float m_RippleU; |
|
float m_RippleV; |
|
float m_Radius; |
|
float m_StartTime; |
|
}; |
|
|
|
// Owner entity |
|
int m_nOwningPlayerIndex; |
|
|
|
// number of subdivisions |
|
int m_SubdivisionCount; |
|
float m_InvSubdivisionCount; |
|
|
|
// Shield powerlevel |
|
float m_flPowerLevel; |
|
|
|
// Texture animation |
|
float m_StartTime; |
|
|
|
bool m_bCollisionsActive; |
|
bool m_bIsEMPed; |
|
|
|
// Used to do spline queries |
|
CSplinePatch m_SplinePatch; |
|
|
|
// List of all ripples + decals |
|
int m_CurrentDecal; |
|
CUtlVector< Ripple_t > m_Ripples; |
|
CUtlVector< Decal_t > m_Decals; |
|
|
|
// All the various materials we use |
|
CMaterialReference m_pWireframe; |
|
CMaterialReference m_pShield; |
|
CMaterialReference m_pHitDecal; |
|
CMaterialReference m_pPassDecal; |
|
CMaterialReference m_pPassDecal2; |
|
|
|
// A little state used only during rendering, but I didn't want |
|
// to pass these as arguments to a bunch of functions |
|
bool m_ShieldOwnedByLocalPlayer; |
|
Vector m_ViewDir; |
|
|
|
// List of all active shields |
|
static CUtlVector< C_Shield* > s_Shields; |
|
}; |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Inline methods |
|
//----------------------------------------------------------------------------- |
|
inline int C_Shield::Width() const |
|
{ |
|
return m_SplinePatch.Width(); |
|
} |
|
|
|
inline int C_Shield::Height() const |
|
{ |
|
return m_SplinePatch.Height(); |
|
} |
|
|
|
inline bool C_Shield::IsEMPed() const |
|
{ |
|
return m_bIsEMPed; |
|
} |
|
|
|
inline void C_Shield::SetEMPed( bool bIsEmped ) |
|
{ |
|
m_bIsEMPed = bIsEmped; |
|
} |
|
|
|
|
|
//----------------------------------------------------------------------------- |
|
// Class factory methods to create the various versions of the shield |
|
//----------------------------------------------------------------------------- |
|
C_Shield* CreateMobileShield( C_BaseEntity *owner, float flFrontDistance = 0 ); |
|
|
|
#endif // C_SHIELD_H
|