diff options
author | Justin Clark-Casey (justincc) | 2011-09-03 01:11:16 +0100 |
---|---|---|
committer | Justin Clark-Casey (justincc) | 2011-09-03 01:11:16 +0100 |
commit | 5c1fa968ab954bec9860023dffc8f68baf3c0620 (patch) | |
tree | f5be7264076e9e2815cd05f6a7ba8bac2831330a /OpenSim/Region/CoreModules/Avatar | |
parent | Comment out Scene.CleanDroppedAttachments() and calls. (diff) | |
download | opensim-SC_OLD-5c1fa968ab954bec9860023dffc8f68baf3c0620.zip opensim-SC_OLD-5c1fa968ab954bec9860023dffc8f68baf3c0620.tar.gz opensim-SC_OLD-5c1fa968ab954bec9860023dffc8f68baf3c0620.tar.bz2 opensim-SC_OLD-5c1fa968ab954bec9860023dffc8f68baf3c0620.tar.xz |
Stop NPCs losing attachments when the source avatar takes them off.
This was happening because we were using the source avatar's item IDs in the clone appearance.
Switch to using the asset IDs of attachments instead for NPCs.
The InventoryAccessModule and AttachmentModule had to be changed to allow rezzing of an object without an associated inventory item.
Hopefully goes some way towards resolving http://opensimulator.org/mantis/view.php?id=5653
Diffstat (limited to 'OpenSim/Region/CoreModules/Avatar')
-rw-r--r-- | OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs | 76 |
1 files changed, 48 insertions, 28 deletions
diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs index ffe76a8..4881499 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs | |||
@@ -111,10 +111,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
111 | List<AvatarAttachment> attachments = sp.Appearance.GetAttachments(); | 111 | List<AvatarAttachment> attachments = sp.Appearance.GetAttachments(); |
112 | foreach (AvatarAttachment attach in attachments) | 112 | foreach (AvatarAttachment attach in attachments) |
113 | { | 113 | { |
114 | int p = attach.AttachPoint; | 114 | uint p = (uint)attach.AttachPoint; |
115 | UUID itemID = attach.ItemID; | 115 | |
116 | // m_log.DebugFormat( | ||
117 | // "[ATTACHMENTS MODULE]: Doing initial rez of attachment with itemID {0}, assetID {1}, point {2} for {3} in {4}", | ||
118 | // attach.ItemID, attach.AssetID, p, sp.Name, m_scene.RegionInfo.RegionName); | ||
116 | 119 | ||
117 | //UUID assetID = attach.AssetID; | ||
118 | // For some reason assetIDs are being written as Zero's in the DB -- need to track tat down | 120 | // For some reason assetIDs are being written as Zero's in the DB -- need to track tat down |
119 | // But they're not used anyway, the item is being looked up for now, so let's proceed. | 121 | // But they're not used anyway, the item is being looked up for now, so let's proceed. |
120 | //if (UUID.Zero == assetID) | 122 | //if (UUID.Zero == assetID) |
@@ -125,7 +127,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
125 | 127 | ||
126 | try | 128 | try |
127 | { | 129 | { |
128 | RezSingleAttachmentFromInventory(sp.ControllingClient, itemID, (uint)p); | 130 | // If we're an NPC then skip all the item checks and manipulations since we don't have an |
131 | // inventory right now. | ||
132 | if (sp.PresenceType == PresenceType.Npc) | ||
133 | RezSingleAttachmentFromInventoryInternal(sp, UUID.Zero, attach.AssetID, p); | ||
134 | else | ||
135 | RezSingleAttachmentFromInventory(sp.ControllingClient, attach.ItemID, p); | ||
129 | } | 136 | } |
130 | catch (Exception e) | 137 | catch (Exception e) |
131 | { | 138 | { |
@@ -231,7 +238,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
231 | return AttachObject(sp, group, AttachmentPt, silent); | 238 | return AttachObject(sp, group, AttachmentPt, silent); |
232 | } | 239 | } |
233 | 240 | ||
234 | private bool AttachObject(ScenePresence sp, SceneObjectGroup group, uint attachmentPt, bool silent) | 241 | private bool AttachObject(IScenePresence sp, SceneObjectGroup group, uint attachmentPt, bool silent) |
235 | { | 242 | { |
236 | // m_log.DebugFormat( | 243 | // m_log.DebugFormat( |
237 | // "[ATTACHMENTS MODULE]: Attaching object {0} {1} to {2} point {3} from ground (silent = {4})", | 244 | // "[ATTACHMENTS MODULE]: Attaching object {0} {1} to {2} point {3} from ground (silent = {4})", |
@@ -284,17 +291,21 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
284 | List<SceneObjectGroup> attachments = sp.GetAttachments(attachmentPt); | 291 | List<SceneObjectGroup> attachments = sp.GetAttachments(attachmentPt); |
285 | 292 | ||
286 | // At the moment we can only deal with a single attachment | 293 | // At the moment we can only deal with a single attachment |
287 | if (attachments.Count != 0) | 294 | // We also don't want to do any of the inventory operations for an NPC. |
288 | itemID = attachments[0].GetFromItemID(); | 295 | if (sp.PresenceType != PresenceType.Npc) |
289 | 296 | { | |
290 | if (itemID != UUID.Zero) | 297 | if (attachments.Count != 0) |
291 | DetachSingleAttachmentToInv(itemID, sp); | 298 | itemID = attachments[0].GetFromItemID(); |
292 | 299 | ||
293 | itemID = group.GetFromItemID(); | 300 | if (itemID != UUID.Zero) |
294 | if (itemID == UUID.Zero) | 301 | DetachSingleAttachmentToInv(itemID, sp); |
295 | itemID = AddSceneObjectAsAttachment(sp.ControllingClient, group).ID; | 302 | |
296 | 303 | itemID = group.GetFromItemID(); | |
297 | ShowAttachInUserInventory(sp, attachmentPt, itemID, group); | 304 | if (itemID == UUID.Zero) |
305 | itemID = AddSceneObjectAsAttachment(sp.ControllingClient, group).ID; | ||
306 | |||
307 | ShowAttachInUserInventory(sp, attachmentPt, itemID, group); | ||
308 | } | ||
298 | 309 | ||
299 | AttachToAgent(sp, group, attachmentPt, attachPos, silent); | 310 | AttachToAgent(sp, group, attachmentPt, attachPos, silent); |
300 | 311 | ||
@@ -312,7 +323,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
312 | } | 323 | } |
313 | } | 324 | } |
314 | 325 | ||
315 | public ISceneEntity RezSingleAttachmentFromInventory(IClientAPI remoteClient, UUID itemID, uint AttachmentPt) | 326 | public ISceneEntity RezSingleAttachmentFromInventory( |
327 | IClientAPI remoteClient, UUID itemID, uint AttachmentPt) | ||
316 | { | 328 | { |
317 | return RezSingleAttachmentFromInventory(remoteClient, itemID, AttachmentPt, true); | 329 | return RezSingleAttachmentFromInventory(remoteClient, itemID, AttachmentPt, true); |
318 | } | 330 | } |
@@ -338,7 +350,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
338 | // be removed when that functionality is implemented in opensim | 350 | // be removed when that functionality is implemented in opensim |
339 | AttachmentPt &= 0x7f; | 351 | AttachmentPt &= 0x7f; |
340 | 352 | ||
341 | SceneObjectGroup att = RezSingleAttachmentFromInventoryInternal(sp, itemID, AttachmentPt); | 353 | SceneObjectGroup att = RezSingleAttachmentFromInventoryInternal(sp, itemID, UUID.Zero, AttachmentPt); |
342 | 354 | ||
343 | if (updateInventoryStatus) | 355 | if (updateInventoryStatus) |
344 | { | 356 | { |
@@ -352,14 +364,21 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
352 | } | 364 | } |
353 | 365 | ||
354 | private SceneObjectGroup RezSingleAttachmentFromInventoryInternal( | 366 | private SceneObjectGroup RezSingleAttachmentFromInventoryInternal( |
355 | ScenePresence sp, UUID itemID, uint attachmentPt) | 367 | IScenePresence sp, UUID itemID, UUID assetID, uint attachmentPt) |
356 | { | 368 | { |
357 | IInventoryAccessModule invAccess = m_scene.RequestModuleInterface<IInventoryAccessModule>(); | 369 | IInventoryAccessModule invAccess = m_scene.RequestModuleInterface<IInventoryAccessModule>(); |
358 | if (invAccess != null) | 370 | if (invAccess != null) |
359 | { | 371 | { |
360 | SceneObjectGroup objatt = invAccess.RezObject(sp.ControllingClient, | 372 | SceneObjectGroup objatt; |
361 | itemID, Vector3.Zero, Vector3.Zero, UUID.Zero, (byte)1, true, | 373 | |
362 | false, false, sp.UUID, true); | 374 | if (itemID != UUID.Zero) |
375 | objatt = invAccess.RezObject(sp.ControllingClient, | ||
376 | itemID, Vector3.Zero, Vector3.Zero, UUID.Zero, (byte)1, true, | ||
377 | false, false, sp.UUID, true); | ||
378 | else | ||
379 | objatt = invAccess.RezObject(sp.ControllingClient, | ||
380 | null, assetID, Vector3.Zero, Vector3.Zero, UUID.Zero, (byte)1, true, | ||
381 | false, false, sp.UUID, true); | ||
363 | 382 | ||
364 | // m_log.DebugFormat( | 383 | // m_log.DebugFormat( |
365 | // "[ATTACHMENTS MODULE]: Retrieved single object {0} for attachment to {1} on point {2}", | 384 | // "[ATTACHMENTS MODULE]: Retrieved single object {0} for attachment to {1} on point {2}", |
@@ -425,7 +444,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
425 | /// <param name="attachmentPoint"></param> | 444 | /// <param name="attachmentPoint"></param> |
426 | /// <returns></returns> | 445 | /// <returns></returns> |
427 | private UUID ShowAttachInUserInventory( | 446 | private UUID ShowAttachInUserInventory( |
428 | SceneObjectGroup att, ScenePresence sp, UUID itemID, uint attachmentPoint) | 447 | SceneObjectGroup att, IScenePresence sp, UUID itemID, uint attachmentPoint) |
429 | { | 448 | { |
430 | // m_log.DebugFormat( | 449 | // m_log.DebugFormat( |
431 | // "[ATTACHMENTS MODULE]: Updating inventory of {0} to show attachment of {1} {2} (item ID {3}) at {4}", | 450 | // "[ATTACHMENTS MODULE]: Updating inventory of {0} to show attachment of {1} {2} (item ID {3}) at {4}", |
@@ -452,7 +471,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
452 | /// <param name="itemID"></param> | 471 | /// <param name="itemID"></param> |
453 | /// <param name="att"></param> | 472 | /// <param name="att"></param> |
454 | private void ShowAttachInUserInventory( | 473 | private void ShowAttachInUserInventory( |
455 | ScenePresence sp, uint AttachmentPt, UUID itemID, SceneObjectGroup att) | 474 | IScenePresence sp, uint AttachmentPt, UUID itemID, SceneObjectGroup att) |
456 | { | 475 | { |
457 | // m_log.DebugFormat( | 476 | // m_log.DebugFormat( |
458 | // "[USER INVENTORY]: Updating attachment {0} for {1} at {2} using item ID {3}", | 477 | // "[USER INVENTORY]: Updating attachment {0} for {1} at {2} using item ID {3}", |
@@ -574,7 +593,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
574 | 593 | ||
575 | // What makes this method odd and unique is it tries to detach using an UUID.... Yay for standards. | 594 | // 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?? | 595 | // To LocalId or UUID, *THAT* is the question. How now Brown UUID?? |
577 | private void DetachSingleAttachmentToInv(UUID itemID, ScenePresence sp) | 596 | private void DetachSingleAttachmentToInv(UUID itemID, IScenePresence sp) |
578 | { | 597 | { |
579 | if (itemID == UUID.Zero) // If this happened, someone made a mistake.... | 598 | if (itemID == UUID.Zero) // If this happened, someone made a mistake.... |
580 | return; | 599 | return; |
@@ -697,16 +716,17 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
697 | /// <summary> | 716 | /// <summary> |
698 | /// Attach this scene object to the given avatar. | 717 | /// Attach this scene object to the given avatar. |
699 | /// </summary> | 718 | /// </summary> |
700 | /// | 719 | /// <remarks> |
701 | /// This isn't publicly available since attachments should always perform the corresponding inventory | 720 | /// This isn't publicly available since attachments should always perform the corresponding inventory |
702 | /// operation (to show the attach in user inventory and update the asset with positional information). | 721 | /// operation (to show the attach in user inventory and update the asset with positional information). |
703 | /// | 722 | /// </remarks> |
704 | /// <param name="sp"></param> | 723 | /// <param name="sp"></param> |
705 | /// <param name="so"></param> | 724 | /// <param name="so"></param> |
706 | /// <param name="attachmentpoint"></param> | 725 | /// <param name="attachmentpoint"></param> |
707 | /// <param name="attachOffset"></param> | 726 | /// <param name="attachOffset"></param> |
708 | /// <param name="silent"></param> | 727 | /// <param name="silent"></param> |
709 | protected void AttachToAgent(ScenePresence avatar, SceneObjectGroup so, uint attachmentpoint, Vector3 attachOffset, bool silent) | 728 | private void AttachToAgent( |
729 | IScenePresence avatar, SceneObjectGroup so, uint attachmentpoint, Vector3 attachOffset, bool silent) | ||
710 | { | 730 | { |
711 | // m_log.DebugFormat("[ATTACHMENTS MODULE]: Adding attachment {0} to avatar {1} in pt {2} pos {3} {4}", | 731 | // m_log.DebugFormat("[ATTACHMENTS MODULE]: Adding attachment {0} to avatar {1} in pt {2} pos {3} {4}", |
712 | // so.Name, avatar.Name, attachmentpoint, attachOffset, so.RootPart.AttachedPos); | 732 | // so.Name, avatar.Name, attachmentpoint, attachOffset, so.RootPart.AttachedPos); |