//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: 
//
// $NoKeywords: $
//=============================================================================//
#include "cbase.h"
#include "C_BaseFourWheelVehicle.h"

IMPLEMENT_CLIENTCLASS_DT(C_BaseTFFourWheelVehicle, DT_BaseTFFourWheelVehicle, CBaseTFFourWheelVehicle)
	RecvPropFloat( RECVINFO( m_flDeployFinishTime ) ),
	RecvPropInt( RECVINFO( m_eDeployMode ) ),
	RecvPropInt( RECVINFO( m_bBoostUpgrade ) ),
	RecvPropInt( RECVINFO( m_nBoostTimeLeft ) ),
END_RECV_TABLE()

//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
C_BaseTFFourWheelVehicle::C_BaseTFFourWheelVehicle()
{
}

//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
float C_BaseTFFourWheelVehicle::GetDeployFinishTime() const
{
	return m_flDeployFinishTime;
}

//-----------------------------------------------------------------------------
// Purpose:
//-----------------------------------------------------------------------------
VehicleModeDeploy_e C_BaseTFFourWheelVehicle::GetVehicleModeDeploy() const
{
	return m_eDeployMode;
}

//-----------------------------------------------------------------------------
// Purpose: 
//-----------------------------------------------------------------------------
void C_BaseTFFourWheelVehicle::OnDataChanged( DataUpdateType_t updateType )
{
	BaseClass::OnDataChanged( updateType );

	if ( updateType == DATA_UPDATE_CREATED )
	{
		// Start thinking (Baseclass stops it)
		ClientThinkList()->SetNextClientThink( GetClientHandle(), CLIENT_THINK_ALWAYS );
	}
}

//-----------------------------------------------------------------------------
// Restricts the view within a range of the center...
//-----------------------------------------------------------------------------
void C_BaseTFFourWheelVehicle::RestrictView( int nRole, float flMinYaw, float flMaxYaw, QAngle &vecViewAngles )
{
	Assert( nRole >= 0 );
	Vector vehicleEyeOrigin;
	QAngle vehicleEyeAngles;
	GetRoleViewPosition( nRole, &vehicleEyeOrigin, &vehicleEyeAngles ); 

	// Confine the view to the appropriate yaw range...
	float flCenterYaw = vehicleEyeAngles[YAW];

	// View angles are dealt with in absolute terms here...
	float flAngleDiff = AngleDiff( vecViewAngles[YAW], flCenterYaw );

	// Here, we must clamp to the cone...
	if (flAngleDiff < flMinYaw)
		vecViewAngles[YAW] = anglemod(flCenterYaw + flMinYaw);
	else if (flAngleDiff > flMaxYaw)
		vecViewAngles[YAW] = anglemod(flCenterYaw + flMaxYaw);
}


//-----------------------------------------------------------------------------
// Clamps the view angles while driving the vehicle 
//-----------------------------------------------------------------------------
void C_BaseTFFourWheelVehicle::UpdateViewAngles( C_BasePlayer *pLocalPlayer, CUserCmd *pCmd )
{
	int nRole = GetPassengerRole( pLocalPlayer );
	if ( nRole != VEHICLE_ROLE_DRIVER )
	{
		RestrictView( nRole, -90, 90, pCmd->viewangles );
	}
}