summaryrefslogtreecommitdiff
path: root/game/shared/tf2/tf_shieldshared.h
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /game/shared/tf2/tf_shieldshared.h
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'game/shared/tf2/tf_shieldshared.h')
-rw-r--r--game/shared/tf2/tf_shieldshared.h262
1 files changed, 262 insertions, 0 deletions
diff --git a/game/shared/tf2/tf_shieldshared.h b/game/shared/tf2/tf_shieldshared.h
new file mode 100644
index 0000000..52ed301
--- /dev/null
+++ b/game/shared/tf2/tf_shieldshared.h
@@ -0,0 +1,262 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//=============================================================================//
+
+#ifndef TF_SHIELD_SHARED_H
+#define TF_SHIELD_SHARED_H
+#ifdef _WIN32
+#pragma once
+#endif
+
+#include "mathlib/mathlib.h"
+#include "mathlib/vector.h"
+#include "mathlib/vmatrix.h"
+#include "utlvector.h"
+#include "SheetSimulator.h"
+#include "predictable_entity.h"
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Shield (mobile version)
+//-----------------------------------------------------------------------------
+enum
+{
+ SHIELD_NUM_HORIZONTAL_POINTS = 8,
+ SHIELD_NUM_VERTICAL_POINTS = 8,
+ SHIELD_NUM_CONTROL_POINTS = SHIELD_NUM_HORIZONTAL_POINTS * SHIELD_NUM_VERTICAL_POINTS,
+ SHIELD_INITIAL_THETA = 135,
+ SHIELD_INITIAL_PHI = 90,
+ SHIELD_HORIZONTAL_PANEL_COUNT = (SHIELD_NUM_HORIZONTAL_POINTS - 1),
+ SHIELD_VERTICAL_PANEL_COUNT = (SHIELD_NUM_VERTICAL_POINTS - 1),
+ SHIELD_PANELS_COUNT = (SHIELD_HORIZONTAL_PANEL_COUNT * SHIELD_VERTICAL_PANEL_COUNT),
+ SHIELD_VERTEX_BYTES = (SHIELD_NUM_CONTROL_POINTS + 7) >> 3,
+ SHIELD_TIME_SUBVISIBIONS = 2
+};
+
+//--------------------------------------------------------------------------
+// Mobile shield state flags
+//--------------------------------------------------------------------------
+enum
+{
+ SHIELD_MOBILE_EMP = 0x1
+};
+
+
+//--------------------------------------------------------------------------
+// Shield grenade state
+//--------------------------------------------------------------------------
+enum
+{
+ SHIELD_FLAT_EMP = 0x1,
+ SHIELD_FLAT_INACTIVE = 0x2
+};
+
+enum
+{
+ SHIELD_FLAT_SHUTDOWN_TIME = 1
+};
+
+enum
+{
+ SHIELD_GRENADE_WIDTH = 150,
+ SHIELD_GRENADE_HEIGHT = 150,
+};
+
+
+#define SHIELD_DAMAGE_CHANGE_TIME 1.5f
+
+
+//-----------------------------------------------------------------------------
+// Amount of time it takes to fade the shield in or out due to EMP
+//-----------------------------------------------------------------------------
+#define SHIELD_EMP_FADE_TIME 0.7f
+
+
+//-----------------------------------------------------------------------------
+// Amount of time it takes a point to wobble when EMPed
+//-----------------------------------------------------------------------------
+#define SHIELD_EMP_WOBBLE_TIME 0.1f
+
+
+//-----------------------------------------------------------------------------
+// Methods we must install into the effect
+//-----------------------------------------------------------------------------
+class IActiveVertList
+{
+public:
+ virtual int GetActiveVertState( int iVert ) = 0;
+ virtual void SetActiveVertState( int iVert, int bOn ) = 0;
+};
+
+
+class CShieldEffect
+{
+ DECLARE_CLASS_NOBASE( CShieldEffect );
+ DECLARE_PREDICTABLE();
+
+public:
+ CShieldEffect();
+
+ void Precache();
+ void Spawn(const Vector& currentPosition, const QAngle& currentAngles);
+
+ // Sets the collision group
+ void SetCollisionGroup( int group );
+
+ // Computes the opacity....
+ float ComputeOpacity( const Vector& pt, const Vector& center ) const;
+
+ // Computes the bounds
+ void ComputeBounds( Vector& mins, Vector& maxs );
+
+ // Simulation
+ void Simulate( float dt );
+
+ // Sets desired orientation + position
+ void SetDesiredOrigin( const Vector& origin );
+ void SetDesiredAngles( const QAngle& angles );
+ const QAngle& GetDesiredAngles() const;
+
+ // Hooks in active bits...
+ void SetActiveVertexList( IActiveVertList *pActiveVerts );
+
+ // Gets a point...
+ const Vector& GetPoint( int x, int y ) const;
+ const Vector& GetPoint( int i ) const;
+ Vector& GetPoint( int i );
+
+ // Computes control points
+ void ComputeControlPoints();
+
+ // The current angles (computed by Simulate on the server)
+ const QAngle& GetCurrentAngles() const;
+ void SetCurrentAngles( const QAngle& angles);
+
+ // The current position (computed by Simulate on the server)
+ const Vector& GetCurrentPosition();
+ void SetCurrentPosition( const Vector& pos );
+
+ // Compute vertex activity
+ void ComputeVertexActivity();
+
+ // Recompute whether the panels are active or not
+ void ComputePanelActivity();
+
+ // Is a particular vertex active?
+ bool IsVertexActive( int x, int y ) const;
+
+ // Is a particular panel active?
+ bool IsPanelActive( int x, int y ) const;
+
+ // Gets a control point (for collision)
+ const Vector& GetControlPoint( int i ) const { return m_pControlPoint[i]; }
+
+ // Returns the panel size (for collision testing)
+ void GetPanelSize( Vector& mins, Vector& maxs ) const;
+
+ // 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.
+ void SetAngularSpringConstant( float flConstant );
+
+ // Set the shield theta & phi
+ void SetThetaPhi( float flTheta, float flPhi );
+
+ // Returns the render bounds
+ const Vector& GetRenderMins() const;
+ const Vector& GetRenderMaxs() const;
+
+private:
+ // Simulation set up
+ void ComputeRestPositions();
+ void SetShieldPanelSize( Vector& mins, Vector& maxs );
+ void SimulateTranslation( float dt );
+ void SimulateRotation( float dt, const Vector& forward );
+ void ComputeOrientationMatrix();
+
+ float m_RestLength;
+ float m_PlaneDist;
+ float m_ShieldTheta;
+ float m_ShieldPhi;
+
+ // Spring constants
+ float m_SpringConstant;
+ float m_DampConstant;
+ float m_ViscousDrag;
+ float m_Mass;
+
+ float m_AngularSpringConstant;
+ float m_AngularViscousDrag;
+
+ // collision group
+ int m_CollisionGroup;
+
+ // Directions of the control points in shield space
+ Vector m_pFixedDirection[SHIELD_NUM_CONTROL_POINTS];
+
+ // Position of the control points in world space
+ Vector m_pControlPoint[SHIELD_NUM_CONTROL_POINTS];
+
+ // Bitfield indicating which vertices are active
+ IActiveVertList *m_pActiveVerts;
+
+ // Bitfield indicating which panels are active
+ bool m_pActivePanels[SHIELD_PANELS_COUNT];
+
+ // Which point on the shield to test next
+ int m_TestPoint;
+ int m_PointList[SHIELD_NUM_CONTROL_POINTS];
+
+ // desired position + orientation
+ Vector m_vecDesiredOrigin;
+ QAngle m_angDesiredAngles;
+
+ // collision box
+ Vector m_PanelBoxMin;
+ Vector m_PanelBoxMax;
+
+ // Render bounds (shield space)
+ Vector m_vecRenderMins;
+ Vector m_vecRenderMaxs;
+
+ // Actual center position (relative to m_Origin)
+ // + velocity (world space)
+ Vector m_Position;
+ Vector m_Velocity;
+
+ // our current orientation....
+ QAngle m_CurrentAngles;
+ VMatrix m_Orientation;
+ float m_Theta;
+ float m_Phi;
+ float m_ThetaVelocity;
+ float m_PhiVelocity;
+};
+
+
+//-----------------------------------------------------------------------------
+// Inline methods
+//-----------------------------------------------------------------------------
+inline const QAngle& CShieldEffect::GetCurrentAngles() const
+{
+ return m_CurrentAngles;
+}
+
+//-----------------------------------------------------------------------------
+// Returns the render bounds
+//-----------------------------------------------------------------------------
+inline const Vector& CShieldEffect::GetRenderMins() const
+{
+ return m_vecRenderMins;
+}
+
+inline const Vector& CShieldEffect::GetRenderMaxs() const
+{
+ return m_vecRenderMaxs;
+}
+
+
+#endif // TF_SHIELD_SHARED_H