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);