// // Created by sebastian on 08.02.26. // #ifndef ENTITYMANAGER_H #define ENTITYMANAGER_H #include #include #include #include #include "../../../game/hexWorld/ecs/components/OwnerComponent.h" class BuildingComponent; // Forward Declarations (KEINE includes hier!) class TransformComponent; class ModelComponent; class TileRenderComponent; class TileGameplayComponent; class MapEntityComponent; using EntityID = std::uint32_t; class EntityManager { private: EntityID nextID = 1; std::vector entities; std::unordered_map> transforms; std::unordered_map> models; std::unordered_map> tileRenderComponents; std::unordered_map> tileGameplayComponents; std::unordered_map> mapEntityComponents; std::unordered_map> buildings; std::unordered_map> owners; public: EntityID createEntity(); void destroyEntity(EntityID entity); template void addComponent(EntityID entity, std::shared_ptr component) { if constexpr (std::is_same_v) { transforms[entity] = component; } else if constexpr (std::is_same_v) { models[entity] = component; } else if constexpr (std::is_same_v) { tileRenderComponents[entity] = component; } else if constexpr (std::is_same_v) { tileGameplayComponents[entity] = component; } else if constexpr (std::is_same_v) { mapEntityComponents[entity] = component; } else if constexpr (std::is_same_v) { buildings[entity] = component; } else if constexpr (std::is_same_v) { owners[entity] = component; } else { static_assert(sizeof(T) == 0, "Component-Typ nicht unterstützt"); } } template std::shared_ptr getComponent(EntityID entity) { if constexpr (std::is_same_v) { auto it = transforms.find(entity); return (it != transforms.end()) ? it->second : nullptr; } else if constexpr (std::is_same_v) { auto it = models.find(entity); return (it != models.end()) ? it->second : nullptr; } else if constexpr (std::is_same_v) { auto it = tileRenderComponents.find(entity); return (it != tileRenderComponents.end()) ? it->second : nullptr; } else if constexpr (std::is_same_v) { auto it = tileGameplayComponents.find(entity); return (it != tileGameplayComponents.end()) ? it->second : nullptr; } else if constexpr (std::is_same_v) { auto it = mapEntityComponents.find(entity); return (it != mapEntityComponents.end()) ? it->second : nullptr; } else if constexpr (std::is_same_v) { auto it = buildings.find(entity); return (it != buildings.end()) ? it->second : nullptr; } else if constexpr (std::is_same_v) { auto it = owners.find(entity); return (it != owners.end()) ? it->second : nullptr; } else { static_assert(sizeof(T) == 0, "Component-Typ nicht unterstützt"); } } const std::vector& getAllEntities() const { return entities; } }; #endif //ENTITYMANAGER_H