diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index ee3945e5cf..dff51a189b 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -2478,6 +2478,26 @@ bool EntityTree::readFromMap(QVariantMap& map) { } } + // Convert old cloneable entities so they use cloneableData instead of userData + if (contentVersion < (int)EntityVersion::CloneableData) { + QJsonObject userData = QJsonDocument::fromJson(properties.getUserData().toUtf8()).object(); + QJsonObject grabbableKey = userData["grabbableKey"].toObject(); + QJsonValue cloneable = grabbableKey["cloneable"]; + if (cloneable.isBool() && cloneable.toBool()) { + QJsonValue cloneLifetime = grabbableKey["cloneLifetime"]; + QJsonValue cloneLimit = grabbableKey["cloneLimit"]; + QJsonValue cloneDynamic = grabbableKey["cloneDynamic"]; + QJsonValue cloneAvatarEntity = grabbableKey["cloneAvatarEntity"]; + + // This is cloneable, we need to convert the properties + properties.setCloneable(true); + properties.setCloneLifetime(cloneLifetime.toInt()); + properties.setCloneLimit(cloneLimit.toInt()); + properties.setCloneDynamic(cloneDynamic.toBool()); + properties.setCloneAvatarEntity(cloneAvatarEntity.toBool()); + } + } + EntityItemPointer entity = addEntity(entityItemID, properties); if (!entity) { qCDebug(entities) << "adding Entity failed:" << entityItemID << properties.getType(); diff --git a/scripts/system/controllers/controllerModules/nearParentGrabEntity.js b/scripts/system/controllers/controllerModules/nearParentGrabEntity.js index 4ab45b33f7..00d7ad0491 100644 --- a/scripts/system/controllers/controllerModules/nearParentGrabEntity.js +++ b/scripts/system/controllers/controllerModules/nearParentGrabEntity.js @@ -339,11 +339,13 @@ Script.include("/~/system/libraries/cloneEntityUtils.js"); if (targetCloneable) { if (this.cloneAllowed) { var cloneID = cloneEntity(targetProps); - var cloneProps = Entities.getEntityProperties(cloneID); - this.grabbing = true; - this.targetEntityID = cloneID; - this.startNearParentingGrabEntity(controllerData, cloneProps); - this.cloneAllowed = false; // prevent another clone call until inputs released + if (cloneID !== null) { + var cloneProps = Entities.getEntityProperties(cloneID); + this.grabbing = true; + this.targetEntityID = cloneID; + this.startNearParentingGrabEntity(controllerData, cloneProps); + this.cloneAllowed = false; // prevent another clone call until inputs released + } } } else if (targetProps) { this.grabbing = true;