summaryrefslogtreecommitdiff
path: root/game/server/cstrike/holiday_gift.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'game/server/cstrike/holiday_gift.cpp')
-rw-r--r--game/server/cstrike/holiday_gift.cpp128
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 );
+}