/*****************************************************************************
*
*  PROJECT:     Multi Theft Auto v1.0
*  LICENSE:     See LICENSE in the top level directory
*  FILE:        multiplayer_sa/CPopulationSA.h
*  PURPOSE:     Ped world population class
*  DEVELOPERS:  Ed Lyons <eai@opencoding.net>
*               Christian Myhre Lundheim <>
*
*  Multi Theft Auto is available from http://w...content-available-to-author-only...o.com/
*
*****************************************************************************/

#include <multiplayer/CPopulationMP.h>

// These includes need to be fixed!
#include "../game_sa/CPedSA.h"
#include "../game_sa/CVehicleSA.h"
#include "../game_sa/CObjectSA.h"
#include "../game_sa/CCivilianPedSA.h"
#include "../sdk/game/CVehicle.h"
#include "../sdk/game/CObject.h"

#include <list>

#ifndef __CMULTIPLAYER_POPULATION
#define __CMULTIPLAYER_POPULATION

#define HOOKPOS_EndOf_CPopulation__Add      0x612C76
#define HOOKPOS_CPopulation__RemovePed      0x610F20

#define HOOKPOS_CVehicle__Add				0x00000000
#define HOOKPOS_CVehicle__Remove			0x00000000

#define HOOKPOS_CObject__Add				0x00000000
#define HOOKPOS_CObject__Remove				0x00000000

#define VTBL_CPlayerPed                     0x86D168

class CPopulationSA : public CPopulationMP
{
private:
    std::list < CCivilianPedSA* >               peds;
    std::list < CCivilianPedSA* > ::iterator    pedIter;
    DWORD                                       dwPedCount;

	std::list < CVehicleSA* >					vehicles;
	std::list < CVehicleSA* > ::iterator		vehIter;
	DWORD                                       dwVehicleCount;

	std::list < CObjectSA* >					objects;
	std::list < CObjectSA* > ::iterator			objectIter;
	DWORD                                       dwObjectCount;
public:
                        CPopulationSA();
    VOID                AddPed ( CCivilianPed * ped );
    VOID                AddPed ( CPedSAInterface * ped );
    VOID                RemovePed ( CCivilianPed * ped );
    VOID                RemovePed ( CPedSAInterface * ped );
    DWORD               GetPedCount ( );
    CCivilianPed *      GetFirstPed ( );
    CCivilianPed *      GetNextPed ( );
    void                SetCivilianAddHandler ( CivilianAddHandler * pCivilianAddHandler );
    void                SetCivilianRemoveHandler ( CivilianAddHandler * pCivilianAddHandler );

	VOID                AddVehicle(CVehicle * vehicle);
	VOID                AddVehicle(CVehicleSAInterface * vehicle);
	VOID                RemoveVehicle(CVehicle * vehicle);
	VOID                RemoveVehicle(CVehicleSAInterface * vehicle);
	DWORD               GetVehicleCount();
	CVehicle *			GetFirstVehicle();
	CVehicle *			GetNextVehicle();
	void                SetVehicleAddHandler(VehicleAddHandler * pVehicleAddHandler);
	void                SetVehicleRemoveHandler(VehicleRemoveHandler * pVehicleRemoveHandler);

	VOID                AddObject(CObject * Object);
	VOID                AddObject(CObjectSAInterface * Object);
	VOID                RemoveObject(CObject * Object);
	VOID                RemoveObject(CObjectSAInterface * Object);
	DWORD               GetObjectCount();
	CObject *			GetFirstObject();
	CObject *			GetNextObject();
	void                SetObjectAddHandler(ObjectAddHandler * pObjectAddHandler);
	void                SetObjectRemoveHandler(ObjectRemoveHandler * pObjectRemoveHandler);
};

#endif
