diff options
Diffstat (limited to 'game/server/cstrike/holiday_gift.cpp')
| -rw-r--r-- | game/server/cstrike/holiday_gift.cpp | 128 |
1 files changed, 128 insertions, 0 deletions
diff --git a/game/server/cstrike/holiday_gift.cpp b/game/server/cstrike/holiday_gift.cpp new file mode 100644 index 0000000..afb2f0a --- /dev/null +++ b/game/server/cstrike/holiday_gift.cpp @@ -0,0 +1,128 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +//=============================================================================// + +#include "cbase.h" +#include "smokegrenade_projectile.h" +#include "sendproxy.h" +#include "holiday_gift.h" +#include "cs_player.h" +#include "KeyValues.h" +#include "bot_manager.h" +#include "weapon_csbase.h" + +#define CHRISTMAS_MODEL "models/items/cs_gift.mdl" + +LINK_ENTITY_TO_CLASS( holiday_gift, CHolidayGift ); +PRECACHE_WEAPON_REGISTER( holiday_gift ); + +//----------------------------------------------------------------------------- +CHolidayGift* CHolidayGift::Create( const Vector &position, const QAngle &angles, const QAngle &eyeAngles, const Vector &velocity, CBaseCombatCharacter *pOwner ) +{ + CHolidayGift *pGift = (CHolidayGift*)CBaseEntity::Create( "holiday_gift", position, angles, pOwner ); + + if ( pGift ) + { + pGift->AddSpawnFlags( SF_NORESPAWN ); + + Vector vecRight, vecUp; + AngleVectors( eyeAngles, NULL, &vecRight, &vecUp ); + + // Calculate the initial impulse on the gift. + Vector vecImpulse( 0.0f, 0.0f, 0.0f ); + vecImpulse += vecUp * random->RandomFloat( 0, 0.25 ); + vecImpulse += vecRight * random->RandomFloat( -0.25, 0.25 ); + VectorNormalize( vecImpulse ); + vecImpulse *= random->RandomFloat( 100.0, 150.0 ); + vecImpulse += velocity; + + // Cap the impulse. + float flSpeed = vecImpulse.Length(); + if ( flSpeed > 300.0 ) + { + VectorScale( vecImpulse, 300.0 / flSpeed, vecImpulse ); + } + + pGift->SetMoveType( MOVETYPE_FLYGRAVITY ); + pGift->SetAbsVelocity( vecImpulse * 2.f + Vector(0,0,200) ); + pGift->SetAbsAngles( QAngle(0,0,0) ); + pGift->UseClientSideAnimation(); + pGift->ResetSequence( pGift->LookupSequence("idle") ); + + pGift->EmitSound( "Christmas.GiftDrop" ); + + pGift->ActivateWhenAtRest(); + } + + return pGift; +} + +//----------------------------------------------------------------------------- +void CHolidayGift::Precache() +{ + BaseClass::Precache(); + + PrecacheModel( CHRISTMAS_MODEL ); + PrecacheScriptSound( "Christmas.GiftDrop" ); + PrecacheScriptSound( "Christmas.GiftPickup" ); +} + +//----------------------------------------------------------------------------- +void CHolidayGift::Spawn( void ) +{ + BaseClass::Spawn(); + + SetModel( CHRISTMAS_MODEL ); + + // Die in 30 seconds + SetContextThink( &CBaseEntity::SUB_Remove, gpGlobals->curtime + 30, "DIE_THINK" ); + SetContextThink( &CHolidayGift::DropSoundThink, gpGlobals->curtime + 0.2f, "SOUND_THINK" ); +} + +//----------------------------------------------------------------------------- +void CHolidayGift::DropSoundThink( void ) +{ + EmitSound( "Christmas.GiftDrop" ); +} + +//----------------------------------------------------------------------------- +bool CHolidayGift::MyTouch( CBasePlayer *pPlayer ) +{ + if( !pPlayer ) + return false; + + if( !pPlayer->IsAlive() ) + return false; + + if ( pPlayer->IsBot() ) + return false; + + if ( ( pPlayer->GetTeamNumber() != TEAM_CT ) && ( pPlayer->GetTeamNumber() != TEAM_TERRORIST ) ) + return false; + + // Send a message for the achievement tracking. + IGameEvent *event = gameeventmanager->CreateEvent( "christmas_gift_grab" ); + if ( event ) + { + event->SetInt( "userid", pPlayer->GetUserID() ); + gameeventmanager->FireEvent( event ); + } + pPlayer->EmitSound( "Christmas.GiftPickup" ); + + return true; +} + +//----------------------------------------------------------------------------- +void CHolidayGift::ItemTouch( CBaseEntity *pOther ) +{ + if ( pOther->IsWorld() ) + { + Vector absVel = GetAbsVelocity(); + SetAbsVelocity( Vector( 0,0,absVel.z ) ); + return; + } + + BaseClass::ItemTouch( pOther ); +} |