You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
240 lines
6.5 KiB
240 lines
6.5 KiB
//========= 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; |
|
}
|
|
|