diff options
Diffstat (limited to 'OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs')
-rw-r--r-- | OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs | 46 |
1 files changed, 18 insertions, 28 deletions
diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs index acd156e..9647217 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs | |||
@@ -236,9 +236,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
236 | // If we're an NPC then skip all the item checks and manipulations since we don't have an | 236 | // If we're an NPC then skip all the item checks and manipulations since we don't have an |
237 | // inventory right now. | 237 | // inventory right now. |
238 | if (sp.PresenceType == PresenceType.Npc) | 238 | if (sp.PresenceType == PresenceType.Npc) |
239 | RezSingleAttachmentFromInventoryInternal(sp, UUID.Zero, attach.AssetID, p, null); | 239 | RezSingleAttachmentFromInventoryInternal(sp, UUID.Zero, attach.AssetID, p, null, true); |
240 | else | 240 | else |
241 | RezSingleAttachmentFromInventory(sp, attach.ItemID, p, d); | 241 | RezSingleAttachmentFromInventory(sp, attach.ItemID, p | (uint)0x80, d); |
242 | } | 242 | } |
243 | catch (Exception e) | 243 | catch (Exception e) |
244 | { | 244 | { |
@@ -284,12 +284,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
284 | sp.ClearAttachments(); | 284 | sp.ClearAttachments(); |
285 | } | 285 | } |
286 | 286 | ||
287 | public bool AttachObject(IScenePresence sp, SceneObjectGroup group, uint attachmentPt, bool silent, bool useAttachData, bool temp) | 287 | public bool AttachObject(IScenePresence sp, SceneObjectGroup group, uint attachmentPt, bool silent, bool useAttachData, bool temp, bool append) |
288 | { | 288 | { |
289 | if (!Enabled) | 289 | if (!Enabled) |
290 | return false; | 290 | return false; |
291 | 291 | ||
292 | if (AttachObjectInternal(sp, group, attachmentPt, silent, useAttachData, temp)) | 292 | if (AttachObjectInternal(sp, group, attachmentPt, silent, useAttachData, temp, append)) |
293 | { | 293 | { |
294 | m_scene.EventManager.TriggerOnAttach(group.LocalId, group.FromItemID, sp.UUID); | 294 | m_scene.EventManager.TriggerOnAttach(group.LocalId, group.FromItemID, sp.UUID); |
295 | return true; | 295 | return true; |
@@ -298,7 +298,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
298 | return false; | 298 | return false; |
299 | } | 299 | } |
300 | 300 | ||
301 | private bool AttachObjectInternal(IScenePresence sp, SceneObjectGroup group, uint attachmentPt, bool silent, bool useAttachData, bool temp) | 301 | private bool AttachObjectInternal(IScenePresence sp, SceneObjectGroup group, uint attachmentPt, bool silent, bool useAttachData, bool temp, bool append) |
302 | { | 302 | { |
303 | lock (sp.AttachmentsSyncLock) | 303 | lock (sp.AttachmentsSyncLock) |
304 | { | 304 | { |
@@ -326,10 +326,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
326 | 326 | ||
327 | Vector3 attachPos = group.AbsolutePosition; | 327 | Vector3 attachPos = group.AbsolutePosition; |
328 | 328 | ||
329 | // TODO: this short circuits multiple attachments functionality in LL viewer 2.1+ and should | ||
330 | // be removed when that functionality is implemented in opensim | ||
331 | attachmentPt &= 0x7f; | ||
332 | |||
333 | // If the attachment point isn't the same as the one previously used | 329 | // If the attachment point isn't the same as the one previously used |
334 | // set it's offset position = 0 so that it appears on the attachment point | 330 | // set it's offset position = 0 so that it appears on the attachment point |
335 | // and not in a weird location somewhere unknown. | 331 | // and not in a weird location somewhere unknown. |
@@ -375,7 +371,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
375 | group.AbsolutePosition = attachPos; | 371 | group.AbsolutePosition = attachPos; |
376 | 372 | ||
377 | if (sp.PresenceType != PresenceType.Npc) | 373 | if (sp.PresenceType != PresenceType.Npc) |
378 | UpdateUserInventoryWithAttachment(sp, group, attachmentPt, temp); | 374 | UpdateUserInventoryWithAttachment(sp, group, attachmentPt, temp, append); |
379 | 375 | ||
380 | AttachToAgent(sp, group, attachmentPt, attachPos, silent); | 376 | AttachToAgent(sp, group, attachmentPt, attachPos, silent); |
381 | } | 377 | } |
@@ -383,21 +379,16 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
383 | return true; | 379 | return true; |
384 | } | 380 | } |
385 | 381 | ||
386 | private void UpdateUserInventoryWithAttachment(IScenePresence sp, SceneObjectGroup group, uint attachmentPt, bool temp) | 382 | private void UpdateUserInventoryWithAttachment(IScenePresence sp, SceneObjectGroup group, uint attachmentPt, bool temp, bool append) |
387 | { | 383 | { |
388 | // Remove any previous attachments | 384 | // Remove any previous attachments |
389 | List<SceneObjectGroup> attachments = sp.GetAttachments(attachmentPt); | 385 | List<SceneObjectGroup> attachments = sp.GetAttachments(attachmentPt); |
390 | 386 | ||
391 | // At the moment we can only deal with a single attachment | 387 | // At the moment we can only deal with a single attachment |
392 | if (attachments.Count != 0) | 388 | if (attachments.Count != 0 && !append) |
393 | { | 389 | { |
394 | if (attachments[0].FromItemID != UUID.Zero) | 390 | if (attachments[0].FromItemID != UUID.Zero) |
395 | DetachSingleAttachmentToInvInternal(sp, attachments[0]); | 391 | DetachSingleAttachmentToInvInternal(sp, attachments[0]); |
396 | // Error logging commented because UUID.Zero now means temp attachment | ||
397 | // else | ||
398 | // m_log.WarnFormat( | ||
399 | // "[ATTACHMENTS MODULE]: When detaching existing attachment {0} {1} at point {2} to make way for {3} {4} for {5}, couldn't find the associated item ID to adjust inventory attachment record!", | ||
400 | // attachments[0].Name, attachments[0].LocalId, attachmentPt, group.Name, group.LocalId, sp.Name); | ||
401 | } | 392 | } |
402 | 393 | ||
403 | // Add the new attachment to inventory if we don't already have it. | 394 | // Add the new attachment to inventory if we don't already have it. |
@@ -407,7 +398,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
407 | if (newAttachmentItemID == UUID.Zero) | 398 | if (newAttachmentItemID == UUID.Zero) |
408 | newAttachmentItemID = AddSceneObjectAsNewAttachmentInInv(sp, group).ID; | 399 | newAttachmentItemID = AddSceneObjectAsNewAttachmentInInv(sp, group).ID; |
409 | 400 | ||
410 | ShowAttachInUserInventory(sp, attachmentPt, newAttachmentItemID, group); | 401 | ShowAttachInUserInventory(sp, attachmentPt, newAttachmentItemID, group, append); |
411 | } | 402 | } |
412 | } | 403 | } |
413 | 404 | ||
@@ -425,8 +416,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
425 | // "[ATTACHMENTS MODULE]: RezSingleAttachmentFromInventory to point {0} from item {1} for {2}", | 416 | // "[ATTACHMENTS MODULE]: RezSingleAttachmentFromInventory to point {0} from item {1} for {2}", |
426 | // (AttachmentPoint)AttachmentPt, itemID, sp.Name); | 417 | // (AttachmentPoint)AttachmentPt, itemID, sp.Name); |
427 | 418 | ||
428 | // TODO: this short circuits multiple attachments functionality in LL viewer 2.1+ and should | 419 | bool append = (AttachmentPt & 0x80) != 0; |
429 | // be removed when that functionality is implemented in opensim | ||
430 | AttachmentPt &= 0x7f; | 420 | AttachmentPt &= 0x7f; |
431 | 421 | ||
432 | // Viewer 2/3 sometimes asks to re-wear items that are already worn (and show up in it's inventory as such). | 422 | // Viewer 2/3 sometimes asks to re-wear items that are already worn (and show up in it's inventory as such). |
@@ -455,7 +445,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
455 | return null; | 445 | return null; |
456 | } | 446 | } |
457 | 447 | ||
458 | return RezSingleAttachmentFromInventoryInternal(sp, itemID, UUID.Zero, AttachmentPt, doc); | 448 | return RezSingleAttachmentFromInventoryInternal(sp, itemID, UUID.Zero, AttachmentPt, doc, append); |
459 | } | 449 | } |
460 | 450 | ||
461 | public void RezMultipleAttachmentsFromInventory(IScenePresence sp, List<KeyValuePair<UUID, uint>> rezlist) | 451 | public void RezMultipleAttachmentsFromInventory(IScenePresence sp, List<KeyValuePair<UUID, uint>> rezlist) |
@@ -847,7 +837,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
847 | } | 837 | } |
848 | 838 | ||
849 | protected SceneObjectGroup RezSingleAttachmentFromInventoryInternal( | 839 | protected SceneObjectGroup RezSingleAttachmentFromInventoryInternal( |
850 | IScenePresence sp, UUID itemID, UUID assetID, uint attachmentPt, XmlDocument doc) | 840 | IScenePresence sp, UUID itemID, UUID assetID, uint attachmentPt, XmlDocument doc, bool append) |
851 | { | 841 | { |
852 | if (m_invAccessModule == null) | 842 | if (m_invAccessModule == null) |
853 | return null; | 843 | return null; |
@@ -885,7 +875,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
885 | // This will throw if the attachment fails | 875 | // This will throw if the attachment fails |
886 | try | 876 | try |
887 | { | 877 | { |
888 | AttachObjectInternal(sp, objatt, attachmentPt, false, false, false); | 878 | AttachObjectInternal(sp, objatt, attachmentPt, false, false, false, append); |
889 | } | 879 | } |
890 | catch (Exception e) | 880 | catch (Exception e) |
891 | { | 881 | { |
@@ -936,7 +926,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
936 | /// <param name="AttachmentPt"></param> | 926 | /// <param name="AttachmentPt"></param> |
937 | /// <param name="itemID"></param> | 927 | /// <param name="itemID"></param> |
938 | /// <param name="att"></param> | 928 | /// <param name="att"></param> |
939 | private void ShowAttachInUserInventory(IScenePresence sp, uint AttachmentPt, UUID itemID, SceneObjectGroup att) | 929 | private void ShowAttachInUserInventory(IScenePresence sp, uint AttachmentPt, UUID itemID, SceneObjectGroup att, bool append) |
940 | { | 930 | { |
941 | // m_log.DebugFormat( | 931 | // m_log.DebugFormat( |
942 | // "[USER INVENTORY]: Updating attachment {0} for {1} at {2} using item ID {3}", | 932 | // "[USER INVENTORY]: Updating attachment {0} for {1} at {2} using item ID {3}", |
@@ -959,7 +949,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
959 | if (item == null) | 949 | if (item == null) |
960 | return; | 950 | return; |
961 | 951 | ||
962 | bool changed = sp.Appearance.SetAttachment((int)AttachmentPt, itemID, item.AssetID); | 952 | int attFlag = append ? 0x80 : 0; |
953 | bool changed = sp.Appearance.SetAttachment((int)AttachmentPt | attFlag, itemID, item.AssetID); | ||
963 | if (changed && m_scene.AvatarFactory != null) | 954 | if (changed && m_scene.AvatarFactory != null) |
964 | { | 955 | { |
965 | // m_log.DebugFormat( | 956 | // m_log.DebugFormat( |
@@ -1043,12 +1034,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments | |||
1043 | return; | 1034 | return; |
1044 | } | 1035 | } |
1045 | 1036 | ||
1046 | // TODO: this short circuits multiple attachments functionality in LL viewer 2.1+ and should | 1037 | bool append = (AttachmentPt & 0x80) != 0; |
1047 | // be removed when that functionality is implemented in opensim | ||
1048 | AttachmentPt &= 0x7f; | 1038 | AttachmentPt &= 0x7f; |
1049 | 1039 | ||
1050 | // Calls attach with a Zero position | 1040 | // Calls attach with a Zero position |
1051 | if (AttachObject(sp, part.ParentGroup, AttachmentPt, false, true, false)) | 1041 | if (AttachObject(sp, part.ParentGroup, AttachmentPt, false, true, false, append)) |
1052 | { | 1042 | { |
1053 | // m_log.Debug( | 1043 | // m_log.Debug( |
1054 | // "[ATTACHMENTS MODULE]: Saving avatar attachment. AgentID: " + remoteClient.AgentId | 1044 | // "[ATTACHMENTS MODULE]: Saving avatar attachment. AgentID: " + remoteClient.AgentId |