diff options
| author | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
|---|---|---|
| committer | FluorescentCIAAfricanAmerican <[email protected]> | 2020-04-22 12:56:21 -0400 |
| commit | 3bf9df6b2785fa6d951086978a3e66f49427166a (patch) | |
| tree | 2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /game/shared/tf2/weapon_mortar.cpp | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'game/shared/tf2/weapon_mortar.cpp')
| -rw-r--r-- | game/shared/tf2/weapon_mortar.cpp | 367 |
1 files changed, 367 insertions, 0 deletions
diff --git a/game/shared/tf2/weapon_mortar.cpp b/game/shared/tf2/weapon_mortar.cpp new file mode 100644 index 0000000..2fcd467 --- /dev/null +++ b/game/shared/tf2/weapon_mortar.cpp @@ -0,0 +1,367 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// +#include "cbase.h" +#include "tf_player.h" +#include "tf_basecombatweapon.h" +#include "tf_defines.h" +#include "in_buttons.h" +#include "gamerules.h" +#include "ammodef.h" +#include "tf_obj.h" +#include "weapon_mortar.h" +#include "smoke_trail.h" +#include "tf_shareddefs.h" +#include "tf_team.h" +#include "tf_gamerules.h" +#include "tf_obj_antimortar.h" +#include "vstdlib/random.h" +#include "engine/IEngineSound.h" + +extern short g_sModelIndexFireball; + +// Damage CVars +ConVar weapon_mortar_shell_damage( "weapon_mortar_shell_damage","0", FCVAR_NONE, "Mortar's standard shell maximum damage" ); +ConVar weapon_mortar_shell_radius( "weapon_mortar_shell_radius","0", FCVAR_NONE, "Mortar's standard shell splash radius" ); +ConVar weapon_mortar_starburst_damage( "weapon_mortar_starburst_damage","0", FCVAR_NONE, "Mortar's starburst maximum damage" ); +ConVar weapon_mortar_starburst_radius( "weapon_mortar_starburst_radius","0", FCVAR_NONE, "Mortar's starburst splash radius" ); +ConVar weapon_mortar_cluster_shells( "weapon_mortar_cluster_shells","0", FCVAR_NONE, "Number of shells a mortar cluster round bursts into" ); + + +//===================================================================================================== +// MORTAR WEAPON +//===================================================================================================== +LINK_ENTITY_TO_CLASS( weapon_mortar, CWeaponMortar ); +PRECACHE_WEAPON_REGISTER(weapon_mortar); + +EXTERN_SEND_TABLE(DT_BaseCombatWeapon) + +IMPLEMENT_SERVERCLASS_ST(CWeaponMortar, DT_WeaponMortar) + SendPropInt( SENDINFO( m_bCarried ), 2, SPROP_UNSIGNED ), + SendPropInt( SENDINFO( m_bMortarReloading ), 2, SPROP_UNSIGNED ), + SendPropVector( SENDINFO(m_vecMortarOrigin), -1, SPROP_COORD ), + SendPropVector( SENDINFO(m_vecMortarAngles), -1, SPROP_COORD ), +END_SEND_TABLE() + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +CWeaponMortar::CWeaponMortar( void ) +{ +#ifdef _DEBUG + m_vecMortarOrigin.Init(); + m_vecMortarAngles.Init(); +#endif + + m_bCarried = true; + m_bMortarReloading = false; + m_hDeployedMortar = NULL; + m_bRangeUpgraded = false; + m_bAccuracyUpgraded = false; +} + +void CWeaponMortar::Precache() +{ + BaseClass::Precache(); + + PrecacheScriptSound( "WeaponMortar.EMPed" ); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +float CWeaponMortar::GetFireRate( void ) +{ + return 3.0; +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +bool CWeaponMortar::Deploy( ) +{ + return DefaultDeploy( (char*)GetViewModel(), (char*)GetWorldModel(), ACT_SLAM_TRIPMINE_DRAW, (char*)GetAnimPrefix() ); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CWeaponMortar::ItemPostFrame( void ) +{ + CBasePlayer *pPlayer = ToBasePlayer( GetOwner() ); + if (pPlayer == NULL) + return; + + if ( pPlayer->m_nButtons & IN_ATTACK ) + { + if ( m_bCarried ) + { + ClientPrint( pPlayer, HUD_PRINTCENTER, "\n\n\n\n\n\n\n\n\n\nBuild your mortar with the build weapon first!" ); + } + } + else if ( pPlayer->m_nButtons & IN_ATTACK2 ) + { + SecondaryAttack(); + } + + // No buttons down. + if (!(( pPlayer->m_nButtons & IN_ATTACK ) || ( pPlayer->m_nButtons & IN_ATTACK2 ))) + { + WeaponIdle(); + } +} + +//----------------------------------------------------------------------------- +// Purpose: +// Output : Returns true on success, false on failure. +//----------------------------------------------------------------------------- +bool CWeaponMortar::ComputeEMPFireState( void ) +{ + if (IsOwnerEMPed()) + { + CPASAttenuationFilter filter( GetOwner(), "WeaponMortar.EMPed" ); + EmitSound( filter, GetOwner()->entindex(), "WeaponMortar.EMPed" ); + return false; + } + return true; +} + + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CWeaponMortar::PrimaryAttack( void ) +{ + CBaseTFPlayer *pPlayer = ToBaseTFPlayer( GetOwner() ); + if ( !pPlayer ) + return; + // Can't attack if taking EMP damage + if ( !ComputeEMPFireState() ) + return; + if ( IsOwnerEMPed() ) + return; + if ( m_hDeployedMortar == NULL ) + return; + + if ( m_hDeployedMortar->FireMortar( m_flFiringPower, m_flFiringAccuracy, m_bRangeUpgraded, m_bAccuracyUpgraded ) ) + { + WeaponSound( SINGLE ); + } + + m_flNextPrimaryAttack = gpGlobals->curtime + 0.5; + m_flNextSecondaryAttack = gpGlobals->curtime + 0.5; + + CheckRemoveDisguise(); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CWeaponMortar::Fire( float flPower, float flAccuracy ) +{ + m_flFiringPower = flPower; + m_flFiringAccuracy = flAccuracy; + + PrimaryAttack(); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CWeaponMortar::SecondaryAttack( void ) +{ + CBasePlayer *pPlayer = ToBasePlayer( GetOwner() ); + if ( !pPlayer ) + return; + + // Setup for refire + m_flNextPrimaryAttack = gpGlobals->curtime + 0.5; + m_flNextSecondaryAttack = gpGlobals->curtime + 1.0; +} + +//----------------------------------------------------------------------------- +// Purpose: Player's finished deploying his mortar +//----------------------------------------------------------------------------- +void CWeaponMortar::DeployMortar( CObjectMortar *pMortar ) +{ + CBasePlayer *pPlayer = ToBasePlayer( GetOwner() ); + if ( !pPlayer ) + return; + + ClientPrint( pPlayer, HUD_PRINTCENTER, "\n\n\n\n\n\n\n\n\n\nMortar Deployed" ); + + m_bCarried = false; + m_hDeployedMortar = pMortar; + m_hDeployedMortar->m_hMortarWeapon = this; + SendWeaponAnim( ACT_SLAM_DETONATOR_DRAW ); + + m_vecMortarOrigin = m_hDeployedMortar->GetLocalOrigin(); + m_vecMortarAngles = m_hDeployedMortar->GetLocalAngles(); +} + +//----------------------------------------------------------------------------- +// Purpose: Mortar object has been removed +//----------------------------------------------------------------------------- +void CWeaponMortar::MortarObjectRemoved( void ) +{ + m_hDeployedMortar = NULL; + m_bCarried = true; +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CWeaponMortar::SetYaw( float flYaw ) +{ + if ( m_hDeployedMortar == NULL ) + return; + + QAngle angles = m_hDeployedMortar->GetLocalAngles(); + angles.y = flYaw; + m_hDeployedMortar->SetLocalAngles( angles ); + m_vecMortarAngles = angles; +} + +//----------------------------------------------------------------------------- +// Purpose: Set the deployed mortar's firing round +//----------------------------------------------------------------------------- +void CWeaponMortar::SetRoundType( int iRoundType ) +{ + if ( m_hDeployedMortar == NULL ) + return; + + // Make sure we've got the technology for this round type + if ( MortarAmmoTechs[ iRoundType ] && MortarAmmoTechs[ iRoundType ][0] ) + { + CBaseTFPlayer *pPlayer = ToBaseTFPlayer( GetOwner() ); + if ( !pPlayer ) + return; + // Does the player have the technology? + if ( pPlayer->HasNamedTechnology( MortarAmmoTechs[ iRoundType ] ) == false ) + return; + } + + m_hDeployedMortar->m_iRoundType = iRoundType; +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CWeaponMortar::MortarDestroyed( void ) +{ + CBaseTFPlayer *pPlayer = ToBaseTFPlayer( GetOwner() ); + if ( pPlayer ) + { + ClientPrint( pPlayer, HUD_PRINTCENTER, "\n\n\n\n\n\n\n\n\n\nMortar Destroyed!" ); + } + + if ( pPlayer && pPlayer->GetActiveWeapon() == this ) + { + SendWeaponAnim( ACT_SLAM_TRIPMINE_DRAW ); + } + + MortarObjectRemoved(); +} + +//----------------------------------------------------------------------------- +// Purpose: +// Input : *pObject - +//----------------------------------------------------------------------------- +void CWeaponMortar::AddAssociatedObject( CBaseObject *pObject ) +{ + Assert( pObject ); + + // Can't handle this object + CObjectMortar *mortar = dynamic_cast< CObjectMortar * >( pObject ); + if ( !mortar ) + return; + + m_bCarried = false; + + m_hDeployedMortar = mortar; + mortar->m_hMortarWeapon = this; +} + +//----------------------------------------------------------------------------- +// Purpose: +// Input : *pObject - +//----------------------------------------------------------------------------- +void CWeaponMortar::RemoveAssociatedObject( CBaseObject *pObject ) +{ + Assert( pObject ); + + // Can't handle this object + CObjectMortar *mortar = dynamic_cast< CObjectMortar * >( pObject ); + if ( !mortar ) + return; + + if ( m_hDeployedMortar == mortar ) + { + m_hDeployedMortar = NULL; + m_bCarried = true; + } +} + +//----------------------------------------------------------------------------- +// Purpose: The player holding this weapon has just gained new technology. +// Check to see if it affects the mortar +//----------------------------------------------------------------------------- +void CWeaponMortar::GainedNewTechnology( CBaseTechnology *pTechnology ) +{ + CBaseTFPlayer *pPlayer = ToBaseTFPlayer( GetOwner() ); + if ( pPlayer ) + { + // Range upgraded? + if ( pPlayer->HasNamedTechnology("mortar_range") ) + m_bRangeUpgraded = true; + else + m_bRangeUpgraded = false; + + // Accuracy upgraded? + if ( pPlayer->HasNamedTechnology("mortar_accuracy") ) + m_bAccuracyUpgraded = true; + else + m_bAccuracyUpgraded = false; + } +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CWeaponMortar::WeaponIdle( void ) +{ + if ( HasWeaponIdleTimeElapsed() ) + { + if ( m_bCarried ) + { + SendWeaponAnim( ACT_SLAM_TRIPMINE_IDLE ); + } + else + { + SendWeaponAnim( ACT_SLAM_DETONATOR_IDLE ); + } + + SetWeaponIdleTime( gpGlobals->curtime + 1.0 ); + } +} + + +//----------------------------------------------------------------------------- +// Purpose: My mortar object is reloading +//----------------------------------------------------------------------------- +void CWeaponMortar::MortarIsReloading( void ) +{ + m_bMortarReloading = true; +} + +//----------------------------------------------------------------------------- +// Purpose: My mortar object has finished reloading +//----------------------------------------------------------------------------- +void CWeaponMortar::MortarFinishedReloading( void ) +{ + m_bMortarReloading = false; +} |