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.
219 lines
5.5 KiB
219 lines
5.5 KiB
5 years ago
|
//========= Copyright Valve Corporation, All rights reserved. ============//
|
||
|
//
|
||
|
// Purpose: The Escort's Shield weapon
|
||
|
//
|
||
|
// $Revision: $
|
||
|
// $NoKeywords: $
|
||
|
//=============================================================================//
|
||
|
|
||
|
#include "cbase.h"
|
||
|
#include "weapon_shield.h"
|
||
|
#include "in_buttons.h"
|
||
|
#include <float.h>
|
||
|
#include "mathlib/mathlib.h"
|
||
|
#include "engine/IEngineSound.h"
|
||
|
|
||
|
#if defined( CLIENT_DLL )
|
||
|
#include "c_shield.h"
|
||
|
#else
|
||
|
#include "tf_shield.h"
|
||
|
#endif
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Shield WEAPON
|
||
|
//-----------------------------------------------------------------------------
|
||
|
LINK_ENTITY_TO_CLASS( weapon_shield, CWeaponShield );
|
||
|
PRECACHE_WEAPON_REGISTER(weapon_shield);
|
||
|
|
||
|
IMPLEMENT_NETWORKCLASS_ALIASED( WeaponShield, DT_WeaponShield )
|
||
|
|
||
|
BEGIN_NETWORK_TABLE(CWeaponShield, DT_WeaponShield)
|
||
|
#ifdef CLIENT_DLL
|
||
|
RecvPropEHandle (RECVINFO(m_hDeployedShield)),
|
||
|
#else
|
||
|
SendPropEHandle (SENDINFO(m_hDeployedShield)),
|
||
|
#endif
|
||
|
END_NETWORK_TABLE()
|
||
|
|
||
|
|
||
|
BEGIN_PREDICTION_DATA( CWeaponShield )
|
||
|
|
||
|
DEFINE_FIELD( m_bIsDeployed, FIELD_BOOLEAN ),
|
||
|
DEFINE_FIELD( m_bShieldPositionLocked, FIELD_BOOLEAN ),
|
||
|
|
||
|
END_PREDICTION_DATA()
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
CWeaponShield::CWeaponShield( void )
|
||
|
{
|
||
|
SetPredictionEligible( true );
|
||
|
m_bIsDeployed = false;
|
||
|
}
|
||
|
|
||
|
void CWeaponShield::UpdateOnRemove( void )
|
||
|
{
|
||
|
#ifdef GAME_DLL
|
||
|
if ( m_hDeployedShield.Get() )
|
||
|
{
|
||
|
m_hDeployedShield.Get()->Remove( );
|
||
|
m_hDeployedShield.Set( NULL );
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
// Chain at end to mimic destructor unwind order
|
||
|
BaseClass::UpdateOnRemove();
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: Given the distance the hit occurred at, return the damage done
|
||
|
//-----------------------------------------------------------------------------
|
||
|
float CWeaponShield::GetDamage( float flDistance, int iLocation )
|
||
|
{
|
||
|
// Can't injure at all over this distance
|
||
|
return 0.0;
|
||
|
}
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
float CWeaponShield::GetFireRate( void )
|
||
|
{
|
||
|
return 1.0;
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Deploy the shield!
|
||
|
//-----------------------------------------------------------------------------
|
||
|
bool CWeaponShield::Deploy( )
|
||
|
{
|
||
|
if ( !BaseClass::Deploy() )
|
||
|
return false;
|
||
|
|
||
|
// NOTE: the underlying system can cause Deploy to be called twice in a row
|
||
|
if ( m_bIsDeployed )
|
||
|
return true;
|
||
|
|
||
|
// We gotta make the actual shield effect....
|
||
|
CBaseTFPlayer *pPlayer = ToBaseTFPlayer( GetOwner() );
|
||
|
if ( !pPlayer )
|
||
|
return false;
|
||
|
|
||
|
#ifdef GAME_DLL
|
||
|
Assert( !m_hDeployedShield.Get().IsValid() );
|
||
|
m_hDeployedShield = CreateMobileShield( pPlayer );
|
||
|
#endif
|
||
|
|
||
|
SetShieldPositionLocked( false );
|
||
|
m_bIsDeployed = true;
|
||
|
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose: Remove the shield
|
||
|
//-----------------------------------------------------------------------------
|
||
|
bool CWeaponShield::Holster( CBaseCombatWeapon *pSwitchingTo )
|
||
|
{
|
||
|
#ifdef GAME_DLL
|
||
|
if ( m_hDeployedShield.Get() )
|
||
|
{
|
||
|
m_hDeployedShield.Get()->Remove( );
|
||
|
m_hDeployedShield.Set( NULL );
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
m_bIsDeployed = false;
|
||
|
|
||
|
return BaseClass::Holster( pSwitchingTo );
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CWeaponShield::ItemPostFrame( void )
|
||
|
{
|
||
|
CBaseTFPlayer *pPlayer = ToBaseTFPlayer( GetOwner() );
|
||
|
if (pPlayer == NULL)
|
||
|
return;
|
||
|
|
||
|
// Disabled
|
||
|
if ( ComputeEMPFireState() )
|
||
|
{
|
||
|
// Handle deployment & pick-up (firing is handled on the client)
|
||
|
if ( pPlayer->m_nButtons & IN_ATTACK2 )
|
||
|
{
|
||
|
if ( gpGlobals->curtime >= m_flNextPrimaryAttack)
|
||
|
{
|
||
|
PrimaryAttack();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
WeaponIdle();
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Purpose:
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CWeaponShield::PrimaryAttack( void )
|
||
|
{
|
||
|
CShield *shield = m_hDeployedShield.Get();
|
||
|
if ( shield )
|
||
|
{
|
||
|
SetShieldPositionLocked( !m_bShieldPositionLocked );
|
||
|
|
||
|
#ifdef GAME_DLL
|
||
|
if ( m_bShieldPositionLocked )
|
||
|
{
|
||
|
ClientPrint( ToBasePlayer(GetOwner()), HUD_PRINTCENTER, "Projected Shield Locked" );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
ClientPrint( ToBasePlayer(GetOwner()), HUD_PRINTCENTER, "Projected Shield Tracking" );
|
||
|
}
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
m_flNextPrimaryAttack = gpGlobals->curtime + 0.25f;
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Lock the projected shield
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CWeaponShield::SetShieldPositionLocked( bool bLocked )
|
||
|
{
|
||
|
m_bShieldPositionLocked = bLocked;
|
||
|
if ( m_hDeployedShield.Get() )
|
||
|
{
|
||
|
if ( bLocked && m_hDeployedShield.Get()->IsAlwaysOrienting() )
|
||
|
{
|
||
|
CBaseTFPlayer *pPlayer = ToBaseTFPlayer( GetOwner() );
|
||
|
m_hDeployedShield.Get()->SetCenterAngles( pPlayer->EyeAngles() );
|
||
|
}
|
||
|
m_hDeployedShield.Get()->SetAlwaysOrient( !bLocked );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
//-----------------------------------------------------------------------------
|
||
|
// Idle processing
|
||
|
//-----------------------------------------------------------------------------
|
||
|
void CWeaponShield::WeaponIdle( void )
|
||
|
{
|
||
|
bool isEmped = IsOwnerEMPed();
|
||
|
|
||
|
if (m_hDeployedShield.Get())
|
||
|
{
|
||
|
m_hDeployedShield.Get()->SetEMPed( isEmped );
|
||
|
}
|
||
|
}
|