mirror of
https://github.com/nillerusr/source-engine.git
synced 2026-08-16 13:43:00 +00:00
1
This commit is contained in:
@@ -0,0 +1,199 @@
|
||||
//========= 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
|
||||
Reference in New Issue
Block a user