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_basecombatobject.cpp | |
| download | archived-source-engine-2018-hl2-src-3bf9df6b2785fa6d951086978a3e66f49427166a.tar.xz archived-source-engine-2018-hl2-src-3bf9df6b2785fa6d951086978a3e66f49427166a.zip | |
Diffstat (limited to 'game/shared/tf2/weapon_basecombatobject.cpp')
| -rw-r--r-- | game/shared/tf2/weapon_basecombatobject.cpp | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/game/shared/tf2/weapon_basecombatobject.cpp b/game/shared/tf2/weapon_basecombatobject.cpp new file mode 100644 index 0000000..4d02d43 --- /dev/null +++ b/game/shared/tf2/weapon_basecombatobject.cpp @@ -0,0 +1,126 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// +#include "cbase.h" +#include "basetfplayer_shared.h" +#include "weapon_basecombatobject.h" +//==================================================================================================== +// BASE COMBAT OBJECT WEAPON +//==================================================================================================== + +LINK_ENTITY_TO_CLASS( weapon_basecombatobject, CWeaponBaseCombatObject ); + +IMPLEMENT_NETWORKCLASS_ALIASED( WeaponBaseCombatObject, DT_WeaponBaseCombatObject ) + +BEGIN_NETWORK_TABLE( CWeaponBaseCombatObject, DT_WeaponBaseCombatObject ) +END_NETWORK_TABLE() + +BEGIN_PREDICTION_DATA( CWeaponBaseCombatObject ) + +/* + DEFINE_PRED_ARRAY( m_szObjectName, FIELD_CHARACTER, sizeof( m_szObjectName ) ), + DEFINE_PRED_FIELD( m_vecBuildMins, FIELD_VECTOR, 0 ), + DEFINE_PRED_FIELD( m_vecBuildMaxs, FIELD_VECTOR, 0 ), +*/ + +END_PREDICTION_DATA() + + +CWeaponBaseCombatObject::CWeaponBaseCombatObject() +{ +} + +//----------------------------------------------------------------------------- +// Purpose: Place the combat object +//----------------------------------------------------------------------------- +void CWeaponBaseCombatObject::PrimaryAttack( void ) +{ + CBaseTFPlayer *pPlayer = dynamic_cast<CBaseTFPlayer*>((CBaseEntity*)GetOwner()); + if ( !pPlayer ) + return; + if ( pPlayer->GetAmmoCount(m_iPrimaryAmmoType) <= 0 ) + return; + + m_flNextPrimaryAttack = gpGlobals->curtime + GetFireRate(); + + Vector vecPlaceOrigin; + QAngle angPlaceAngles; + if ( GetPlacePosition( pPlayer, &vecPlaceOrigin, &angPlaceAngles ) == false ) + { + WeaponSound( WPN_DOUBLE ); + return; + } + + // Place the combat object + PlaceCombatObject( pPlayer, vecPlaceOrigin, angPlaceAngles ); + + WeaponSound( SINGLE ); + pPlayer->RemoveAmmo( 1, m_iPrimaryAmmoType ); + + // If I'm now out of ammo, switch away + if ( !HasPrimaryAmmo() ) + { + pPlayer->SelectLastItem(); + } +} + +//----------------------------------------------------------------------------- +// Purpose: Return true if we found a valid placement point +//----------------------------------------------------------------------------- +bool CWeaponBaseCombatObject::GetPlacePosition( CBaseTFPlayer *pBuilder, Vector *vecPlaceOrigin, QAngle *angPlaceAngles ) +{ + Vector vecForward; + QAngle vecAngles = vec3_angle; + vecAngles.y = pBuilder->EyeAngles().y; + AngleVectors( vecAngles, &vecForward, NULL, NULL); + *vecPlaceOrigin = pBuilder->WorldSpaceCenter() + (vecForward * ((m_vecBuildMaxs.x - m_vecBuildMins.x) + 32)); + if ( UTIL_PointContents( *vecPlaceOrigin ) != CONTENTS_EMPTY ) + return false; + + // Room to fit? + trace_t tr; + UTIL_TraceHull( *vecPlaceOrigin, *vecPlaceOrigin + Vector(0,0,-64), m_vecBuildMins, m_vecBuildMaxs, MASK_SOLID, this, COLLISION_GROUP_NONE, &tr ); + if ( tr.allsolid || tr.startsolid ) + return false; + if ( tr.fraction == 1.0 ) + return false; + + *vecPlaceOrigin = tr.endpos; + //VectorAngles( tr.plane.normal, *angPlaceAngles ); + *angPlaceAngles = QAngle(0,0,0); + return true; +} + +//----------------------------------------------------------------------------- +// Purpose: Put the combat object for this weapon on the specified point +//----------------------------------------------------------------------------- +void CWeaponBaseCombatObject::PlaceCombatObject( CBaseTFPlayer *pBuilder, Vector vecOrigin, QAngle angles ) +{ +#if !defined( CLIENT_DLL ) + Assert( m_szObjectName != NULL ); + + CBaseEntity *pEntity = CreateEntityByName( m_szObjectName ); + pEntity->SetLocalAngles( angles ); + pEntity->Spawn(); + pEntity->Teleport( &vecOrigin, &angles, &vec3_origin ); + + // If it's an object, set it's builder & team + CBaseObject *pObject = dynamic_cast< CBaseObject * >( pEntity ); + if ( pObject ) + { + pObject->SetBuilder( pBuilder ); + pObject->ChangeTeam( pBuilder->GetTeamNumber() ); + } +#endif +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +float CWeaponBaseCombatObject::GetFireRate( void ) +{ + return 0.5; +} |