#pragma once #include "../Engine_Physics/Entity.h" #include "../Engine_Common/Common.h" #include "../GameEngine/Engine_Messaging_System/MessageSystemEvent.h" #include #include #include #include #include #include #include class Texture; typedef std::vector> messageSystemEventVector; typedef std::unordered_map 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* getMessageSystemEventType(uint32_t inputMessageSystemEvent); uint32_t getMaxEntityID() const; template T* getMessageSystemEvent(Entity* inputEntity); private: EntityUnorderedMap mapOfEntities; uint32_t entityID; std::unordered_map > entityMessageSystemEvent; uint32_t getNextEntityID(); }; template T* EntityManagement::getMessageSystemEvent(Entity* inputEntity) { static_assert(std::is_base_of::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(*iterator); } return nullptr; }