//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
//=============================================================================
#ifndef TF_PLAYERCLASS_SHARED_H
#define TF_PLAYERCLASS_SHARED_H
#ifdef _WIN32
#pragma once
#endif

#include "tf_shareddefs.h"
#include "tf_classdata.h"

// Client specific.
#ifdef CLIENT_DLL

EXTERN_RECV_TABLE( DT_TFPlayerClassShared );

// Server specific.
#else

EXTERN_SEND_TABLE( DT_TFPlayerClassShared );

#endif

//-----------------------------------------------------------------------------
// TF Player Class Shared
//-----------------------------------------------------------------------------
class CTFPlayerClassShared
{
public:

	CTFPlayerClassShared();

	DECLARE_EMBEDDED_NETWORKVAR()
	DECLARE_CLASS_NOBASE( CTFPlayerClassShared );

	bool		Init( int iClass );
	bool		IsClass( int iClass ) const						{ return ( m_iClass == iClass ); }
	int			GetClassIndex( void ) const						{ return m_iClass; }
	void		Reset( void );

#ifdef CLIENT_DLL
	string_t	GetClassIconName( void ) const					{ return MAKE_STRING( m_iszClassIcon ); }
	bool		HasCustomModel( void ) const					{ return m_iszCustomModel[0] != '\0'; }
#else
	string_t	GetClassIconName( void ) const					{ return m_iszClassIcon.Get(); }
	void		SetClassIconName( string_t iszClassIcon )		{ m_iszClassIcon = iszClassIcon; }
	bool		HasCustomModel( void ) const					{ return (m_iszCustomModel.Get() != NULL_STRING); }
#endif

#ifndef CLIENT_DLL
	#define USE_CLASS_ANIMATIONS true
	void		SetCustomModel( const char *pszModelName, bool isUsingClassAnimations = false );
	void		SetCustomModelOffset( Vector &vecOffset )		{ m_vecCustomModelOffset = vecOffset; }
	void		SetCustomModelRotates( bool bRotates )			{ m_bCustomModelRotates = bRotates; }
	void		SetCustomModelRotation( QAngle &vecOffset )		{ m_angCustomModelRotation = vecOffset; m_bCustomModelRotationSet = true; }
	void		ClearCustomModelRotation( void )				{ m_bCustomModelRotationSet = false; }
	void		SetCustomModelVisibleToSelf( bool bVisible )	{ m_bCustomModelVisibleToSelf = bVisible; }
#endif

	const char	*GetName( void ) const							{ return GetPlayerClassData( m_iClass )->m_szClassName; }
	const char	*GetModelName( void ) const;
	const char	*GetHandModelName( int iHandIndex ) const;
	float		GetMaxSpeed( void )								{ return GetPlayerClassData( m_iClass )->m_flMaxSpeed; }
	int			GetMaxHealth( void ) const						{ return GetPlayerClassData( m_iClass )->m_nMaxHealth; }
	int			GetMaxArmor( void )	const						{ return GetPlayerClassData( m_iClass )->m_nMaxArmor; }
	Vector		GetCustomModelOffset( void ) const				{ return m_vecCustomModelOffset.Get(); }
	QAngle		GetCustomModelRotation( void ) const			{ return m_angCustomModelRotation.Get(); }
	bool		CustomModelRotationSet( void )					{ return m_bCustomModelRotationSet.Get(); }
	bool		CustomModelRotates( void ) const				{ return m_bCustomModelRotates.Get(); }
	bool		CustomModelIsVisibleToSelf( void ) const		{ return m_bCustomModelVisibleToSelf.Get(); }
	bool		CustomModelUsesClassAnimations( void ) const	{ return m_bUseClassAnimations.Get(); }
	bool		CustomModelHasChanged( void );

	TFPlayerClassData_t  *GetData( void ) const					{ return GetPlayerClassData( m_iClass ); }

	// If needed, put this into playerclass scripts
	bool CanBuildObject( int iObjectType );

protected:

	CNetworkVar( int,	m_iClass );

#ifdef CLIENT_DLL
	char		m_iszClassIcon[MAX_PATH];
	char		m_iszCustomModel[MAX_PATH];
#else
	CNetworkVar( string_t, m_iszClassIcon );
	CNetworkVar( string_t, m_iszCustomModel );
#endif
	CNetworkVar( Vector, m_vecCustomModelOffset );
	CNetworkVar( QAngle, m_angCustomModelRotation );
	CNetworkVar( bool, m_bCustomModelRotates );
	CNetworkVar( bool, m_bCustomModelRotationSet );
	CNetworkVar( bool, m_bCustomModelVisibleToSelf );
	CNetworkVar( bool, m_bUseClassAnimations );
	CNetworkVar( int,  m_iClassModelParity );
	int			m_iOldClassModelParity;
};

#endif // TF_PLAYERCLASS_SHARED_H