source-engine/game/server/hl2/extinguisherjet.cpp

203 lines
5.5 KiB
C++
Raw Normal View History

2020-04-22 16:56:21 +00:00
//========= 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 );
}
}