//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: // // $NoKeywords: $ //=============================================================================// #include "cbase.h" #include "extinguisherjet.h" #include "engine/IEngineSound.h" #include "fire.h" #include "ndebugoverlay.h" // memdbgon must be the last include file in a .cpp file!!! #include "tier0/memdbgon.h" extern ConVar fire_extinguisher_debug; //Networking IMPLEMENT_SERVERCLASS_ST( CExtinguisherJet, DT_ExtinguisherJet ) SendPropInt(SENDINFO(m_bEmit), 1, SPROP_UNSIGNED), SendPropInt(SENDINFO(m_bUseMuzzlePoint), 1, SPROP_UNSIGNED), SendPropInt(SENDINFO(m_nLength), 32, SPROP_UNSIGNED), SendPropInt(SENDINFO(m_nSize), 32, SPROP_UNSIGNED), END_SEND_TABLE() //Save/restore BEGIN_DATADESC( CExtinguisherJet ) //Regular fields DEFINE_FIELD( m_bEmit, FIELD_BOOLEAN ), DEFINE_KEYFIELD( m_bEnabled, FIELD_BOOLEAN, "enabled" ), DEFINE_KEYFIELD( m_nLength, FIELD_INTEGER, "length" ), DEFINE_KEYFIELD( m_nSize, FIELD_INTEGER, "size" ), DEFINE_KEYFIELD( m_nRadius, FIELD_INTEGER, "radius" ), DEFINE_KEYFIELD( m_flStrength,FIELD_FLOAT, "strength" ), DEFINE_FIELD( m_bAutoExtinguish, FIELD_BOOLEAN ), DEFINE_FIELD( m_bUseMuzzlePoint, FIELD_BOOLEAN ), DEFINE_INPUTFUNC( FIELD_VOID, "Enable", InputEnable ), DEFINE_INPUTFUNC( FIELD_VOID, "Disable", InputDisable ), DEFINE_INPUTFUNC( FIELD_VOID, "Toggle", InputToggle ), DEFINE_FUNCTION( ExtinguishThink ), END_DATADESC() LINK_ENTITY_TO_CLASS( env_extinguisherjet, CExtinguisherJet ); //----------------------------------------------------------------------------- // Purpose: Constructor //----------------------------------------------------------------------------- CExtinguisherJet::CExtinguisherJet( void ) { m_bEmit = false; m_bEnabled = false; m_bAutoExtinguish = true; m_nLength = 128; m_nSize = 8; m_flStrength = 0.97f; //FIXME: Stub numbers m_nRadius = 32; // Send to the client even though we don't have a model AddEFlags( EFL_FORCE_CHECK_TRANSMIT ); } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CExtinguisherJet::Spawn( void ) { Precache(); if ( m_bEnabled ) { TurnOn(); } } void CExtinguisherJet::Precache() { BaseClass::Precache(); PrecacheScriptSound( "ExtinguisherJet.TurnOn" ); PrecacheScriptSound( "ExtinguisherJet.TurnOff" ); } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CExtinguisherJet::TurnOn( void ) { //Turn on sound if ( m_bEmit == false ) { EmitSound( "ExtinguisherJet.TurnOn" ); m_bEnabled = m_bEmit = true; } SetThink( ExtinguishThink ); SetNextThink( gpGlobals->curtime + 0.1f ); } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CExtinguisherJet::TurnOff( void ) { //Turn off sound if ( m_bEmit ) { EmitSound( "ExtinguisherJet.TurnOff" ); m_bEnabled = m_bEmit = false; } SetThink( NULL ); } //----------------------------------------------------------------------------- // Purpose: // Input : &inputdata - //----------------------------------------------------------------------------- void CExtinguisherJet::InputEnable( inputdata_t &inputdata ) { TurnOn(); } //----------------------------------------------------------------------------- // Purpose: // Input : &inputdata - //----------------------------------------------------------------------------- void CExtinguisherJet::InputDisable( inputdata_t &inputdata ) { TurnOff(); } //----------------------------------------------------------------------------- // Purpose: // Input : &inputdata - //----------------------------------------------------------------------------- void CExtinguisherJet::InputToggle( inputdata_t &inputdata ) { if ( m_bEnabled ) { TurnOff(); } else { TurnOn(); } } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CExtinguisherJet::Think( void ) { CBaseEntity::Think(); } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void CExtinguisherJet::ExtinguishThink( void ) { SetNextThink( gpGlobals->curtime + 0.1f ); if ( m_bEnabled == false ) return; if ( m_bAutoExtinguish == false ) return; Vector vTestPos; Vector vForward, vRight, vUp; AngleVectors( GetAbsAngles(), &vForward ); vTestPos = GetAbsOrigin() + ( vForward * m_nLength ); trace_t tr; UTIL_TraceLine( GetAbsOrigin(), vTestPos, MASK_SHOT, this, COLLISION_GROUP_NONE, &tr ); //Extinguish the fire where we hit FireSystem_ExtinguishInRadius( tr.endpos, m_nRadius, m_flStrength ); //Debug visualization if ( fire_extinguisher_debug.GetInt() ) { int radius = m_nRadius; NDebugOverlay::Line( GetAbsOrigin(), tr.endpos, 0, 0, 128, false, 0.1f ); NDebugOverlay::Box( GetAbsOrigin(), Vector(-1, -1, -1), Vector(1, 1, 1), 0, 0, 128, false, 0.1f ); NDebugOverlay::Box( tr.endpos, Vector(-2, -2, -2), Vector(2, 2, 2), 0, 0, 128, false, 0.1f ); NDebugOverlay::Box( tr.endpos, Vector(-radius, -radius, -radius), Vector(radius, radius, radius), 0, 0, 255, false, 0.1f ); } }