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.
345 lines
6.7 KiB
345 lines
6.7 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $NoKeywords: $ |
|
// |
|
//=============================================================================// |
|
|
|
#include "cbase.h" |
|
#include "dod_gamerules.h" |
|
#include "weapon_dodbaserpg.h" |
|
|
|
|
|
#ifdef CLIENT_DLL |
|
|
|
#include "c_dod_player.h" |
|
#include "prediction.h" |
|
|
|
#else |
|
|
|
#include "dod_player.h" |
|
|
|
#endif |
|
|
|
IMPLEMENT_NETWORKCLASS_ALIASED( DODBaseRocketWeapon, DT_BaseRocketWeapon ) |
|
|
|
BEGIN_NETWORK_TABLE( CDODBaseRocketWeapon, DT_BaseRocketWeapon ) |
|
|
|
#ifdef CLIENT_DLL |
|
RecvPropBool( RECVINFO(m_bDeployed) ) |
|
#else |
|
SendPropBool( SENDINFO(m_bDeployed) ) |
|
#endif |
|
|
|
END_NETWORK_TABLE() |
|
|
|
BEGIN_PREDICTION_DATA( CDODBaseRocketWeapon ) |
|
END_PREDICTION_DATA() |
|
|
|
#ifndef CLIENT_DLL |
|
|
|
BEGIN_DATADESC( CDODBaseRocketWeapon ) |
|
END_DATADESC() |
|
|
|
#endif |
|
|
|
LINK_ENTITY_TO_CLASS( weapon_dodbaserpg, CDODBaseRocketWeapon ); |
|
|
|
CDODBaseRocketWeapon::CDODBaseRocketWeapon() |
|
{ |
|
} |
|
|
|
void CDODBaseRocketWeapon::Precache() |
|
{ |
|
BaseClass::Precache(); |
|
} |
|
|
|
bool CDODBaseRocketWeapon::Reload( void ) |
|
{ |
|
CDODPlayer *pPlayer = GetDODPlayerOwner(); |
|
|
|
if (pPlayer->GetAmmoCount( GetPrimaryAmmoType() ) <= 0) |
|
{ |
|
CDODPlayer *pDODPlayer = ToDODPlayer( pPlayer ); |
|
pDODPlayer->HintMessage( HINT_AMMO_EXHAUSTED ); |
|
return false; |
|
} |
|
|
|
Activity actReload; |
|
|
|
if( IsDeployed() ) |
|
actReload = ACT_VM_RELOAD_DEPLOYED; |
|
else |
|
actReload = ACT_VM_RELOAD; |
|
|
|
int iResult = DefaultReload( GetMaxClip1(), GetMaxClip2(), actReload ); |
|
if ( !iResult ) |
|
return false; |
|
|
|
pPlayer->SetAnimation( PLAYER_RELOAD ); |
|
|
|
// if we don't want the auto-rezoom, undeploy here |
|
if ( !pPlayer->ShouldAutoRezoom() ) |
|
{ |
|
m_bDeployed = false; |
|
pPlayer->SetBazookaDeployed( m_bDeployed ); |
|
} |
|
|
|
return true; |
|
} |
|
|
|
bool CDODBaseRocketWeapon::ShouldPlayerBeSlow( void ) |
|
{ |
|
if( IsDeployed() && !m_bInReload ) |
|
{ |
|
return true; |
|
} |
|
else |
|
return false; |
|
} |
|
|
|
void CDODBaseRocketWeapon::Spawn( ) |
|
{ |
|
WEAPON_FILE_INFO_HANDLE hWpnInfo = LookupWeaponInfoSlot( GetClassname() ); |
|
|
|
Assert( hWpnInfo != GetInvalidWeaponInfoHandle() ); |
|
|
|
CDODWeaponInfo *pWeaponInfo = dynamic_cast< CDODWeaponInfo* >( GetFileWeaponInfoFromHandle( hWpnInfo ) ); |
|
|
|
Assert( pWeaponInfo && "Failed to get CDODWeaponInfo in weapon spawn" ); |
|
|
|
m_pWeaponInfo = pWeaponInfo; |
|
|
|
BaseClass::Spawn(); |
|
} |
|
|
|
void CDODBaseRocketWeapon::Drop( const Vector &vecVelocity ) |
|
{ |
|
SetDeployed( false ); |
|
|
|
BaseClass::Drop( vecVelocity ); |
|
} |
|
|
|
bool CDODBaseRocketWeapon::Deploy( ) |
|
{ |
|
return DefaultDeploy( (char*)GetViewModel(), (char*)GetWorldModel(), GetDrawActivity(), (char*)GetAnimPrefix() ); |
|
} |
|
|
|
Activity CDODBaseRocketWeapon::GetDrawActivity( void ) |
|
{ |
|
return ACT_VM_DRAW; |
|
} |
|
|
|
bool CDODBaseRocketWeapon::CanHolster( void ) |
|
{ |
|
// can't holster if we are delpoyed and not reloading |
|
if ( IsDeployed() && !m_bInReload ) |
|
return false; |
|
|
|
return true; |
|
} |
|
|
|
bool CDODBaseRocketWeapon::Holster( CBaseCombatWeapon *pSwitchingTo ) |
|
{ |
|
#ifndef CLIENT_DLL |
|
|
|
CDODPlayer *pPlayer = ToDODPlayer( GetPlayerOwner() ); |
|
pPlayer->SetBazookaDeployed( false ); |
|
|
|
#endif |
|
|
|
SetDeployed( false ); |
|
|
|
return BaseClass::Holster(pSwitchingTo); |
|
} |
|
|
|
|
|
void CDODBaseRocketWeapon::PrimaryAttack() |
|
{ |
|
Assert( m_pWeaponInfo ); |
|
|
|
CDODPlayer *pPlayer = ToDODPlayer( GetPlayerOwner() ); |
|
|
|
// Out of ammo? |
|
if ( m_iClip1 <= 0 ) |
|
{ |
|
if (m_bFireOnEmpty) |
|
{ |
|
PlayEmptySound(); |
|
m_flNextPrimaryAttack = gpGlobals->curtime + 0.2; |
|
} |
|
|
|
return; |
|
} |
|
|
|
if( pPlayer->GetWaterLevel() > 2 ) |
|
{ |
|
PlayEmptySound(); |
|
m_flNextPrimaryAttack = gpGlobals->curtime + 1.0; |
|
return; |
|
} |
|
|
|
if( IsDeployed() ) |
|
{ |
|
// player "shoot" animation |
|
pPlayer->SetAnimation( PLAYER_ATTACK1 ); |
|
|
|
SendWeaponAnim( ACT_VM_PRIMARYATTACK ); |
|
|
|
FireRocket(); |
|
|
|
DoFireEffects(); |
|
|
|
m_iClip1--; |
|
|
|
#ifdef CLIENT_DLL |
|
if ( prediction->IsFirstTimePredicted() ) |
|
pPlayer->DoRecoil( GetWeaponID(), GetRecoil() ); |
|
#endif |
|
|
|
if ( m_iClip1 <= 0 && pPlayer->GetAmmoCount( GetPrimaryAmmoType() ) <= 0 ) |
|
{ |
|
Lower(); |
|
} |
|
|
|
m_flNextPrimaryAttack = gpGlobals->curtime + SequenceDuration() + 0.5; |
|
m_flTimeWeaponIdle = gpGlobals->curtime + SequenceDuration() + 0.5; //length of the fire anim! |
|
|
|
#ifndef CLIENT_DLL |
|
IGameEvent * event = gameeventmanager->CreateEvent( "dod_stats_weapon_attack" ); |
|
if ( event ) |
|
{ |
|
event->SetInt( "attacker", pPlayer->GetUserID() ); |
|
event->SetInt( "weapon", GetStatsWeaponID() ); |
|
|
|
gameeventmanager->FireEvent( event ); |
|
} |
|
#endif //CLIENT_DLL |
|
} |
|
else |
|
{ |
|
#ifdef CLIENT_DLL |
|
pPlayer->HintMessage( HINT_SHOULDER_WEAPON, true ); |
|
#endif |
|
|
|
m_flNextPrimaryAttack = gpGlobals->curtime + 2.0f; |
|
} |
|
} |
|
|
|
void CDODBaseRocketWeapon::FireRocket( void ) |
|
{ |
|
Assert( !"Derived classes must implement this." ); |
|
} |
|
|
|
void CDODBaseRocketWeapon::DoFireEffects() |
|
{ |
|
CBasePlayer *pPlayer = GetPlayerOwner(); |
|
|
|
if ( pPlayer ) |
|
pPlayer->DoMuzzleFlash(); |
|
|
|
//smoke etc |
|
} |
|
|
|
void CDODBaseRocketWeapon::SecondaryAttack() |
|
{ |
|
CBasePlayer *pPlayer = GetPlayerOwner(); |
|
|
|
//if we're underwater, lower it |
|
if( pPlayer->GetWaterLevel() > 2 ) |
|
{ |
|
if( IsDeployed() ) |
|
Lower(); |
|
return; |
|
} |
|
|
|
if( IsDeployed() ) |
|
{ |
|
Lower(); |
|
} |
|
else |
|
{ |
|
if ( CanAttack() ) |
|
Raise(); |
|
} |
|
} |
|
|
|
void CDODBaseRocketWeapon::WeaponIdle() |
|
{ |
|
if (m_flTimeWeaponIdle > gpGlobals->curtime) |
|
return; |
|
|
|
SendWeaponAnim( GetIdleActivity() ); |
|
|
|
m_flTimeWeaponIdle = gpGlobals->curtime + SequenceDuration(); |
|
} |
|
|
|
Activity CDODBaseRocketWeapon::GetIdleActivity( void ) |
|
{ |
|
Activity actIdle; |
|
|
|
if( IsDeployed() ) |
|
actIdle = ACT_VM_IDLE_DEPLOYED; |
|
else |
|
actIdle = ACT_VM_IDLE; |
|
|
|
return actIdle; |
|
} |
|
|
|
/* Raise the Bazooka to your shoulder */ |
|
void CDODBaseRocketWeapon::Raise() |
|
{ |
|
//raise to the shoulder |
|
SendWeaponAnim( GetRaiseActivity() ); |
|
|
|
m_bDeployed = true; |
|
|
|
m_flNextPrimaryAttack = gpGlobals->curtime + SequenceDuration(); |
|
m_flNextSecondaryAttack = gpGlobals->curtime + SequenceDuration(); |
|
m_flTimeWeaponIdle = gpGlobals->curtime + SequenceDuration(); |
|
} |
|
|
|
/* Lower the bazooka to running position */ |
|
bool CDODBaseRocketWeapon::Lower() |
|
{ |
|
SendWeaponAnim( GetLowerActivity() ); |
|
|
|
m_bDeployed = false; |
|
|
|
CDODPlayer *pPlayer = ToDODPlayer( GetPlayerOwner() ); |
|
pPlayer->SetBazookaDeployed( m_bDeployed ); |
|
|
|
m_flNextPrimaryAttack = gpGlobals->curtime + SequenceDuration(); |
|
m_flNextSecondaryAttack = gpGlobals->curtime + SequenceDuration(); |
|
m_flTimeWeaponIdle = gpGlobals->curtime + SequenceDuration(); |
|
|
|
return true; |
|
} |
|
|
|
Activity CDODBaseRocketWeapon::GetLowerActivity( void ) |
|
{ |
|
return ACT_VM_UNDEPLOY; |
|
} |
|
|
|
Activity CDODBaseRocketWeapon::GetRaiseActivity( void ) |
|
{ |
|
return ACT_VM_DEPLOY; |
|
} |
|
|
|
#ifdef CLIENT_DLL |
|
|
|
ConVar deployed_bazooka_sensitivity( "deployed_bazooka_sensitivity", "0.6", FCVAR_CHEAT, "Mouse sensitivity while deploying a bazooka" ); |
|
|
|
void CDODBaseRocketWeapon::OverrideMouseInput( float *x, float *y ) |
|
{ |
|
if( m_bDeployed ) |
|
{ |
|
float flSensitivity = deployed_bazooka_sensitivity.GetFloat(); |
|
|
|
*x *= flSensitivity; |
|
*y *= flSensitivity; |
|
} |
|
} |
|
|
|
#endif |