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 | |
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
7 files changed, 154 insertions, 70 deletions
diff --git a/OpenSim/Framework/AvatarAppearance.cs b/OpenSim/Framework/AvatarAppearance.cs index 7c6295d..aed9087 100644 --- a/OpenSim/Framework/AvatarAppearance.cs +++ b/OpenSim/Framework/AvatarAppearance.cs | |||
@@ -433,6 +433,10 @@ namespace OpenSim.Framework | |||
433 | if (attachpoint == 0) | 433 | if (attachpoint == 0) |
434 | return false; | 434 | return false; |
435 | 435 | ||
436 | // m_log.DebugFormat( | ||
437 | // "[AVATAR APPEARANCE]: Setting attachment at {0} with item ID {1}, asset ID {2}", | ||
438 | // attachpoint, item, asset); | ||
439 | |||
436 | if (item == UUID.Zero) | 440 | if (item == UUID.Zero) |
437 | { | 441 | { |
438 | if (m_attachments.ContainsKey(attachpoint)) | 442 | if (m_attachments.ContainsKey(attachpoint)) |
@@ -459,7 +463,7 @@ namespace OpenSim.Framework | |||
459 | } | 463 | } |
460 | else | 464 | else |
461 | { | 465 | { |
462 | ReplaceAttachment(new AvatarAttachment(attachpoint,item,asset)); | 466 | ReplaceAttachment(new AvatarAttachment(attachpoint,item, asset)); |
463 | } | 467 | } |
464 | return true; | 468 | return true; |
465 | } | 469 | } |
@@ -608,7 +612,14 @@ namespace OpenSim.Framework | |||
608 | { | 612 | { |
609 | OSDArray attachs = (OSDArray)(data["attachments"]); | 613 | OSDArray attachs = (OSDArray)(data["attachments"]); |
610 | for (int i = 0; i < attachs.Count; i++) | 614 | for (int i = 0; i < attachs.Count; i++) |
611 | AppendAttachment(new AvatarAttachment((OSDMap)attachs[i])); | 615 | { |
616 | AvatarAttachment att = new AvatarAttachment((OSDMap)attachs[i]); | ||
617 | AppendAttachment(att); | ||
618 | |||
619 | // m_log.DebugFormat( | ||
620 | // "[AVATAR APPEARANCE]: Unpacked attachment itemID {0}, assetID {1}, point {2}", | ||
621 | // att.ItemID, att.AssetID, att.AttachPoint); | ||
622 | } | ||
612 | } | 623 | } |
613 | } | 624 | } |
614 | catch (Exception e) | 625 | catch (Exception e) |
diff --git a/OpenSim/Framework/AvatarAttachment.cs b/OpenSim/Framework/AvatarAttachment.cs index c68d78d..07dd385 100644 --- a/OpenSim/Framework/AvatarAttachment.cs +++ b/OpenSim/Framework/AvatarAttachment.cs | |||
@@ -66,11 +66,11 @@ namespace OpenSim.Framework | |||
66 | return attachdata; | 66 | return attachdata; |
67 | } | 67 | } |
68 | 68 | ||
69 | |||
70 | public void Unpack(OSDMap args) | 69 | public void Unpack(OSDMap args) |
71 | { | 70 | { |
72 | if (args["point"] != null) | 71 | if (args["point"] != null) |
73 | AttachPoint = args["point"].AsInteger(); | 72 | AttachPoint = args["point"].AsInteger(); |
73 | |||
74 | ItemID = (args["item"] != null) ? args["item"].AsUUID() : UUID.Zero; | 74 | ItemID = (args["item"] != null) ? args["item"].AsUUID() : UUID.Zero; |
75 | AssetID = (args["asset"] != null) ? args["asset"].AsUUID() : UUID.Zero; | 75 | AssetID = (args["asset"] != null) ? args["asset"].AsUUID() : UUID.Zero; |
76 | } | 76 | } |
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); |
diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs index 0c0b0c5..4e8466d 100644 --- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs +++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs | |||
@@ -669,28 +669,10 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
669 | return item; | 669 | return item; |
670 | } | 670 | } |
671 | 671 | ||
672 | /// <summary> | 672 | public virtual SceneObjectGroup RezObject( |
673 | /// Rez an object into the scene from the user's inventory | 673 | IClientAPI remoteClient, UUID itemID, Vector3 RayEnd, Vector3 RayStart, |
674 | /// </summary> | 674 | UUID RayTargetID, byte BypassRayCast, bool RayEndIsIntersection, |
675 | /// <remarks> | 675 | bool RezSelected, bool RemoveItem, UUID fromTaskID, bool attachment) |
676 | /// FIXME: It would be really nice if inventory access modules didn't also actually do the work of rezzing | ||
677 | /// things to the scene. The caller should be doing that, I think. | ||
678 | /// </remarks> | ||
679 | /// <param name="remoteClient"></param> | ||
680 | /// <param name="itemID"></param> | ||
681 | /// <param name="RayEnd"></param> | ||
682 | /// <param name="RayStart"></param> | ||
683 | /// <param name="RayTargetID"></param> | ||
684 | /// <param name="BypassRayCast"></param> | ||
685 | /// <param name="RayEndIsIntersection"></param> | ||
686 | /// <param name="RezSelected"></param> | ||
687 | /// <param name="RemoveItem"></param> | ||
688 | /// <param name="fromTaskID"></param> | ||
689 | /// <param name="attachment"></param> | ||
690 | /// <returns>The SceneObjectGroup rezzed or null if rez was unsuccessful.</returns> | ||
691 | public virtual SceneObjectGroup RezObject(IClientAPI remoteClient, UUID itemID, Vector3 RayEnd, Vector3 RayStart, | ||
692 | UUID RayTargetID, byte BypassRayCast, bool RayEndIsIntersection, | ||
693 | bool RezSelected, bool RemoveItem, UUID fromTaskID, bool attachment) | ||
694 | { | 676 | { |
695 | // m_log.DebugFormat("[INVENTORY ACCESS MODULE]: RezObject for {0}, item {1}", remoteClient.Name, itemID); | 677 | // m_log.DebugFormat("[INVENTORY ACCESS MODULE]: RezObject for {0}, item {1}", remoteClient.Name, itemID); |
696 | 678 | ||
@@ -707,13 +689,34 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
707 | } | 689 | } |
708 | 690 | ||
709 | item.Owner = remoteClient.AgentId; | 691 | item.Owner = remoteClient.AgentId; |
710 | AssetBase rezAsset = m_Scene.AssetService.Get(item.AssetID.ToString()); | 692 | |
693 | return RezObject( | ||
694 | remoteClient, item, item.AssetID, | ||
695 | RayEnd, RayStart, RayTargetID, BypassRayCast, RayEndIsIntersection, | ||
696 | RezSelected, RemoveItem, fromTaskID, attachment); | ||
697 | } | ||
698 | |||
699 | public virtual SceneObjectGroup RezObject( | ||
700 | IClientAPI remoteClient, InventoryItemBase item, UUID assetID, Vector3 RayEnd, Vector3 RayStart, | ||
701 | UUID RayTargetID, byte BypassRayCast, bool RayEndIsIntersection, | ||
702 | bool RezSelected, bool RemoveItem, UUID fromTaskID, bool attachment) | ||
703 | { | ||
704 | AssetBase rezAsset = m_Scene.AssetService.Get(assetID.ToString()); | ||
711 | 705 | ||
712 | if (rezAsset == null) | 706 | if (rezAsset == null) |
713 | { | 707 | { |
714 | m_log.WarnFormat( | 708 | if (item != null) |
715 | "[InventoryAccessModule]: Could not find asset {0} for item {1} {2} for {3} in RezObject()", | 709 | { |
716 | item.AssetID, item.Name, item.ID, remoteClient.Name); | 710 | m_log.WarnFormat( |
711 | "[InventoryAccessModule]: Could not find asset {0} for item {1} {2} for {3} in RezObject()", | ||
712 | assetID, item.Name, item.ID, remoteClient.Name); | ||
713 | } | ||
714 | else | ||
715 | { | ||
716 | m_log.WarnFormat( | ||
717 | "[InventoryAccessModule]: Could not find asset {0} for {1} in RezObject()", | ||
718 | assetID, remoteClient.Name); | ||
719 | } | ||
717 | 720 | ||
718 | return null; | 721 | return null; |
719 | } | 722 | } |
@@ -781,7 +784,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
781 | } | 784 | } |
782 | } | 785 | } |
783 | 786 | ||
784 | if (!DoPreRezWhenFromItem(remoteClient, item, objlist, pos, attachment)) | 787 | if (item != null && !DoPreRezWhenFromItem(remoteClient, item, objlist, pos, attachment)) |
785 | return null; | 788 | return null; |
786 | 789 | ||
787 | for (int i = 0; i < objlist.Count; i++) | 790 | for (int i = 0; i < objlist.Count; i++) |
@@ -829,10 +832,6 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
829 | 832 | ||
830 | group.AbsolutePosition = pos + veclist[i]; | 833 | group.AbsolutePosition = pos + veclist[i]; |
831 | } | 834 | } |
832 | else | ||
833 | { | ||
834 | group.SetFromItemID(itemID); | ||
835 | } | ||
836 | 835 | ||
837 | SceneObjectPart rootPart = group.RootPart; | 836 | SceneObjectPart rootPart = group.RootPart; |
838 | 837 | ||
@@ -855,7 +854,8 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
855 | // group.Name, group.LocalId, group.UUID, remoteClient.Name); | 854 | // group.Name, group.LocalId, group.UUID, remoteClient.Name); |
856 | } | 855 | } |
857 | 856 | ||
858 | DoPostRezWhenFromItem(item, attachment); | 857 | if (item != null) |
858 | DoPostRezWhenFromItem(item, attachment); | ||
859 | 859 | ||
860 | return group; | 860 | return group; |
861 | } | 861 | } |
@@ -973,6 +973,9 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
973 | } | 973 | } |
974 | 974 | ||
975 | rootPart.TrimPermissions(); | 975 | rootPart.TrimPermissions(); |
976 | |||
977 | if (isAttachment) | ||
978 | so.SetFromItemID(item.ID); | ||
976 | } | 979 | } |
977 | 980 | ||
978 | return true; | 981 | return true; |
diff --git a/OpenSim/Region/Framework/Interfaces/IInventoryAccessModule.cs b/OpenSim/Region/Framework/Interfaces/IInventoryAccessModule.cs index da11e61..1904011 100644 --- a/OpenSim/Region/Framework/Interfaces/IInventoryAccessModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IInventoryAccessModule.cs | |||
@@ -54,10 +54,58 @@ namespace OpenSim.Region.Framework.Interfaces | |||
54 | /// FIXME: This is not very useful. It would be far more useful to return a list of items instead. | 54 | /// FIXME: This is not very useful. It would be far more useful to return a list of items instead. |
55 | /// </returns> | 55 | /// </returns> |
56 | UUID CopyToInventory(DeRezAction action, UUID folderID, List<SceneObjectGroup> objectGroups, IClientAPI remoteClient); | 56 | UUID CopyToInventory(DeRezAction action, UUID folderID, List<SceneObjectGroup> objectGroups, IClientAPI remoteClient); |
57 | 57 | ||
58 | SceneObjectGroup RezObject(IClientAPI remoteClient, UUID itemID, Vector3 RayEnd, Vector3 RayStart, | 58 | /// <summary> |
59 | UUID RayTargetID, byte BypassRayCast, bool RayEndIsIntersection, | 59 | /// Rez an object into the scene from the user's inventory |
60 | bool RezSelected, bool RemoveItem, UUID fromTaskID, bool attachment); | 60 | /// </summary> |
61 | /// <remarks> | ||
62 | /// FIXME: It would be really nice if inventory access modules didn't also actually do the work of rezzing | ||
63 | /// things to the scene. The caller should be doing that, I think. | ||
64 | /// </remarks> | ||
65 | /// <param name="remoteClient"></param> | ||
66 | /// <param name="itemID"></param> | ||
67 | /// <param name="RayEnd"></param> | ||
68 | /// <param name="RayStart"></param> | ||
69 | /// <param name="RayTargetID"></param> | ||
70 | /// <param name="BypassRayCast"></param> | ||
71 | /// <param name="RayEndIsIntersection"></param> | ||
72 | /// <param name="RezSelected"></param> | ||
73 | /// <param name="RemoveItem"></param> | ||
74 | /// <param name="fromTaskID"></param> | ||
75 | /// <param name="attachment"></param> | ||
76 | /// <returns>The SceneObjectGroup rezzed or null if rez was unsuccessful.</returns> | ||
77 | SceneObjectGroup RezObject( | ||
78 | IClientAPI remoteClient, UUID itemID, Vector3 RayEnd, Vector3 RayStart, | ||
79 | UUID RayTargetID, byte BypassRayCast, bool RayEndIsIntersection, | ||
80 | bool RezSelected, bool RemoveItem, UUID fromTaskID, bool attachment); | ||
81 | |||
82 | /// <summary> | ||
83 | /// Rez an object into the scene from the user's inventory | ||
84 | /// </summary> | ||
85 | /// <remarks> | ||
86 | /// FIXME: It would be really nice if inventory access modules didn't also actually do the work of rezzing | ||
87 | /// things to the scene. The caller should be doing that, I think. | ||
88 | /// </remarks> | ||
89 | /// <param name="remoteClient"></param> | ||
90 | /// <param name="item"> | ||
91 | /// The item from which the object asset came. Can be null, in which case pre and post rez item adjustment and checks are not performed. | ||
92 | /// </param> | ||
93 | /// <param name="assetID">The asset id for the object to rez.</param> | ||
94 | /// <param name="RayEnd"></param> | ||
95 | /// <param name="RayStart"></param> | ||
96 | /// <param name="RayTargetID"></param> | ||
97 | /// <param name="BypassRayCast"></param> | ||
98 | /// <param name="RayEndIsIntersection"></param> | ||
99 | /// <param name="RezSelected"></param> | ||
100 | /// <param name="RemoveItem"></param> | ||
101 | /// <param name="fromTaskID"></param> | ||
102 | /// <param name="attachment"></param> | ||
103 | /// <returns>The SceneObjectGroup rezzed or null if rez was unsuccessful.</returns> | ||
104 | SceneObjectGroup RezObject( | ||
105 | IClientAPI remoteClient, InventoryItemBase item, UUID assetID, Vector3 RayEnd, Vector3 RayStart, | ||
106 | UUID RayTargetID, byte BypassRayCast, bool RayEndIsIntersection, | ||
107 | bool RezSelected, bool RemoveItem, UUID fromTaskID, bool attachment); | ||
108 | |||
61 | void TransferInventoryAssets(InventoryItemBase item, UUID sender, UUID receiver); | 109 | void TransferInventoryAssets(InventoryItemBase item, UUID sender, UUID receiver); |
62 | 110 | ||
63 | /// <summary> | 111 | /// <summary> |
diff --git a/OpenSim/Region/Framework/Interfaces/IScenePresence.cs b/OpenSim/Region/Framework/Interfaces/IScenePresence.cs index 91e4bf2..8913133 100644 --- a/OpenSim/Region/Framework/Interfaces/IScenePresence.cs +++ b/OpenSim/Region/Framework/Interfaces/IScenePresence.cs | |||
@@ -46,6 +46,11 @@ namespace OpenSim.Region.Framework.Interfaces | |||
46 | IClientAPI ControllingClient { get; } | 46 | IClientAPI ControllingClient { get; } |
47 | 47 | ||
48 | /// <summary> | 48 | /// <summary> |
49 | /// What type of presence is this? User, NPC, etc. | ||
50 | /// </summary> | ||
51 | PresenceType PresenceType { get; } | ||
52 | |||
53 | /// <summary> | ||
49 | /// Avatar appearance data. | 54 | /// Avatar appearance data. |
50 | /// </summary> | 55 | /// </summary> |
51 | /// <remarks> | 56 | /// <remarks> |
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 0d284a5..1c283c7 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs | |||
@@ -75,9 +75,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
75 | 75 | ||
76 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | 76 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); |
77 | 77 | ||
78 | /// <summary> | ||
79 | /// What type of presence is this? User, NPC, etc. | ||
80 | /// </summary> | ||
81 | public PresenceType PresenceType { get; private set; } | 78 | public PresenceType PresenceType { get; private set; } |
82 | 79 | ||
83 | // private static readonly byte[] DEFAULT_TEXTURE = AvatarAppearance.GetDefaultTexture().GetBytes(); | 80 | // private static readonly byte[] DEFAULT_TEXTURE = AvatarAppearance.GetDefaultTexture().GetBytes(); |