diff options
Diffstat (limited to 'game/shared/tf/tf_weapon_pistol.cpp')
| -rw-r--r-- | game/shared/tf/tf_weapon_pistol.cpp | 259 |
1 files changed, 259 insertions, 0 deletions
diff --git a/game/shared/tf/tf_weapon_pistol.cpp b/game/shared/tf/tf_weapon_pistol.cpp new file mode 100644 index 0000000..6687893 --- /dev/null +++ b/game/shared/tf/tf_weapon_pistol.cpp @@ -0,0 +1,259 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// +//============================================================================= +#include "cbase.h" +#include "tf_weapon_pistol.h" +#include "tf_fx_shared.h" +#include "in_buttons.h" +#include "tf_gamerules.h" + +// Client specific. +#ifdef CLIENT_DLL +#include "c_tf_player.h" +#include "c_tf_gamestats.h" +// Server specific. +#else +#include "tf_player.h" +#include "tf_gamestats.h" +#include "ilagcompensationmanager.h" +#endif + +//============================================================================= +// +// Weapon Pistol tables. +// +IMPLEMENT_NETWORKCLASS_ALIASED( TFPistol, DT_WeaponPistol ) + +BEGIN_NETWORK_TABLE( CTFPistol, DT_WeaponPistol ) +END_NETWORK_TABLE() + +BEGIN_PREDICTION_DATA( CTFPistol ) +END_PREDICTION_DATA() + +LINK_ENTITY_TO_CLASS( tf_weapon_pistol, CTFPistol ); +PRECACHE_WEAPON_REGISTER( tf_weapon_pistol ); + +// Server specific. +#ifndef CLIENT_DLL +BEGIN_DATADESC( CTFPistol ) +END_DATADESC() +#endif + +//============================ + +IMPLEMENT_NETWORKCLASS_ALIASED( TFPistol_Scout, DT_WeaponPistol_Scout ) + +BEGIN_NETWORK_TABLE( CTFPistol_Scout, DT_WeaponPistol_Scout ) +END_NETWORK_TABLE() + +BEGIN_PREDICTION_DATA( CTFPistol_Scout ) +END_PREDICTION_DATA() + +LINK_ENTITY_TO_CLASS( tf_weapon_pistol_scout, CTFPistol_Scout ); +PRECACHE_WEAPON_REGISTER( tf_weapon_pistol_scout ); + +//============================ + +IMPLEMENT_NETWORKCLASS_ALIASED( TFPistol_ScoutPrimary, DT_WeaponPistol_ScoutPrimary ) + +BEGIN_NETWORK_TABLE( CTFPistol_ScoutPrimary, DT_WeaponPistol_ScoutPrimary ) +END_NETWORK_TABLE() + +BEGIN_PREDICTION_DATA( CTFPistol_ScoutPrimary ) +END_PREDICTION_DATA() + +LINK_ENTITY_TO_CLASS( tf_weapon_handgun_scout_primary, CTFPistol_ScoutPrimary ); +PRECACHE_WEAPON_REGISTER( tf_weapon_handgun_scout_primary ); + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +CTFPistol_ScoutPrimary::CTFPistol_ScoutPrimary() +{ + m_flPushTime = -1.f; +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CTFPistol_ScoutPrimary::PlayWeaponShootSound( void ) +{ + BaseClass::PlayWeaponShootSound(); + + if ( TFGameRules()->GameModeUsesUpgrades() ) + { + PlayUpgradedShootSound( "Weapon_Upgrade.DamageBonus" ); + } +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CTFPistol_ScoutPrimary::SecondaryAttack( void ) +{ + CTFPlayer *pOwner = ToTFPlayer( GetPlayerOwner() ); + if ( !pOwner ) + return; + + if ( !CanAttack() ) + return; + + if ( m_flNextSecondaryAttack > gpGlobals->curtime ) + return; + + pOwner->DoAnimationEvent( PLAYERANIMEVENT_ATTACK_SECONDARY ); + SendWeaponAnim( ACT_SECONDARY_VM_ALTATTACK ); + + m_flNextPrimaryAttack = gpGlobals->curtime + 0.6f; + m_flNextSecondaryAttack = gpGlobals->curtime + 1.5f; + m_flPushTime = gpGlobals->curtime + 0.2f; // Anim delay + + EmitSound( "Weapon_Hands.Push" ); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CTFPistol_ScoutPrimary::Push( void ) +{ + CTFPlayer *pOwner = ToTFPlayer( GetPlayerOwner() ); + if ( !pOwner ) + return; + +#ifdef GAME_DLL + lagcompensation->StartLagCompensation( pOwner, pOwner->GetCurrentCommand() ); + + CUtlVector< CTFPlayer* > enemyVector; + CollectPlayers( &enemyVector, GetEnemyTeam( pOwner->GetTeamNumber() ), COLLECT_ONLY_LIVING_PLAYERS ); + + for ( int i = 0; i < enemyVector.Count(); ++i ) + { + CTFPlayer *pVictim = enemyVector[i]; + + if ( !pVictim->IsAlive() ) + continue; + + if ( pVictim == pOwner ) + continue; + + if ( pVictim->InSameTeam( pOwner ) ) + continue; + + if ( TFGameRules() && TFGameRules()->IsTruceActive() && pOwner->IsTruceValidForEnt() ) + continue; + + if ( ( pOwner->GetAbsOrigin()- pVictim->GetAbsOrigin() ).LengthSqr() > ( 128.f * 128.f ) ) + continue; + + if ( !pOwner->FVisible( pVictim, MASK_SOLID ) ) + continue; + + Vector vecEyes = pOwner->EyePosition(); + Vector vecForward; + AngleVectors( pOwner->EyeAngles(), &vecForward ); + CTraceFilterSimple traceFilter( this, COLLISION_GROUP_NONE ); + const Vector vHull = Vector( 16.f, 16.f, 16.f ); + trace_t trace; + + float flDist = 50.f; + UTIL_TraceHull( vecEyes, vecEyes + vecForward * flDist, -vHull, vHull, MASK_SOLID, &traceFilter, &trace ); + + bool bDebug = false; + if ( bDebug ) + { + NDebugOverlay::SweptBox( vecEyes, vecEyes + vecForward * flDist, -vHull, vHull, pOwner->EyeAngles(), 255, 0, 0, 40, 5 ); + } + + if ( trace.m_pEnt && trace.m_pEnt == pVictim && trace.fraction < 1.f ) + { + Vector vecToVictim = pVictim->GetAbsOrigin() - pOwner->GetAbsOrigin(); + VectorNormalize( vecToVictim ); + pVictim->ApplyAirBlastImpulse( vecToVictim * 400.f ); + float flDamage = 1.f; + CTakeDamageInfo info( pOwner, pVictim, this, flDamage, DMG_MELEE | DMG_NEVERGIB | DMG_CLUB, TF_DMG_CUSTOM_NONE ); + CalculateMeleeDamageForce( &info, vecForward, GetAbsOrigin() + vecForward * flDist, 1.f / flDamage * 80.f ); + pVictim->DispatchTraceAttack( info, vecForward, &trace ); + ApplyMultiDamage(); + + CPVSFilter filter( vecToVictim ); + EmitSound( "Weapon_Hands.PushImpact" ); + + // Make sure we get credit for the push if the target falls to its death + pVictim->m_AchievementData.AddDamagerToHistory( pOwner ); + + break; + } + } + + pOwner->SpeakWeaponFire(); + CTF_GameStats.Event_PlayerFiredWeapon( pOwner, IsCurrentAttackACrit() ); + + lagcompensation->FinishLagCompensation( pOwner ); +#else + C_CTF_GameStats.Event_PlayerFiredWeapon( pOwner, IsCurrentAttackACrit() ); +#endif +} + +//----------------------------------------------------------------------------- +// Purpose: +// Input : - +//----------------------------------------------------------------------------- +void CTFPistol_ScoutPrimary::ItemPostFrame() +{ + // Check for smack. + if ( m_flPushTime > -1.f && gpGlobals->curtime > m_flPushTime ) + { + Push(); + m_flPushTime = -1.f; + } + + BaseClass::ItemPostFrame(); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +bool CTFPistol_ScoutPrimary::Holster( CBaseCombatWeapon *pSwitchingTo ) +{ + m_flPushTime = -1.f; + + return BaseClass::Holster( pSwitchingTo ); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CTFPistol_ScoutPrimary::Precache( void ) +{ + PrecacheScriptSound( "Weapon_Hands.Push" ); + PrecacheScriptSound( "Weapon_Hands.PushImpact" ); + + BaseClass::Precache(); +} + +//============================ + +IMPLEMENT_NETWORKCLASS_ALIASED( TFPistol_ScoutSecondary, DT_WeaponPistol_ScoutSecondary ) + +BEGIN_NETWORK_TABLE( CTFPistol_ScoutSecondary, DT_WeaponPistol_ScoutSecondary ) +END_NETWORK_TABLE() + +BEGIN_PREDICTION_DATA( CTFPistol_ScoutSecondary ) +END_PREDICTION_DATA() + +LINK_ENTITY_TO_CLASS( tf_weapon_handgun_scout_secondary, CTFPistol_ScoutSecondary ); +PRECACHE_WEAPON_REGISTER( tf_weapon_handgun_scout_secondary ); + +//----------------------------------------------------------------------------- +int CTFPistol_ScoutSecondary::GetDamageType( void ) const +{ + int iBackheadshot = 0; + CALL_ATTRIB_HOOK_INT( iBackheadshot, back_headshot ); + if ( iBackheadshot ) + { + return BaseClass::GetDamageType() | DMG_USE_HITLOCATIONS; + } + return BaseClass::GetDamageType(); +} |