CSC3224_Computer_Games_Development / GameEngine / Engine_Resource_Management / EntityManagement.h
EntityManagement.h
Raw
#pragma once
#include "../Engine_Physics/Entity.h"
#include "../Engine_Common/Common.h"
#include "../GameEngine/Engine_Messaging_System/MessageSystemEvent.h"
#include <iostream>
#include <algorithm>
#include <unordered_set>
#include <typeindex>
#include <iostream>
#include <string>
#include <type_traits>

class Texture;

typedef std::vector<std::pair<MessageSystemEvent*, Entity*>> messageSystemEventVector;
typedef std::unordered_map<int, messageSystemEventVector > EntityUnorderedMap;

class EntityManagement
{
public:
	EntityManagement();
	~EntityManagement();

	Entity* createEntity(std::string inputTextureID, sf::IntRect inputEntityRectangle);
	Entity* createEntity(SpriteRectangle* inputSpriteRectangle);
	void destroyEntity(Entity* inputEntity);
	void addMessageSystemEvent(Entity& inputEntity, MessageSystemEvent& inputMessageSystemEvent);
	void removeMessageSystemEvent(Entity& inputEntity, MessageSystemEvent& inputMessageSystemEvent);

	messageSystemEventVector* getMessageSystemEventType(MessageSystemEventType inputMessageSystemEvent);
	std::vector<MessageSystemEvent*>* getMessageSystemEventType(uint32_t inputMessageSystemEvent);

	uint32_t getMaxEntityID() const;

	template <typename T>
	T* getMessageSystemEvent(Entity* inputEntity);
private:
	EntityUnorderedMap mapOfEntities;
	uint32_t entityID;
	std::unordered_map <uint32_t, std::vector<MessageSystemEvent*>> entityMessageSystemEvent;
	uint32_t getNextEntityID();
};

template <typename T>
T* EntityManagement::getMessageSystemEvent(Entity* inputEntity)
{
	static_assert(std::is_base_of<MessageSystemEvent, T>::value, "T must inherit from Message System Event");
	auto message = getMessageSystemEventType(inputEntity->getEntityID());
	auto iterator = std::find_if(message->begin(), message->end(), [](MessageSystemEvent* p)
	   {
		 return (T::messageTypeID == p->getType());
	    });
	if (iterator != message->end())
	{
		return static_cast<T*>(*iterator);
	}
	return nullptr;
}