//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: 
//
// $NoKeywords: $
//=============================================================================//

// copied from portal2 code; original code came with client-predicted counterpart,
// but implementing predictable triggers in tf2 wasn't trivial so this is just the
// server component. it works but causes prediction errors.
#ifndef TRIGGER_CATAPULT_H
#define TRIGGER_CATAPULT_H
#ifdef _WIN32
#pragma once
#endif

#include "triggers.h"


class CTriggerCatapult : public CBaseTrigger
{
	DECLARE_CLASS( CTriggerCatapult, CBaseTrigger );
	DECLARE_DATADESC();
	//DECLARE_SERVERCLASS();

public:

	CTriggerCatapult( void );

	virtual void	Spawn( void );
	virtual void	StartTouch( CBaseEntity *pOther );
	virtual void	EndTouch( CBaseEntity *pOther );
	virtual int		DrawDebugTextOverlays(void);
	virtual void	DrawDebugGeometryOverlays( void );

	void			LaunchThink( void );

	void			PlayerPassesTriggerFiltersThink( void );
	static const char *s_szPlayerPassesTriggerFiltersThinkContext;

private:
	void			InputSetPlayerSpeed( inputdata_t &in );
	void			InputSetPhysicsSpeed( inputdata_t &in );
	void			InputSetLaunchTarget( inputdata_t &in );
	void			InputSetExactVelocityChoiceType( inputdata_t &in );

	void			LaunchByTarget( CBaseEntity *pVictim, CBaseEntity *pTarget  );
	Vector			CalculateLaunchVector( CBaseEntity *pVictim, CBaseEntity *pTarget  );
	Vector			CalculateLaunchVectorPreserve( Vector vecInitialVelocity, CBaseEntity *pVictim, CBaseEntity *pTarget, bool bForcePlayer = false );

	void			LaunchByDirection( CBaseEntity *pVictim  );
	void			OnLaunchedVictim( CBaseEntity *pVictim );

	float m_flRefireDelay[MAX_PLAYERS + 1];
	float m_flPlayerVelocity;
	float m_flPhysicsVelocity;
	QAngle m_vecLaunchAngles;
	string_t m_strLaunchTarget;
	int m_ExactVelocityChoice;
	bool m_bUseExactVelocity;
	bool m_bUseThresholdCheck;
	float m_flLowerThreshold;
	float m_flUpperThreshold;
	float m_flEntryAngleTolerance;
	EHANDLE m_hLaunchTarget;
	bool m_bOnlyVelocityCheck;
	bool m_bApplyAngularImpulse;
	bool m_bPlayersPassTriggerFilters;
	float m_flAirControlSupressionTime;
	bool m_bDirectionSuppressAirControl;

	//CNetworkArray( float, m_flRefireDelay, MAX_PLAYERS + 1 ); // 0 for physics object the rest for each player userid
	//CNetworkVar( float, m_flPlayerVelocity );
	//CNetworkVar( float, m_flPhysicsVelocity );
	//CNetworkQAngle( m_vecLaunchAngles );
	////CNetworkVar( string_t, m_strLaunchTarget );
	//string_t m_strLaunchTarget;

	//CNetworkVar( int, m_ExactVelocityChoice );
	//CNetworkVar( bool, m_bUseExactVelocity );

	//CNetworkVar( bool, m_bUseThresholdCheck );
	//CNetworkVar( float, m_flLowerThreshold );
	//CNetworkVar( float, m_flUpperThreshold );
	//CNetworkVar( float, m_flEntryAngleTolerance );

	//CNetworkHandle( CBaseEntity, m_hLaunchTarget );

	//CNetworkVar( bool, m_bOnlyVelocityCheck );
	//CNetworkVar( bool, m_bApplyAngularImpulse );
	//CNetworkVar( bool, m_bPlayersPassTriggerFilters );

	//CNetworkVar( float, m_flAirControlSupressionTime ); // After catapult, stop air control for this long (or default of quarter second if this value is negative)
	//CNetworkVar( bool, m_bDirectionSuppressAirControl );	// Do we want to use air control suppression for directional catapults.

	COutputEvent	m_OnCatapulted;

	CUtlVector< EHANDLE > m_hAbortedLaunchees;
};

#endif // TRIGGER_CATAPULT_H  
