/// <summary> /// Delete the given object from the scene /// </summary> public void DeleteToInventory(DeRezAction action, UUID folderID, SceneObjectGroup objectGroup, IClientAPI remoteClient, bool permissionToDelete) { if (Enabled) { m_inventoryTicker.Stop(); } lock (m_inventoryDeletes) { DeleteToInventoryHolder dtis = new DeleteToInventoryHolder(); dtis.action = action; dtis.folderID = folderID; dtis.objectGroup = objectGroup; dtis.remoteClient = remoteClient; dtis.permissionToDelete = permissionToDelete; m_inventoryDeletes.Enqueue(dtis); } if (Enabled) { m_inventoryTicker.Start(); } // Visually remove it, even if it isnt really gone yet. This means that if we crash before the object // has gone to inventory, it will reappear in the region again on restart instead of being lost. // This is not ideal since the object will still be available for manipulation when it should be, but it's // better than losing the object for now. if (permissionToDelete) { objectGroup.DeleteGroup(false); } }
/// <summary> /// Synchronously delete the given object from the scene. /// </summary> /// <param name="group">Object Id</param> /// <param name="silent">Suppress broadcasting changes to other clients.</param> public void DeleteSceneObject(SceneObjectGroup group, bool silent) { //SceneObjectPart rootPart = group.GetChildPart(group.UUID); // Serialise calls to RemoveScriptInstances to avoid // deadlocking on m_parts inside SceneObjectGroup lock (m_deleting_scene_object) { group.RemoveScriptInstances(); } foreach (SceneObjectPart part in group.Children.Values) { if (part.IsJoint() && ((part.ObjectFlags&(uint)PrimFlags.Physics) != 0)) { PhysicsScene.RequestJointDeletion(part.Name); // FIXME: what if the name changed? } else if (part.PhysActor != null) { PhysicsScene.RemovePrim(part.PhysActor); part.PhysActor = null; } } // if (rootPart.PhysActor != null) // { // PhysicsScene.RemovePrim(rootPart.PhysActor); // rootPart.PhysActor = null; // } if (UnlinkSceneObject(group.UUID, false)) { EventManager.TriggerObjectBeingRemovedFromScene(group); EventManager.TriggerParcelPrimCountTainted(); } group.DeleteGroup(silent); }
/// <summary> /// Delete the given object from the scene /// </summary> public void DeleteToInventory(DeRezAction action, UUID folderID, SceneObjectGroup objectGroup, IClientAPI remoteClient, bool permissionToDelete) { if (Enabled) lock (m_inventoryTicker) m_inventoryTicker.Stop(); lock (m_inventoryDeletes) { DeleteToInventoryHolder dtis = new DeleteToInventoryHolder(); dtis.action = action; dtis.folderID = folderID; dtis.objectGroup = objectGroup; dtis.remoteClient = remoteClient; dtis.permissionToDelete = permissionToDelete; m_inventoryDeletes.Enqueue(dtis); } if (Enabled) lock (m_inventoryTicker) m_inventoryTicker.Start(); // Visually remove it, even if it isnt really gone yet. This means that if we crash before the object // has gone to inventory, it will reappear in the region again on restart instead of being lost. // This is not ideal since the object will still be available for manipulation when it should be, but it's // better than losing the object for now. if (permissionToDelete) objectGroup.DeleteGroup(false); }
/// <summary> /// Synchronously delete the given object from the scene. /// </summary> /// <param name="group">Object Id</param> /// <param name="silent">Suppress broadcasting changes to other clients.</param> public void DeleteSceneObject(SceneObjectGroup group, bool silent, bool DeleteScripts) { // m_log.DebugFormat("[SCENE]: Deleting scene object {0} {1}", group.Name, group.UUID); //SceneObjectPart rootPart = group.GetChildPart(group.UUID); // Serialise calls to RemoveScriptInstances to avoid // deadlocking on m_parts inside SceneObjectGroup lock (group.RootPart.SitTargetAvatar) { if (group.RootPart.SitTargetAvatar.Count != 0) { foreach (UUID avID in group.RootPart.SitTargetAvatar) { ScenePresence SP = GetScenePresence(avID); if (SP != null) SP.StandUp(); } } } if (DeleteScripts) { lock (m_deleting_scene_object) { group.RemoveScriptInstances(true); } } foreach (SceneObjectPart part in group.ChildrenList) { if (part.IsJoint() && ((part.ObjectFlags&(uint)PrimFlags.Physics) != 0)) { PhysicsScene.RequestJointDeletion(part.Name); // FIXME: what if the name changed? } else if (part.PhysActor != null) { PhysicsScene.RemovePrim(part.PhysActor); part.PhysActor = null; } } if (UnlinkSceneObject(group, false)) { EventManager.TriggerObjectBeingRemovedFromScene(group); EventManager.TriggerParcelPrimCountTainted(); } group.DeleteGroup(silent); //m_log.DebugFormat("[SCENE]: Exit DeleteSceneObject() for {0} {1}", group.Name, group.UUID); }