summaryrefslogtreecommitdiff
path: root/game/shared/tf/tf_weapon_invis.cpp
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /game/shared/tf/tf_weapon_invis.cpp
downloadarchived-source-engine-2018-hl2-src-master.tar.xz
archived-source-engine-2018-hl2-src-master.zip
Diffstat (limited to 'game/shared/tf/tf_weapon_invis.cpp')
-rw-r--r--game/shared/tf/tf_weapon_invis.cpp346
1 files changed, 346 insertions, 0 deletions
diff --git a/game/shared/tf/tf_weapon_invis.cpp b/game/shared/tf/tf_weapon_invis.cpp
new file mode 100644
index 0000000..91f3674
--- /dev/null
+++ b/game/shared/tf/tf_weapon_invis.cpp
@@ -0,0 +1,346 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+//=============================================================================
+
+#include "cbase.h"
+#include "tf_weapon_invis.h"
+#include "in_buttons.h"
+
+#if !defined( CLIENT_DLL )
+ #include "vguiscreen.h"
+ #include "tf_player.h"
+#else
+ #include "c_tf_player.h"
+#endif
+
+extern ConVar tf_spy_invis_unstealth_time;
+extern ConVar tf_spy_cloak_consume_rate;
+extern ConVar tf_spy_cloak_regen_rate;
+
+//=============================================================================
+//
+// TFWeaponBase Melee tables.
+//
+IMPLEMENT_NETWORKCLASS_ALIASED( TFWeaponInvis, DT_TFWeaponInvis )
+
+BEGIN_NETWORK_TABLE( CTFWeaponInvis, DT_TFWeaponInvis )
+END_NETWORK_TABLE()
+
+BEGIN_PREDICTION_DATA( CTFWeaponInvis )
+END_PREDICTION_DATA()
+
+LINK_ENTITY_TO_CLASS( tf_weapon_invis, CTFWeaponInvis );
+PRECACHE_WEAPON_REGISTER( tf_weapon_invis );
+
+// Server specific.
+#if !defined( CLIENT_DLL )
+ BEGIN_DATADESC( CTFWeaponInvis )
+ END_DATADESC()
+#endif
+
+//-----------------------------------------------------------------------------
+// Purpose: Use the offhand view model
+//-----------------------------------------------------------------------------
+void CTFWeaponInvis::Spawn( void )
+{
+ BaseClass::Spawn();
+
+ SetViewModelIndex( 1 );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CTFWeaponInvis::OnActiveStateChanged( int iOldState )
+{
+ BaseClass::OnActiveStateChanged( iOldState );
+
+ // If we are being removed, we need to remove all stealth effects from our owner
+ if ( m_iState == WEAPON_NOT_CARRIED && iOldState != WEAPON_NOT_CARRIED )
+ {
+ CleanupInvisibilityWatch();
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Clear out the view model when we hide
+//-----------------------------------------------------------------------------
+void CTFWeaponInvis::HideThink( void )
+{
+ SetWeaponVisible( false );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+const char *CTFWeaponInvis::GetViewModel( int viewmodelindex ) const
+{
+ // Watch uses the player model as its viewmodel, because it's never seen being carried by the player
+ const CEconItemView *pItem = GetAttributeContainer()->GetItem();
+ if ( pItem->IsValid() )
+ {
+ int iClass = 0;
+ int iTeam = 0;
+ CTFPlayer *pTFPlayer = ToTFPlayer( GetOwnerEntity() );
+ if ( pTFPlayer )
+ {
+ iClass = pTFPlayer->GetPlayerClass()->GetClassIndex();
+ iTeam = pTFPlayer->GetTeamNumber();
+ }
+
+ return pItem->GetPlayerDisplayModel( iClass, iTeam );
+ }
+
+ return BaseClass::GetViewModel( viewmodelindex );
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Show/hide weapon and corresponding view model if any
+// Input : visible -
+//-----------------------------------------------------------------------------
+void CTFWeaponInvis::SetWeaponVisible( bool visible )
+{
+ CBaseViewModel *vm = NULL;
+
+ CBasePlayer *pOwner = ToBasePlayer( GetOwner() );
+ if ( pOwner )
+ {
+ vm = pOwner->GetViewModel( m_nViewModelIndex );
+ }
+
+ if ( visible )
+ {
+ RemoveEffects( EF_NODRAW );
+ if ( vm )
+ {
+ vm->RemoveEffects( EF_NODRAW );
+ }
+ }
+ else
+ {
+ AddEffects( EF_NODRAW );
+ if ( vm )
+ {
+ vm->AddEffects( EF_NODRAW );
+ }
+ }
+}
+
+//-----------------------------------------------------------------------------
+bool CTFWeaponInvis::Deploy( void )
+{
+ bool b = BaseClass::Deploy();
+
+ SetWeaponIdleTime( gpGlobals->curtime + 1.5 );
+
+ return b;
+}
+
+//-----------------------------------------------------------------------------
+bool CTFWeaponInvis::Holster( CBaseCombatWeapon *pSwitchingTo )
+{
+ bool bHolster = BaseClass::Holster( pSwitchingTo );
+
+ // far in the future
+ SetWeaponIdleTime( gpGlobals->curtime + 10 );
+
+ return bHolster;
+}
+
+//-----------------------------------------------------------------------------
+void CTFWeaponInvis::PrimaryAttack( void )
+{
+ // do nothing
+}
+
+//-----------------------------------------------------------------------------
+void CTFWeaponInvis::SecondaryAttack( void )
+{
+ // do nothing
+}
+
+//-----------------------------------------------------------------------------
+void CTFWeaponInvis::ItemBusyFrame( void )
+{
+ // do nothing
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: the player alt-fired or otherwise activated the functionality of
+// the invisibility watch
+//-----------------------------------------------------------------------------
+bool CTFWeaponInvis::ActivateInvisibilityWatch( void )
+{
+ CTFPlayer *pOwner = ToTFPlayer( GetOwner() );
+ if ( !pOwner )
+ return false;
+
+ SetCloakRates();
+
+ bool bDoSkill = false;
+ // If we're in TF_COND_STEALTHED - which means we gave it ourselves - always remove it
+ // If we're in TF_COND_STEALTHED_USER_BUFF and we have Dead Ringer, allow it to be toggled
+ // since we're allowed to fire from stealth
+ if ( pOwner->m_Shared.InCond( TF_COND_STEALTHED ) )
+ {
+ // De-cloak.
+ float flDecloakRate = 0.0f;
+ CALL_ATTRIB_HOOK_FLOAT( flDecloakRate, mult_decloak_rate );
+ if ( flDecloakRate <= 0.0f )
+ flDecloakRate = 1.0f;
+
+ pOwner->m_Shared.FadeInvis( 1.0f );
+ }
+ else
+ {
+ if ( HasFeignDeath() )
+ {
+ if ( pOwner->m_Shared.IsFeignDeathReady() )
+ {
+ // Turn it off...
+ SetFeignDeathState( false );
+ }
+ else if ( pOwner->m_Shared.GetSpyCloakMeter() == 100.f )
+ {
+ // Turn it on...
+ SetFeignDeathState( true );
+ }
+ }
+ else if ( pOwner->CanGoInvisible() && ( pOwner->m_Shared.GetSpyCloakMeter() > 8.0f ) ) // must have over 10% cloak to start
+ {
+ // Do standard cloak.
+ pOwner->m_Shared.AddCond( TF_COND_STEALTHED, -1.f, pOwner );
+
+#ifdef STAGING_ONLY
+ if ( pOwner->m_Shared.HasPhaseCloakAbility() )
+ {
+ pOwner->m_Shared.AddCond( TF_COND_STEALTHED_PHASE, -1.f, pOwner );
+ }
+#endif // STAGING_ONLY
+
+ bDoSkill = true;
+ }
+ }
+
+ if ( bDoSkill )
+ {
+ pOwner->m_Shared.SetNextStealthTime( gpGlobals->curtime + 0.5 );
+ }
+ else
+ {
+ pOwner->m_Shared.SetNextStealthTime( gpGlobals->curtime + 0.1 );
+ }
+
+ return bDoSkill;
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: the player has changed loadouts or done something else that causes
+// us to clean up any side effects of our watch
+//-----------------------------------------------------------------------------
+void CTFWeaponInvis::CleanupInvisibilityWatch( void )
+{
+ CTFPlayer *pOwner = ToTFPlayer( GetOwner() );
+ if ( !pOwner )
+ return;
+
+ pOwner->m_Shared.SetFeignDeathReady( false );
+
+ if ( pOwner->m_Shared.IsStealthed() )
+ {
+ // De-cloak.
+ pOwner->m_Shared.FadeInvis( 1.0f );
+ }
+
+ pOwner->HolsterOffHandWeapon();
+}
+
+//-----------------------------------------------------------------------------
+// Purpose:
+//-----------------------------------------------------------------------------
+void CTFWeaponInvis::SetFeignDeathState( bool bEnabled )
+{
+ CTFPlayer *pOwner = ToTFPlayer( GetOwner() );
+ if ( !pOwner )
+ return;
+
+ if ( pOwner->m_Shared.InCond( TF_COND_GRAPPLINGHOOK ) )
+ return;
+
+ if ( bEnabled )
+ {
+ pOwner->m_Shared.SetFeignDeathReady( true );
+ pOwner->SetOffHandWeapon( this );
+ pOwner->m_Shared.SetNextStealthTime( gpGlobals->curtime + 0.5 );
+ }
+ else
+ {
+ pOwner->m_Shared.SetFeignDeathReady( false );
+ if ( !pOwner->m_Shared.InCond( TF_COND_STEALTHED ) )
+ {
+ pOwner->HolsterOffHandWeapon();
+ if ( pOwner->GetActiveWeapon() )
+ {
+ pOwner->GetActiveWeapon()->m_flNextPrimaryAttack = gpGlobals->curtime + 0.1f;
+ }
+ }
+ }
+}
+
+//-----------------------------------------------------------------------------
+// Purpose: Set the correct cloak consume & regen rates for this item.
+//-----------------------------------------------------------------------------
+void CTFWeaponInvis::SetCloakRates( void )
+{
+ CTFPlayer *pOwner = ToTFPlayer( GetOwner() );
+
+ float fCloakConsumeRate = tf_spy_cloak_consume_rate.GetFloat();
+ float fCloakConsumeFactor = 1.0f;
+ CALL_ATTRIB_HOOK_FLOAT_ON_OTHER( pOwner, fCloakConsumeFactor, mult_cloak_meter_consume_rate ); // Ask the owner since this attr may come from another weapon
+
+ // This value is a inverse scale and does not match expectations on description
+ // so we subtract and invert to make it align
+ // ie 25% (0.75% in schema) makes 10seconds go to 13.3 when we want 12.5
+ // 2 - 0.75 = 1.25... 1 / 1.25 = 0.8.. Consume rate "8". 10s / 0.8 = 12.5s
+ if ( fCloakConsumeFactor < 1.0f )
+ {
+ fCloakConsumeFactor = 1.0f / (2.0f - fCloakConsumeFactor);
+ }
+
+ pOwner->m_Shared.SetCloakConsumeRate( fCloakConsumeRate * fCloakConsumeFactor );
+
+ float fCloakRegenRate = tf_spy_cloak_regen_rate.GetFloat();
+ float fCloakRegenFactor = 1.0f;
+ CALL_ATTRIB_HOOK_FLOAT( fCloakRegenFactor, mult_cloak_meter_regen_rate );
+ pOwner->m_Shared.SetCloakRegenRate( fCloakRegenRate * fCloakRegenFactor );
+}
+
+#ifndef CLIENT_DLL
+
+//-----------------------------------------------------------------------------
+// Purpose: Return the right pda panel for the watch model we're using
+//-----------------------------------------------------------------------------
+void CTFWeaponInvis::GetControlPanelInfo( int nPanelIndex, const char *&pPanelName )
+{
+ const char *pszViewModel = GetViewModel(0);
+ if ( Q_stristr( pszViewModel, "pocket" ) )
+ {
+ pPanelName = "pda_panel_spy_invis_pocket";
+ }
+ else if ( Q_stristr( pszViewModel, "ttg_watch_spy" ) )
+ {
+ pPanelName = "pda_panel_spy_invis_pocket_ttg";
+ }
+ else if ( Q_stristr( pszViewModel, "hm_watch" ) )
+ {
+ pPanelName = "pda_panel_spy_invis_pocket_hm";
+ }
+ else
+ {
+ pPanelName = "pda_panel_spy_invis";
+ }
+}
+
+#endif