diff options
Diffstat (limited to 'game/server/tf/halloween/merasmus/merasmus_trick_or_treat_prop.cpp')
| -rw-r--r-- | game/server/tf/halloween/merasmus/merasmus_trick_or_treat_prop.cpp | 178 |
1 files changed, 178 insertions, 0 deletions
diff --git a/game/server/tf/halloween/merasmus/merasmus_trick_or_treat_prop.cpp b/game/server/tf/halloween/merasmus/merasmus_trick_or_treat_prop.cpp new file mode 100644 index 0000000..f343d92 --- /dev/null +++ b/game/server/tf/halloween/merasmus/merasmus_trick_or_treat_prop.cpp @@ -0,0 +1,178 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// +// +//============================================================================= +#include "cbase.h" + +#include "tf_ammo_pack.h" +#include "particle_parse.h" +#include "tf/halloween/ghost/ghost.h" +#include "tf_player.h" +#include "tf_gamerules.h" + +#include "merasmus.h" +#include "merasmus_trick_or_treat_prop.h" + +LINK_ENTITY_TO_CLASS( tf_merasmus_trick_or_treat_prop, CTFMerasmusTrickOrTreatProp ); + +IMPLEMENT_AUTO_LIST( ITFMerasmusTrickOrTreatProp ); + +ConVar tf_merasmus_prop_health( "tf_merasmus_prop_health", "150", FCVAR_CHEAT | FCVAR_GAMEDLL ); + +CTFMerasmusTrickOrTreatProp::CTFMerasmusTrickOrTreatProp() +{ +} + + +void CTFMerasmusTrickOrTreatProp::Spawn() +{ + Precache(); + + SetModel( CMerasmus::GetRandomPropModelName() ); + + BaseClass::Spawn(); + + SetMoveType( MOVETYPE_NONE ); + SetSolid( SOLID_VPHYSICS ); + m_takedamage = DAMAGE_YES; + SetHealth( tf_merasmus_prop_health.GetInt() ); + + DispatchParticleEffect( "merasmus_object_spawn", WorldSpaceCenter(), GetAbsAngles() ); +} + + +void CTFMerasmusTrickOrTreatProp::Event_Killed( const CTakeDamageInfo &info ) +{ + SpawnTrickOrTreatItem(); + + DispatchParticleEffect( "merasmus_object_spawn", WorldSpaceCenter(), GetAbsAngles() ); + EmitSound( "Halloween.Merasmus_Hiding_Explode" ); + + if ( TFGameRules()->GetActiveBoss() ) + { + CMerasmus* pMerasmus = assert_cast< CMerasmus* >( TFGameRules()->GetActiveBoss() ); + if ( pMerasmus ) + { + if ( pMerasmus->IsNextKilledPropMerasmus() ) + { + // move merasmus to the destroyed prop before we reveal him + pMerasmus->SetAbsOrigin( GetAbsOrigin() ); + + if ( info.GetAttacker() && info.GetAttacker()->IsPlayer() ) + { + CTFPlayer* pTFPlayer = assert_cast< CTFPlayer* >( info.GetAttacker() ); + if ( pTFPlayer ) + { + pMerasmus->SetRevealer( pTFPlayer ); + + IGameEvent *pEvent = gameeventmanager->CreateEvent( "merasmus_prop_found" ); + if ( pEvent ) + { + pEvent->SetInt( "player", pTFPlayer->GetUserID() ); + gameeventmanager->FireEvent( pEvent, true ); + } + } + } + } + else + { + CPVSFilter filter( pMerasmus->WorldSpaceCenter() ); + if (RandomInt(1,3) == 1) + { + pMerasmus->PlayLowPrioritySound( filter, "Halloween.MerasmusTauntFakeProp" ); + } + } + } + } + + BaseClass::Event_Killed( info ); +} + + +int CTFMerasmusTrickOrTreatProp::OnTakeDamage( const CTakeDamageInfo &info ) +{ + DispatchParticleEffect( "merasmus_blood", info.GetDamagePosition(), GetAbsAngles() ); + + CTakeDamageInfo newinfo = info; + + CTFPlayer *pTFPlayer = ToTFPlayer( newinfo.GetAttacker() ); + if ( pTFPlayer && ( pTFPlayer->IsPlayerClass( TF_CLASS_SOLDIER ) || pTFPlayer->IsPlayerClass( TF_CLASS_DEMOMAN ) ) && ( newinfo.GetDamageType() & DMG_BLAST ) ) + { + newinfo.SetDamage( GetHealth() * 2.f ); + } + + return BaseClass::OnTakeDamage( newinfo ); +} + + +void CTFMerasmusTrickOrTreatProp::Touch( CBaseEntity *pOther ) +{ + BaseClass::Touch( pOther ); + + if ( pOther && pOther->IsPlayer() ) + { + CTFPlayer *pPlayer = ToTFPlayer( pOther ); + if ( pPlayer->m_Shared.InCond( TF_COND_HALLOWEEN_BOMB_HEAD ) ) + { + pPlayer->m_Shared.RemoveCond( TF_COND_HALLOWEEN_BOMB_HEAD ); + pPlayer->m_Shared.RemoveCond( TF_COND_STUNNED ); + pPlayer->MerasmusPlayerBombExplode( false ); + + // force kill + CTakeDamageInfo info( pPlayer, pPlayer, 99999, DMG_BLAST, TF_DMG_CUSTOM_NONE ); + Event_Killed( info ); + } + } +} + + +CTFMerasmusTrickOrTreatProp* CTFMerasmusTrickOrTreatProp::Create( const Vector& vPosition, const QAngle& qAngles ) +{ + CTFMerasmusTrickOrTreatProp *pTrickOrTreatProp = static_cast<CTFMerasmusTrickOrTreatProp*>( CBaseEntity::Create( "tf_merasmus_trick_or_treat_prop", vPosition, qAngles, NULL ) ); + + // must be on a team different from player(s) in order for some + // weapons to hit (ie: pipe bombs) + if ( pTrickOrTreatProp ) + { + pTrickOrTreatProp->ChangeTeam( TF_TEAM_HALLOWEEN ); + } + + return pTrickOrTreatProp; +} + + +void CTFMerasmusTrickOrTreatProp::SpawnTrickOrTreatItem() +{ + int nNumAmmo = 1/*RandomInt( 1, 3 )*/; + for ( int i=0; i<nNumAmmo; ++i ) + { + // Create the ammo pack. + CTFAmmoPack *pAmmoPack = CTFAmmoPack::Create( WorldSpaceCenter(), vec3_angle, this, "models/items/ammopack_medium.mdl" ); + Assert( pAmmoPack ); + if ( pAmmoPack ) + { + pAmmoPack->MakeHolidayPack(); + pAmmoPack->SetBonusScale( 2.f ); + pAmmoPack->SetModelScale( 1.4f ); + + Vector vecRight, vecUp; + AngleVectors( EyeAngles(), NULL, &vecRight, &vecUp ); + + // Calculate the initial impulse on the weapon. + Vector vecImpulse = RandomVector( 40.f, 80.f ); + vecImpulse.z *= Sign( vecImpulse.z ); // always go up + + pAmmoPack->SetInitialVelocity( vecImpulse ); + pAmmoPack->ApplyAbsVelocityImpulse( vecImpulse ); + + + // Give the ammo pack some health, so that trains can destroy it. + pAmmoPack->SetCollisionGroup( COLLISION_GROUP_DEBRIS ); + pAmmoPack->m_takedamage = DAMAGE_YES; + pAmmoPack->SetHealth( 900 ); + + pAmmoPack->SetBodygroup( 1, 1 ); + } + } +} |