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.

108 lines
3.0 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 "tf_shareddefs.h"
  11. #include "tf_weapon_parse.h"
  12. #include "econ_item_system.h"
  13. #define TE_RIFLE_SHELL 1024
  14. #define TE_PISTOL_SHELL 2048
  15. extern CTFWeaponInfo *GetTFWeaponInfo( int iWeapon );
  16. //-----------------------------------------------------------------------------
  17. // Purpose: TF Eject Brass
  18. //-----------------------------------------------------------------------------
  19. void TF_EjectBrassCallback( const CEffectData &data )
  20. {
  21. const char *pszBrassModel = NULL;
  22. // If we got given a definition index, see if it has a brass model override
  23. if ( data.m_nDamageType )
  24. {
  25. CEconItemDefinition *pDef = ItemSystem()->GetStaticDataForItemByDefIndex( data.m_nDamageType );
  26. if ( pDef )
  27. {
  28. pszBrassModel = pDef->GetBrassModelOverride();
  29. // Allow weapon definitions to disable brass ejection
  30. if ( pszBrassModel && !pszBrassModel[0] )
  31. return;
  32. }
  33. }
  34. // Otherwise, use the weapon default
  35. if ( !pszBrassModel || !pszBrassModel[0] )
  36. {
  37. CTFWeaponInfo *pWeaponInfo = GetTFWeaponInfo( data.m_nHitBox );
  38. if ( pWeaponInfo )
  39. {
  40. pszBrassModel = pWeaponInfo->m_szBrassModel;
  41. }
  42. }
  43. if ( !pszBrassModel || !pszBrassModel[0] )
  44. return;
  45. Vector vForward, vRight, vUp;
  46. AngleVectors( data.m_vAngles, &vForward, &vRight, &vUp );
  47. QAngle vecShellAngles;
  48. VectorAngles( -vUp, vecShellAngles );
  49. Vector vecVelocity = random->RandomFloat( 130, 180 ) * vForward +
  50. random->RandomFloat( -30, 30 ) * vRight +
  51. random->RandomFloat( -30, 30 ) * vUp;
  52. float flLifeTime = 10.0f;
  53. model_t *pModel = (model_t *)engine->LoadModel( pszBrassModel );
  54. if ( !pModel )
  55. return;
  56. int flags = FTENT_FADEOUT | FTENT_GRAVITY | FTENT_COLLIDEALL | FTENT_HITSOUND | FTENT_ROTATE;
  57. if ( data.m_nHitBox == TF_WEAPON_MINIGUN )
  58. {
  59. // More velocity for Jake
  60. vecVelocity = random->RandomFloat( 130, 250 ) * vForward +
  61. random->RandomFloat( -100, 100 ) * vRight +
  62. random->RandomFloat( -30, 80 ) * vUp;
  63. }
  64. Assert( pModel );
  65. C_LocalTempEntity *pTemp = tempents->SpawnTempModel( pModel, data.m_vOrigin, vecShellAngles, vecVelocity, flLifeTime, FTENT_NEVERDIE );
  66. if ( pTemp == NULL )
  67. return;
  68. pTemp->m_vecTempEntAngVelocity[0] = random->RandomFloat(-512,511);
  69. pTemp->m_vecTempEntAngVelocity[1] = random->RandomFloat(-255,255);
  70. pTemp->m_vecTempEntAngVelocity[2] = random->RandomFloat(-255,255);
  71. pTemp->hitSound = TE_PISTOL_SHELL;
  72. pTemp->SetGravity( 0.4 );
  73. pTemp->m_flSpriteScale = 10;
  74. pTemp->flags = flags;
  75. // don't collide with owner
  76. pTemp->clientIndex = data.entindex();
  77. if ( pTemp->clientIndex < 0 )
  78. {
  79. pTemp->clientIndex = 0;
  80. }
  81. // ::ShouldCollide decides what this collides with
  82. pTemp->flags |= FTENT_COLLISIONGROUP;
  83. pTemp->SetCollisionGroup( COLLISION_GROUP_DEBRIS );
  84. }
  85. DECLARE_CLIENT_EFFECT( "TF_EjectBrass", TF_EjectBrassCallback );