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
|