#ifndef C_RECIPIENTFILTER_H
#define C_RECIPIENTFILTER_H
#ifdef _WIN32
#pragma once
#endif

#include "irecipientfilter.h"
#include "utlvector.h"
#include "c_baseentity.h"
#include "soundflags.h"
#include "bitvec.h"

class C_BasePlayer;
class C_Team;

class C_RecipientFilter : public IRecipientFilter
{
public:
	C_RecipientFilter();
	virtual			~C_RecipientFilter();

	virtual bool	IsReliable(void) const;

	virtual int		GetRecipientCount(void) const;
	virtual int		GetRecipientIndex(int slot) const;

	virtual bool	IsInitMessage(void) const { return false; };

public:

	void			CopyFrom(const C_RecipientFilter& src);

	void			Reset(void);

	void			MakeReliable(void);

	void			AddAllPlayers(void);
	void			AddRecipientsByPVS(const Vector& origin);
	void			AddRecipientsByPAS(const Vector& origin);
	void			AddRecipient(C_BasePlayer* player);
	void			RemoveRecipient(C_BasePlayer* player);
	void			AddRecipientsByTeam(C_Team* team);
	void			RemoveRecipientsByTeam(C_Team* team);

	void			UsePredictionRules(void);
	bool			IsUsingPredictionRules(void) const;

	bool			IgnorePredictionCull(void) const;
	void			SetIgnorePredictionCull(bool ignore);

	void			AddPlayersFromBitMask(CPlayerBitVec& playerbits);

	void			RemoveSplitScreenPlayers();

private:

	bool				m_bReliable;
	bool				m_bInitMessage;
	CUtlVector< int >	m_Recipients;
	bool				m_bUsingPredictionRules;
	bool				m_bIgnorePredictionCull;
};

class CSingleUserRecipientFilter : public C_RecipientFilter
{
public:
	CSingleUserRecipientFilter(C_BasePlayer* player)
	{
		AddRecipient(player);
	}
};

class CBroadcastRecipientFilter : public C_RecipientFilter
{
public:
	CBroadcastRecipientFilter(void)
	{
		AddAllPlayers();
	}
};

class CReliableBroadcastRecipientFilter : public CBroadcastRecipientFilter
{
public:
	CReliableBroadcastRecipientFilter(void)
	{
		MakeReliable();
	}
};

class CPASFilter : public C_RecipientFilter
{
public:
	CPASFilter(const Vector& origin)
	{
		AddRecipientsByPAS(origin);
	}
};

class CPASAttenuationFilter : public CPASFilter
{
public:
	CPASAttenuationFilter(C_BaseEntity* entity, float attenuation = ATTN_NORM) :
		CPASFilter(entity->GetAbsOrigin())
	{
	}

	CPASAttenuationFilter(const Vector& origin, float attenuation = ATTN_NORM) :
		CPASFilter(origin)
	{
	}

	CPASAttenuationFilter(C_BaseEntity* entity, const char* lookupSound) :
		CPASFilter(entity->GetAbsOrigin())
	{
	}

	CPASAttenuationFilter(const Vector& origin, const char* lookupSound) :
		CPASFilter(origin)
	{
	}

	CPASAttenuationFilter(C_BaseEntity* entity, const char* lookupSound, HSOUNDSCRIPTHANDLE& handle) :
		CPASFilter(entity->GetAbsOrigin())
	{
	}

	CPASAttenuationFilter(const Vector& origin, const char* lookupSound, HSOUNDSCRIPTHANDLE& handle) :
		CPASFilter(origin)
	{
	}
};

class CPVSFilter : public C_RecipientFilter
{
public:
	CPVSFilter(const Vector& origin)
	{
		AddRecipientsByPVS(origin);
	}
};

class CLocalPlayerFilter : public C_RecipientFilter
{
public:
	CLocalPlayerFilter(void);
};

#endif  