summaryrefslogtreecommitdiff
path: root/game/server/tf2/tf_shield_flat.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'game/server/tf2/tf_shield_flat.cpp')
-rw-r--r--game/server/tf2/tf_shield_flat.cpp150
1 files changed, 150 insertions, 0 deletions
diff --git a/game/server/tf2/tf_shield_flat.cpp b/game/server/tf2/tf_shield_flat.cpp
new file mode 100644
index 0000000..cbe187d
--- /dev/null
+++ b/game/server/tf2/tf_shield_flat.cpp
@@ -0,0 +1,150 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+// $NoKeywords: $
+//=============================================================================//
+
+#include "cbase.h"
+#include "tf_shield_flat.h"
+#include "tf_shieldshared.h"
+
+
+//-----------------------------------------------------------------------------
+// Data tables
+//-----------------------------------------------------------------------------
+LINK_ENTITY_TO_CLASS( shield_flat, CShieldFlat );
+
+IMPLEMENT_SERVERCLASS_ST(CShieldFlat, DT_Shield_Flat)
+
+ SendPropInt (SENDINFO(m_ShieldState), 2, SPROP_UNSIGNED ),
+ SendPropFloat (SENDINFO(m_Width), 8, 0, 0, 256 ),
+ SendPropFloat (SENDINFO(m_Height), 8, 0, 0, 256 ),
+
+END_SEND_TABLE()
+
+
+//-----------------------------------------------------------------------------
+// Spawn
+//-----------------------------------------------------------------------------
+void CShieldFlat::Spawn( )
+{
+ BaseClass::Spawn();
+ m_ShieldState = 0;
+ ShieldMoved();
+}
+
+
+//-----------------------------------------------------------------------------
+// Computes the shield bounding box
+//-----------------------------------------------------------------------------
+void CShieldFlat::ShieldMoved( void )
+{
+ Vector forward, right, up;
+ AngleVectors( GetAbsAngles(), &forward, &right, &up );
+
+ VectorMA( GetAbsOrigin(), -m_Width * 0.5, right, m_Pos[0] );
+ VectorMA( m_Pos[0], -m_Height * 0.5, up, m_Pos[0] );
+ VectorMA( m_Pos[0], m_Width, right, m_Pos[1] );
+ VectorMA( m_Pos[0], m_Height, up, m_Pos[2] );
+ VectorMA( m_Pos[2], m_Width, right, m_Pos[3] );
+
+ m_LastAngles = GetAbsAngles();
+ m_LastPosition = GetAbsOrigin();
+}
+
+
+//-----------------------------------------------------------------------------
+// Shield size
+//-----------------------------------------------------------------------------
+void CShieldFlat::SetSize( float w, float h )
+{
+ m_Width = w;
+ m_Height = h;
+ Vector mins( -1.0/16.0f, -w * 0.5f, -h * 0.5f );
+ Vector maxs( 1.0/16.0f, w * 0.5f, h * 0.5f );
+ UTIL_SetSize( this, mins, maxs );
+ ShieldMoved();
+}
+
+
+//-----------------------------------------------------------------------------
+// Compute world axis-aligned bounding box
+//-----------------------------------------------------------------------------
+void CShieldFlat::ComputeWorldSpaceSurroundingBox( Vector *pWorldMins, Vector *pWorldMaxs )
+{
+ TransformAABB( CollisionProp()->CollisionToWorldTransform(),
+ CollisionProp()->OBBMins(), CollisionProp()->OBBMaxs(), *pWorldMins, *pWorldMaxs );
+}
+
+
+//-----------------------------------------------------------------------------
+// Shield points
+//-----------------------------------------------------------------------------
+const Vector& CShieldFlat::GetPoint( int x, int y )
+{
+ if ((m_LastAngles != GetAbsAngles()) || (m_LastPosition != GetAbsOrigin() ))
+ {
+ ShieldMoved();
+ }
+
+ int i = (x >= 1);
+ i += (y >= 1) * 2;
+ return m_Pos[i];
+}
+
+
+//-----------------------------------------------------------------------------
+// Called when the shield is EMPed
+//-----------------------------------------------------------------------------
+void CShieldFlat::SetEMPed( bool isEmped )
+{
+ CShield::SetEMPed(isEmped);
+ if (IsEMPed())
+ {
+ m_ShieldState |= SHIELD_FLAT_EMP;
+ }
+ else
+ {
+ m_ShieldState &= ~SHIELD_FLAT_EMP;
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Shield is killed here
+//-----------------------------------------------------------------------------
+void CShieldFlat::Activate( bool active )
+{
+ if (active)
+ {
+ m_ShieldState &= ~SHIELD_FLAT_INACTIVE;
+ }
+ else
+ {
+ m_ShieldState |= SHIELD_FLAT_INACTIVE;
+ }
+ ActivateCollisions( active );
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Create a mobile version of the shield
+//-----------------------------------------------------------------------------
+CShieldFlat* CreateFlatShield( CBaseEntity *pOwner, float w, float h, const Vector& relOrigin, const QAngle &relAngles )
+{
+ CShieldFlat *pShield = (CShieldFlat*)CreateEntityByName("shield_flat");
+
+ pShield->SetParent( pOwner );
+ pShield->SetOwnerEntity( pOwner );
+ UTIL_SetOrigin( pShield, relOrigin );
+
+ // Compute relative angles....
+ pShield->SetLocalAngles( relAngles );
+ pShield->ChangeTeam( pOwner->GetTeamNumber() );
+ pShield->Spawn();
+ pShield->SetSize( w , h );
+
+ return pShield;
+}
+