diff options
Diffstat (limited to 'OpenSim/Region/Framework/Scenes')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/EventManager.cs | 97 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/Scene.Permissions.cs | 38 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/Scene.cs | 4 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | 2 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 40 |
5 files changed, 173 insertions, 8 deletions
diff --git a/OpenSim/Region/Framework/Scenes/EventManager.cs b/OpenSim/Region/Framework/Scenes/EventManager.cs index 9db2e41..0ae3146 100644 --- a/OpenSim/Region/Framework/Scenes/EventManager.cs +++ b/OpenSim/Region/Framework/Scenes/EventManager.cs | |||
@@ -330,10 +330,38 @@ namespace OpenSim.Region.Framework.Scenes | |||
330 | /// If the object is being attached, then the avatarID will be present. If the object is being detached then | 330 | /// If the object is being attached, then the avatarID will be present. If the object is being detached then |
331 | /// the avatarID is UUID.Zero (I know, this doesn't make much sense but now it's historical). | 331 | /// the avatarID is UUID.Zero (I know, this doesn't make much sense but now it's historical). |
332 | public delegate void Attach(uint localID, UUID itemID, UUID avatarID); | 332 | public delegate void Attach(uint localID, UUID itemID, UUID avatarID); |
333 | public event Attach OnAttach; | 333 | public event Attach OnAttach; |
334 | |||
335 | /// <summary> | ||
336 | /// Called immediately after an object is loaded from storage. | ||
337 | /// </summary> | ||
338 | public event SceneObjectDelegate OnSceneObjectLoaded; | ||
339 | public delegate void SceneObjectDelegate(SceneObjectGroup so); | ||
340 | |||
341 | /// <summary> | ||
342 | /// Called immediately before an object is saved to storage. | ||
343 | /// </summary> | ||
344 | /// <param name="persistingSo"> | ||
345 | /// The scene object being persisted. | ||
346 | /// This is actually a copy of the original scene object so changes made here will be saved to storage but will not be kept in memory. | ||
347 | /// </param> | ||
348 | /// <param name="originalSo"> | ||
349 | /// The original scene object being persisted. Changes here will stay in memory but will not be saved to storage on this save. | ||
350 | /// </param> | ||
351 | public event SceneObjectPreSaveDelegate OnSceneObjectPreSave; | ||
352 | public delegate void SceneObjectPreSaveDelegate(SceneObjectGroup persistingSo, SceneObjectGroup originalSo); | ||
353 | |||
354 | /// <summary> | ||
355 | /// Called when a scene object part is cloned within the region. | ||
356 | /// </summary> | ||
357 | /// <param name="copy"></param> | ||
358 | /// <param name="original"></param> | ||
359 | /// <param name="userExposed">True if the duplicate will immediately be in the scene, false otherwise</param> | ||
360 | public event SceneObjectPartCopyDelegate OnSceneObjectPartCopy; | ||
361 | public delegate void SceneObjectPartCopyDelegate(SceneObjectPart copy, SceneObjectPart original, bool userExposed); | ||
334 | 362 | ||
335 | public delegate void RegionUp(GridRegion region); | 363 | public delegate void RegionUp(GridRegion region); |
336 | public event RegionUp OnRegionUp; | 364 | public event RegionUp OnRegionUp; |
337 | 365 | ||
338 | public class MoneyTransferArgs : EventArgs | 366 | public class MoneyTransferArgs : EventArgs |
339 | { | 367 | { |
@@ -2013,5 +2041,68 @@ namespace OpenSim.Region.Framework.Scenes | |||
2013 | } | 2041 | } |
2014 | } | 2042 | } |
2015 | } | 2043 | } |
2044 | |||
2045 | public void TriggerOnSceneObjectLoaded(SceneObjectGroup so) | ||
2046 | { | ||
2047 | SceneObjectDelegate handler = OnSceneObjectLoaded; | ||
2048 | if (handler != null) | ||
2049 | { | ||
2050 | foreach (SceneObjectDelegate d in handler.GetInvocationList()) | ||
2051 | { | ||
2052 | try | ||
2053 | { | ||
2054 | d(so); | ||
2055 | } | ||
2056 | catch (Exception e) | ||
2057 | { | ||
2058 | m_log.ErrorFormat( | ||
2059 | "[EVENT MANAGER]: Delegate for TriggerOnSceneObjectLoaded failed - continuing. {0} {1}", | ||
2060 | e.Message, e.StackTrace); | ||
2061 | } | ||
2062 | } | ||
2063 | } | ||
2064 | } | ||
2065 | |||
2066 | public void TriggerOnSceneObjectPreSave(SceneObjectGroup persistingSo, SceneObjectGroup originalSo) | ||
2067 | { | ||
2068 | SceneObjectPreSaveDelegate handler = OnSceneObjectPreSave; | ||
2069 | if (handler != null) | ||
2070 | { | ||
2071 | foreach (SceneObjectPreSaveDelegate d in handler.GetInvocationList()) | ||
2072 | { | ||
2073 | try | ||
2074 | { | ||
2075 | d(persistingSo, originalSo); | ||
2076 | } | ||
2077 | catch (Exception e) | ||
2078 | { | ||
2079 | m_log.ErrorFormat( | ||
2080 | "[EVENT MANAGER]: Delegate for TriggerOnSceneObjectPreSave failed - continuing. {0} {1}", | ||
2081 | e.Message, e.StackTrace); | ||
2082 | } | ||
2083 | } | ||
2084 | } | ||
2085 | } | ||
2086 | |||
2087 | public void TriggerOnSceneObjectPartCopy(SceneObjectPart copy, SceneObjectPart original, bool userExposed) | ||
2088 | { | ||
2089 | SceneObjectPartCopyDelegate handler = OnSceneObjectPartCopy; | ||
2090 | if (handler != null) | ||
2091 | { | ||
2092 | foreach (SceneObjectPartCopyDelegate d in handler.GetInvocationList()) | ||
2093 | { | ||
2094 | try | ||
2095 | { | ||
2096 | d(copy, original, userExposed); | ||
2097 | } | ||
2098 | catch (Exception e) | ||
2099 | { | ||
2100 | m_log.ErrorFormat( | ||
2101 | "[EVENT MANAGER]: Delegate for TriggerOnSceneObjectPartCopy failed - continuing. {0} {1}", | ||
2102 | e.Message, e.StackTrace); | ||
2103 | } | ||
2104 | } | ||
2105 | } | ||
2106 | } | ||
2016 | } | 2107 | } |
2017 | } | 2108 | } \ No newline at end of file |
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs b/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs index a523351..4e80bf2 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Permissions.cs | |||
@@ -1,4 +1,4 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) Contributors, http://opensimulator.org/ | 2 | * Copyright (c) Contributors, http://opensimulator.org/ |
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | 3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. |
4 | * | 4 | * |
@@ -82,6 +82,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
82 | public delegate bool CopyUserInventoryHandler(UUID itemID, UUID userID); | 82 | public delegate bool CopyUserInventoryHandler(UUID itemID, UUID userID); |
83 | public delegate bool DeleteUserInventoryHandler(UUID itemID, UUID userID); | 83 | public delegate bool DeleteUserInventoryHandler(UUID itemID, UUID userID); |
84 | public delegate bool TeleportHandler(UUID userID, Scene scene); | 84 | public delegate bool TeleportHandler(UUID userID, Scene scene); |
85 | public delegate bool ControlPrimMediaHandler(UUID userID, UUID primID, int face); | ||
86 | public delegate bool InteractWithPrimMediaHandler(UUID userID, UUID primID, int face); | ||
85 | #endregion | 87 | #endregion |
86 | 88 | ||
87 | public class ScenePermissions | 89 | public class ScenePermissions |
@@ -141,6 +143,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
141 | public event CopyUserInventoryHandler OnCopyUserInventory; | 143 | public event CopyUserInventoryHandler OnCopyUserInventory; |
142 | public event DeleteUserInventoryHandler OnDeleteUserInventory; | 144 | public event DeleteUserInventoryHandler OnDeleteUserInventory; |
143 | public event TeleportHandler OnTeleport; | 145 | public event TeleportHandler OnTeleport; |
146 | public event ControlPrimMediaHandler OnControlPrimMedia; | ||
147 | public event InteractWithPrimMediaHandler OnInteractWithPrimMedia; | ||
144 | #endregion | 148 | #endregion |
145 | 149 | ||
146 | #region Object Permission Checks | 150 | #region Object Permission Checks |
@@ -964,5 +968,35 @@ namespace OpenSim.Region.Framework.Scenes | |||
964 | } | 968 | } |
965 | return true; | 969 | return true; |
966 | } | 970 | } |
971 | |||
972 | public bool CanControlPrimMedia(UUID userID, UUID primID, int face) | ||
973 | { | ||
974 | ControlPrimMediaHandler handler = OnControlPrimMedia; | ||
975 | if (handler != null) | ||
976 | { | ||
977 | Delegate[] list = handler.GetInvocationList(); | ||
978 | foreach (ControlPrimMediaHandler h in list) | ||
979 | { | ||
980 | if (h(userID, primID, face) == false) | ||
981 | return false; | ||
982 | } | ||
983 | } | ||
984 | return true; | ||
985 | } | ||
986 | |||
987 | public bool CanInteractWithPrimMedia(UUID userID, UUID primID, int face) | ||
988 | { | ||
989 | InteractWithPrimMediaHandler handler = OnInteractWithPrimMedia; | ||
990 | if (handler != null) | ||
991 | { | ||
992 | Delegate[] list = handler.GetInvocationList(); | ||
993 | foreach (InteractWithPrimMediaHandler h in list) | ||
994 | { | ||
995 | if (h(userID, primID, face) == false) | ||
996 | return false; | ||
997 | } | ||
998 | } | ||
999 | return true; | ||
1000 | } | ||
967 | } | 1001 | } |
968 | } | 1002 | } \ No newline at end of file |
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 93f684c..dcd7f3d 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs | |||
@@ -1887,9 +1887,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
1887 | 1887 | ||
1888 | foreach (SceneObjectGroup group in PrimsFromDB) | 1888 | foreach (SceneObjectGroup group in PrimsFromDB) |
1889 | { | 1889 | { |
1890 | EventManager.TriggerOnSceneObjectLoaded(group); | ||
1891 | |||
1890 | if (group.RootPart == null) | 1892 | if (group.RootPart == null) |
1891 | { | 1893 | { |
1892 | m_log.ErrorFormat("[SCENE] Found a SceneObjectGroup with m_rootPart == null and {0} children", | 1894 | m_log.ErrorFormat("[SCENE]: Found a SceneObjectGroup with m_rootPart == null and {0} children", |
1893 | group.Children == null ? 0 : group.Children.Count); | 1895 | group.Children == null ? 0 : group.Children.Count); |
1894 | } | 1896 | } |
1895 | 1897 | ||
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index 17275d0..e26e4ae 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | |||
@@ -1479,6 +1479,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1479 | backup_group.RootPart.ParticleSystem = RootPart.ParticleSystem; | 1479 | backup_group.RootPart.ParticleSystem = RootPart.ParticleSystem; |
1480 | HasGroupChanged = false; | 1480 | HasGroupChanged = false; |
1481 | 1481 | ||
1482 | m_scene.EventManager.TriggerOnSceneObjectPreSave(backup_group, this); | ||
1482 | datastore.StoreObject(backup_group, m_scene.RegionInfo.RegionID); | 1483 | datastore.StoreObject(backup_group, m_scene.RegionInfo.RegionID); |
1483 | 1484 | ||
1484 | backup_group.ForEachPart(delegate(SceneObjectPart part) | 1485 | backup_group.ForEachPart(delegate(SceneObjectPart part) |
@@ -1527,6 +1528,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1527 | /// <summary> | 1528 | /// <summary> |
1528 | /// Duplicates this object, including operations such as physics set up and attaching to the backup event. | 1529 | /// Duplicates this object, including operations such as physics set up and attaching to the backup event. |
1529 | /// </summary> | 1530 | /// </summary> |
1531 | /// <param name="userExposed">True if the duplicate will immediately be in the scene, false otherwise</param> | ||
1530 | /// <returns></returns> | 1532 | /// <returns></returns> |
1531 | public SceneObjectGroup Copy(bool userExposed) | 1533 | public SceneObjectGroup Copy(bool userExposed) |
1532 | { | 1534 | { |
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 69f9627..3dac0ad 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | |||
@@ -59,6 +59,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
59 | REGION = 256, | 59 | REGION = 256, |
60 | TELEPORT = 512, | 60 | TELEPORT = 512, |
61 | REGION_RESTART = 1024, | 61 | REGION_RESTART = 1024, |
62 | MEDIA = 2048, | ||
62 | ANIMATION = 16384 | 63 | ANIMATION = 16384 |
63 | } | 64 | } |
64 | 65 | ||
@@ -321,6 +322,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
321 | protected Vector3 m_lastAcceleration; | 322 | protected Vector3 m_lastAcceleration; |
322 | protected Vector3 m_lastAngularVelocity; | 323 | protected Vector3 m_lastAngularVelocity; |
323 | protected int m_lastTerseSent; | 324 | protected int m_lastTerseSent; |
325 | |||
326 | /// <summary> | ||
327 | /// Stores media texture data | ||
328 | /// </summary> | ||
329 | protected string m_mediaUrl; | ||
324 | 330 | ||
325 | // TODO: Those have to be changed into persistent properties at some later point, | 331 | // TODO: Those have to be changed into persistent properties at some later point, |
326 | // or sit-camera on vehicles will break on sim-crossing. | 332 | // or sit-camera on vehicles will break on sim-crossing. |
@@ -965,18 +971,39 @@ namespace OpenSim.Region.Framework.Scenes | |||
965 | TriggerScriptChangedEvent(Changed.SCALE); | 971 | TriggerScriptChangedEvent(Changed.SCALE); |
966 | } | 972 | } |
967 | } | 973 | } |
974 | |||
968 | public byte UpdateFlag | 975 | public byte UpdateFlag |
969 | { | 976 | { |
970 | get { return m_updateFlag; } | 977 | get { return m_updateFlag; } |
971 | set { m_updateFlag = value; } | 978 | set { m_updateFlag = value; } |
972 | } | 979 | } |
980 | |||
981 | /// <summary> | ||
982 | /// Used for media on a prim. | ||
983 | /// </summary> | ||
984 | /// Do not change this value directly - always do it through an IMoapModule. | ||
985 | public string MediaUrl | ||
986 | { | ||
987 | get | ||
988 | { | ||
989 | return m_mediaUrl; | ||
990 | } | ||
991 | |||
992 | set | ||
993 | { | ||
994 | m_mediaUrl = value; | ||
995 | |||
996 | if (ParentGroup != null) | ||
997 | ParentGroup.HasGroupChanged = true; | ||
998 | } | ||
999 | } | ||
973 | 1000 | ||
974 | [XmlIgnore] | 1001 | [XmlIgnore] |
975 | public bool CreateSelected | 1002 | public bool CreateSelected |
976 | { | 1003 | { |
977 | get { return m_createSelected; } | 1004 | get { return m_createSelected; } |
978 | set { m_createSelected = value; } | 1005 | set { m_createSelected = value; } |
979 | } | 1006 | } |
980 | 1007 | ||
981 | #endregion | 1008 | #endregion |
982 | 1009 | ||
@@ -1527,6 +1554,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
1527 | /// <summary> | 1554 | /// <summary> |
1528 | /// Duplicates this part. | 1555 | /// Duplicates this part. |
1529 | /// </summary> | 1556 | /// </summary> |
1557 | /// <param name="localID"></param> | ||
1558 | /// <param name="AgentID"></param> | ||
1559 | /// <param name="GroupID"></param> | ||
1560 | /// <param name="linkNum"></param> | ||
1561 | /// <param name="userExposed">True if the duplicate will immediately be in the scene, false otherwise</param> | ||
1530 | /// <returns></returns> | 1562 | /// <returns></returns> |
1531 | public SceneObjectPart Copy(uint localID, UUID AgentID, UUID GroupID, int linkNum, bool userExposed) | 1563 | public SceneObjectPart Copy(uint localID, UUID AgentID, UUID GroupID, int linkNum, bool userExposed) |
1532 | { | 1564 | { |
@@ -1590,7 +1622,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
1590 | dupe.DoPhysicsPropertyUpdate(UsePhysics, true); | 1622 | dupe.DoPhysicsPropertyUpdate(UsePhysics, true); |
1591 | } | 1623 | } |
1592 | 1624 | ||
1593 | return dupe; | 1625 | ParentGroup.Scene.EventManager.TriggerOnSceneObjectPartCopy(dupe, this, userExposed); |
1626 | |||
1627 | // m_log.DebugFormat("[SCENE OBJECT PART]: Clone of {0} {1} finished", Name, UUID); | ||
1628 | |||
1629 | return dupe; | ||
1594 | } | 1630 | } |
1595 | 1631 | ||
1596 | protected void AssetReceived(string id, Object sender, AssetBase asset) | 1632 | protected void AssetReceived(string id, Object sender, AssetBase asset) |