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/tf/entity_bonuspack.cpp | |
| download | archived-source-engine-2018-hl2-src-master.tar.xz archived-source-engine-2018-hl2-src-master.zip | |
Diffstat (limited to 'game/shared/tf/entity_bonuspack.cpp')
| -rw-r--r-- | game/shared/tf/entity_bonuspack.cpp | 188 |
1 files changed, 188 insertions, 0 deletions
diff --git a/game/shared/tf/entity_bonuspack.cpp b/game/shared/tf/entity_bonuspack.cpp new file mode 100644 index 0000000..1d2af24 --- /dev/null +++ b/game/shared/tf/entity_bonuspack.cpp @@ -0,0 +1,188 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: CTF HealthKit. +// +//=============================================================================// +#include "cbase.h" +#include "entity_bonuspack.h" + +#ifdef GAME_DLL + #include "tf_logic_robot_destruction.h" + #include "tf_player.h" + #include "particle_parse.h" + #include "tf_fx.h" +#endif + +#define TF_POWERCORE_RED_PICKUP "powercore_embers_red" +#define TF_POWERCORE_BLUE_PICKUP "powercore_embers_blue" +#define BONUS_PACK_BLINK_CONTEXT "blink_think" + +ConVar tf_bonuspack_score( "tf_bonuspack_score", "1", FCVAR_REPLICATED | FCVAR_DEVELOPMENTONLY ); +#define BLINK_TIME 5.f +#define REMOVE_TIME 20.f +#define PICKUP_TIME 0.5f + +IMPLEMENT_NETWORKCLASS_ALIASED( BonusPack, DT_CBonusPack ) + +BEGIN_NETWORK_TABLE( CBonusPack, DT_CBonusPack ) +END_NETWORK_TABLE() + +BEGIN_DATADESC( CBonusPack ) +END_DATADESC() + +LINK_ENTITY_TO_CLASS( item_bonuspack, CBonusPack ); + +IMPLEMENT_AUTO_LIST( IBonusPackAutoList ); + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +CBonusPack::CBonusPack() +{ +#ifdef GAME_DLL + m_bAutoMaterialize = false; +#else + SetCycle( RandomFloat() ); +#endif +} + + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CBonusPack::Spawn( void ) +{ + Precache(); + BaseClass::BaseClass::Spawn(); + +#ifdef GAME_DLL + const char *pszParticleName = GetTeamNumber() == TF_TEAM_RED ? "powercore_alert_blue" : "powercore_alert_red"; + DispatchParticleEffect( pszParticleName, PATTACH_POINT_FOLLOW, this, "particle_spawn" ); + + SetModel( GetPowerupModel() ); + CollisionProp()->UseTriggerBounds( true, 64 ); + m_flCanPickupTime = gpGlobals->curtime + PICKUP_TIME; + m_nBlinkCount = 0; + m_flKillTime = gpGlobals->curtime + REMOVE_TIME + BLINK_TIME; + SetContextThink( &CBonusPack::BlinkThink, gpGlobals->curtime + REMOVE_TIME, BONUS_PACK_BLINK_CONTEXT ); + SetContextThink( &CBonusPack::SUB_Remove, m_flKillTime, "RemoveThink" ); +#endif +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CBonusPack::Precache( void ) +{ + // We deliberately allow late precaches here + bool bAllowPrecache = CBaseEntity::IsPrecacheAllowed(); + CBaseEntity::SetAllowPrecache( true ); + PrecacheParticleSystem( TF_POWERCORE_RED_PICKUP ); + PrecacheParticleSystem( TF_POWERCORE_BLUE_PICKUP ); + BaseClass::Precache(); + CBaseEntity::SetAllowPrecache( bAllowPrecache ); +} + +#ifdef GAME_DLL +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +bool CBonusPack::MyTouch( CBasePlayer *pPlayer ) +{ + if ( ValidTouch( pPlayer ) && gpGlobals->curtime >= m_flCanPickupTime ) + { + CTFPlayer *pTFPlayer = ToTFPlayer( pPlayer ); + if ( !pTFPlayer ) + return true; + + // Play a particle colored the color of the player that picked it up + Vector vecOrigin = GetAbsOrigin() + Vector( 0,0,5 ); + CPVSFilter pvsfilter( vecOrigin ); + const char *pszParticleName = pPlayer->GetTeamNumber() == TF_TEAM_RED ? TF_POWERCORE_RED_PICKUP : TF_POWERCORE_BLUE_PICKUP; + TE_TFParticleEffect( pvsfilter, 0.f, pszParticleName, vecOrigin, vec3_angle ); + + if ( CTFRobotDestructionLogic::GetRobotDestructionLogic() ) + { + CTFRobotDestructionLogic::GetRobotDestructionLogic()->ScorePoints( GetTeamNumber() + , tf_bonuspack_score.GetInt() + , SCORE_CORES_COLLECTED + , ToTFPlayer( pPlayer ) ); + } + + int iBoostMax = pTFPlayer->m_Shared.GetMaxBuffedHealth(); + // Cap it to the max we'll boost a player's health + int nHealthToAdd = clamp( 5, 0, iBoostMax - pTFPlayer->GetHealth() ); + // Give health + pPlayer->TakeHealth( nHealthToAdd, DMG_GENERIC | DMG_IGNORE_MAXHEALTH ); + + for ( int i=0;i<TF_AMMO_COUNT;i++ ) + { + pPlayer->GiveAmmo( 5, i ); + } + + pPlayer->SetLastObjectiveTime( gpGlobals->curtime ); + + return true; + } + + return false; +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +bool CBonusPack::ValidTouch( CBasePlayer *pPlayer ) +{ + if( pPlayer->GetTeamNumber() != GetTeamNumber() ) + return false; + + CTFPlayer *pTFPlayer = ToTFPlayer( pPlayer ); + if ( !pTFPlayer ) + return false; + + // No invis spies + if ( pTFPlayer->m_Shared.InCond( TF_COND_STEALTHED ) || pTFPlayer->m_Shared.GetPercentInvisible() > 0.25f ) + return false; + + // No disguised spies + if ( pTFPlayer->m_Shared.InCond( TF_COND_DISGUISED ) || pTFPlayer->m_Shared.InCond( TF_COND_DISGUISING ) ) + return false; + + // No bonk'd scouts + if ( pTFPlayer->m_Shared.InCond( TF_COND_PHASE ) || pTFPlayer->m_Shared.InCond( TF_COND_PASSTIME_INTERCEPTION ) ) + return false; + + // No teleporting players + if ( pTFPlayer->m_Shared.InCond( TF_COND_SELECTED_TO_TELEPORT ) ) + return false; + + // No invulns + if ( pTFPlayer->m_Shared.IsInvulnerable() ) + return false; + + return BaseClass::ValidTouch( pPlayer ); +} + +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +void CBonusPack::BlinkThink() +{ + float flTimeToKill = m_flKillTime - gpGlobals->curtime; + float flNextBlink = RemapValClamped( flTimeToKill, BLINK_TIME, 0.f, 0.5f, 0.1f ); + + SetContextThink( &CBonusPack::BlinkThink, gpGlobals->curtime + flNextBlink, BONUS_PACK_BLINK_CONTEXT ); + + SetRenderMode( kRenderTransAlpha ); + + ++m_nBlinkCount; + if ( m_nBlinkCount % 2 == 0 ) + { + SetRenderColorA( 25 ); + } + else + { + SetRenderColorA( 255 ); + } +} +#endif |