#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; }