diff --git a/libraries/entities/src/EntityItem.cpp b/libraries/entities/src/EntityItem.cpp index 2a0fb893cf..3dd60d1095 100644 --- a/libraries/entities/src/EntityItem.cpp +++ b/libraries/entities/src/EntityItem.cpp @@ -2707,10 +2707,12 @@ quint64 EntityItem::getLastEdited() const { } void EntityItem::setLastEdited(quint64 lastEdited) { - withWriteLock([&] { - _lastEdited = _lastUpdated = lastEdited; - _changedOnServer = glm::max(lastEdited, _changedOnServer); - }); + if (lastEdited == 0 || lastEdited > _lastEdited) { + withWriteLock([&] { + _lastEdited = _lastUpdated = lastEdited; + _changedOnServer = glm::max(lastEdited, _changedOnServer); + }); + } } void EntityItem::markAsChangedOnServer() { diff --git a/libraries/entities/src/EntityItemProperties.cpp b/libraries/entities/src/EntityItemProperties.cpp index ae2e83affe..319dfc922f 100644 --- a/libraries/entities/src/EntityItemProperties.cpp +++ b/libraries/entities/src/EntityItemProperties.cpp @@ -5071,8 +5071,9 @@ void EntityItemProperties::convertToCloneProperties(const EntityItemID& entityID setEntityHostType(entity::HostType::LOCAL); setCollisionless(true); } - setCreated(usecTimestampNow()); - setLastEdited(usecTimestampNow()); + uint64_t now = usecTimestampNow(); + setCreated(now); + setLastEdited(now); setCloneable(ENTITY_ITEM_DEFAULT_CLONEABLE); setCloneLifetime(ENTITY_ITEM_DEFAULT_CLONE_LIFETIME); setCloneLimit(ENTITY_ITEM_DEFAULT_CLONE_LIMIT); diff --git a/libraries/entities/src/EntityTree.cpp b/libraries/entities/src/EntityTree.cpp index fed9090ddb..9066e76752 100644 --- a/libraries/entities/src/EntityTree.cpp +++ b/libraries/entities/src/EntityTree.cpp @@ -1942,6 +1942,8 @@ int EntityTree::processEditPacketData(ReceivedMessage& message, const unsigned c FilterType filterType = isPhysics ? FilterType::Physics : (isAdd ? FilterType::Add : FilterType::Edit); bool allowed = (!isPhysics && senderNode->isAllowedEditor()) || filterProperties(existingEntity, properties, properties, wasChanged, filterType); if (!allowed) { + // the update failed and we need to convey that fact to the sender + // our method is to re-assert the current properties and bump the lastEdited timestamp auto timestamp = properties.getLastEdited(); properties = EntityItemProperties(); properties.setLastEdited(timestamp);