Merge pull request #4174 from huffman/delete-entity

Update deleteEntity to obey entity locked property
This commit is contained in:
Brad Hefta-Gaub 2015-01-27 13:05:05 -08:00
commit a46fda3749
2 changed files with 53 additions and 6 deletions

View file

@ -145,15 +145,26 @@ void EntityScriptingInterface::deleteEntity(EntityItemID entityID) {
} }
} }
bool shouldDelete = true;
// If we have a local entity tree set, then also update it. // If we have a local entity tree set, then also update it.
if (_entityTree) { if (_entityTree) {
_entityTree->lockForWrite(); _entityTree->lockForWrite();
_entityTree->deleteEntity(entityID);
EntityItem* entity = const_cast<EntityItem*>(_entityTree->findEntityByEntityItemID(actualID));
if (entity) {
if (entity->getLocked()) {
shouldDelete = false;
} else {
_entityTree->deleteEntity(entityID);
}
}
_entityTree->unlock(); _entityTree->unlock();
} }
// if at this point, we know the id, send the update to the entity server // if at this point, we know the id, and we should still delete the entity, send the update to the entity server
if (entityID.isKnownID) { if (shouldDelete && entityID.isKnownID) {
getEntityPacketSender()->queueEraseEntityMessage(entityID); getEntityPacketSender()->queueEraseEntityMessage(entityID);
} }
} }

View file

@ -229,6 +229,23 @@ void EntityTree::setSimulation(EntitySimulation* simulation) {
} }
void EntityTree::deleteEntity(const EntityItemID& entityID) { void EntityTree::deleteEntity(const EntityItemID& entityID) {
EntityTreeElement* containingElement = getContainingElement(entityID);
if (!containingElement) {
qDebug() << "UNEXPECTED!!!! EntityTree::deleteEntity() entityID doesn't exist!!! entityID=" << entityID;
return;
}
EntityItem* existingEntity = containingElement->getEntityWithEntityItemID(entityID);
if (!existingEntity) {
qDebug() << "UNEXPECTED!!!! don't call EntityTree::deleteEntity() on entity items that don't exist. entityID=" << entityID;
return;
}
if (existingEntity->getLocked()) {
qDebug() << "ERROR! EntityTree::deleteEntity() trying to delete locked entity. entityID=" << entityID;
return;
}
emit deletingEntity(entityID); emit deletingEntity(entityID);
// NOTE: callers must lock the tree before using this method // NOTE: callers must lock the tree before using this method
@ -242,14 +259,33 @@ void EntityTree::deleteEntities(QSet<EntityItemID> entityIDs) {
// NOTE: callers must lock the tree before using this method // NOTE: callers must lock the tree before using this method
DeleteEntityOperator theOperator(this); DeleteEntityOperator theOperator(this);
foreach(const EntityItemID& entityID, entityIDs) { foreach(const EntityItemID& entityID, entityIDs) {
EntityTreeElement* containingElement = getContainingElement(entityID);
if (!containingElement) {
qDebug() << "UNEXPECTED!!!! EntityTree::deleteEntities() entityID doesn't exist!!! entityID=" << entityID;
continue;
}
EntityItem* existingEntity = containingElement->getEntityWithEntityItemID(entityID);
if (!existingEntity) {
qDebug() << "UNEXPECTED!!!! don't call EntityTree::deleteEntities() on entity items that don't exist. entityID=" << entityID;
continue;
}
if (existingEntity->getLocked()) {
qDebug() << "ERROR! EntityTree::deleteEntities() trying to delete locked entity. entityID=" << entityID;
continue;
}
// tell our delete operator about this entityID // tell our delete operator about this entityID
theOperator.addEntityIDToDeleteList(entityID); theOperator.addEntityIDToDeleteList(entityID);
emit deletingEntity(entityID); emit deletingEntity(entityID);
} }
recurseTreeWithOperator(&theOperator); if (theOperator.getEntities().size() > 0) {
processRemovedEntities(theOperator); recurseTreeWithOperator(&theOperator);
_isDirty = true; processRemovedEntities(theOperator);
_isDirty = true;
}
} }
void EntityTree::processRemovedEntities(const DeleteEntityOperator& theOperator) { void EntityTree::processRemovedEntities(const DeleteEntityOperator& theOperator) {