summaryrefslogtreecommitdiff
path: root/game/server/tf2/tf_obj_shieldwall.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'game/server/tf2/tf_obj_shieldwall.cpp')
-rw-r--r--game/server/tf2/tf_obj_shieldwall.cpp270
1 files changed, 270 insertions, 0 deletions
diff --git a/game/server/tf2/tf_obj_shieldwall.cpp b/game/server/tf2/tf_obj_shieldwall.cpp
new file mode 100644
index 0000000..37ccc47
--- /dev/null
+++ b/game/server/tf2/tf_obj_shieldwall.cpp
@@ -0,0 +1,270 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose: Medic's resupply beacon
+//
+// $NoKeywords: $
+//=============================================================================//
+
+#include "cbase.h"
+#include "tf_obj.h"
+#include "tf_player.h"
+#include "tf_team.h"
+#include "techtree.h"
+#include "tf_shield.h"
+#include "VGuiScreen.h"
+
+//-----------------------------------------------------------------------------
+// Shield wall defines
+//-----------------------------------------------------------------------------
+
+#define SHIELDWALL_MINS Vector(-20, -20, 0)
+#define SHIELDWALL_MAXS Vector( 20, 20, 100)
+
+#define SHIELD_WALL_PITCH -10.0f
+
+
+ConVar obj_shieldwall_health( "obj_shieldwall_health","200", FCVAR_NONE, "Shield wall health" );
+
+
+//-----------------------------------------------------------------------------
+// Shield wall object that's built by the player
+//-----------------------------------------------------------------------------
+class CObjectShieldWallBase : public CBaseObject
+{
+DECLARE_CLASS( CObjectShieldWallBase, CBaseObject );
+
+public:
+ CObjectShieldWallBase();
+
+ virtual void UpdateOnRemove( void );
+
+ virtual void Spawn();
+
+ virtual void PowerupStart( int iPowerup, float flAmount, CBaseEntity *pAttacker, CDamageModifier *pDamageModifier );
+ virtual void PowerupEnd( int iPowerup );
+
+ // Team change
+ virtual void ChangeTeam( int nTeamNumber ) OVERRIDE;
+
+public:
+ CNetworkHandle( CShield, m_hDeployedShield );
+};
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+CObjectShieldWallBase::CObjectShieldWallBase()
+{
+ m_hDeployedShield.Set(0);
+ AddEFlags( EFL_FORCE_CHECK_TRANSMIT );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CObjectShieldWallBase::UpdateOnRemove( void )
+{
+ if ( m_hDeployedShield.Get() )
+ {
+ UTIL_Remove( m_hDeployedShield );
+ m_hDeployedShield.Set( NULL );
+ }
+
+ // Chain at end to mimic destructor unwind order
+ BaseClass::UpdateOnRemove();
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CObjectShieldWallBase::Spawn()
+{
+ m_takedamage = DAMAGE_YES;
+
+ SetType( OBJ_SHIELDWALL );
+
+ BaseClass::Spawn();
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Powerup has just started
+//-----------------------------------------------------------------------------
+void CObjectShieldWallBase::PowerupStart( int iPowerup, float flAmount, CBaseEntity *pAttacker, CDamageModifier *pDamageModifier )
+{
+ switch( iPowerup )
+ {
+ case POWERUP_BOOST:
+ // Increase our shield's energy
+ if ( m_hDeployedShield )
+ {
+ m_hDeployedShield->SetPower( m_hDeployedShield->GetPower() + (flAmount * 3) );
+ }
+ break;
+
+ case POWERUP_EMP:
+ if (m_hDeployedShield)
+ {
+ m_hDeployedShield->SetEMPed(true);
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ BaseClass::PowerupStart( iPowerup, flAmount, pAttacker, pDamageModifier );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Powerup has just started
+//-----------------------------------------------------------------------------
+void CObjectShieldWallBase::PowerupEnd( int iPowerup )
+{
+ switch ( iPowerup )
+ {
+ case POWERUP_EMP:
+ if (m_hDeployedShield)
+ {
+ m_hDeployedShield->SetEMPed(false);
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ BaseClass::PowerupEnd( iPowerup );
+}
+
+
+//-----------------------------------------------------------------------------
+// Team change
+//-----------------------------------------------------------------------------
+void CObjectShieldWallBase::ChangeTeam( int nTeamNumber )
+{
+ BaseClass::ChangeTeam( nTeamNumber );
+ if ( m_hDeployedShield )
+ {
+ m_hDeployedShield->ChangeTeam( nTeamNumber );
+ }
+}
+
+
+//-----------------------------------------------------------------------------
+// Shield wall object that's built by the player
+//-----------------------------------------------------------------------------
+class CObjectShieldWall : public CObjectShieldWallBase
+{
+DECLARE_CLASS( CObjectShieldWall, CObjectShieldWallBase );
+
+public:
+ DECLARE_SERVERCLASS();
+
+ CObjectShieldWall();
+
+ virtual void Spawn();
+ virtual void Precache();
+ virtual void GetControlPanelInfo( int nPanelIndex, const char *&pPanelName );
+ virtual void ObjectMoved( );
+ virtual void FinishedBuilding( void );
+};
+
+IMPLEMENT_SERVERCLASS_ST(CObjectShieldWall, DT_ObjectShieldWall)
+ SendPropEHandle(SENDINFO(m_hDeployedShield)),
+END_SEND_TABLE();
+
+LINK_ENTITY_TO_CLASS(obj_shieldwall, CObjectShieldWall);
+PRECACHE_REGISTER(obj_shieldwall);
+
+CObjectShieldWall::CObjectShieldWall()
+{
+ UseClientSideAnimation();
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CObjectShieldWall::Spawn()
+{
+ SetModel( "models/objects/obj_shieldwall.mdl" );
+ SetSolid( SOLID_BBOX );
+ UTIL_SetSize(this, SHIELDWALL_MINS, SHIELDWALL_MAXS);
+ m_iHealth = obj_shieldwall_health.GetInt();
+ m_hDeployedShield = NULL;
+
+ SetType( OBJ_SHIELDWALL );
+
+ BaseClass::Spawn();
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CObjectShieldWall::Precache()
+{
+ PrecacheModel( "models/objects/obj_shieldwall.mdl" );
+ PrecacheVGuiScreen( "screen_obj_shieldwall" );
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose: Gets info about the control panels
+//-----------------------------------------------------------------------------
+void CObjectShieldWall::GetControlPanelInfo( int nPanelIndex, const char *&pPanelName )
+{
+ pPanelName = "screen_obj_shieldwall";
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CObjectShieldWall::FinishedBuilding( void )
+{
+ BaseClass::FinishedBuilding();
+
+ int nAttachmentIndex = LookupAttachment( "projectionpoint" );
+
+ m_hDeployedShield = CreateMobileShield( this );
+ m_hDeployedShield->SetAlwaysOrient( false );
+ m_hDeployedShield->SetAttachmentIndex( nAttachmentIndex );
+ m_hDeployedShield->SetAngularSpringConstant( 20 );
+ ObjectMoved();
+}
+
+
+//-----------------------------------------------------------------------------
+// Called when the builder rotates this object...
+//-----------------------------------------------------------------------------
+void CObjectShieldWall::ObjectMoved( )
+{
+ if (m_hDeployedShield)
+ {
+ VMatrix matangles;
+ VMatrix matoffset;
+ VMatrix matfinal;
+
+ // This represents how much to pitch the shield up from the attachment point
+ QAngle angleOffset( SHIELD_WALL_PITCH, 0, 0 );
+
+ // Get the location and angles of the attachment point
+ // Attachment point position is the origin of the shield
+ QAngle angles;
+
+ // Rotate the angles of the attachment point by the angle offset
+ MatrixFromAngles( GetAbsAngles(), matangles );
+ MatrixFromAngles( angleOffset, matoffset );
+ MatrixMultiply( matangles, matoffset, matfinal );
+ MatrixToAngles( matfinal, angles );
+ m_hDeployedShield->SetCenterAngles( angles );
+
+ m_hDeployedShield->ShieldMoved();
+ }
+ BaseClass::ObjectMoved();
+}
+
+
+
+