diff options
6 files changed, 82 insertions, 78 deletions
diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs index 530a21c..d458364 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs | |||
@@ -25,6 +25,7 @@ | |||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | */ | 26 | */ |
27 | 27 | ||
28 | using System.Collections.Generic; | ||
28 | using System.Reflection; | 29 | using System.Reflection; |
29 | using log4net; | 30 | using log4net; |
30 | using Nini.Config; | 31 | using Nini.Config; |
@@ -131,26 +132,18 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
131 | } | 132 | } |
132 | else | 133 | else |
133 | { | 134 | { |
134 | m_log.DebugFormat("[SCENE GRAPH]: AttachObject found no such scene object {0}", objectLocalID); | 135 | m_log.DebugFormat("[ATTACHMENTS MODULE]: AttachObject found no such scene object {0}", objectLocalID); |
135 | return false; | 136 | return false; |
136 | } | 137 | } |
137 | 138 | ||
138 | return true; | 139 | return true; |
139 | } | 140 | } |
140 | 141 | ||
141 | /// <summary> | ||
142 | /// Update the user inventory to reflect an attachment | ||
143 | /// </summary> | ||
144 | /// <param name="att"></param> | ||
145 | /// <param name="remoteClient"></param> | ||
146 | /// <param name="itemID"></param> | ||
147 | /// <param name="AttachmentPt"></param> | ||
148 | /// <returns></returns> | ||
149 | public UUID SetAttachmentInventoryStatus( | 142 | public UUID SetAttachmentInventoryStatus( |
150 | SceneObjectGroup att, IClientAPI remoteClient, UUID itemID, uint AttachmentPt) | 143 | SceneObjectGroup att, IClientAPI remoteClient, UUID itemID, uint AttachmentPt) |
151 | { | 144 | { |
152 | m_log.DebugFormat( | 145 | m_log.DebugFormat( |
153 | "[USER INVENTORY]: Updating inventory of {0} to show attachment of {1} (item ID {2})", | 146 | "[ATTACHMENTS MODULEY]: Updating inventory of {0} to show attachment of {1} (item ID {2})", |
154 | remoteClient.Name, att.Name, itemID); | 147 | remoteClient.Name, att.Name, itemID); |
155 | 148 | ||
156 | if (!att.IsDeleted) | 149 | if (!att.IsDeleted) |
@@ -184,19 +177,19 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
184 | 177 | ||
185 | if (UUID.Zero == itemID) | 178 | if (UUID.Zero == itemID) |
186 | { | 179 | { |
187 | m_log.Error("[SCENE INVENTORY]: Unable to save attachment. Error inventory item ID."); | 180 | m_log.Error("[ATTACHMENTS MODULE]: Unable to save attachment. Error inventory item ID."); |
188 | return; | 181 | return; |
189 | } | 182 | } |
190 | 183 | ||
191 | if (0 == AttachmentPt) | 184 | if (0 == AttachmentPt) |
192 | { | 185 | { |
193 | m_log.Error("[SCENE INVENTORY]: Unable to save attachment. Error attachment point."); | 186 | m_log.Error("[ATTACHMENTS MODULE]: Unable to save attachment. Error attachment point."); |
194 | return; | 187 | return; |
195 | } | 188 | } |
196 | 189 | ||
197 | if (null == att.RootPart) | 190 | if (null == att.RootPart) |
198 | { | 191 | { |
199 | m_log.Error("[SCENE INVENTORY]: Unable to save attachment for a prim without the rootpart!"); | 192 | m_log.Error("[ATTACHMENTS MODULE]: Unable to save attachment for a prim without the rootpart!"); |
200 | return; | 193 | return; |
201 | } | 194 | } |
202 | 195 | ||
@@ -212,5 +205,53 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
212 | m_scene.AvatarFactory.UpdateDatabase(remoteClient.AgentId, presence.Appearance); | 205 | m_scene.AvatarFactory.UpdateDatabase(remoteClient.AgentId, presence.Appearance); |
213 | } | 206 | } |
214 | } | 207 | } |
208 | |||
209 | public void ShowDetachInUserInventory(UUID itemID, IClientAPI remoteClient) | ||
210 | { | ||
211 | ScenePresence presence; | ||
212 | if (m_scene.TryGetAvatar(remoteClient.AgentId, out presence)) | ||
213 | { | ||
214 | presence.Appearance.DetachAttachment(itemID); | ||
215 | |||
216 | // Save avatar attachment information | ||
217 | if (m_scene.AvatarFactory != null) | ||
218 | { | ||
219 | m_log.Debug("[ATTACHMENTS MODULE]: Saving avatar attachment. AgentID: " + remoteClient.AgentId + ", ItemID: " + itemID); | ||
220 | m_scene.AvatarFactory.UpdateDatabase(remoteClient.AgentId, presence.Appearance); | ||
221 | } | ||
222 | } | ||
223 | |||
224 | DetachSingleAttachmentToInv(itemID, remoteClient); | ||
225 | } | ||
226 | |||
227 | // What makes this method odd and unique is it tries to detach using an UUID.... Yay for standards. | ||
228 | // To LocalId or UUID, *THAT* is the question. How now Brown UUID?? | ||
229 | protected void DetachSingleAttachmentToInv(UUID itemID, IClientAPI remoteClient) | ||
230 | { | ||
231 | if (itemID == UUID.Zero) // If this happened, someone made a mistake.... | ||
232 | return; | ||
233 | |||
234 | // We can NOT use the dictionries here, as we are looking | ||
235 | // for an entity by the fromAssetID, which is NOT the prim UUID | ||
236 | List<EntityBase> detachEntities = m_scene.GetEntities(); | ||
237 | SceneObjectGroup group; | ||
238 | |||
239 | foreach (EntityBase entity in detachEntities) | ||
240 | { | ||
241 | if (entity is SceneObjectGroup) | ||
242 | { | ||
243 | group = (SceneObjectGroup)entity; | ||
244 | if (group.GetFromItemID() == itemID) | ||
245 | { | ||
246 | m_scene.EventManager.TriggerOnAttach(group.LocalId, itemID, UUID.Zero); | ||
247 | group.DetachToInventoryPrep(); | ||
248 | m_log.Debug("[ATTACHMENTS MODULE]: Saving attachpoint: " + ((uint)group.GetAttachmentPoint()).ToString()); | ||
249 | m_scene.UpdateKnownItem(remoteClient, group,group.GetFromItemID(), group.OwnerID); | ||
250 | m_scene.DeleteSceneObject(group, false); | ||
251 | return; | ||
252 | } | ||
253 | } | ||
254 | } | ||
255 | } | ||
215 | } | 256 | } |
216 | } \ No newline at end of file | 257 | } \ No newline at end of file |
diff --git a/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs b/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs index 5e5df4b..367ff3d 100644 --- a/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs | |||
@@ -57,5 +57,16 @@ namespace OpenSim.Region.Framework.Interfaces | |||
57 | /// <returns></returns> | 57 | /// <returns></returns> |
58 | UUID SetAttachmentInventoryStatus( | 58 | UUID SetAttachmentInventoryStatus( |
59 | SceneObjectGroup att, IClientAPI remoteClient, UUID itemID, uint AttachmentPt); | 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); | ||
60 | } | 71 | } |
61 | } \ No newline at end of file | 72 | } \ No newline at end of file |
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index bd3b433..dad0efd 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | |||
@@ -1858,7 +1858,7 @@ 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 | ||
@@ -1904,24 +1904,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
1904 | SendAttachEvent(part.ParentGroup.LocalId, itemID, UUID.Zero); | 1904 | SendAttachEvent(part.ParentGroup.LocalId, itemID, UUID.Zero); |
1905 | } | 1905 | } |
1906 | 1906 | ||
1907 | public void DetachSingleAttachmentToInv(UUID itemID, IClientAPI remoteClient) | ||
1908 | { | ||
1909 | ScenePresence presence; | ||
1910 | if (TryGetAvatar(remoteClient.AgentId, out presence)) | ||
1911 | { | ||
1912 | presence.Appearance.DetachAttachment(itemID); | ||
1913 | |||
1914 | // Save avatar attachment information | ||
1915 | if (m_AvatarFactory != null) | ||
1916 | { | ||
1917 | m_log.Info("[SCENE]: Saving avatar attachment. AgentID: " + remoteClient.AgentId + ", ItemID: " + itemID); | ||
1918 | m_AvatarFactory.UpdateDatabase(remoteClient.AgentId, presence.Appearance); | ||
1919 | } | ||
1920 | } | ||
1921 | |||
1922 | m_sceneGraph.DetachSingleAttachmentToInv(itemID, remoteClient); | ||
1923 | } | ||
1924 | |||
1925 | public void GetScriptRunning(IClientAPI controllingClient, UUID objectID, UUID itemID) | 1907 | public void GetScriptRunning(IClientAPI controllingClient, UUID objectID, UUID itemID) |
1926 | { | 1908 | { |
1927 | 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 c83132f..7c0375e 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs | |||
@@ -2646,10 +2646,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
2646 | public virtual void SubscribeToClientAttachmentEvents(IClientAPI client) | 2646 | public virtual void SubscribeToClientAttachmentEvents(IClientAPI client) |
2647 | { | 2647 | { |
2648 | client.OnRezSingleAttachmentFromInv += RezSingleAttachment; | 2648 | client.OnRezSingleAttachmentFromInv += RezSingleAttachment; |
2649 | client.OnRezMultipleAttachmentsFromInv += RezMultipleAttachments; | 2649 | client.OnRezMultipleAttachmentsFromInv += RezMultipleAttachments; |
2650 | client.OnDetachAttachmentIntoInv += DetachSingleAttachmentToInv; | ||
2651 | client.OnObjectAttach += m_sceneGraph.AttachObject; | 2650 | client.OnObjectAttach += m_sceneGraph.AttachObject; |
2652 | client.OnObjectDetach += m_sceneGraph.DetachObject; | 2651 | client.OnObjectDetach += m_sceneGraph.DetachObject; |
2652 | |||
2653 | if (AttachmentsModule != null) | ||
2654 | client.OnDetachAttachmentIntoInv += AttachmentsModule.ShowDetachInUserInventory; | ||
2653 | } | 2655 | } |
2654 | 2656 | ||
2655 | public virtual void SubscribeToClientTeleportEvents(IClientAPI client) | 2657 | public virtual void SubscribeToClientTeleportEvents(IClientAPI client) |
@@ -2696,8 +2698,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2696 | } | 2698 | } |
2697 | 2699 | ||
2698 | protected virtual void UnsubscribeToClientEvents(IClientAPI client) | 2700 | protected virtual void UnsubscribeToClientEvents(IClientAPI client) |
2699 | { | 2701 | { |
2700 | |||
2701 | } | 2702 | } |
2702 | 2703 | ||
2703 | /// <summary> | 2704 | /// <summary> |
@@ -2719,7 +2720,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
2719 | 2720 | ||
2720 | UnSubscribeToClientNetworkEvents(client); | 2721 | UnSubscribeToClientNetworkEvents(client); |
2721 | 2722 | ||
2722 | |||
2723 | // EventManager.TriggerOnNewClient(client); | 2723 | // EventManager.TriggerOnNewClient(client); |
2724 | } | 2724 | } |
2725 | 2725 | ||
@@ -2799,12 +2799,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
2799 | } | 2799 | } |
2800 | 2800 | ||
2801 | public virtual void UnSubscribeToClientAttachmentEvents(IClientAPI client) | 2801 | public virtual void UnSubscribeToClientAttachmentEvents(IClientAPI client) |
2802 | { | 2802 | { |
2803 | client.OnRezSingleAttachmentFromInv -= RezSingleAttachment; | ||
2804 | client.OnRezMultipleAttachmentsFromInv -= RezMultipleAttachments; | 2803 | client.OnRezMultipleAttachmentsFromInv -= RezMultipleAttachments; |
2805 | client.OnDetachAttachmentIntoInv -= DetachSingleAttachmentToInv; | 2804 | client.OnRezSingleAttachmentFromInv -= RezSingleAttachment; |
2806 | client.OnObjectAttach -= m_sceneGraph.AttachObject; | 2805 | client.OnObjectAttach -= m_sceneGraph.AttachObject; |
2807 | client.OnObjectDetach -= m_sceneGraph.DetachObject; | 2806 | client.OnObjectDetach -= m_sceneGraph.DetachObject; |
2807 | |||
2808 | if (AttachmentsModule != null) | ||
2809 | client.OnDetachAttachmentIntoInv -= AttachmentsModule.ShowDetachInUserInventory; | ||
2808 | } | 2810 | } |
2809 | 2811 | ||
2810 | public virtual void UnSubscribeToClientTeleportEvents(IClientAPI client) | 2812 | public virtual void UnSubscribeToClientTeleportEvents(IClientAPI client) |
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs index 48744d7..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 | ||
@@ -574,39 +574,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
574 | return null; | 574 | return null; |
575 | } | 575 | } |
576 | 576 | ||
577 | // What makes this method odd and unique is it tries to detach using an UUID.... Yay for standards. | ||
578 | // To LocalId or UUID, *THAT* is the question. How now Brown UUID?? | ||
579 | public void DetachSingleAttachmentToInv(UUID itemID, IClientAPI remoteClient) | ||
580 | { | ||
581 | if (itemID == UUID.Zero) // If this happened, someone made a mistake.... | ||
582 | return; | ||
583 | |||
584 | // We can NOT use the dictionries here, as we are looking | ||
585 | // for an entity by the fromAssetID, which is NOT the prim UUID | ||
586 | // | ||
587 | List<EntityBase> detachEntities = GetEntities(); | ||
588 | SceneObjectGroup group; | ||
589 | |||
590 | foreach (EntityBase entity in detachEntities) | ||
591 | { | ||
592 | if (entity is SceneObjectGroup) | ||
593 | { | ||
594 | group = (SceneObjectGroup)entity; | ||
595 | if (group.GetFromItemID() == itemID) | ||
596 | { | ||
597 | m_parentScene.SendAttachEvent(group.LocalId, itemID, UUID.Zero); | ||
598 | group.DetachToInventoryPrep(); | ||
599 | m_log.Debug("[DETACH]: Saving attachpoint: " + | ||
600 | ((uint)group.GetAttachmentPoint()).ToString()); | ||
601 | m_parentScene.UpdateKnownItem(remoteClient, group, | ||
602 | group.GetFromItemID(), group.OwnerID); | ||
603 | m_parentScene.DeleteSceneObject(group, false); | ||
604 | return; | ||
605 | } | ||
606 | } | ||
607 | } | ||
608 | } | ||
609 | |||
610 | protected internal ScenePresence CreateAndAddChildScenePresence(IClientAPI client, AvatarAppearance appearance) | 577 | protected internal ScenePresence CreateAndAddChildScenePresence(IClientAPI client, AvatarAppearance appearance) |
611 | { | 578 | { |
612 | ScenePresence newAvatar = null; | 579 | ScenePresence newAvatar = null; |
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 0eee147..8217248 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | |||
@@ -2931,8 +2931,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2931 | 2931 | ||
2932 | ScenePresence presence = World.GetScenePresence(m_host.OwnerID); | 2932 | ScenePresence presence = World.GetScenePresence(m_host.OwnerID); |
2933 | 2933 | ||
2934 | m_ScriptEngine.World.DetachSingleAttachmentToInv(itemID, | 2934 | IAttachmentsModule attachmentsModule = m_ScriptEngine.World.AttachmentsModule; |
2935 | presence.ControllingClient); | 2935 | if (attachmentsModule != null) |
2936 | attachmentsModule.ShowDetachInUserInventory(itemID, presence.ControllingClient); | ||
2936 | } | 2937 | } |
2937 | } | 2938 | } |
2938 | 2939 | ||