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.

99 lines
2.9 KiB

  1. //========= Copyright Valve Corporation, All rights reserved. ============//
  2. //
  3. // Purpose: Game-specific impact effect hooks
  4. //
  5. //=============================================================================//
  6. #include "cbase.h"
  7. #include "c_te_effect_dispatch.h"
  8. #include "tempent.h"
  9. #include "c_te_legacytempents.h"
  10. #include "dod_shareddefs.h"
  11. #define TE_RIFLE_SHELL 1024
  12. #define TE_PISTOL_SHELL 2048
  13. //-----------------------------------------------------------------------------
  14. // Purpose: DOD Eject Brass
  15. //-----------------------------------------------------------------------------
  16. void DOD_EjectBrassCallback( const CEffectData &data )
  17. {
  18. int shelltype = data.m_nHitBox;
  19. Vector vForward, vRight, vUp;
  20. AngleVectors( data.m_vAngles, &vForward, &vRight, &vUp );
  21. QAngle vecShellAngles;
  22. VectorAngles( -vUp, vecShellAngles );
  23. Vector vecVelocity = random->RandomFloat( 130, 180 ) * vForward +
  24. random->RandomFloat( -30, 30 ) * vRight +
  25. random->RandomFloat( -30, 30 ) * vUp;
  26. float flLifeTime = 10.0f;
  27. int hitsound = 0;
  28. model_t *pModel = NULL;
  29. //should be precached .. oh well
  30. static model_t *pSmallShell = (model_t *)engine->LoadModel( "models/shells/shell_small.mdl" );
  31. static model_t *pMediumShell = (model_t *)engine->LoadModel( "models/shells/shell_medium.mdl" );
  32. static model_t *pLargeShell = (model_t *)engine->LoadModel( "models/shells/shell_large.mdl" );
  33. static model_t *pGarandClip = (model_t *)engine->LoadModel( "models/shells/garand_clip.mdl" );
  34. int flags = FTENT_FADEOUT | FTENT_GRAVITY | FTENT_COLLIDEALL | FTENT_HITSOUND | FTENT_ROTATE;
  35. switch( shelltype )
  36. {
  37. case EJECTBRASS_PISTOL:
  38. hitsound = TE_PISTOL_SHELL;
  39. pModel = pSmallShell;
  40. break;
  41. case EJECTBRASS_RIFLE:
  42. hitsound = TE_PISTOL_SHELL;
  43. pModel = pMediumShell;
  44. break;
  45. case EJECTBRASS_MG:
  46. case EJECTBRASS_MG_2:
  47. hitsound = TE_RIFLE_SHELL;
  48. pModel = pLargeShell;
  49. break;
  50. case EJECTBRASS_GARANDCLIP:
  51. hitsound = TE_RIFLE_SHELL;
  52. flags &= ~FTENT_COLLIDEALL;
  53. flags |= FTENT_COLLIDEWORLD;
  54. pModel = pGarandClip;
  55. break;
  56. default:
  57. break;
  58. }
  59. Assert( pModel );
  60. C_LocalTempEntity *pTemp = tempents->SpawnTempModel( pModel, data.m_vOrigin, vecShellAngles, vecVelocity, flLifeTime, FTENT_NEVERDIE );
  61. if ( pTemp == NULL )
  62. return;
  63. pTemp->m_vecTempEntAngVelocity[0] = random->RandomFloat(-512,511);
  64. pTemp->m_vecTempEntAngVelocity[1] = random->RandomFloat(-255,255);
  65. pTemp->m_vecTempEntAngVelocity[2] = random->RandomFloat(-255,255);
  66. pTemp->hitSound = hitsound;
  67. pTemp->SetGravity( 0.4 );
  68. pTemp->m_flSpriteScale = 10;
  69. pTemp->flags = flags;
  70. // don't collide with owner
  71. pTemp->clientIndex = data.entindex();
  72. if ( pTemp->clientIndex < 0 )
  73. {
  74. pTemp->clientIndex = 0;
  75. }
  76. // ::ShouldCollide decides what this collides with
  77. pTemp->flags |= FTENT_COLLISIONGROUP;
  78. pTemp->SetCollisionGroup( DOD_COLLISIONGROUP_SHELLS );
  79. }
  80. DECLARE_CLIENT_EFFECT( "DOD_EjectBrass", DOD_EjectBrassCallback );