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.
191 lines
5.3 KiB
191 lines
5.3 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
//============================================================================= |
|
|
|
#include "cbase.h" |
|
#include "tf_weapon_bonesaw.h" |
|
#include "tf_weapon_medigun.h" |
|
#ifdef GAME_DLL |
|
#include "tf_player.h" |
|
#else |
|
#include "c_tf_player.h" |
|
#endif |
|
|
|
|
|
#define UBERSAW_CHARGE_POSEPARAM "syringe_charge_level" |
|
|
|
//============================================================================= |
|
// |
|
// Weapon Bonesaw tables. |
|
// |
|
|
|
IMPLEMENT_NETWORKCLASS_ALIASED( TFBonesaw, DT_TFWeaponBonesaw ) |
|
|
|
BEGIN_NETWORK_TABLE( CTFBonesaw, DT_TFWeaponBonesaw ) |
|
END_NETWORK_TABLE() |
|
|
|
BEGIN_PREDICTION_DATA( CTFBonesaw ) |
|
END_PREDICTION_DATA() |
|
|
|
LINK_ENTITY_TO_CLASS( tf_weapon_bonesaw, CTFBonesaw ); |
|
PRECACHE_WEAPON_REGISTER( tf_weapon_bonesaw ); |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void CTFBonesaw::Activate( void ) |
|
{ |
|
BaseClass::Activate(); |
|
} |
|
//----------------------------------------------------------------------------- |
|
void CTFBonesaw::SecondaryAttack( void ) |
|
{ |
|
CTFPlayer *pPlayer = GetTFPlayerOwner(); |
|
if ( !pPlayer ) |
|
return; |
|
|
|
#ifdef GAME_DLL |
|
int iSpecialTaunt = 0; |
|
CALL_ATTRIB_HOOK_INT( iSpecialTaunt, special_taunt ); |
|
if ( iSpecialTaunt ) |
|
{ |
|
pPlayer->Taunt( TAUNT_BASE_WEAPON ); |
|
return; |
|
} |
|
#endif |
|
BaseClass::SecondaryAttack(); |
|
} |
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
bool CTFBonesaw::DefaultDeploy( char *szViewModel, char *szWeaponModel, int iActivity, char *szAnimExt ) |
|
{ |
|
if ( BaseClass::DefaultDeploy( szViewModel, szWeaponModel, iActivity, szAnimExt ) ) |
|
{ |
|
#ifdef CLIENT_DLL |
|
UpdateChargePoseParam(); |
|
#endif |
|
return true; |
|
} |
|
|
|
return false; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
void CTFBonesaw::DoMeleeDamage( CBaseEntity* ent, trace_t& trace ) |
|
{ |
|
// We hit a target, take a head |
|
CTFPlayer *pPlayer = ToTFPlayer( GetOwnerEntity() ); |
|
CTFPlayer *pVictim = ToTFPlayer( ent ); |
|
|
|
int iTakeHeads = 0; |
|
CALL_ATTRIB_HOOK_INT( iTakeHeads, add_head_on_hit ); |
|
if ( pPlayer && pVictim && iTakeHeads && (pVictim->GetTeamNumber() != pPlayer->GetTeamNumber() ) ) |
|
{ |
|
int iDecaps = pPlayer->m_Shared.GetDecapitations() + 1; |
|
pPlayer->m_Shared.SetDecapitations( iDecaps ); |
|
pPlayer->TeamFortress_SetSpeed(); |
|
} |
|
|
|
BaseClass::DoMeleeDamage( ent, trace ); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
float CTFBonesaw::GetBoneSawSpeedMod( void ) |
|
{ |
|
const int MAX_HEADS_FOR_SPEED = 10; |
|
// Calculate Speed based on heads |
|
CTFPlayer *pPlayer = ToTFPlayer( GetOwnerEntity() ); |
|
|
|
int iTakeHeads = 0; |
|
CALL_ATTRIB_HOOK_INT( iTakeHeads, add_head_on_hit ); |
|
if ( pPlayer && iTakeHeads ) |
|
{ |
|
int iDecaps = Min( MAX_HEADS_FOR_SPEED, pPlayer->m_Shared.GetDecapitations() ); |
|
return 1.f + (iDecaps * 0.05f); |
|
} |
|
return 1.f; |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
int CTFBonesaw::GetCount( void ) |
|
{ |
|
CTFPlayer *pOwner = ToTFPlayer( GetOwner() ); |
|
if ( !pOwner ) |
|
return 0; |
|
|
|
return pOwner->m_Shared.GetDecapitations(); |
|
} |
|
|
|
#ifdef CLIENT_DLL |
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void CTFBonesaw::OnDataChanged( DataUpdateType_t updateType ) |
|
{ |
|
BaseClass::OnDataChanged( updateType ); |
|
|
|
UpdateChargePoseParam(); |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void CTFBonesaw::UpdateAttachmentModels( void ) |
|
{ |
|
BaseClass::UpdateAttachmentModels(); |
|
|
|
if ( m_hViewmodelAttachment ) |
|
{ |
|
m_iUberChargePoseParam = m_hViewmodelAttachment->LookupPoseParameter( m_hViewmodelAttachment->GetModelPtr(), UBERSAW_CHARGE_POSEPARAM ); |
|
} |
|
else |
|
{ |
|
m_iUberChargePoseParam = LookupPoseParameter( GetModelPtr(), UBERSAW_CHARGE_POSEPARAM ); |
|
} |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void CTFBonesaw::UpdateChargePoseParam( void ) |
|
{ |
|
if ( m_iUberChargePoseParam >= 0 ) |
|
{ |
|
CTFPlayer *pTFPlayer = ToTFPlayer( GetOwner() ); |
|
if ( pTFPlayer && pTFPlayer->IsPlayerClass( TF_CLASS_MEDIC ) ) |
|
{ |
|
CWeaponMedigun *pMedigun = (CWeaponMedigun *)pTFPlayer->Weapon_OwnsThisID( TF_WEAPON_MEDIGUN ); |
|
if ( pMedigun ) |
|
{ |
|
m_flChargeLevel = pMedigun->GetChargeLevel(); |
|
|
|
// On the local client, we push the pose parameters onto the attached model |
|
if ( m_hViewmodelAttachment ) |
|
{ |
|
m_hViewmodelAttachment->SetPoseParameter( m_iUberChargePoseParam, pMedigun->GetChargeLevel() ); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
|
//----------------------------------------------------------------------------- |
|
// Purpose: |
|
//----------------------------------------------------------------------------- |
|
void CTFBonesaw::GetPoseParameters( CStudioHdr *pStudioHdr, float poseParameter[MAXSTUDIOPOSEPARAM] ) |
|
{ |
|
if ( !pStudioHdr ) |
|
return; |
|
|
|
BaseClass::GetPoseParameters( pStudioHdr, poseParameter ); |
|
|
|
if ( m_iUberChargePoseParam >= 0 ) |
|
{ |
|
poseParameter[m_iUberChargePoseParam] = m_flChargeLevel; |
|
} |
|
} |
|
|
|
#endif |