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.

202 lines
5.5 KiB

  1. //========= Copyright Valve Corporation, All rights reserved. ============//
  2. //
  3. // Purpose:
  4. //
  5. // $NoKeywords: $
  6. //=============================================================================//
  7. #include "cbase.h"
  8. #include "extinguisherjet.h"
  9. #include "engine/IEngineSound.h"
  10. #include "fire.h"
  11. #include "ndebugoverlay.h"
  12. // memdbgon must be the last include file in a .cpp file!!!
  13. #include "tier0/memdbgon.h"
  14. extern ConVar fire_extinguisher_debug;
  15. //Networking
  16. IMPLEMENT_SERVERCLASS_ST( CExtinguisherJet, DT_ExtinguisherJet )
  17. SendPropInt(SENDINFO(m_bEmit), 1, SPROP_UNSIGNED),
  18. SendPropInt(SENDINFO(m_bUseMuzzlePoint), 1, SPROP_UNSIGNED),
  19. SendPropInt(SENDINFO(m_nLength), 32, SPROP_UNSIGNED),
  20. SendPropInt(SENDINFO(m_nSize), 32, SPROP_UNSIGNED),
  21. END_SEND_TABLE()
  22. //Save/restore
  23. BEGIN_DATADESC( CExtinguisherJet )
  24. //Regular fields
  25. DEFINE_FIELD( m_bEmit, FIELD_BOOLEAN ),
  26. DEFINE_KEYFIELD( m_bEnabled, FIELD_BOOLEAN, "enabled" ),
  27. DEFINE_KEYFIELD( m_nLength, FIELD_INTEGER, "length" ),
  28. DEFINE_KEYFIELD( m_nSize, FIELD_INTEGER, "size" ),
  29. DEFINE_KEYFIELD( m_nRadius, FIELD_INTEGER, "radius" ),
  30. DEFINE_KEYFIELD( m_flStrength,FIELD_FLOAT, "strength" ),
  31. DEFINE_FIELD( m_bAutoExtinguish, FIELD_BOOLEAN ),
  32. DEFINE_FIELD( m_bUseMuzzlePoint, FIELD_BOOLEAN ),
  33. DEFINE_INPUTFUNC( FIELD_VOID, "Enable", InputEnable ),
  34. DEFINE_INPUTFUNC( FIELD_VOID, "Disable", InputDisable ),
  35. DEFINE_INPUTFUNC( FIELD_VOID, "Toggle", InputToggle ),
  36. DEFINE_FUNCTION( ExtinguishThink ),
  37. END_DATADESC()
  38. LINK_ENTITY_TO_CLASS( env_extinguisherjet, CExtinguisherJet );
  39. //-----------------------------------------------------------------------------
  40. // Purpose: Constructor
  41. //-----------------------------------------------------------------------------
  42. CExtinguisherJet::CExtinguisherJet( void )
  43. {
  44. m_bEmit = false;
  45. m_bEnabled = false;
  46. m_bAutoExtinguish = true;
  47. m_nLength = 128;
  48. m_nSize = 8;
  49. m_flStrength = 0.97f; //FIXME: Stub numbers
  50. m_nRadius = 32;
  51. // Send to the client even though we don't have a model
  52. AddEFlags( EFL_FORCE_CHECK_TRANSMIT );
  53. }
  54. //-----------------------------------------------------------------------------
  55. // Purpose:
  56. //-----------------------------------------------------------------------------
  57. void CExtinguisherJet::Spawn( void )
  58. {
  59. Precache();
  60. if ( m_bEnabled )
  61. {
  62. TurnOn();
  63. }
  64. }
  65. void CExtinguisherJet::Precache()
  66. {
  67. BaseClass::Precache();
  68. PrecacheScriptSound( "ExtinguisherJet.TurnOn" );
  69. PrecacheScriptSound( "ExtinguisherJet.TurnOff" );
  70. }
  71. //-----------------------------------------------------------------------------
  72. // Purpose:
  73. //-----------------------------------------------------------------------------
  74. void CExtinguisherJet::TurnOn( void )
  75. {
  76. //Turn on sound
  77. if ( m_bEmit == false )
  78. {
  79. EmitSound( "ExtinguisherJet.TurnOn" );
  80. m_bEnabled = m_bEmit = true;
  81. }
  82. SetThink( ExtinguishThink );
  83. SetNextThink( gpGlobals->curtime + 0.1f );
  84. }
  85. //-----------------------------------------------------------------------------
  86. // Purpose:
  87. //-----------------------------------------------------------------------------
  88. void CExtinguisherJet::TurnOff( void )
  89. {
  90. //Turn off sound
  91. if ( m_bEmit )
  92. {
  93. EmitSound( "ExtinguisherJet.TurnOff" );
  94. m_bEnabled = m_bEmit = false;
  95. }
  96. SetThink( NULL );
  97. }
  98. //-----------------------------------------------------------------------------
  99. // Purpose:
  100. // Input : &inputdata -
  101. //-----------------------------------------------------------------------------
  102. void CExtinguisherJet::InputEnable( inputdata_t &inputdata )
  103. {
  104. TurnOn();
  105. }
  106. //-----------------------------------------------------------------------------
  107. // Purpose:
  108. // Input : &inputdata -
  109. //-----------------------------------------------------------------------------
  110. void CExtinguisherJet::InputDisable( inputdata_t &inputdata )
  111. {
  112. TurnOff();
  113. }
  114. //-----------------------------------------------------------------------------
  115. // Purpose:
  116. // Input : &inputdata -
  117. //-----------------------------------------------------------------------------
  118. void CExtinguisherJet::InputToggle( inputdata_t &inputdata )
  119. {
  120. if ( m_bEnabled )
  121. {
  122. TurnOff();
  123. }
  124. else
  125. {
  126. TurnOn();
  127. }
  128. }
  129. //-----------------------------------------------------------------------------
  130. // Purpose:
  131. //-----------------------------------------------------------------------------
  132. void CExtinguisherJet::Think( void )
  133. {
  134. CBaseEntity::Think();
  135. }
  136. //-----------------------------------------------------------------------------
  137. // Purpose:
  138. //-----------------------------------------------------------------------------
  139. void CExtinguisherJet::ExtinguishThink( void )
  140. {
  141. SetNextThink( gpGlobals->curtime + 0.1f );
  142. if ( m_bEnabled == false )
  143. return;
  144. if ( m_bAutoExtinguish == false )
  145. return;
  146. Vector vTestPos;
  147. Vector vForward, vRight, vUp;
  148. AngleVectors( GetAbsAngles(), &vForward );
  149. vTestPos = GetAbsOrigin() + ( vForward * m_nLength );
  150. trace_t tr;
  151. UTIL_TraceLine( GetAbsOrigin(), vTestPos, MASK_SHOT, this, COLLISION_GROUP_NONE, &tr );
  152. //Extinguish the fire where we hit
  153. FireSystem_ExtinguishInRadius( tr.endpos, m_nRadius, m_flStrength );
  154. //Debug visualization
  155. if ( fire_extinguisher_debug.GetInt() )
  156. {
  157. int radius = m_nRadius;
  158. NDebugOverlay::Line( GetAbsOrigin(), tr.endpos, 0, 0, 128, false, 0.1f );
  159. NDebugOverlay::Box( GetAbsOrigin(), Vector(-1, -1, -1), Vector(1, 1, 1), 0, 0, 128, false, 0.1f );
  160. NDebugOverlay::Box( tr.endpos, Vector(-2, -2, -2), Vector(2, 2, 2), 0, 0, 128, false, 0.1f );
  161. NDebugOverlay::Box( tr.endpos, Vector(-radius, -radius, -radius), Vector(radius, radius, radius), 0, 0, 255, false, 0.1f );
  162. }
  163. }