summaryrefslogtreecommitdiff
path: root/game/server/tf2/tf_obj_manned_shield.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'game/server/tf2/tf_obj_manned_shield.cpp')
-rw-r--r--game/server/tf2/tf_obj_manned_shield.cpp240
1 files changed, 240 insertions, 0 deletions
diff --git a/game/server/tf2/tf_obj_manned_shield.cpp b/game/server/tf2/tf_obj_manned_shield.cpp
new file mode 100644
index 0000000..878c302
--- /dev/null
+++ b/game/server/tf2/tf_obj_manned_shield.cpp
@@ -0,0 +1,240 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose: A stationary shield that players can man
+//
+// $NoKeywords: $
+//=============================================================================//
+
+#include "cbase.h"
+#include "tf_obj_base_manned_gun.h"
+#include "tf_shield.h"
+#include "in_buttons.h"
+
+
+// ------------------------------------------------------------------------ //
+// A stationary gun that players can man that's built by the player
+// ------------------------------------------------------------------------ //
+class CObjectMannedShield : public CObjectBaseMannedGun
+{
+ DECLARE_CLASS( CObjectMannedShield, CObjectBaseMannedGun );
+
+public:
+ DECLARE_SERVERCLASS();
+ DECLARE_DATADESC();
+
+ CObjectMannedShield();
+ virtual ~CObjectMannedShield();
+
+ static CObjectMannedShield* Create(const Vector &vOrigin, const QAngle &vAngles);
+
+ virtual void Spawn();
+ virtual void Precache();
+ virtual void SetPassenger( int nRole, CBasePlayer *pEnt );
+
+ virtual void PowerupStart( int iPowerup, float flAmount, CBaseEntity *pAttacker, CDamageModifier *pDamageModifier );
+ virtual void PowerupEnd( int iPowerup );
+
+protected:
+
+ virtual void OnItemPostFrame( CBaseTFPlayer *pDriver );
+
+
+private:
+
+ void ShieldRotationThink();
+
+ CHandle<CShield> m_hDeployedShield;
+};
+
+#define MANNED_SHIELD_CLIP_COUNT 3
+
+#define MANNED_SHIELD_MINS Vector(-20, -20, 0)
+#define MANNED_SHIELD_MAXS Vector( 20, 20, 55)
+#define MANNED_SHIELD_MODEL "models/objects/obj_manned_plasmagun.mdl"
+
+
+BEGIN_DATADESC( CObjectMannedShield )
+END_DATADESC()
+
+IMPLEMENT_SERVERCLASS_ST(CObjectMannedShield, DT_ObjectMannedShield)
+END_SEND_TABLE()
+
+LINK_ENTITY_TO_CLASS(obj_manned_shield, CObjectMannedShield);
+PRECACHE_REGISTER(obj_manned_shield);
+
+// CVars
+ConVar obj_manned_shield_health( "obj_manned_shield_health","100", FCVAR_NONE, "Manned Missile Launcher health" );
+
+const char *g_pMannedShieldThinkContextName = "MannedShieldThinkContext";
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+CObjectMannedShield::CObjectMannedShield()
+{
+}
+
+CObjectMannedShield::~CObjectMannedShield()
+{
+ UTIL_Remove( m_hDeployedShield );
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CObjectMannedShield::Spawn()
+{
+ m_iHealth = obj_manned_shield_health.GetInt();
+ BaseClass::Spawn();
+
+ SetMovementStyle( MOVEMENT_STYLE_SIMPLE );
+ SetModel( MANNED_SHIELD_MODEL );
+ OnModelSelected();
+ SetSolid( SOLID_BBOX );
+ UTIL_SetSize(this, MANNED_SHIELD_MINS, MANNED_SHIELD_MAXS);
+
+ SetMaxPassengerCount( 1 );
+
+ SetType( OBJ_MANNED_SHIELD );
+
+ SetContextThink( ShieldRotationThink, gpGlobals->curtime + 0.1, g_pMannedShieldThinkContextName );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Powerup has just started
+//-----------------------------------------------------------------------------
+void CObjectMannedShield::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 * 10) );
+ }
+ 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 CObjectMannedShield::PowerupEnd( int iPowerup )
+{
+ switch ( iPowerup )
+ {
+ case POWERUP_EMP:
+ if (m_hDeployedShield)
+ {
+ m_hDeployedShield->SetEMPed(false);
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ BaseClass::PowerupEnd( iPowerup );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CObjectMannedShield::ShieldRotationThink( void )
+{
+ if ( m_hDeployedShield )
+ {
+ QAngle vAngles;
+ vAngles[YAW] = GetAbsAngles()[YAW] + GetGunYaw();
+ vAngles[PITCH] = GetAbsAngles()[PITCH] + GetGunPitch();
+ vAngles[ROLL] = 0;
+ m_hDeployedShield->SetCenterAngles( vAngles );
+ }
+
+ SetContextThink( ShieldRotationThink, gpGlobals->curtime + 0.1, g_pMannedShieldThinkContextName );
+}
+
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CObjectMannedShield::Precache( void )
+{
+ PrecacheModel( MANNED_SHIELD_MODEL );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Get and set the current driver.
+//-----------------------------------------------------------------------------
+void CObjectMannedShield::SetPassenger( int nRole, CBasePlayer *pEnt )
+{
+ BaseClass::SetPassenger( nRole, pEnt );
+
+ // If we just got a player, create the shield. Otherwise, remove it
+ if ( pEnt )
+ {
+ if ( !m_hDeployedShield )
+ {
+ // Hack our angles so the mobile shield appears directly in front of the gun
+ QAngle vecOldAngles = GetAbsAngles();
+ QAngle vAngles;
+ vAngles[YAW] = GetAbsAngles()[YAW] + GetGunYaw();
+ vAngles[PITCH] = GetAbsAngles()[PITCH] + GetGunPitch();
+ vAngles[ROLL] = 0;
+ SetAbsAngles( vAngles );
+
+ int nAttachmentIndex = LookupAttachment( "barrel" );
+ m_hDeployedShield = CreateMobileShield( this, 0 );
+ if ( m_hDeployedShield )
+ {
+ m_hDeployedShield->SetThetaPhi( 60, 40 );
+ m_hDeployedShield->SetAngularSpringConstant( 15 );
+ m_hDeployedShield->SetAlwaysOrient( false );
+ m_hDeployedShield->SetAttachmentIndex( nAttachmentIndex );
+ }
+
+ SetAbsAngles( vecOldAngles );
+ }
+ }
+ else
+ {
+ if ( m_hDeployedShield )
+ {
+ UTIL_Remove( m_hDeployedShield );
+ }
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CObjectMannedShield::OnItemPostFrame( CBaseTFPlayer *pDriver )
+{
+ int iOldButtons = pDriver->m_nButtons;
+
+ // Manned shields have no gun, so map both attack buttons to laser designate
+ if ( pDriver->m_nButtons & IN_ATTACK )
+ {
+ pDriver->m_nButtons &= ~IN_ATTACK;
+ pDriver->m_nButtons |= IN_ATTACK2;
+ }
+
+ BaseClass::OnItemPostFrame( pDriver );
+
+ pDriver->m_nButtons = iOldButtons;
+}