diff --git a/dGame/Entity.cpp b/dGame/Entity.cpp index 92b2281a..24321f85 100644 --- a/dGame/Entity.cpp +++ b/dGame/Entity.cpp @@ -170,13 +170,13 @@ Entity::~Entity() { if (m_ParentEntity) m_ParentEntity->RemoveChild(this); } -void Entity::ApplyComponentWhitelist(std::vector& components) { +void Entity::ApplyComponentWhitelist(TemplateComponents& components) { const auto whitelistIndex = GetVar(u"componentWhitelist"); if (whitelistIndex < 0 || whitelistIndex >= m_ComponentWhitelists.size()) return; const auto& whitelist = m_ComponentWhitelists.at(whitelistIndex); - const auto endRange = std::remove_if(components.begin(), components.end(), [&whitelist](const eReplicaComponentType& componentCandidate) { - return std::find(whitelist.begin(), whitelist.end(), componentCandidate) == whitelist.end(); + const auto endRange = std::remove_if(components.begin(), components.end(), [&whitelist](const auto& componentCandidate) { + return std::find(whitelist.begin(), whitelist.end(), componentCandidate.first) == whitelist.end(); }); components.erase(endRange, components.end()); } @@ -204,8 +204,8 @@ void Entity::Initialize() { } auto* componentsRegistry = CDClientManager::Instance().GetTable(); - auto components = componentsRegistry->GetTemplateComponents(m_TemplateID); - // Apply the whitelist here based on the corresponding ldf key. Removes components that are not whitelisted. List is determined based on the clients whitelist data. + TemplateComponents components = componentsRegistry->GetTemplateComponents(m_TemplateID); + ApplyComponentWhitelist(components); for (const auto& [componentTemplate, componentId] : components) { switch (componentTemplate) { case eReplicaComponentType::CONTROLLABLE_PHYSICS: diff --git a/dGame/Entity.h b/dGame/Entity.h index 901e23dd..6337c52b 100644 --- a/dGame/Entity.h +++ b/dGame/Entity.h @@ -50,13 +50,14 @@ namespace CppScripts { using ComponentPtr = std::unique_ptr; using ComponentWhitelist = std::vector; +using TemplateComponents = std::vector>; class Entity { public: explicit Entity(const LWOOBJID& objectID, EntityInfo info, Entity* parentEntity = nullptr); virtual ~Entity(); - void ApplyComponentWhitelist(std::vector& components); + void ApplyComponentWhitelist(TemplateComponents& components); static const std::vector& GetComponentWhitelists() { return m_ComponentWhitelists; } virtual void Initialize(); diff --git a/tests/dGameTests/EntityTests.cpp b/tests/dGameTests/EntityTests.cpp index 3a2d71a8..a6c5ef6e 100644 --- a/tests/dGameTests/EntityTests.cpp +++ b/tests/dGameTests/EntityTests.cpp @@ -21,40 +21,40 @@ protected: this->TearDownDependencies(); } - void RunWhitelistTest(const int32_t whitelistIndex, std::vector componentList) { + void RunWhitelistTest(const int32_t whitelistIndex, TemplateComponents componentList) { Game::logger->Log("EntityTests", "whitelist test %i", whitelistIndex); entity->SetVar(u"componentWhitelist", whitelistIndex); entity->ApplyComponentWhitelist(componentList); const auto whitelist = Entity::GetComponentWhitelists().at(whitelistIndex); std::for_each(whitelist.begin(), whitelist.end(), [&componentList](const eReplicaComponentType& keptComponent) { - EXPECT_EQ(std::count(componentList.begin(), componentList.end(), keptComponent), 2); + EXPECT_EQ(std::count(componentList.begin(), componentList.end(), std::pair(keptComponent, 0U)), 2); }); } }; TEST_F(EntityTests, WhitelistTest) { const auto whitelists = Entity::GetComponentWhitelists(); - std::vector components = { - eReplicaComponentType::CONTROLLABLE_PHYSICS, - eReplicaComponentType::SIMPLE_PHYSICS, - eReplicaComponentType::MODEL_BEHAVIOR, - eReplicaComponentType::SPAWN, - eReplicaComponentType::RENDER, - eReplicaComponentType::ITEM, - eReplicaComponentType::BLUEPRINT, - eReplicaComponentType::PET, - eReplicaComponentType::SKILL, - eReplicaComponentType::DESTROYABLE, - eReplicaComponentType::CONTROLLABLE_PHYSICS, - eReplicaComponentType::SIMPLE_PHYSICS, - eReplicaComponentType::MODEL_BEHAVIOR, - eReplicaComponentType::SPAWN, - eReplicaComponentType::RENDER, - eReplicaComponentType::ITEM, - eReplicaComponentType::BLUEPRINT, - eReplicaComponentType::PET, - eReplicaComponentType::SKILL, - eReplicaComponentType::DESTROYABLE, + TemplateComponents components = { + { eReplicaComponentType::CONTROLLABLE_PHYSICS, 0}, + { eReplicaComponentType::SIMPLE_PHYSICS, 0}, + { eReplicaComponentType::MODEL_BEHAVIOR, 0}, + { eReplicaComponentType::SPAWN, 0}, + { eReplicaComponentType::RENDER, 0}, + { eReplicaComponentType::ITEM, 0}, + { eReplicaComponentType::BLUEPRINT, 0}, + { eReplicaComponentType::PET, 0}, + { eReplicaComponentType::SKILL, 0}, + { eReplicaComponentType::DESTROYABLE, 0}, + { eReplicaComponentType::CONTROLLABLE_PHYSICS, 0}, + { eReplicaComponentType::SIMPLE_PHYSICS, 0}, + { eReplicaComponentType::MODEL_BEHAVIOR, 0}, + { eReplicaComponentType::SPAWN, 0}, + { eReplicaComponentType::RENDER, 0}, + { eReplicaComponentType::ITEM, 0}, + { eReplicaComponentType::BLUEPRINT, 0}, + { eReplicaComponentType::PET, 0}, + { eReplicaComponentType::SKILL, 0}, + { eReplicaComponentType::DESTROYABLE, 0}, }; RunWhitelistTest(0, components); RunWhitelistTest(1, components);