
///////////////////////////////////////////////////////////////////////////////
//
// File   : AVP_CorpseCollection.h
// Author : Andy Tate
// Date   : 19-Jan-2007
//
// Copyright (C) 2007 Rebellion, All Rights Reserved.
//
///////////////////////////////////////////////////////////////////////////////

#ifdef ASURA_USE_PRAGMA_ONCE
	#pragma once
#endif   // ifdef ASURA_USE_PRAGMA_ONCE

#ifndef __AVP_CORPSECOLLECTION_H__
#define __AVP_CORPSECOLLECTION_H__

////////////////////////////////////////////////////////////////////////////////
// Include files...
////////////////////////////////////////////////////////////////////////////////

#include "Network/Asura_Guid.h"
#include "Core/Asura_Hash.h"


////////////////////////////////////////////////////////////////////////////////
// Forward class declarations...
////////////////////////////////////////////////////////////////////////////////

class Asura_Vector_3;


////////////////////////////////////////////////////////////////////////////////
// Class declaration...
////////////////////////////////////////////////////////////////////////////////

////////////////////////////////////////////////////////////////////////////////
// Class        : AVP_CorpseCollection
// Author       : Andy Tate
// Date         : 19-Jan-2007
//
// Description  : Class to handle collection of corpses.
////////////////////////////////////////////////////////////////////////////////

class AVP_CorpseCollection
{
public:
	// Public functions...
	AVP_CorpseCollection  (const Asura_Guid uMyGuid, const u_int uMaxCorpses);
	~AVP_CorpseCollection ();

	// Add/remove functions...
	bool	AddCorpse			(const bool bServer, const Asura_Guid uGuid, const Asura_Hash_ID uMarkerPointHash, const u_int uBoneID, const Asura_Vector_3& xPosition);
	bool	RemoveCorpse		(const bool bServer, const Asura_Guid uGuid);
	void	RemoveAllCorpses	(const bool bServer);

	// Accessor functions...
	u_int	GetNumCorpses	(void) const	{ return(m_uNumCorpses); }


protected:
	// Protected variables...

	// Protected functions...


private:
	// Private variables...
	union
	{
		u_int		m_uFlags;				// Single access point for the flags.

		struct
		{
			u_int	m_uNumCorpses	: 8,	// The current number of corpses collected.
					m_uMaxCorpses	: 8,	// The maximum number of corpses collected.

									: 0;	// 16 spare-bits
		};
	};

	Asura_Guid	m_uMyGuid;					// The GUID for the entity collecting corpses.
	Asura_Guid*	m_puCorpseGuids;			// Array of GUIDs for the corpses currently collected.

	// Private functions...
	AVP_CorpseCollection  (void);
	AVP_CorpseCollection  (const AVP_CorpseCollection& xOther);

	AVP_CorpseCollection&	operator=	(const AVP_CorpseCollection& xOther);

	// Connection functions...
	bool	ApplyConnection		(const bool bServer, const Asura_Guid uGuid, const Asura_Hash_ID uMarkerPointHash, const u_int uBoneID, const Asura_Vector_3& xPosition);
	bool	ApplyDisconnection	(const bool bServer, const Asura_Guid uGuid);

};   // End of class 'AVP_CorpseCollection'.


#endif   // ifndef __AVP_CORPSECOLLECTION_H__


/// End of file. ///
