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.
235 lines
6.0 KiB
235 lines
6.0 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
//============================================================================= |
|
|
|
#include "cbase.h" |
|
#include "tf_weapon_fists.h" |
|
#include "decals.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" |
|
#endif |
|
|
|
//============================================================================= |
|
// |
|
// Weapon Fists tables. |
|
// |
|
IMPLEMENT_NETWORKCLASS_ALIASED( TFFists, DT_TFWeaponFists ) |
|
|
|
BEGIN_NETWORK_TABLE( CTFFists, DT_TFWeaponFists ) |
|
END_NETWORK_TABLE() |
|
|
|
BEGIN_PREDICTION_DATA( CTFFists ) |
|
END_PREDICTION_DATA() |
|
|
|
LINK_ENTITY_TO_CLASS( tf_weapon_fists, CTFFists ); |
|
PRECACHE_WEAPON_REGISTER( tf_weapon_fists ); |
|
|
|
//============================================================================= |
|
// |
|
// Weapon Fists functions. |
|
// |
|
|
|
// ----------------------------------------------------------------------------- |
|
// Purpose: |
|
// ----------------------------------------------------------------------------- |
|
void CTFFists::ItemPreFrame( void ) |
|
{ |
|
return BaseClass::ItemPreFrame(); |
|
} |
|
|
|
// ----------------------------------------------------------------------------- |
|
// Purpose: |
|
// ----------------------------------------------------------------------------- |
|
void CTFFists::PrimaryAttack() |
|
{ |
|
if ( !CanAttack() ) |
|
return; |
|
|
|
// Set the weapon usage mode - primary, secondary. |
|
// reversed for 360 because the primary attack is on the right side of the controller |
|
if ( IsX360() || IsViewModelFlipped() ) |
|
{ |
|
m_iWeaponMode = TF_WEAPON_SECONDARY_MODE; |
|
} |
|
else |
|
{ |
|
m_iWeaponMode = TF_WEAPON_PRIMARY_MODE; |
|
} |
|
|
|
Punch(); |
|
} |
|
|
|
// ----------------------------------------------------------------------------- |
|
// Purpose: |
|
// ----------------------------------------------------------------------------- |
|
void CTFFists::SecondaryAttack() |
|
{ |
|
if ( !CanAttack() ) |
|
return; |
|
|
|
CTFPlayer *pPlayer = GetTFPlayerOwner(); |
|
if ( pPlayer && pPlayer->m_Shared.IsControlStunned() ) |
|
{ |
|
return; |
|
} |
|
|
|
// Set the weapon usage mode - primary, secondary. |
|
if ( IsX360() || IsViewModelFlipped() ) |
|
{ |
|
m_iWeaponMode = TF_WEAPON_PRIMARY_MODE; |
|
} |
|
else |
|
{ |
|
m_iWeaponMode = TF_WEAPON_SECONDARY_MODE; |
|
} |
|
|
|
Punch(); |
|
} |
|
|
|
// ----------------------------------------------------------------------------- |
|
// Purpose: |
|
// ----------------------------------------------------------------------------- |
|
bool CTFFists::Holster( CBaseCombatWeapon *pSwitchingTo ) |
|
{ |
|
return BaseClass::Holster( pSwitchingTo ); |
|
} |
|
|
|
// ----------------------------------------------------------------------------- |
|
// Purpose: |
|
// ----------------------------------------------------------------------------- |
|
void CTFFists::Punch( void ) |
|
{ |
|
// Get the current player. |
|
CTFPlayer *pPlayer = GetTFPlayerOwner(); |
|
if ( !pPlayer ) |
|
return; |
|
|
|
// Swing the weapon. |
|
Swing( pPlayer ); |
|
|
|
m_flNextSecondaryAttack = m_flNextPrimaryAttack; |
|
|
|
#if !defined( CLIENT_DLL ) |
|
pPlayer->SpeakWeaponFire(); |
|
CTF_GameStats.Event_PlayerFiredWeapon( pPlayer, IsCurrentAttackACrit() ); |
|
|
|
if ( pPlayer->m_Shared.IsStealthed() ) |
|
{ |
|
pPlayer->RemoveInvisibility(); |
|
} |
|
#else |
|
C_CTF_GameStats.Event_PlayerFiredWeapon( pPlayer, IsCurrentAttackACrit() ); |
|
#endif |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: Allow melee weapons to send different anim events |
|
// Input : - |
|
//----------------------------------------------------------------------------- |
|
void CTFFists::SendPlayerAnimEvent( CTFPlayer *pPlayer ) |
|
{ |
|
// Send extra activities to the weapon for breadgloves |
|
if ( IsCurrentAttackACrit() ) |
|
{ |
|
pPlayer->DoAnimationEvent( PLAYERANIMEVENT_ATTACK_SECONDARY ); |
|
} |
|
else |
|
{ |
|
pPlayer->DoAnimationEvent( PLAYERANIMEVENT_ATTACK_PRIMARY ); |
|
} |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void CTFFists::DoViewModelAnimation( void ) |
|
{ |
|
Activity act; |
|
|
|
if ( IsCurrentAttackACrit() ) |
|
{ |
|
act = ACT_VM_SWINGHARD; |
|
} |
|
else |
|
{ |
|
act = ( m_iWeaponMode == TF_WEAPON_PRIMARY_MODE ) ? ACT_VM_HITLEFT : ACT_VM_HITRIGHT; |
|
} |
|
|
|
SendWeaponAnim( act ); |
|
|
|
// Send WeaponAnim actually sets all anims and we want an override for the world model |
|
//int iIsBreadgloves = 0; |
|
//CALL_ATTRIB_HOOK_INT( iIsBreadgloves, breadgloves_properties ); |
|
//if ( iIsBreadgloves ) |
|
//{ |
|
// ResetSequence( SelectWeightedSequence( ACT_BREADMONSTER_GLOVES_HITRIGHT ) ); |
|
// SetPlaybackRate( 0.0f ); |
|
// ResetClientsideFrame(); |
|
//} |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
bool CTFFists::AllowTaunts( void ) |
|
{ |
|
// Radial buff fists don't allow player to taunt manually |
|
return ( GetFistType() != FISTTYPE_RADIAL_BUFF ); |
|
} |
|
|
|
#ifdef GAME_DLL |
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void CTFFists::OnEntityHit( CBaseEntity *pEntity, CTakeDamageInfo *info ) |
|
{ |
|
CTFPlayer *pHitPlayer = ToTFPlayer( pEntity ); |
|
|
|
if ( !pHitPlayer ) |
|
return; |
|
|
|
// Get the current player. |
|
CTFPlayer *pPlayer = GetTFPlayerOwner(); |
|
if ( !pPlayer ) |
|
return; |
|
|
|
if ( pHitPlayer->GetTeamNumber() == pPlayer->GetTeamNumber() ) |
|
return; |
|
|
|
if ( pPlayer->m_Shared.InCond( TF_COND_INVULNERABLE ) ) |
|
{ |
|
int iNumHealers = pPlayer->m_Shared.GetNumHealers(); |
|
|
|
// for each medic healing me |
|
for ( int i=0;i<iNumHealers;i++ ) |
|
{ |
|
CTFPlayer *pMedic = ToTFPlayer( pPlayer->m_Shared.GetHealerByIndex( i ) ); |
|
|
|
// if it's a medic and that medic is releasing charge |
|
if ( pMedic && pMedic->GetChargeEffectBeingProvided() == MEDIGUN_CHARGE_INVULN ) |
|
{ |
|
// they are invulning me - add pEntity to their list of people punched |
|
pMedic->HandleAchievement_Medic_AssistHeavy( pHitPlayer ); |
|
} |
|
} |
|
} |
|
|
|
// If we've killed someone, check to see for the unique fist kill response |
|
if ( !pEntity->IsAlive() ) |
|
{ |
|
if ( GetFistType() == FISTTYPE_RADIAL_BUFF ) |
|
{ |
|
pPlayer->Taunt(); |
|
} |
|
} |
|
} |
|
#endif |