//========= Copyright Valve Corporation, All rights reserved. ============//
//
//
//=============================================================================
#include "cbase.h"
#include "tf_weapon_raygun.h"
#include "tf_fx_shared.h"
#include "in_buttons.h"

// Client specific.
#ifdef CLIENT_DLL
#include "c_tf_player.h"
#include "particle_property.h"
#else
#include "tf_player.h"
#include "ndebugoverlay.h"
#include "particle_parse.h"
#include "tf_fx.h"
#include "tf_gamestats.h"
#include "tf_projectile_energy_ring.h"
#endif


//============================

IMPLEMENT_NETWORKCLASS_ALIASED( TFRaygun, DT_WeaponRaygun )

BEGIN_NETWORK_TABLE( CTFRaygun, DT_WeaponRaygun )
#ifdef GAME_DLL
	SendPropBool( SENDINFO( m_bUseNewProjectileCode ) ),
#else
	RecvPropBool( RECVINFO( m_bUseNewProjectileCode ) ),
#endif
END_NETWORK_TABLE()

BEGIN_PREDICTION_DATA( CTFRaygun )
END_PREDICTION_DATA()

LINK_ENTITY_TO_CLASS( tf_weapon_raygun, CTFRaygun );
PRECACHE_WEAPON_REGISTER( tf_weapon_raygun );

//============================
IMPLEMENT_NETWORKCLASS_ALIASED( TFDRGPomson, DT_WeaponDRGPomson )

BEGIN_NETWORK_TABLE( CTFDRGPomson, DT_WeaponDRGPomson )
END_NETWORK_TABLE()

BEGIN_PREDICTION_DATA( CTFDRGPomson )
END_PREDICTION_DATA()

LINK_ENTITY_TO_CLASS( tf_weapon_drg_pomson, CTFDRGPomson );
PRECACHE_WEAPON_REGISTER( tf_weapon_drg_pomson );


//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
CTFRaygun::CTFRaygun()
{
	m_bUseNewProjectileCode = false;
#ifdef GAME_DLL
	// Goofyness to preserve demos.  Old demos wont have this set on the client
	// so we'll know to use the old code path.
	m_bUseNewProjectileCode = true;
#endif
	m_flIrradiateTime = 0.f;
	m_bEffectsThinking = false;
}

//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
void CTFRaygun::Precache()
{
	PrecacheParticleSystem( "drg_bison_impact" );
	PrecacheParticleSystem( "drg_bison_idle" );
	PrecacheParticleSystem( "drg_bison_muzzleflash" );

	BaseClass::Precache();
}

//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
const char *CTFRaygun::GetMuzzleFlashParticleEffect( void )
{
	return "drg_bison_muzzleflash";
}

//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
void CTFRaygun::PrimaryAttack( void )
{
	if ( !Energy_HasEnergy() )
		return;

	BaseClass::PrimaryAttack();
}

//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
void CTFRaygun::ModifyProjectile( CBaseEntity* pProj )
{
#ifdef GAME_DLL
	/*
	CTFProjectile_EnergyRing* pEnergyBall = dynamic_cast<CTFProjectile_EnergyRing*>( pProj );
	if ( pEnergyBall == NULL )
		return;

	pEnergyBall->SetColor( 1, GetParticleColor( 1 ) );
	pEnergyBall->SetColor( 2, GetParticleColor( 2 ) );
	*/
#endif

	Energy_DrainEnergy();
}

//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
float CTFRaygun::GetProgress( void )
{
	return Energy_GetEnergy() / Energy_GetMaxEnergy();
}

#ifdef CLIENT_DLL
//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
void CTFRaygun::DispatchMuzzleFlash( const char* effectName, C_BaseEntity* pAttachEnt )
{
	DispatchParticleEffect( effectName, PATTACH_POINT_FOLLOW, pAttachEnt, "muzzle", GetParticleColor( 1 ), GetParticleColor( 2 ) );
}
#endif

//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
bool CTFRaygun::Holster( CBaseCombatWeapon *pSwitchingTo )
{
#ifdef CLIENT_DLL
	m_bEffectsThinking = false;
#endif

	return BaseClass::Holster( pSwitchingTo );
}

//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
bool CTFRaygun::Deploy( void )
{
#ifdef CLIENT_DLL
	m_bEffectsThinking = true;
	SetContextThink( &CTFRaygun::ClientEffectsThink, gpGlobals->curtime + rand() % 5, "EFFECTS_THINK" );
#endif

	return BaseClass::Deploy();
}

//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
void CTFRaygun::ItemPostFrame( void )
{
	BaseClass::ItemPostFrame();

#ifdef CLIENT_DLL
	if ( !m_bEffectsThinking )
	{
		m_bEffectsThinking = true;
		SetContextThink( &CTFRaygun::ClientEffectsThink, gpGlobals->curtime + rand() % 5, "EFFECTS_THINK" );
	}
#endif
}

#ifdef CLIENT_DLL
//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
void CTFRaygun::ClientEffectsThink( void )
{
	CTFPlayer *pPlayer = GetTFPlayerOwner();
	if ( !pPlayer )
		return;

	if ( !pPlayer->IsLocalPlayer() )
		return;

	if ( !pPlayer->GetViewModel() )
		return;

	if ( !m_bEffectsThinking )
		return;

	SetContextThink( &CTFRaygun::ClientEffectsThink, gpGlobals->curtime + 2 + rand() % 5, "EFFECTS_THINK" );

	ParticleProp()->Init( this );
	CNewParticleEffect* pEffect = ParticleProp()->Create( GetIdleParticleEffect(), PATTACH_POINT_FOLLOW, "muzzle" );
	if ( pEffect )
	{
		pEffect->SetControlPoint( CUSTOM_COLOR_CP1, GetParticleColor( 1 ) );
		pEffect->SetControlPoint( CUSTOM_COLOR_CP2, GetParticleColor( 2 ) );
	}
}

#endif

//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
float CTFRaygun::GetProjectileSpeed( void )
{
	return 1200.f;
}

//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
float CTFRaygun::GetProjectileGravity( void )
{
	return 0.f;
}

//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
bool CTFRaygun::IsViewModelFlipped( void )
{
	return !BaseClass::IsViewModelFlipped(); 
}

void CTFDRGPomson::Precache()
{
	BaseClass::Precache();

	PrecacheParticleSystem( "drg_pomson_idle" );
	PrecacheParticleSystem( "drg_pomson_impact_drain" );
	PrecacheParticleSystem( "drg_pomson_projectile" );
	PrecacheParticleSystem( "drg_pomson_muzzleflash" );
}


//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
void CTFDRGPomson::GetProjectileFireSetup( CTFPlayer *pPlayer, Vector vecOffset, Vector *vecSrc, QAngle *angForward, bool bHitTeammates, float flEndDist )
{
	BaseClass::GetProjectileFireSetup( pPlayer, vecOffset, vecSrc, angForward, bHitTeammates, flEndDist );

	// adjust to line up with the weapon muzzle
	vecSrc->z -= 13.0f;
}