From 29b11b910124640c39e59131de2e2443d904368b Mon Sep 17 00:00:00 2001 From: Liv Erickson Date: Fri, 18 May 2018 17:12:41 -0700 Subject: [PATCH] some fixes to server cloneables --- libraries/entities/src/EntityItem.cpp | 6 +++--- libraries/entities/src/EntityItem.h | 16 ++++++++-------- libraries/entities/src/EntityItemProperties.cpp | 10 +++++----- libraries/entities/src/EntityItemProperties.h | 12 ++++++------ .../entities/src/EntityItemPropertiesDefaults.h | 12 ++++++------ .../entities/src/EntityScriptingInterface.cpp | 17 ++++++++++++----- libraries/entities/src/EntityTree.cpp | 9 +++++---- 7 files changed, 45 insertions(+), 37 deletions(-) diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index 667ca9296d..9bad6f2519 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -3112,15 +3112,15 @@ void EntityItem::removeCloneID(const QUuid& cloneID) { }); } -const QList EntityItem::getCloneIDs() const { - QList result; +const QVector EntityItem::getCloneIDs() const { + QVector result; withReadLock([&] { result = _cloneIDs; }); return result; } -void EntityItem::setCloneIDs(const QList& cloneIDs) { +void EntityItem::setCloneIDs(const QVector& cloneIDs) { withWriteLock([&] { _cloneIDs = cloneIDs; }); diff --git a/libraries/entities/src/EntityItem.h b/libraries/entities/src/EntityItem.h index 9b1230c843..42c4605e44 100644 --- a/libraries/entities/src/EntityItem.h +++ b/libraries/entities/src/EntityItem.h @@ -509,8 +509,8 @@ public: void addCloneID(const QUuid& cloneID); void removeCloneID(const QUuid& cloneID); - const QList getCloneIDs() const; - void setCloneIDs(const QList& cloneIDs); + const QVector getCloneIDs() const; + void setCloneIDs(const QVector& cloneIDs); signals: void requestRenderUpdate(); @@ -666,13 +666,13 @@ protected: bool _cauterized { false }; // if true, don't draw because it would obscure 1st-person camera - bool _cloneable { ENTITY_ITEM_CLONEABLE }; - float _cloneLifetime { ENTITY_ITEM_CLONE_LIFETIME }; - float _cloneLimit { ENTITY_ITEM_CLONE_LIMIT }; - bool _cloneDynamic { ENTITY_ITEM_CLONE_DYNAMIC }; - bool _cloneAvatarEntity { ENTITY_ITEM_CLONE_AVATAR_ENTITY }; + bool _cloneable { ENTITY_ITEM_DEFAULT_CLONEABLE }; + float _cloneLifetime { ENTITY_ITEM_DEFAULT_CLONE_LIFETIME }; + float _cloneLimit { ENTITY_ITEM_DEFAULT_CLONE_LIMIT }; + bool _cloneDynamic { ENTITY_ITEM_DEFAULT_CLONE_DYNAMIC }; + bool _cloneAvatarEntity { ENTITY_ITEM_DEFAULT_CLONE_AVATAR_ENTITY }; QUuid _cloneOriginID; - QList _cloneIDs; + QVector _cloneIDs; private: std::unordered_map _materials; diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index 5a2f3a8fc5..39449c7cd1 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -3657,9 +3657,9 @@ void EntityItemProperties::convertToCloneProperties(const EntityItemID& entityID setLifetime(getCloneLifetime()); setDynamic(getCloneDynamic()); setClientOnly(getCloneAvatarEntity()); - setCloneable(ENTITY_ITEM_CLONEABLE); - setCloneLifetime(ENTITY_ITEM_CLONE_LIFETIME); - setCloneLimit(ENTITY_ITEM_CLONE_LIMIT); - setCloneDynamic(ENTITY_ITEM_CLONE_DYNAMIC); - setCloneAvatarEntity(ENTITY_ITEM_CLONE_AVATAR_ENTITY); + setCloneable(ENTITY_ITEM_DEFAULT_CLONEABLE); + setCloneLifetime(ENTITY_ITEM_DEFAULT_CLONE_LIFETIME); + setCloneLimit(ENTITY_ITEM_DEFAULT_CLONE_LIMIT); + setCloneDynamic(ENTITY_ITEM_DEFAULT_CLONE_DYNAMIC); + setCloneAvatarEntity(ENTITY_ITEM_DEFAULT_CLONE_AVATAR_ENTITY); } diff --git a/libraries/entities/src/EntityItemProperties.h b/libraries/entities/src/EntityItemProperties.h index a34058c010..d00a21435c 100644 --- a/libraries/entities/src/EntityItemProperties.h +++ b/libraries/entities/src/EntityItemProperties.h @@ -272,12 +272,12 @@ public: DEFINE_PROPERTY_REF(PROP_SERVER_SCRIPTS, ServerScripts, serverScripts, QString, ENTITY_ITEM_DEFAULT_SERVER_SCRIPTS); DEFINE_PROPERTY(PROP_RELAY_PARENT_JOINTS, RelayParentJoints, relayParentJoints, bool, ENTITY_ITEM_DEFAULT_RELAY_PARENT_JOINTS); - DEFINE_PROPERTY(PROP_CLONEABLE, Cloneable, cloneable, bool, ENTITY_ITEM_CLONEABLE); - DEFINE_PROPERTY(PROP_CLONE_LIFETIME, CloneLifetime, cloneLifetime, float, ENTITY_ITEM_CLONE_LIFETIME); - DEFINE_PROPERTY(PROP_CLONE_LIMIT, CloneLimit, cloneLimit, float, ENTITY_ITEM_CLONE_LIMIT); - DEFINE_PROPERTY(PROP_CLONE_DYNAMIC, CloneDynamic, cloneDynamic, bool, ENTITY_ITEM_CLONE_DYNAMIC); - DEFINE_PROPERTY(PROP_CLONE_AVATAR_ENTITY, CloneAvatarEntity, cloneAvatarEntity, bool, ENTITY_ITEM_CLONE_AVATAR_ENTITY); - DEFINE_PROPERTY(PROP_CLONE_ORIGIN_ID, CloneOriginID, cloneOriginID, QUuid, ENTITY_ITEM_CLONE_ORIGIN_ID); + DEFINE_PROPERTY(PROP_CLONEABLE, Cloneable, cloneable, bool, ENTITY_ITEM_DEFAULT_CLONEABLE); + DEFINE_PROPERTY(PROP_CLONE_LIFETIME, CloneLifetime, cloneLifetime, float, ENTITY_ITEM_DEFAULT_CLONE_LIFETIME); + DEFINE_PROPERTY(PROP_CLONE_LIMIT, CloneLimit, cloneLimit, float, ENTITY_ITEM_DEFAULT_CLONE_LIMIT); + DEFINE_PROPERTY(PROP_CLONE_DYNAMIC, CloneDynamic, cloneDynamic, bool, ENTITY_ITEM_DEFAULT_CLONE_DYNAMIC); + DEFINE_PROPERTY(PROP_CLONE_AVATAR_ENTITY, CloneAvatarEntity, cloneAvatarEntity, bool, ENTITY_ITEM_DEFAULT_CLONE_AVATAR_ENTITY); + DEFINE_PROPERTY(PROP_CLONE_ORIGIN_ID, CloneOriginID, cloneOriginID, QUuid, ENTITY_ITEM_DEFAULT_CLONE_ORIGIN_ID); static QString getComponentModeString(uint32_t mode); static QString getComponentModeAsString(uint32_t mode); diff --git a/libraries/entities/src/EntityItemPropertiesDefaults.h b/libraries/entities/src/EntityItemPropertiesDefaults.h index 1a31bddebe..0fd926e677 100644 --- a/libraries/entities/src/EntityItemPropertiesDefaults.h +++ b/libraries/entities/src/EntityItemPropertiesDefaults.h @@ -97,11 +97,11 @@ const QUuid ENTITY_ITEM_DEFAULT_LAST_EDITED_BY = QUuid(); const bool ENTITY_ITEM_DEFAULT_RELAY_PARENT_JOINTS = false; -const bool ENTITY_ITEM_CLONEABLE = false; -const float ENTITY_ITEM_CLONE_LIFETIME = 300.0f; -const int ENTITY_ITEM_CLONE_LIMIT = 0; -const bool ENTITY_ITEM_CLONE_DYNAMIC = false; -const bool ENTITY_ITEM_CLONE_AVATAR_ENTITY = false; -const QUuid ENTITY_ITEM_CLONE_ORIGIN_ID = QUuid(); +const bool ENTITY_ITEM_DEFAULT_CLONEABLE = false; +const float ENTITY_ITEM_DEFAULT_CLONE_LIFETIME = 300.0f; +const int ENTITY_ITEM_DEFAULT_CLONE_LIMIT = 0; +const bool ENTITY_ITEM_DEFAULT_CLONE_DYNAMIC = false; +const bool ENTITY_ITEM_DEFAULT_CLONE_AVATAR_ENTITY = false; +const QUuid ENTITY_ITEM_DEFAULT_CLONE_ORIGIN_ID = QUuid(); #endif // hifi_EntityItemPropertiesDefaults_h diff --git a/libraries/entities/src/EntityScriptingInterface.cpp b/libraries/entities/src/EntityScriptingInterface.cpp index f47a353ae8..ace4670fef 100644 --- a/libraries/entities/src/EntityScriptingInterface.cpp +++ b/libraries/entities/src/EntityScriptingInterface.cpp @@ -332,13 +332,20 @@ QUuid EntityScriptingInterface::addModelEntity(const QString& name, const QStrin QUuid EntityScriptingInterface::cloneEntity(QUuid entityIDToClone) { EntityItemID newEntityID; EntityItemProperties properties = getEntityProperties(entityIDToClone); + bool cloneAvatarEntity = properties.getCloneAvatarEntity(); properties.convertToCloneProperties(entityIDToClone); - bool success = addLocalEntityCopy(properties, newEntityID); - if (success) { - getEntityPacketSender()->queueCloneEntityMessage(entityIDToClone, newEntityID); - return newEntityID; + + if (cloneAvatarEntity) { + return addEntity(properties, true); } else { - return QUuid(); + bool success = addLocalEntityCopy(properties, newEntityID); + if (success) { + getEntityPacketSender()->queueCloneEntityMessage(entityIDToClone, newEntityID); + return newEntityID; + } + else { + return QUuid(); + } } } diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index c87f6d771a..a36ee4be9d 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -639,7 +639,7 @@ void EntityTree::cleanupCloneIDs(const EntityItemID& entityID) { } } // clear the clone origin ID on any clones that this entity had - const QList& cloneIDs = entity->getCloneIDs(); + const QVector& cloneIDs = entity->getCloneIDs(); foreach(const QUuid& cloneChildID, cloneIDs) { EntityItemPointer cloneChild = findEntityByEntityItemID(cloneChildID); if (cloneChild) { @@ -1627,7 +1627,7 @@ int EntityTree::processEditPacketData(ReceivedMessage& message, const unsigned c } else if (isClone && !isCloneable) { failedAdd = true; qCDebug(entities) << "User attempted to clone non-cloneable entity from entity ID:" << entityIDToClone; - } else if (isClone && entityToClone && entityToClone->getCloneIDs().size() >= cloneLimit) { + } else if (isClone && entityToClone && entityToClone->getCloneIDs().size() >= cloneLimit && cloneLimit != 0) { failedAdd = true; qCDebug(entities) << "User attempted to clone entity ID:" << entityIDToClone << " which reached it's cloneable limit."; } else { @@ -2039,6 +2039,7 @@ int EntityTree::processEraseMessageDetails(const QByteArray& dataByteArray, cons if (shouldEraseEntity(entityID, sourceNode)) { entityItemIDsToDelete << entityItemID; + cleanupCloneIDs(entityItemID); } } @@ -2385,7 +2386,7 @@ bool EntityTree::readFromMap(QVariantMap& map) { return false; } - QMap> cloneIDs; + QMap> cloneIDs; bool success = true; foreach (QVariant entityVariant, entitiesQList) { @@ -2488,7 +2489,7 @@ bool EntityTree::readFromMap(QVariantMap& map) { for (auto iter = cloneIDs.begin(); iter != cloneIDs.end(); ++iter) { const QUuid& entityID = iter.key(); - const QList& cloneIDs = iter.value(); + const QVector& cloneIDs = iter.value(); EntityItemPointer entity = findEntityByID(entityID); if (entity) { entity->setCloneIDs(cloneIDs);