void Entity::AddComponent(component_id_t id, const ComponentPtr &component, AttributeChange::Type change) { // Must exist and be free if (component && component->ParentEntity() == 0) { if (!id) { bool authority = true; if (scene_) authority = scene_->IsAuthority(); // Loop until we find a free ID for (;;) { if (authority) id = component->IsReplicated() ? idGenerator_.AllocateReplicated() : idGenerator_.AllocateLocal(); else id = component->IsReplicated() ? idGenerator_.AllocateUnacked() : idGenerator_.AllocateLocal(); if (components_.find(id) == components_.end()) break; } } else { component->SetReplicated(id < UniqueIdGenerator::FIRST_LOCAL_ID); // If component ID is specified manually, but it already exists, it is an error. Do not add the component in that case. if (components_.find(id) != components_.end()) { LogError("Can not add component: a component with id " + QString::number(id) + " already exists in entity " + ToString()); return; } // Whenever a manual replicated ID is assigned, reset the ID generator to the highest value to avoid unnecessary free ID probing in the future if (id < UniqueIdGenerator::FIRST_LOCAL_ID) idGenerator_.ResetReplicatedId(std::max(id, idGenerator_.id)); } QString componentTypeName = component->TypeName(); componentTypeName.replace(0, 3, ""); componentTypeName = componentTypeName.toLower(); // We already have 'name' property in Entity, so ignore "EC_Name" ("name") here. if (componentTypeName != "name" && !property(componentTypeName.toStdString().c_str()).isValid()) { QVariant var = QVariant::fromValue<QObject*>(component.get()); setProperty(componentTypeName.toStdString().c_str(), var); } component->SetNewId(id); component->SetParentEntity(this); components_[id] = component; if (change != AttributeChange::Disconnected) emit ComponentAdded(component.get(), change == AttributeChange::Default ? component->UpdateMode() : change); if (scene_) scene_->EmitComponentAdded(this, component.get(), change); } }
void Entity::AddComponent(component_id_t id, const ComponentPtr &component, AttributeChange::Type change) { // Must exist and be free if (component && component->ParentEntity() == 0) { if (!id) { bool authority = true; if (scene_) authority = scene_->IsAuthority(); // Loop until we find a free ID for (;;) { if (authority) id = component->IsReplicated() ? idGenerator_.AllocateReplicated() : idGenerator_.AllocateLocal(); else id = component->IsReplicated() ? idGenerator_.AllocateUnacked() : idGenerator_.AllocateLocal(); if (components_.Find(id) == components_.End()) break; } } else { component->SetReplicated(id < UniqueIdGenerator::FIRST_LOCAL_ID); // If component ID is specified manually, but it already exists, it is an error. Do not add the component in that case. if (components_.Find(id) != components_.End()) { LogError("Can not add component: a component with id " + String(id) + " already exists in entity " + ToString()); return; } // Whenever a manual replicated ID is assigned, reset the ID generator to the highest value to avoid unnecessary free ID probing in the future if (id < UniqueIdGenerator::FIRST_LOCAL_ID) idGenerator_.ResetReplicatedId(Max(id, idGenerator_.id)); } component->SetNewId(id); component->SetParentEntity(this); components_[id] = component; if (change != AttributeChange::Disconnected) ComponentAdded.Emit(component.Get(), change == AttributeChange::Default ? component->UpdateMode() : change); if (scene_) scene_->EmitComponentAdded(this, component.Get(), change); } }