Team Fortress 2 Source Code as on 22/4/2020
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

157 lines
4.0 KiB

  1. //========= Copyright Valve Corporation, All rights reserved. ============//
  2. //
  3. // Purpose: Projectile shot by mortar synth.
  4. //
  5. // $NoKeywords: $
  6. //=============================================================================//
  7. #include "cbase.h"
  8. #include "grenade_energy.h"
  9. #include "soundent.h"
  10. #include "player.h"
  11. #include "hl2_shareddefs.h"
  12. // memdbgon must be the last include file in a .cpp file!!!
  13. #include "tier0/memdbgon.h"
  14. #define ENERGY_GRENADE_LIFETIME 1
  15. ConVar sk_dmg_energy_grenade ( "sk_dmg_energy_grenade","0");
  16. ConVar sk_energy_grenade_radius ( "sk_energy_grenade_radius","0");
  17. BEGIN_DATADESC( CGrenadeEnergy )
  18. DEFINE_FIELD( m_flMaxFrame, FIELD_INTEGER ),
  19. DEFINE_FIELD( m_nEnergySprite, FIELD_INTEGER ),
  20. DEFINE_FIELD( m_flLaunchTime, FIELD_TIME ),
  21. // Function pointers
  22. DEFINE_FUNCTION( Animate ),
  23. DEFINE_FUNCTION( GrenadeEnergyTouch ),
  24. END_DATADESC()
  25. LINK_ENTITY_TO_CLASS( grenade_energy, CGrenadeEnergy );
  26. void CGrenadeEnergy::Spawn( void )
  27. {
  28. Precache( );
  29. SetSolid( SOLID_BBOX );
  30. SetMoveType( MOVETYPE_FLY );
  31. SetModel( "Models/weapons/w_energy_grenade.mdl" );
  32. SetUse( DetonateUse );
  33. SetTouch( GrenadeEnergyTouch );
  34. SetNextThink( gpGlobals->curtime + 0.1f );
  35. m_flDamage = sk_dmg_energy_grenade.GetFloat();
  36. m_DmgRadius = sk_energy_grenade_radius.GetFloat();
  37. m_takedamage = DAMAGE_YES;
  38. m_iHealth = 1;
  39. m_flCycle = 0;
  40. m_flLaunchTime = gpGlobals->curtime;
  41. SetCollisionGroup( HL2COLLISION_GROUP_HOUNDEYE );
  42. UTIL_SetSize( this, vec3_origin, vec3_origin );
  43. m_flMaxFrame = (float) modelinfo->GetModelFrameCount( GetModel() ) - 1;
  44. }
  45. //------------------------------------------------------------------------------
  46. // Purpose :
  47. // Input :
  48. // Output :
  49. //------------------------------------------------------------------------------
  50. void CGrenadeEnergy::Shoot( CBaseEntity* pOwner, const Vector &vStart, Vector vVelocity )
  51. {
  52. CGrenadeEnergy *pEnergy = (CGrenadeEnergy *)CreateEntityByName( "grenade_energy" );
  53. pEnergy->Spawn();
  54. UTIL_SetOrigin( pEnergy, vStart );
  55. pEnergy->SetAbsVelocity( vVelocity );
  56. pEnergy->SetOwnerEntity( pOwner );
  57. pEnergy->SetThink ( Animate );
  58. pEnergy->SetNextThink( gpGlobals->curtime + 0.1f );
  59. pEnergy->m_nRenderMode = kRenderTransAdd;
  60. pEnergy->SetRenderColor( 160, 160, 160, 255 );
  61. pEnergy->m_nRenderFX = kRenderFxNone;
  62. }
  63. //------------------------------------------------------------------------------
  64. // Purpose :
  65. // Input :
  66. // Output :
  67. //------------------------------------------------------------------------------
  68. void CGrenadeEnergy::Animate( void )
  69. {
  70. float flLifeLeft = 1-(gpGlobals->curtime - m_flLaunchTime)/ENERGY_GRENADE_LIFETIME;
  71. if (flLifeLeft < 0)
  72. {
  73. SetRenderColorA( 0 );
  74. SetThink(NULL);
  75. UTIL_Remove(this);
  76. }
  77. SetNextThink( gpGlobals->curtime + 0.01f );
  78. QAngle angles;
  79. VectorAngles( GetAbsVelocity(), angles );
  80. SetLocalAngles( angles );
  81. SetNextThink( gpGlobals->curtime + 0.1f );
  82. StudioFrameAdvance( );
  83. SetRenderColorA( flLifeLeft );
  84. }
  85. void CGrenadeEnergy::Event_Killed( const CTakeDamageInfo &info )
  86. {
  87. Detonate( );
  88. }
  89. void CGrenadeEnergy::GrenadeEnergyTouch( CBaseEntity *pOther )
  90. {
  91. if ( pOther->m_takedamage )
  92. {
  93. float flLifeLeft = 1-(gpGlobals->curtime - m_flLaunchTime)/ENERGY_GRENADE_LIFETIME;
  94. if ( pOther->GetFlags() & (FL_CLIENT) )
  95. {
  96. CBasePlayer *pPlayer = ( CBasePlayer * )pOther;
  97. float flKick = 120 * flLifeLeft;
  98. pPlayer->m_Local.m_vecPunchAngle.SetX( flKick * (random->RandomInt(0,1) == 1) ? -1 : 1 );
  99. pPlayer->m_Local.m_vecPunchAngle.SetY( flKick * (random->RandomInt(0,1) == 1) ? -1 : 1 );
  100. }
  101. float flDamage = m_flDamage * flLifeLeft;
  102. if (flDamage < 1)
  103. {
  104. flDamage = 1;
  105. }
  106. trace_t tr;
  107. tr = GetTouchTrace();
  108. CTakeDamageInfo info( this, GetThrower(), m_flDamage * flLifeLeft, DMG_SONIC );
  109. CalculateMeleeDamageForce( &info, (tr.endpos - tr.startpos), tr.endpos );
  110. pOther->TakeDamage( info );
  111. }
  112. Detonate();
  113. }
  114. void CGrenadeEnergy::Detonate(void)
  115. {
  116. m_takedamage = DAMAGE_NO;
  117. UTIL_Remove( this );
  118. }
  119. void CGrenadeEnergy::Precache( void )
  120. {
  121. PrecacheModel("Models/weapons/w_energy_grenade.mdl");
  122. }