diff --git a/OpenSim/Region/Framework/Scenes/EventManager.cs b/OpenSim/Region/Framework/Scenes/EventManager.cs index ba79964bcb..d325240596 100644 --- a/OpenSim/Region/Framework/Scenes/EventManager.cs +++ b/OpenSim/Region/Framework/Scenes/EventManager.cs @@ -786,7 +786,29 @@ namespace OpenSim.Region.Framework.Scenes /// /// public event Action OnObjectAddedToScene; + + /// + /// When a client sends a derez request for an object inworld + /// but before the object is deleted + /// + public event DeRezRequested OnDeRezRequested; + /// + /// Triggered when a client sends a derez request for an object inworld + /// + /// The client question (it can be null) + /// The object in question + /// The exact derez action + /// Flag indicating whether the object should be deleted from the scene or not + public delegate bool DeRezRequested(IClientAPI remoteClient, List objs, DeRezAction action); + /// + /// Triggered when an object is removed from the scene. + /// + /// + /// Triggered by + /// in + /// + public event ObjectBeingRemovedFromScene OnObjectBeingRemovedFromScene; /// /// Delegate for /// @@ -806,15 +828,6 @@ namespace OpenSim.Region.Framework.Scenes /// public event Action OnObjectRemovedFromPhysicalScene; - /// - /// Triggered when an object is removed from the scene. - /// - /// - /// Triggered by - /// in - /// - public event ObjectBeingRemovedFromScene OnObjectBeingRemovedFromScene; - public delegate void NoticeNoLandDataFromStorage(); public event NoticeNoLandDataFromStorage OnNoticeNoLandDataFromStorage; @@ -1521,8 +1534,33 @@ namespace OpenSim.Region.Framework.Scenes } } } - } - + } + + public bool TriggerDeRezRequested(IClientAPI client, List objs, DeRezAction action) + { + bool canDeRez = true; + + DeRezRequested handlerDeRezRequested = OnDeRezRequested; + if (handlerDeRezRequested != null) + { + foreach (DeRezRequested d in handlerDeRezRequested.GetInvocationList()) + { + try + { + canDeRez &= d(client, objs, action); + } + catch (Exception e) + { + m_log.ErrorFormat( + "[EVENT MANAGER]: Delegate for TriggerDeRezRequested failed - continuing. {0} {1}", + e.Message, e.StackTrace); + } + } + } + + return canDeRez; + } + public void TriggerObjectBeingRemovedFromScene(SceneObjectGroup obj) { ObjectBeingRemovedFromScene handlerObjectBeingRemovedFromScene = OnObjectBeingRemovedFromScene; diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index 5cc56065dd..b14e2f7b84 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs @@ -2182,13 +2182,16 @@ namespace OpenSim.Region.Framework.Scenes } } + // OK, we're done with permissions. Let's check if any part of the code prevents the objects from being deleted + bool canDelete = EventManager.TriggerDeRezRequested(remoteClient, deleteGroups, action); + if (permissionToTake && (action != DeRezAction.Delete || this.m_useTrashOnDelete)) { m_asyncSceneObjectDeleter.DeleteToInventory( action, destinationID, deleteGroups, remoteClient, - permissionToDelete); + permissionToDelete && canDelete); } - else if (permissionToDelete) + else if (permissionToDelete && canDelete) { foreach (SceneObjectGroup g in deleteGroups) DeleteSceneObject(g, false);