diff options
author | Justin Clark-Casey (justincc) | 2011-08-30 22:06:24 +0100 |
---|---|---|
committer | Justin Clark-Casey (justincc) | 2011-08-30 22:06:24 +0100 |
commit | e7a515bab0e46c228f8f543397f97b7ba2f0df3c (patch) | |
tree | 9c5bd0f2aea3f59b5a8b82da74b336f78f74c17e /OpenSim | |
parent | Merge branch 'master' into bulletsim (diff) | |
download | opensim-SC-e7a515bab0e46c228f8f543397f97b7ba2f0df3c.zip opensim-SC-e7a515bab0e46c228f8f543397f97b7ba2f0df3c.tar.gz opensim-SC-e7a515bab0e46c228f8f543397f97b7ba2f0df3c.tar.bz2 opensim-SC-e7a515bab0e46c228f8f543397f97b7ba2f0df3c.tar.xz |
Fix bug where attachments were remaining on the avatar after being dropped.
If the inventory service is configured not to allow deletion then these will not disappear from inventory
Diffstat (limited to 'OpenSim')
3 files changed, 25 insertions, 8 deletions
diff --git a/OpenSim/Framework/AvatarAppearance.cs b/OpenSim/Framework/AvatarAppearance.cs index ab4ed66..7c6295d 100644 --- a/OpenSim/Framework/AvatarAppearance.cs +++ b/OpenSim/Framework/AvatarAppearance.cs | |||
@@ -383,9 +383,11 @@ namespace OpenSim.Framework | |||
383 | // DEBUG OFF | 383 | // DEBUG OFF |
384 | 384 | ||
385 | /// <summary> | 385 | /// <summary> |
386 | /// Get a list of the attachments, note that there may be | 386 | /// Get a list of the attachments. |
387 | /// duplicate attachpoints | ||
388 | /// </summary> | 387 | /// </summary> |
388 | /// <remarks> | ||
389 | /// There may be duplicate attachpoints | ||
390 | /// </remarks> | ||
389 | public List<AvatarAttachment> GetAttachments() | 391 | public List<AvatarAttachment> GetAttachments() |
390 | { | 392 | { |
391 | List<AvatarAttachment> alist = new List<AvatarAttachment>(); | 393 | List<AvatarAttachment> alist = new List<AvatarAttachment>(); |
@@ -487,6 +489,7 @@ namespace OpenSim.Framework | |||
487 | // And remove the list if there are no more attachments here | 489 | // And remove the list if there are no more attachments here |
488 | if (m_attachments[kvp.Key].Count == 0) | 490 | if (m_attachments[kvp.Key].Count == 0) |
489 | m_attachments.Remove(kvp.Key); | 491 | m_attachments.Remove(kvp.Key); |
492 | |||
490 | return true; | 493 | return true; |
491 | } | 494 | } |
492 | } | 495 | } |
diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs index 2d5eb18..b7a7f77 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs | |||
@@ -451,6 +451,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
451 | 451 | ||
452 | public void DetachSingleAttachmentToGround(UUID sceneObjectID, IClientAPI remoteClient) | 452 | public void DetachSingleAttachmentToGround(UUID sceneObjectID, IClientAPI remoteClient) |
453 | { | 453 | { |
454 | // m_log.DebugFormat( | ||
455 | // "[ATTACHMENTS MODULE]: DetachSingleAttachmentToGround() for {0}, object {1}", | ||
456 | // remoteClient.Name, sceneObjectID); | ||
457 | |||
454 | SceneObjectGroup so = m_scene.GetSceneObjectGroup(sceneObjectID); | 458 | SceneObjectGroup so = m_scene.GetSceneObjectGroup(sceneObjectID); |
455 | 459 | ||
456 | if (so == null) | 460 | if (so == null) |
@@ -461,6 +465,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
461 | 465 | ||
462 | UUID inventoryID = so.GetFromItemID(); | 466 | UUID inventoryID = so.GetFromItemID(); |
463 | 467 | ||
468 | // m_log.DebugFormat( | ||
469 | // "[ATTACHMENTS MODULE]: In DetachSingleAttachmentToGround(), object is {0} {1}, associated item is {2}", | ||
470 | // so.Name, so.LocalId, inventoryID); | ||
471 | |||
464 | ScenePresence presence; | 472 | ScenePresence presence; |
465 | if (m_scene.TryGetScenePresence(remoteClient.AgentId, out presence)) | 473 | if (m_scene.TryGetScenePresence(remoteClient.AgentId, out presence)) |
466 | { | 474 | { |
@@ -468,7 +476,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
468 | so.PrimCount, remoteClient.AgentId, presence.AbsolutePosition)) | 476 | so.PrimCount, remoteClient.AgentId, presence.AbsolutePosition)) |
469 | return; | 477 | return; |
470 | 478 | ||
471 | bool changed = presence.Appearance.DetachAttachment(sceneObjectID); | 479 | bool changed = presence.Appearance.DetachAttachment(inventoryID); |
472 | if (changed && m_scene.AvatarFactory != null) | 480 | if (changed && m_scene.AvatarFactory != null) |
473 | m_scene.AvatarFactory.QueueAppearanceSave(remoteClient.AgentId); | 481 | m_scene.AvatarFactory.QueueAppearanceSave(remoteClient.AgentId); |
474 | 482 | ||
@@ -485,7 +493,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
485 | } | 493 | } |
486 | 494 | ||
487 | /// <summary> | 495 | /// <summary> |
488 | /// Detach the given scene objet to the ground. | 496 | /// Detach the given scene object to the ground. |
489 | /// </summary> | 497 | /// </summary> |
490 | /// <remarks> | 498 | /// <remarks> |
491 | /// The caller has to take care of all the other work in updating avatar appearance, inventory, etc. | 499 | /// The caller has to take care of all the other work in updating avatar appearance, inventory, etc. |
diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs index bb53601..b1f9197 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs | |||
@@ -138,7 +138,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests | |||
138 | m_attMod.RezSingleAttachmentFromInventory( | 138 | m_attMod.RezSingleAttachmentFromInventory( |
139 | m_presence.ControllingClient, attItemId, (uint)AttachmentPoint.Chest); | 139 | m_presence.ControllingClient, attItemId, (uint)AttachmentPoint.Chest); |
140 | 140 | ||
141 | // Check status on scene presence | 141 | // Check scene presence status |
142 | Assert.That(m_presence.HasAttachments(), Is.True); | 142 | Assert.That(m_presence.HasAttachments(), Is.True); |
143 | List<SceneObjectGroup> attachments = m_presence.Attachments; | 143 | List<SceneObjectGroup> attachments = m_presence.Attachments; |
144 | Assert.That(attachments.Count, Is.EqualTo(1)); | 144 | Assert.That(attachments.Count, Is.EqualTo(1)); |
@@ -149,12 +149,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests | |||
149 | Assert.That(attSo.UsesPhysics, Is.False); | 149 | Assert.That(attSo.UsesPhysics, Is.False); |
150 | Assert.That(attSo.IsTemporary, Is.False); | 150 | Assert.That(attSo.IsTemporary, Is.False); |
151 | 151 | ||
152 | // Check item status | 152 | // Check appearance status |
153 | Assert.That(m_presence.Appearance.GetAttachpoint(attItemId), Is.EqualTo((int)AttachmentPoint.Chest)); | 153 | Assert.That(m_presence.Appearance.GetAttachpoint(attItemId), Is.EqualTo((int)AttachmentPoint.Chest)); |
154 | } | 154 | } |
155 | 155 | ||
156 | [Test] | 156 | [Test] |
157 | public void TestDetachAttachmentToScene() | 157 | public void TestDetachAttachmentToGround() |
158 | { | 158 | { |
159 | TestHelpers.InMethod(); | 159 | TestHelpers.InMethod(); |
160 | // log4net.Config.XmlConfigurator.Configure(); | 160 | // log4net.Config.XmlConfigurator.Configure(); |
@@ -168,15 +168,21 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests | |||
168 | UserInventoryHelpers.CreateInventoryItem( | 168 | UserInventoryHelpers.CreateInventoryItem( |
169 | scene, attName, attItemId, attAssetId, m_presence.UUID, InventoryType.Object); | 169 | scene, attName, attItemId, attAssetId, m_presence.UUID, InventoryType.Object); |
170 | 170 | ||
171 | // Check item status | ||
172 | Assert.That(scene.InventoryService.GetItem(new InventoryItemBase(attItemId)), Is.Not.Null); | ||
173 | |||
171 | UUID attSoId = m_attMod.RezSingleAttachmentFromInventory( | 174 | UUID attSoId = m_attMod.RezSingleAttachmentFromInventory( |
172 | m_presence.ControllingClient, attItemId, (uint)AttachmentPoint.Chest); | 175 | m_presence.ControllingClient, attItemId, (uint)AttachmentPoint.Chest); |
173 | m_attMod.DetachSingleAttachmentToGround(attSoId, m_presence.ControllingClient); | 176 | m_attMod.DetachSingleAttachmentToGround(attSoId, m_presence.ControllingClient); |
174 | 177 | ||
175 | // Check status on scene presence | 178 | // Check scene presence status |
176 | Assert.That(m_presence.HasAttachments(), Is.False); | 179 | Assert.That(m_presence.HasAttachments(), Is.False); |
177 | List<SceneObjectGroup> attachments = m_presence.Attachments; | 180 | List<SceneObjectGroup> attachments = m_presence.Attachments; |
178 | Assert.That(attachments.Count, Is.EqualTo(0)); | 181 | Assert.That(attachments.Count, Is.EqualTo(0)); |
179 | 182 | ||
183 | // Check appearance status | ||
184 | Assert.That(m_presence.Appearance.GetAttachments().Count, Is.EqualTo(0)); | ||
185 | |||
180 | // Check item status | 186 | // Check item status |
181 | Assert.That(scene.InventoryService.GetItem(new InventoryItemBase(attItemId)), Is.Null); | 187 | Assert.That(scene.InventoryService.GetItem(new InventoryItemBase(attItemId)), Is.Null); |
182 | 188 | ||