diff options
Diffstat (limited to 'OpenSim/Region/Framework')
-rw-r--r-- | OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs | 72 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/EventManager.cs | 30 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 109 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/Scene.cs | 31 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/SceneGraph.cs | 121 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs | 1 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/ScenePresence.cs | 8 |
7 files changed, 114 insertions, 258 deletions
diff --git a/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs b/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs new file mode 100644 index 0000000..367ff3d --- /dev/null +++ b/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs | |||
@@ -0,0 +1,72 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSim Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using OpenMetaverse; | ||
30 | using OpenSim.Framework; | ||
31 | using OpenSim.Region.Framework.Scenes; | ||
32 | |||
33 | namespace OpenSim.Region.Framework.Interfaces | ||
34 | { | ||
35 | public interface IAttachmentsModule | ||
36 | { | ||
37 | /// <summary> | ||
38 | /// Attach an object to an avatar. | ||
39 | /// </summary> | ||
40 | /// <param name="controllingClient"></param> | ||
41 | /// <param name="localID"></param> | ||
42 | /// <param name="attachPoint"></param> | ||
43 | /// <param name="rot"></param> | ||
44 | /// <param name="pos"></param> | ||
45 | /// <param name="silent"></param> | ||
46 | /// <returns>true if the object was successfully attached, false otherwise</returns> | ||
47 | bool AttachObject( | ||
48 | IClientAPI controllingClient, uint localID, uint attachPoint, Quaternion rot, Vector3 pos, bool silent); | ||
49 | |||
50 | /// <summary> | ||
51 | /// Update the user inventory to the attachment of an item | ||
52 | /// </summary> | ||
53 | /// <param name="att"></param> | ||
54 | /// <param name="remoteClient"></param> | ||
55 | /// <param name="itemID"></param> | ||
56 | /// <param name="AttachmentPt"></param> | ||
57 | /// <returns></returns> | ||
58 | UUID SetAttachmentInventoryStatus( | ||
59 | SceneObjectGroup att, IClientAPI remoteClient, UUID itemID, uint AttachmentPt); | ||
60 | |||
61 | /// <summary> | ||
62 | /// Update the user inventory to show a detach. | ||
63 | /// </summary> | ||
64 | /// <param name="itemID"> | ||
65 | /// A <see cref="UUID"/> | ||
66 | /// </param> | ||
67 | /// <param name="remoteClient"> | ||
68 | /// A <see cref="IClientAPI"/> | ||
69 | /// </param> | ||
70 | void ShowDetachInUserInventory(UUID itemID, IClientAPI remoteClient); | ||
71 | } | ||
72 | } \ No newline at end of file | ||
diff --git a/OpenSim/Region/Framework/Scenes/EventManager.cs b/OpenSim/Region/Framework/Scenes/EventManager.cs index ac04462..f0d346f 100644 --- a/OpenSim/Region/Framework/Scenes/EventManager.cs +++ b/OpenSim/Region/Framework/Scenes/EventManager.cs | |||
@@ -110,21 +110,24 @@ namespace OpenSim.Region.Framework.Scenes | |||
110 | public event OnSetRootAgentSceneDelegate OnSetRootAgentScene; | 110 | public event OnSetRootAgentSceneDelegate OnSetRootAgentScene; |
111 | 111 | ||
112 | /// <summary> | 112 | /// <summary> |
113 | /// Called when an object is touched/grabbed. | 113 | /// Fired when an object is touched/grabbed. |
114 | /// </summary> | 114 | /// </summary> |
115 | /// The originalID is the local ID of the part that was actually touched. The localID itself is always that of | 115 | /// The originalID is the local ID of the part that was actually touched. The localID itself is always that of |
116 | /// the root part. | 116 | /// the root part. |
117 | public delegate void ObjectGrabDelegate(uint localID, uint originalID, Vector3 offsetPos, IClientAPI remoteClient, SurfaceTouchEventArgs surfaceArgs); | ||
118 | public event ObjectGrabDelegate OnObjectGrab; | 117 | public event ObjectGrabDelegate OnObjectGrab; |
118 | public delegate void ObjectGrabDelegate(uint localID, uint originalID, Vector3 offsetPos, IClientAPI remoteClient, SurfaceTouchEventArgs surfaceArgs); | ||
119 | 119 | ||
120 | public event ObjectGrabDelegate OnObjectGrabbing; | 120 | public event ObjectGrabDelegate OnObjectGrabbing; |
121 | public event ObjectDeGrabDelegate OnObjectDeGrab; | 121 | public event ObjectDeGrabDelegate OnObjectDeGrab; |
122 | public event ScriptResetDelegate OnScriptReset; | 122 | public event ScriptResetDelegate OnScriptReset; |
123 | 123 | ||
124 | public event OnPermissionErrorDelegate OnPermissionError; | 124 | public event OnPermissionErrorDelegate OnPermissionError; |
125 | 125 | ||
126 | public delegate void NewRezScript(uint localID, UUID itemID, string script, int startParam, bool postOnRez, string engine, int stateSource); | 126 | /// <summary> |
127 | /// Fired when a new script is created. | ||
128 | /// </summary> | ||
127 | public event NewRezScript OnRezScript; | 129 | public event NewRezScript OnRezScript; |
130 | public delegate void NewRezScript(uint localID, UUID itemID, string script, int startParam, bool postOnRez, string engine, int stateSource); | ||
128 | 131 | ||
129 | public delegate void RemoveScript(uint localID, UUID itemID); | 132 | public delegate void RemoveScript(uint localID, UUID itemID); |
130 | public event RemoveScript OnRemoveScript; | 133 | public event RemoveScript OnRemoveScript; |
@@ -166,38 +169,35 @@ namespace OpenSim.Region.Framework.Scenes | |||
166 | 169 | ||
167 | public delegate void ClientClosed(UUID clientID, Scene scene); | 170 | public delegate void ClientClosed(UUID clientID, Scene scene); |
168 | 171 | ||
169 | public event ClientClosed OnClientClosed; | 172 | public event ClientClosed OnClientClosed; |
170 | |||
171 | public delegate void ScriptChangedEvent(uint localID, uint change); | ||
172 | 173 | ||
174 | /// <summary> | ||
175 | /// This is fired when a scene object property that a script might be interested in (such as color, scale or | ||
176 | /// inventory) changes. Only enough information is sent for the LSL changed event | ||
177 | /// (see http://lslwiki.net/lslwiki/wakka.php?wakka=changed) | ||
178 | /// </summary> | ||
173 | public event ScriptChangedEvent OnScriptChangedEvent; | 179 | public event ScriptChangedEvent OnScriptChangedEvent; |
180 | public delegate void ScriptChangedEvent(uint localID, uint change); | ||
174 | 181 | ||
175 | public delegate void ScriptControlEvent(uint localID, UUID item, UUID avatarID, uint held, uint changed); | 182 | public delegate void ScriptControlEvent(uint localID, UUID item, UUID avatarID, uint held, uint changed); |
176 | |||
177 | public event ScriptControlEvent OnScriptControlEvent; | 183 | public event ScriptControlEvent OnScriptControlEvent; |
178 | 184 | ||
179 | public delegate void ScriptAtTargetEvent(uint localID, uint handle, Vector3 targetpos, Vector3 atpos); | 185 | public delegate void ScriptAtTargetEvent(uint localID, uint handle, Vector3 targetpos, Vector3 atpos); |
180 | |||
181 | public event ScriptAtTargetEvent OnScriptAtTargetEvent; | 186 | public event ScriptAtTargetEvent OnScriptAtTargetEvent; |
182 | 187 | ||
183 | public delegate void ScriptNotAtTargetEvent(uint localID); | 188 | public delegate void ScriptNotAtTargetEvent(uint localID); |
184 | |||
185 | public event ScriptNotAtTargetEvent OnScriptNotAtTargetEvent; | 189 | public event ScriptNotAtTargetEvent OnScriptNotAtTargetEvent; |
186 | 190 | ||
187 | public delegate void ScriptAtRotTargetEvent(uint localID, uint handle, Quaternion targetrot, Quaternion atrot); | 191 | public delegate void ScriptAtRotTargetEvent(uint localID, uint handle, Quaternion targetrot, Quaternion atrot); |
188 | |||
189 | public event ScriptAtRotTargetEvent OnScriptAtRotTargetEvent; | 192 | public event ScriptAtRotTargetEvent OnScriptAtRotTargetEvent; |
190 | 193 | ||
191 | public delegate void ScriptNotAtRotTargetEvent(uint localID); | 194 | public delegate void ScriptNotAtRotTargetEvent(uint localID); |
192 | |||
193 | public event ScriptNotAtRotTargetEvent OnScriptNotAtRotTargetEvent; | 195 | public event ScriptNotAtRotTargetEvent OnScriptNotAtRotTargetEvent; |
194 | 196 | ||
195 | public delegate void ScriptColliding(uint localID, ColliderArgs colliders); | 197 | public delegate void ScriptColliding(uint localID, ColliderArgs colliders); |
196 | |||
197 | public event ScriptColliding OnScriptColliderStart; | 198 | public event ScriptColliding OnScriptColliderStart; |
198 | public event ScriptColliding OnScriptColliding; | 199 | public event ScriptColliding OnScriptColliding; |
199 | public event ScriptColliding OnScriptCollidingEnd; | 200 | public event ScriptColliding OnScriptCollidingEnd; |
200 | |||
201 | public event ScriptColliding OnScriptLandColliderStart; | 201 | public event ScriptColliding OnScriptLandColliderStart; |
202 | public event ScriptColliding OnScriptLandColliding; | 202 | public event ScriptColliding OnScriptLandColliding; |
203 | public event ScriptColliding OnScriptLandColliderEnd; | 203 | public event ScriptColliding OnScriptLandColliderEnd; |
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index 5f3cd8c..dad0efd 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | |||
@@ -1858,39 +1858,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
1858 | 1858 | ||
1859 | if (att == null) | 1859 | if (att == null) |
1860 | { | 1860 | { |
1861 | DetachSingleAttachmentToInv(itemID, remoteClient); | 1861 | AttachmentsModule.ShowDetachInUserInventory(itemID, remoteClient); |
1862 | return UUID.Zero; | 1862 | return UUID.Zero; |
1863 | } | 1863 | } |
1864 | 1864 | ||
1865 | return RezSingleAttachment(att, remoteClient, itemID, AttachmentPt); | 1865 | return AttachmentsModule.SetAttachmentInventoryStatus(att, remoteClient, itemID, AttachmentPt); |
1866 | } | ||
1867 | |||
1868 | /// <summary> | ||
1869 | /// Update the user inventory to reflect an attachment | ||
1870 | /// </summary> | ||
1871 | /// <param name="att"></param> | ||
1872 | /// <param name="remoteClient"></param> | ||
1873 | /// <param name="itemID"></param> | ||
1874 | /// <param name="AttachmentPt"></param> | ||
1875 | /// <returns></returns> | ||
1876 | public UUID RezSingleAttachment(SceneObjectGroup att, IClientAPI remoteClient, UUID itemID, uint AttachmentPt) | ||
1877 | { | ||
1878 | m_log.DebugFormat( | ||
1879 | "[USER INVENTORY]: Updating inventory of {0} to show attachment of {1} (item ID {2})", | ||
1880 | remoteClient.Name, att.Name, itemID); | ||
1881 | |||
1882 | if (!att.IsDeleted) | ||
1883 | AttachmentPt = att.RootPart.AttachmentPoint; | ||
1884 | |||
1885 | ScenePresence presence; | ||
1886 | if (TryGetAvatar(remoteClient.AgentId, out presence)) | ||
1887 | { | ||
1888 | InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId); | ||
1889 | item = InventoryService.GetItem(item); | ||
1890 | |||
1891 | presence.Appearance.SetAttachment((int)AttachmentPt, itemID, item.AssetID /*att.UUID*/); | ||
1892 | } | ||
1893 | return att.UUID; | ||
1894 | } | 1866 | } |
1895 | 1867 | ||
1896 | public void RezMultipleAttachments(IClientAPI remoteClient, RezMultipleAttachmentsFromInvPacket.HeaderDataBlock header, | 1868 | public void RezMultipleAttachments(IClientAPI remoteClient, RezMultipleAttachmentsFromInvPacket.HeaderDataBlock header, |
@@ -1902,65 +1874,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
1902 | } | 1874 | } |
1903 | } | 1875 | } |
1904 | 1876 | ||
1905 | /// <summary> | ||
1906 | /// Attach an object. | ||
1907 | /// </summary> | ||
1908 | /// <param name="controllingClient"></param> | ||
1909 | /// <param name="localID"></param> | ||
1910 | /// <param name="attachPoint"></param> | ||
1911 | /// <param name="rot"></param> | ||
1912 | /// <param name="pos"></param> | ||
1913 | /// <param name="silent"></param> | ||
1914 | /// <returns>true if the object was successfully attached, false otherwise</returns> | ||
1915 | public bool AttachObject(IClientAPI controllingClient, uint localID, uint attachPoint, Quaternion rot, Vector3 pos, bool silent) | ||
1916 | { | ||
1917 | return m_sceneGraph.AttachObject(controllingClient, localID, attachPoint, rot, pos, silent); | ||
1918 | } | ||
1919 | |||
1920 | /// <summary> | ||
1921 | /// This registers the item as attached in a user's inventory | ||
1922 | /// </summary> | ||
1923 | /// <param name="remoteClient"></param> | ||
1924 | /// <param name="AttachmentPt"></param> | ||
1925 | /// <param name="itemID"></param> | ||
1926 | /// <param name="att"></param> | ||
1927 | public void AttachObject(IClientAPI remoteClient, uint AttachmentPt, UUID itemID, SceneObjectGroup att) | ||
1928 | { | ||
1929 | // m_log.DebugFormat( | ||
1930 | // "[USER INVENTORY]: Updating attachment {0} for {1} at {2} using item ID {3}", | ||
1931 | // att.Name, remoteClient.Name, AttachmentPt, itemID); | ||
1932 | |||
1933 | if (UUID.Zero == itemID) | ||
1934 | { | ||
1935 | m_log.Error("[SCENE INVENTORY]: Unable to save attachment. Error inventory item ID."); | ||
1936 | return; | ||
1937 | } | ||
1938 | |||
1939 | if (0 == AttachmentPt) | ||
1940 | { | ||
1941 | m_log.Error("[SCENE INVENTORY]: Unable to save attachment. Error attachment point."); | ||
1942 | return; | ||
1943 | } | ||
1944 | |||
1945 | if (null == att.RootPart) | ||
1946 | { | ||
1947 | m_log.Error("[SCENE INVENTORY]: Unable to save attachment for a prim without the rootpart!"); | ||
1948 | return; | ||
1949 | } | ||
1950 | |||
1951 | ScenePresence presence; | ||
1952 | if (TryGetAvatar(remoteClient.AgentId, out presence)) | ||
1953 | { | ||
1954 | // XXYY!! | ||
1955 | InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId); | ||
1956 | item = InventoryService.GetItem(item); | ||
1957 | presence.Appearance.SetAttachment((int)AttachmentPt, itemID, item.AssetID /* att.UUID */); | ||
1958 | |||
1959 | if (m_AvatarFactory != null) | ||
1960 | m_AvatarFactory.UpdateDatabase(remoteClient.AgentId, presence.Appearance); | ||
1961 | } | ||
1962 | } | ||
1963 | |||
1964 | public void DetachSingleAttachmentToGround(UUID itemID, IClientAPI remoteClient) | 1877 | public void DetachSingleAttachmentToGround(UUID itemID, IClientAPI remoteClient) |
1965 | { | 1878 | { |
1966 | SceneObjectPart part = GetSceneObjectPart(itemID); | 1879 | SceneObjectPart part = GetSceneObjectPart(itemID); |
@@ -1991,24 +1904,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
1991 | SendAttachEvent(part.ParentGroup.LocalId, itemID, UUID.Zero); | 1904 | SendAttachEvent(part.ParentGroup.LocalId, itemID, UUID.Zero); |
1992 | } | 1905 | } |
1993 | 1906 | ||
1994 | public void DetachSingleAttachmentToInv(UUID itemID, IClientAPI remoteClient) | ||
1995 | { | ||
1996 | ScenePresence presence; | ||
1997 | if (TryGetAvatar(remoteClient.AgentId, out presence)) | ||
1998 | { | ||
1999 | presence.Appearance.DetachAttachment(itemID); | ||
2000 | |||
2001 | // Save avatar attachment information | ||
2002 | if (m_AvatarFactory != null) | ||
2003 | { | ||
2004 | m_log.Info("[SCENE]: Saving avatar attachment. AgentID: " + remoteClient.AgentId + ", ItemID: " + itemID); | ||
2005 | m_AvatarFactory.UpdateDatabase(remoteClient.AgentId, presence.Appearance); | ||
2006 | } | ||
2007 | } | ||
2008 | |||
2009 | m_sceneGraph.DetachSingleAttachmentToInv(itemID, remoteClient); | ||
2010 | } | ||
2011 | |||
2012 | public void GetScriptRunning(IClientAPI controllingClient, UUID objectID, UUID itemID) | 1907 | public void GetScriptRunning(IClientAPI controllingClient, UUID objectID, UUID itemID) |
2013 | { | 1908 | { |
2014 | EventManager.TriggerGetScriptRunning(controllingClient, objectID, itemID); | 1909 | EventManager.TriggerGetScriptRunning(controllingClient, objectID, itemID); |
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index a880fe7..30c69a8 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs | |||
@@ -307,6 +307,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
307 | 307 | ||
308 | protected IXMLRPC m_xmlrpcModule; | 308 | protected IXMLRPC m_xmlrpcModule; |
309 | protected IWorldComm m_worldCommModule; | 309 | protected IWorldComm m_worldCommModule; |
310 | public IAttachmentsModule AttachmentsModule { get; set; } | ||
310 | protected IAvatarFactory m_AvatarFactory; | 311 | protected IAvatarFactory m_AvatarFactory; |
311 | public IAvatarFactory AvatarFactory | 312 | public IAvatarFactory AvatarFactory |
312 | { | 313 | { |
@@ -1132,10 +1133,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1132 | 1133 | ||
1133 | public int GetInaccurateNeighborCount() | 1134 | public int GetInaccurateNeighborCount() |
1134 | { | 1135 | { |
1135 | lock (m_neighbours) | 1136 | return m_neighbours.Count; |
1136 | { | ||
1137 | return m_neighbours.Count; | ||
1138 | } | ||
1139 | } | 1137 | } |
1140 | 1138 | ||
1141 | // This is the method that shuts down the scene. | 1139 | // This is the method that shuts down the scene. |
@@ -1215,6 +1213,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1215 | m_worldCommModule = RequestModuleInterface<IWorldComm>(); | 1213 | m_worldCommModule = RequestModuleInterface<IWorldComm>(); |
1216 | XferManager = RequestModuleInterface<IXfer>(); | 1214 | XferManager = RequestModuleInterface<IXfer>(); |
1217 | m_AvatarFactory = RequestModuleInterface<IAvatarFactory>(); | 1215 | m_AvatarFactory = RequestModuleInterface<IAvatarFactory>(); |
1216 | AttachmentsModule = RequestModuleInterface<IAttachmentsModule>(); | ||
1218 | m_serialiser = RequestModuleInterface<IRegionSerialiserModule>(); | 1217 | m_serialiser = RequestModuleInterface<IRegionSerialiserModule>(); |
1219 | m_dialogModule = RequestModuleInterface<IDialogModule>(); | 1218 | m_dialogModule = RequestModuleInterface<IDialogModule>(); |
1220 | m_capsModule = RequestModuleInterface<ICapabilitiesModule>(); | 1219 | m_capsModule = RequestModuleInterface<ICapabilitiesModule>(); |
@@ -2405,9 +2404,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
2405 | //grp.SetFromAssetID(grp.RootPart.LastOwnerID); | 2404 | //grp.SetFromAssetID(grp.RootPart.LastOwnerID); |
2406 | m_log.DebugFormat( | 2405 | m_log.DebugFormat( |
2407 | "[ATTACHMENT]: Attach to avatar {0} at position {1}", sp.UUID, grp.AbsolutePosition); | 2406 | "[ATTACHMENT]: Attach to avatar {0} at position {1}", sp.UUID, grp.AbsolutePosition); |
2407 | |||
2408 | if (AttachmentsModule != null) | ||
2409 | AttachmentsModule.AttachObject( | ||
2410 | sp.ControllingClient, grp.LocalId, (uint)0, grp.GroupRotation, grp.AbsolutePosition, false); | ||
2408 | 2411 | ||
2409 | AttachObject( | ||
2410 | sp.ControllingClient, grp.LocalId, (uint)0, grp.GroupRotation, grp.AbsolutePosition, false); | ||
2411 | RootPrim.RemFlag(PrimFlags.TemporaryOnRez); | 2412 | RootPrim.RemFlag(PrimFlags.TemporaryOnRez); |
2412 | grp.SendGroupFullUpdate(); | 2413 | grp.SendGroupFullUpdate(); |
2413 | } | 2414 | } |
@@ -2642,10 +2643,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
2642 | public virtual void SubscribeToClientAttachmentEvents(IClientAPI client) | 2643 | public virtual void SubscribeToClientAttachmentEvents(IClientAPI client) |
2643 | { | 2644 | { |
2644 | client.OnRezSingleAttachmentFromInv += RezSingleAttachment; | 2645 | client.OnRezSingleAttachmentFromInv += RezSingleAttachment; |
2645 | client.OnRezMultipleAttachmentsFromInv += RezMultipleAttachments; | 2646 | client.OnRezMultipleAttachmentsFromInv += RezMultipleAttachments; |
2646 | client.OnDetachAttachmentIntoInv += DetachSingleAttachmentToInv; | ||
2647 | client.OnObjectAttach += m_sceneGraph.AttachObject; | 2647 | client.OnObjectAttach += m_sceneGraph.AttachObject; |
2648 | client.OnObjectDetach += m_sceneGraph.DetachObject; | 2648 | client.OnObjectDetach += m_sceneGraph.DetachObject; |
2649 | |||
2650 | if (AttachmentsModule != null) | ||
2651 | client.OnDetachAttachmentIntoInv += AttachmentsModule.ShowDetachInUserInventory; | ||
2649 | } | 2652 | } |
2650 | 2653 | ||
2651 | public virtual void SubscribeToClientTeleportEvents(IClientAPI client) | 2654 | public virtual void SubscribeToClientTeleportEvents(IClientAPI client) |
@@ -2692,8 +2695,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2692 | } | 2695 | } |
2693 | 2696 | ||
2694 | protected virtual void UnsubscribeToClientEvents(IClientAPI client) | 2697 | protected virtual void UnsubscribeToClientEvents(IClientAPI client) |
2695 | { | 2698 | { |
2696 | |||
2697 | } | 2699 | } |
2698 | 2700 | ||
2699 | /// <summary> | 2701 | /// <summary> |
@@ -2715,7 +2717,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
2715 | 2717 | ||
2716 | UnSubscribeToClientNetworkEvents(client); | 2718 | UnSubscribeToClientNetworkEvents(client); |
2717 | 2719 | ||
2718 | |||
2719 | // EventManager.TriggerOnNewClient(client); | 2720 | // EventManager.TriggerOnNewClient(client); |
2720 | } | 2721 | } |
2721 | 2722 | ||
@@ -2795,12 +2796,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
2795 | } | 2796 | } |
2796 | 2797 | ||
2797 | public virtual void UnSubscribeToClientAttachmentEvents(IClientAPI client) | 2798 | public virtual void UnSubscribeToClientAttachmentEvents(IClientAPI client) |
2798 | { | 2799 | { |
2799 | client.OnRezSingleAttachmentFromInv -= RezSingleAttachment; | ||
2800 | client.OnRezMultipleAttachmentsFromInv -= RezMultipleAttachments; | 2800 | client.OnRezMultipleAttachmentsFromInv -= RezMultipleAttachments; |
2801 | client.OnDetachAttachmentIntoInv -= DetachSingleAttachmentToInv; | 2801 | client.OnRezSingleAttachmentFromInv -= RezSingleAttachment; |
2802 | client.OnObjectAttach -= m_sceneGraph.AttachObject; | 2802 | client.OnObjectAttach -= m_sceneGraph.AttachObject; |
2803 | client.OnObjectDetach -= m_sceneGraph.DetachObject; | 2803 | client.OnObjectDetach -= m_sceneGraph.DetachObject; |
2804 | |||
2805 | if (AttachmentsModule != null) | ||
2806 | client.OnDetachAttachmentIntoInv -= AttachmentsModule.ShowDetachInUserInventory; | ||
2804 | } | 2807 | } |
2805 | 2808 | ||
2806 | public virtual void UnSubscribeToClientTeleportEvents(IClientAPI client) | 2809 | public virtual void UnSubscribeToClientTeleportEvents(IClientAPI client) |
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs index 22613e9..380722d 100644 --- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs +++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs | |||
@@ -452,7 +452,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
452 | if (group != null) | 452 | if (group != null) |
453 | { | 453 | { |
454 | //group.DetachToGround(); | 454 | //group.DetachToGround(); |
455 | m_parentScene.DetachSingleAttachmentToInv(group.GetFromItemID(), remoteClient); | 455 | m_parentScene.AttachmentsModule.ShowDetachInUserInventory(group.GetFromItemID(), remoteClient); |
456 | } | 456 | } |
457 | } | 457 | } |
458 | 458 | ||
@@ -504,7 +504,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
504 | return; | 504 | return; |
505 | 505 | ||
506 | // Calls attach with a Zero position | 506 | // Calls attach with a Zero position |
507 | if (AttachObject(remoteClient, objectLocalID, AttachmentPt, rot, Vector3.Zero, false)) | 507 | if (m_parentScene.AttachmentsModule.AttachObject(remoteClient, objectLocalID, AttachmentPt, rot, Vector3.Zero, false)) |
508 | { | 508 | { |
509 | m_parentScene.SendAttachEvent(objectLocalID, part.ParentGroup.GetFromItemID(), remoteClient.AgentId); | 509 | m_parentScene.SendAttachEvent(objectLocalID, part.ParentGroup.GetFromItemID(), remoteClient.AgentId); |
510 | 510 | ||
@@ -547,8 +547,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
547 | if (AttachmentPt != 0 && AttachmentPt != objatt.GetAttachmentPoint()) | 547 | if (AttachmentPt != 0 && AttachmentPt != objatt.GetAttachmentPoint()) |
548 | tainted = true; | 548 | tainted = true; |
549 | 549 | ||
550 | AttachObject(remoteClient, objatt.LocalId, AttachmentPt, Quaternion.Identity, objatt.AbsolutePosition, false); | 550 | m_parentScene.AttachmentsModule.AttachObject( |
551 | remoteClient, objatt.LocalId, AttachmentPt, Quaternion.Identity, objatt.AbsolutePosition, false); | ||
551 | //objatt.ScheduleGroupForFullUpdate(); | 552 | //objatt.ScheduleGroupForFullUpdate(); |
553 | |||
552 | if (tainted) | 554 | if (tainted) |
553 | objatt.HasGroupChanged = true; | 555 | objatt.HasGroupChanged = true; |
554 | 556 | ||
@@ -572,119 +574,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
572 | return null; | 574 | return null; |
573 | } | 575 | } |
574 | 576 | ||
575 | // What makes this method odd and unique is it tries to detach using an UUID.... Yay for standards. | ||
576 | // To LocalId or UUID, *THAT* is the question. How now Brown UUID?? | ||
577 | public void DetachSingleAttachmentToInv(UUID itemID, IClientAPI remoteClient) | ||
578 | { | ||
579 | if (itemID == UUID.Zero) // If this happened, someone made a mistake.... | ||
580 | return; | ||
581 | |||
582 | // We can NOT use the dictionries here, as we are looking | ||
583 | // for an entity by the fromAssetID, which is NOT the prim UUID | ||
584 | // | ||
585 | List<EntityBase> detachEntities = GetEntities(); | ||
586 | SceneObjectGroup group; | ||
587 | |||
588 | foreach (EntityBase entity in detachEntities) | ||
589 | { | ||
590 | if (entity is SceneObjectGroup) | ||
591 | { | ||
592 | group = (SceneObjectGroup)entity; | ||
593 | if (group.GetFromItemID() == itemID) | ||
594 | { | ||
595 | m_parentScene.SendAttachEvent(group.LocalId, itemID, UUID.Zero); | ||
596 | group.DetachToInventoryPrep(); | ||
597 | m_log.Debug("[DETACH]: Saving attachpoint: " + | ||
598 | ((uint)group.GetAttachmentPoint()).ToString()); | ||
599 | m_parentScene.UpdateKnownItem(remoteClient, group, | ||
600 | group.GetFromItemID(), group.OwnerID); | ||
601 | m_parentScene.DeleteSceneObject(group, false); | ||
602 | return; | ||
603 | } | ||
604 | } | ||
605 | } | ||
606 | } | ||
607 | |||
608 | /// <summary> | ||
609 | /// Attach a scene object to an avatar. | ||
610 | /// </summary> | ||
611 | /// <param name="remoteClient"></param> | ||
612 | /// <param name="objectLocalID"></param> | ||
613 | /// <param name="AttachmentPt"></param> | ||
614 | /// <param name="rot"></param> | ||
615 | /// <param name="attachPos"></param> | ||
616 | /// <param name="silent"></param> | ||
617 | /// <returns>true if the attachment was successful, false otherwise</returns> | ||
618 | protected internal bool AttachObject( | ||
619 | IClientAPI remoteClient, uint objectLocalID, uint AttachmentPt, Quaternion rot, Vector3 attachPos, bool silent) | ||
620 | { | ||
621 | SceneObjectGroup group = GetGroupByPrim(objectLocalID); | ||
622 | if (group != null) | ||
623 | { | ||
624 | if (m_parentScene.Permissions.CanTakeObject(group.UUID, remoteClient.AgentId)) | ||
625 | { | ||
626 | // If the attachment point isn't the same as the one previously used | ||
627 | // set it's offset position = 0 so that it appears on the attachment point | ||
628 | // and not in a weird location somewhere unknown. | ||
629 | if (AttachmentPt != 0 && AttachmentPt != (uint)group.GetAttachmentPoint()) | ||
630 | { | ||
631 | attachPos = Vector3.Zero; | ||
632 | } | ||
633 | |||
634 | // AttachmentPt 0 means the client chose to 'wear' the attachment. | ||
635 | if (AttachmentPt == 0) | ||
636 | { | ||
637 | // Check object for stored attachment point | ||
638 | AttachmentPt = (uint)group.GetAttachmentPoint(); | ||
639 | } | ||
640 | |||
641 | // if we still didn't find a suitable attachment point....... | ||
642 | if (AttachmentPt == 0) | ||
643 | { | ||
644 | // Stick it on left hand with Zero Offset from the attachment point. | ||
645 | AttachmentPt = (uint)AttachmentPoint.LeftHand; | ||
646 | attachPos = Vector3.Zero; | ||
647 | } | ||
648 | |||
649 | group.SetAttachmentPoint((byte)AttachmentPt); | ||
650 | group.AbsolutePosition = attachPos; | ||
651 | |||
652 | // Saves and gets itemID | ||
653 | UUID itemId; | ||
654 | |||
655 | if (group.GetFromItemID() == UUID.Zero) | ||
656 | { | ||
657 | m_parentScene.attachObjectAssetStore(remoteClient, group, remoteClient.AgentId, out itemId); | ||
658 | } | ||
659 | else | ||
660 | { | ||
661 | itemId = group.GetFromItemID(); | ||
662 | } | ||
663 | |||
664 | m_parentScene.AttachObject(remoteClient, AttachmentPt, itemId, group); | ||
665 | |||
666 | group.AttachToAgent(remoteClient.AgentId, AttachmentPt, attachPos, silent); | ||
667 | // In case it is later dropped again, don't let | ||
668 | // it get cleaned up | ||
669 | // | ||
670 | group.RootPart.RemFlag(PrimFlags.TemporaryOnRez); | ||
671 | group.HasGroupChanged = false; | ||
672 | } | ||
673 | else | ||
674 | { | ||
675 | remoteClient.SendAgentAlertMessage("You don't have sufficient permissions to attach this object", false); | ||
676 | return false; | ||
677 | } | ||
678 | } | ||
679 | else | ||
680 | { | ||
681 | m_log.DebugFormat("[SCENE GRAPH]: AttachObject found no such scene object {0}", objectLocalID); | ||
682 | return false; | ||
683 | } | ||
684 | |||
685 | return true; | ||
686 | } | ||
687 | |||
688 | protected internal ScenePresence CreateAndAddChildScenePresence(IClientAPI client, AvatarAppearance appearance) | 577 | protected internal ScenePresence CreateAndAddChildScenePresence(IClientAPI client, AvatarAppearance appearance) |
689 | { | 578 | { |
690 | ScenePresence newAvatar = null; | 579 | ScenePresence newAvatar = null; |
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs index 04e3221..77bf6fe 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs | |||
@@ -637,7 +637,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
637 | m_items[item.ItemID] = item; | 637 | m_items[item.ItemID] = item; |
638 | m_inventorySerial++; | 638 | m_inventorySerial++; |
639 | m_part.TriggerScriptChangedEvent(Changed.INVENTORY); | 639 | m_part.TriggerScriptChangedEvent(Changed.INVENTORY); |
640 | |||
641 | HasInventoryChanged = true; | 640 | HasInventoryChanged = true; |
642 | m_part.ParentGroup.HasGroupChanged = true; | 641 | m_part.ParentGroup.HasGroupChanged = true; |
643 | 642 | ||
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 465e916..4256be9 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs | |||
@@ -2675,6 +2675,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
2675 | if (Util.GetDistanceTo(AbsolutePosition, m_lastChildAgentUpdatePosition) >= Scene.ChildReprioritizationDistance || | 2675 | if (Util.GetDistanceTo(AbsolutePosition, m_lastChildAgentUpdatePosition) >= Scene.ChildReprioritizationDistance || |
2676 | Util.GetDistanceTo(CameraPosition, m_lastChildAgentUpdateCamPosition) >= Scene.ChildReprioritizationDistance) | 2676 | Util.GetDistanceTo(CameraPosition, m_lastChildAgentUpdateCamPosition) >= Scene.ChildReprioritizationDistance) |
2677 | { | 2677 | { |
2678 | m_lastChildAgentUpdatePosition = AbsolutePosition; | ||
2679 | m_lastChildAgentUpdateCamPosition = CameraPosition; | ||
2680 | |||
2678 | ChildAgentDataUpdate cadu = new ChildAgentDataUpdate(); | 2681 | ChildAgentDataUpdate cadu = new ChildAgentDataUpdate(); |
2679 | cadu.ActiveGroupID = UUID.Zero.Guid; | 2682 | cadu.ActiveGroupID = UUID.Zero.Guid; |
2680 | cadu.AgentID = UUID.Guid; | 2683 | cadu.AgentID = UUID.Guid; |
@@ -2683,8 +2686,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
2683 | Vector3 tempCameraCenter = m_CameraCenter; | 2686 | Vector3 tempCameraCenter = m_CameraCenter; |
2684 | cadu.cameraPosition = tempCameraCenter; | 2687 | cadu.cameraPosition = tempCameraCenter; |
2685 | cadu.drawdistance = m_DrawDistance; | 2688 | cadu.drawdistance = m_DrawDistance; |
2686 | if (m_scene.Permissions.IsGod(new UUID(cadu.AgentID))) | ||
2687 | cadu.godlevel = m_godlevel; | ||
2688 | cadu.GroupAccess = 0; | 2689 | cadu.GroupAccess = 0; |
2689 | cadu.Position = AbsolutePosition; | 2690 | cadu.Position = AbsolutePosition; |
2690 | cadu.regionHandle = m_rootRegionHandle; | 2691 | cadu.regionHandle = m_rootRegionHandle; |
@@ -2707,9 +2708,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
2707 | agentpos.CopyFrom(cadu); | 2708 | agentpos.CopyFrom(cadu); |
2708 | 2709 | ||
2709 | m_scene.SendOutChildAgentUpdates(agentpos, this); | 2710 | m_scene.SendOutChildAgentUpdates(agentpos, this); |
2710 | |||
2711 | m_lastChildAgentUpdatePosition = AbsolutePosition; | ||
2712 | m_lastChildAgentUpdateCamPosition = CameraPosition; | ||
2713 | } | 2711 | } |
2714 | } | 2712 | } |
2715 | 2713 | ||