text: //========= Copyright Valve Corporation, All rights reserved. ============//
  //
  // Purpose: 
  //
  //=============================================================================//
  
  #include "cbase.h"
  #include "citadel_effects_shared.h"
  
  // memdbgon must be the last include file in a .cpp file!!!
  #include "tier0/memdbgon.h"
  
  LINK_ENTITY_TO_CLASS( env_citadel_energy_core, CCitadelEnergyCore );
  
  BEGIN_DATADESC( CCitadelEnergyCore )
  	DEFINE_KEYFIELD( m_flScale, FIELD_FLOAT, "scale" ),
  	DEFINE_FIELD( m_nState, FIELD_INTEGER ),
  	DEFINE_FIELD( m_flDuration, FIELD_FLOAT ),
  	DEFINE_FIELD( m_flStartTime, FIELD_TIME ),
  
  	DEFINE_INPUTFUNC( FIELD_FLOAT, "StartCharge", InputStartCharge ),
  	DEFINE_INPUTFUNC( FIELD_VOID, "StartDischarge", InputStartDischarge ),
  	DEFINE_INPUTFUNC( FIELD_FLOAT, "Stop", InputStop ),
  END_DATADESC()
  
  IMPLEMENT_SERVERCLASS_ST( CCitadelEnergyCore, DT_CitadelEnergyCore )
  	SendPropFloat( SENDINFO(m_flScale), 0, SPROP_NOSCALE),
  	SendPropInt( SENDINFO(m_nState), 8, SPROP_UNSIGNED),
  	SendPropFloat( SENDINFO(m_flDuration), 0, SPROP_NOSCALE),
  	SendPropFloat( SENDINFO(m_flStartTime), 0, SPROP_NOSCALE),
  	SendPropInt( SENDINFO(m_spawnflags), 0, SPROP_UNSIGNED),
  END_SEND_TABLE()
  
  
  //-----------------------------------------------------------------------------
  // Precache: 
  //-----------------------------------------------------------------------------
  void CCitadelEnergyCore::Precache()
  {
  	BaseClass::Precache();
  	PrecacheMaterial( "effects/combinemuzzle2_dark" ); 
  }
  
  
  //-----------------------------------------------------------------------------
  // Purpose: 
  //-----------------------------------------------------------------------------
  void CCitadelEnergyCore::Spawn( void )
  {
  	Precache();
  
  	UTIL_SetSize( this, Vector( -8, -8, -8 ), Vector( 8, 8, 8 ) );
  
  	// See if we start active
  	if ( HasSpawnFlags( SF_ENERGYCORE_START_ON ) )
  	{
  		m_nState = (int)ENERGYCORE_STATE_DISCHARGING;
  		m_flStartTime = gpGlobals->curtime;
  	}
  
  	// No model but we still need to force this!
  	AddEFlags( EFL_FORCE_CHECK_TRANSMIT );
  }
  
  //-----------------------------------------------------------------------------
  // Purpose: 
  // Input  : flWarmUpTime - 
  //-----------------------------------------------------------------------------
  void CCitadelEnergyCore::StartCharge( float flWarmUpTime )
  {
  	m_nState = (int)ENERGYCORE_STATE_CHARGING;
  	m_flDuration = flWarmUpTime;
  	m_flStartTime = gpGlobals->curtime;
  }
  
  //-----------------------------------------------------------------------------
  // Purpose: 
  //-----------------------------------------------------------------------------
  void CCitadelEnergyCore::StartDischarge( void )
  {
  	m_nState = (int)ENERGYCORE_STATE_DISCHARGING;
  	m_flStartTime = gpGlobals->curtime;
  }
  
  //-----------------------------------------------------------------------------
  // Purpose: 
  // Input  : flCoolDownTime - 
  //-----------------------------------------------------------------------------
  void CCitadelEnergyCore::StopDischarge( float flCoolDownTime )
  {
  	m_nState = (int)ENERGYCORE_STATE_OFF;
  	m_flDuration = flCoolDownTime;
  	m_flStartTime = gpGlobals->curtime;
  }
  
  //-----------------------------------------------------------------------------
  // Purpose: 
  // Input  : &inputdata - 
  //-----------------------------------------------------------------------------
  void CCitadelEnergyCore::InputStartCharge( inputdata_t &inputdata )
  {
  	StartCharge( inputdata.value.Float() );
  }
  
  //-----------------------------------------------------------------------------
  // Purpose: 
  // Input  : &inputdata - 
  //-----------------------------------------------------------------------------
  void CCitadelEnergyCore::InputStartDischarge( inputdata_t &inputdata )
  {
  	StartDischarge();
  }
  
  //-----------------------------------------------------------------------------
  // Purpose: 
  // Input  : &inputdata - 
  //-----------------------------------------------------------------------------
  void CCitadelEnergyCore::InputStop( inputdata_t &inputdata )
  {
  	StopDischarge( inputdata.value.Float() );
  }
  
  CBaseViewModel *IsViewModelMoveParent( CBaseEntity *pEffect )
  {
  	if ( pEffect->GetMoveParent() )
  	{
  		CBaseViewModel *pViewModel = dynamic_cast<CBaseViewModel *>( pEffect->GetMoveParent() );
  
  		if ( pViewModel )
  		{
  			return pViewModel;
  		}
  	}
  
  	return NULL;
  }
  
  int CCitadelEnergyCore::UpdateTransmitState( void )
  {
  	if ( IsViewModelMoveParent( this ) )
  	{
  		return SetTransmitState( FL_EDICT_FULLCHECK );
  	}
  
  	return BaseClass::UpdateTransmitState();
  }
  
  int CCitadelEnergyCore::ShouldTransmit( const CCheckTransmitInfo *pInfo )
  {
  	CBaseViewModel *pViewModel = IsViewModelMoveParent( this );
  
  	if ( pViewModel )
  	{
  		return pViewModel->ShouldTransmit( pInfo );
  	}
  
  	return BaseClass::ShouldTransmit( pInfo );
  }
  