//========= 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 ); }