aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/CoreModules/Avatar/Attachments
diff options
context:
space:
mode:
authoronefang2019-05-19 21:24:15 +1000
committeronefang2019-05-19 21:24:15 +1000
commit5e4d6cab00cb29cd088ab7b62ab13aff103b64cb (patch)
treea9fbc62df9eb2d1d9ba2698d8552eae71eca20d8 /OpenSim/Region/CoreModules/Avatar/Attachments
parentAdd a build script. (diff)
downloadopensim-SC_OLD-5e4d6cab00cb29cd088ab7b62ab13aff103b64cb.zip
opensim-SC_OLD-5e4d6cab00cb29cd088ab7b62ab13aff103b64cb.tar.gz
opensim-SC_OLD-5e4d6cab00cb29cd088ab7b62ab13aff103b64cb.tar.bz2
opensim-SC_OLD-5e4d6cab00cb29cd088ab7b62ab13aff103b64cb.tar.xz
Dump OpenSim 0.9.0.1 into it's own branch.
Diffstat (limited to 'OpenSim/Region/CoreModules/Avatar/Attachments')
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs367
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs92
2 files changed, 309 insertions, 150 deletions
diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
index 2f67c4e..9f52a14 100644
--- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
@@ -41,6 +41,8 @@ using OpenSim.Region.Framework;
41using OpenSim.Region.Framework.Interfaces; 41using OpenSim.Region.Framework.Interfaces;
42using OpenSim.Region.Framework.Scenes; 42using OpenSim.Region.Framework.Scenes;
43using OpenSim.Region.Framework.Scenes.Serialization; 43using OpenSim.Region.Framework.Scenes.Serialization;
44using OpenSim.Services.Interfaces;
45using PermissionMask = OpenSim.Framework.PermissionMask;
44 46
45namespace OpenSim.Region.CoreModules.Avatar.Attachments 47namespace OpenSim.Region.CoreModules.Avatar.Attachments
46{ 48{
@@ -60,7 +62,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
60 /// A value of 0 will apply no pause. The pause is specified in milliseconds. 62 /// A value of 0 will apply no pause. The pause is specified in milliseconds.
61 /// </remarks> 63 /// </remarks>
62 public int ThrottlePer100PrimsRezzed { get; set; } 64 public int ThrottlePer100PrimsRezzed { get; set; }
63 65
64 private Scene m_scene; 66 private Scene m_scene;
65 private IInventoryAccessModule m_invAccessModule; 67 private IInventoryAccessModule m_invAccessModule;
66 68
@@ -68,7 +70,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
68 /// Are attachments enabled? 70 /// Are attachments enabled?
69 /// </summary> 71 /// </summary>
70 public bool Enabled { get; private set; } 72 public bool Enabled { get; private set; }
71 73
72 public string Name { get { return "Attachments Module"; } } 74 public string Name { get { return "Attachments Module"; } }
73 public Type ReplaceableInterface { get { return null; } } 75 public Type ReplaceableInterface { get { return null; } }
74 76
@@ -86,14 +88,14 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
86 Enabled = true; 88 Enabled = true;
87 } 89 }
88 } 90 }
89 91
90 public void AddRegion(Scene scene) 92 public void AddRegion(Scene scene)
91 { 93 {
92 m_scene = scene; 94 m_scene = scene;
93 if (Enabled) 95 if (Enabled)
94 { 96 {
95 // Only register module with scene if it is enabled. All callers check for a null attachments module. 97 // Only register module with scene if it is enabled. All callers check for a null attachments module.
96 // Ideally, there should be a null attachments module for when this core attachments module has been 98 // Ideally, there should be a null attachments module for when this core attachments module has been
97 // disabled. Registering only when enabled allows for other attachments module implementations. 99 // disabled. Registering only when enabled allows for other attachments module implementations.
98 m_scene.RegisterModuleInterface<IAttachmentsModule>(this); 100 m_scene.RegisterModuleInterface<IAttachmentsModule>(this);
99 m_scene.EventManager.OnNewClient += SubscribeToClientEvents; 101 m_scene.EventManager.OnNewClient += SubscribeToClientEvents;
@@ -180,7 +182,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
180 private void HandleScriptStateChange(uint localID, bool started) 182 private void HandleScriptStateChange(uint localID, bool started)
181 { 183 {
182 SceneObjectGroup sog = m_scene.GetGroupByPrim(localID); 184 SceneObjectGroup sog = m_scene.GetGroupByPrim(localID);
183 if (sog != null && sog.IsAttachment) 185 if (sog != null && sog.IsAttachment)
184 { 186 {
185 if (!started) 187 if (!started)
186 { 188 {
@@ -197,21 +199,21 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
197 } 199 }
198 } 200 }
199 } 201 }
200 202
201 public void RemoveRegion(Scene scene) 203 public void RemoveRegion(Scene scene)
202 { 204 {
203 m_scene.UnregisterModuleInterface<IAttachmentsModule>(this); 205 m_scene.UnregisterModuleInterface<IAttachmentsModule>(this);
204 206
205 if (Enabled) 207 if (Enabled)
206 m_scene.EventManager.OnNewClient -= SubscribeToClientEvents; 208 m_scene.EventManager.OnNewClient -= SubscribeToClientEvents;
207 } 209 }
208 210
209 public void RegionLoaded(Scene scene) 211 public void RegionLoaded(Scene scene)
210 { 212 {
211 m_invAccessModule = m_scene.RequestModuleInterface<IInventoryAccessModule>(); 213 m_invAccessModule = m_scene.RequestModuleInterface<IInventoryAccessModule>();
212 } 214 }
213 215
214 public void Close() 216 public void Close()
215 { 217 {
216 RemoveRegion(m_scene); 218 RemoveRegion(m_scene);
217 } 219 }
@@ -269,7 +271,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
269 ((SceneObjectGroup)so).RootPart.ClearUpdateSchedule(); 271 ((SceneObjectGroup)so).RootPart.ClearUpdateSchedule();
270 272
271// m_log.DebugFormat( 273// m_log.DebugFormat(
272// "[ATTACHMENTS MODULE]: Copying script state with {0} bytes for object {1} for {2} in {3}", 274// "[ATTACHMENTS MODULE]: Copying script state with {0} bytes for object {1} for {2} in {3}",
273// ad.AttachmentObjectStates[i].Length, so.Name, sp.Name, m_scene.Name); 275// ad.AttachmentObjectStates[i].Length, so.Name, sp.Name, m_scene.Name);
274 276
275 so.SetState(ad.AttachmentObjectStates[i++], m_scene); 277 so.SetState(ad.AttachmentObjectStates[i++], m_scene);
@@ -294,7 +296,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
294 { 296 {
295 if (DebugLevel > 0) 297 if (DebugLevel > 0)
296 m_log.DebugFormat( 298 m_log.DebugFormat(
297 "[ATTACHMENTS MODULE]: Not doing simulator-side attachment rez for {0} in {1} as their viewer has already rezzed attachments", 299 "[ATTACHMENTS MODULE]: Not doing simulator-side attachment rez for {0} in {1} as their viewer has already rezzed attachments",
298 m_scene.Name, sp.Name); 300 m_scene.Name, sp.Name);
299 301
300 return; 302 return;
@@ -303,6 +305,41 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
303 if (DebugLevel > 0) 305 if (DebugLevel > 0)
304 m_log.DebugFormat("[ATTACHMENTS MODULE]: Rezzing any attachments for {0} from simulator-side", sp.Name); 306 m_log.DebugFormat("[ATTACHMENTS MODULE]: Rezzing any attachments for {0} from simulator-side", sp.Name);
305 307
308 XmlDocument doc = new XmlDocument();
309 doc.XmlResolver=null;
310 string stateData = String.Empty;
311
312 IAttachmentsService attServ = m_scene.RequestModuleInterface<IAttachmentsService>();
313 if (attServ != null)
314 {
315 m_log.DebugFormat("[ATTACHMENT]: Loading attachment data from attachment service");
316 stateData = attServ.Get(sp.UUID.ToString());
317 if (stateData != String.Empty)
318 {
319 try
320 {
321 doc.LoadXml(stateData);
322 }
323 catch { }
324 }
325 }
326
327 Dictionary<UUID, string> itemData = new Dictionary<UUID, string>();
328
329 XmlNodeList nodes = doc.GetElementsByTagName("Attachment");
330 if (nodes.Count > 0)
331 {
332 foreach (XmlNode n in nodes)
333 {
334 XmlElement elem = (XmlElement)n;
335 string itemID = elem.GetAttribute("ItemID");
336 string xml = elem.InnerXml;
337
338 itemData[new UUID(itemID)] = xml;
339 }
340 }
341
342
306 List<AvatarAttachment> attachments = sp.Appearance.GetAttachments(); 343 List<AvatarAttachment> attachments = sp.Appearance.GetAttachments();
307 344
308 // Let's get all items at once, so they get cached 345 // Let's get all items at once, so they get cached
@@ -322,7 +359,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
322 359
323 // For some reason assetIDs are being written as Zero's in the DB -- need to track tat down 360 // For some reason assetIDs are being written as Zero's in the DB -- need to track tat down
324 // But they're not used anyway, the item is being looked up for now, so let's proceed. 361 // But they're not used anyway, the item is being looked up for now, so let's proceed.
325 //if (UUID.Zero == assetID) 362 //if (UUID.Zero == assetID)
326 //{ 363 //{
327 // m_log.DebugFormat("[ATTACHMENT]: Cannot rez attachment in point {0} with itemID {1}", p, itemID); 364 // m_log.DebugFormat("[ATTACHMENT]: Cannot rez attachment in point {0} with itemID {1}", p, itemID);
328 // continue; 365 // continue;
@@ -330,10 +367,21 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
330 367
331 try 368 try
332 { 369 {
370 string xmlData;
371 XmlDocument d = null;
372 UUID asset;
373 if (itemData.TryGetValue(attach.ItemID, out xmlData))
374 {
375 d = new XmlDocument();
376 d.XmlResolver=null;
377 d.LoadXml(xmlData);
378 m_log.InfoFormat("[ATTACHMENT]: Found saved state for item {0}, loading it", attach.ItemID);
379 }
380
333 // If we're an NPC then skip all the item checks and manipulations since we don't have an 381 // If we're an NPC then skip all the item checks and manipulations since we don't have an
334 // inventory right now. 382 // inventory right now.
335 RezSingleAttachmentFromInventoryInternal( 383 RezSingleAttachmentFromInventoryInternal(
336 sp, sp.PresenceType == PresenceType.Npc ? UUID.Zero : attach.ItemID, attach.AssetID, attachmentPt, true); 384 sp, sp.PresenceType == PresenceType.Npc ? UUID.Zero : attach.ItemID, attach.AssetID, attachmentPt, true, d);
337 } 385 }
338 catch (Exception e) 386 catch (Exception e)
339 { 387 {
@@ -361,26 +409,34 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
361 409
362 Dictionary<SceneObjectGroup, string> scriptStates = new Dictionary<SceneObjectGroup, string>(); 410 Dictionary<SceneObjectGroup, string> scriptStates = new Dictionary<SceneObjectGroup, string>();
363 411
364 foreach (SceneObjectGroup so in attachments) 412
413 if (sp.PresenceType != PresenceType.Npc)
365 { 414 {
366 // Scripts MUST be snapshotted before the object is 415 foreach (SceneObjectGroup so in attachments)
367 // removed from the scene because doing otherwise will 416 {
368 // clobber the run flag 417 // Scripts MUST be snapshotted before the object is
369 // This must be done outside the sp.AttachmentSyncLock so that there is no risk of a deadlock from 418 // removed from the scene because doing otherwise will
370 // scripts performing attachment operations at the same time. Getting object states stops the scripts. 419 // clobber the run flag
371 scriptStates[so] = PrepareScriptInstanceForSave(so, false); 420 // This must be done outside the sp.AttachmentSyncLock so that there is no risk of a deadlock from
421 // scripts performing attachment operations at the same time. Getting object states stops the scripts.
422 scriptStates[so] = PrepareScriptInstanceForSave(so, false);
423 }
372 424
373// m_log.DebugFormat( 425 lock (sp.AttachmentsSyncLock)
374// "[ATTACHMENTS MODULE]: For object {0} for {1} in {2} got saved state {3}", 426 {
375// so.Name, sp.Name, m_scene.Name, scriptStates[so]); 427 foreach (SceneObjectGroup so in attachments)
428 UpdateDetachedObject(sp, so, scriptStates[so]);
429 sp.ClearAttachments();
430 }
376 } 431 }
377 432 else
378 lock (sp.AttachmentsSyncLock)
379 { 433 {
380 foreach (SceneObjectGroup so in attachments) 434 lock (sp.AttachmentsSyncLock)
381 UpdateDetachedObject(sp, so, scriptStates[so]); 435 {
382 436 foreach (SceneObjectGroup so in attachments)
383 sp.ClearAttachments(); 437 UpdateDetachedObject(sp, so, String.Empty);
438 sp.ClearAttachments();
439 }
384 } 440 }
385 } 441 }
386 442
@@ -392,7 +448,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
392 if (DebugLevel > 0) 448 if (DebugLevel > 0)
393 m_log.DebugFormat( 449 m_log.DebugFormat(
394 "[ATTACHMENTS MODULE]: Deleting attachments from scene {0} for {1}, silent = {2}", 450 "[ATTACHMENTS MODULE]: Deleting attachments from scene {0} for {1}, silent = {2}",
395 m_scene.RegionInfo.RegionName, sp.Name, silent); 451 m_scene.RegionInfo.RegionName, sp.Name, silent);
396 452
397 foreach (SceneObjectGroup sop in sp.GetAttachments()) 453 foreach (SceneObjectGroup sop in sp.GetAttachments())
398 { 454 {
@@ -401,21 +457,14 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
401 457
402 sp.ClearAttachments(); 458 sp.ClearAttachments();
403 } 459 }
404 460
405 public bool AttachObject( 461 public bool AttachObject(IScenePresence sp, SceneObjectGroup group, uint attachmentPt, bool silent,
406 IScenePresence sp, SceneObjectGroup group, uint attachmentPt, bool silent, bool addToInventory, bool append) 462 bool addToInventory, bool append)
407 { 463 {
408 if (!Enabled) 464 if (!Enabled)
409 return false; 465 return false;
410 466
411 group.DetachFromBackup(); 467 return AttachObjectInternal(sp, group, attachmentPt, silent, addToInventory, false, append);
412
413 bool success = AttachObjectInternal(sp, group, attachmentPt, silent, addToInventory, false, append);
414
415 if (!success)
416 group.AttachToBackup();
417
418 return success;
419 } 468 }
420 469
421 /// <summary> 470 /// <summary>
@@ -428,10 +477,14 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
428 /// <param name='silent'></param> 477 /// <param name='silent'></param>
429 /// <param name='addToInventory'>If true then add object to user inventory.</param> 478 /// <param name='addToInventory'>If true then add object to user inventory.</param>
430 /// <param name='resumeScripts'>If true then scripts are resumed on the attached object.</param> 479 /// <param name='resumeScripts'>If true then scripts are resumed on the attached object.</param>
431 /// <param name='append'>Append to attachment point rather than replace.</param> 480 private bool AttachObjectInternal(IScenePresence sp, SceneObjectGroup group, uint attachmentPt,
432 private bool AttachObjectInternal( 481 bool silent, bool addToInventory, bool resumeScripts, bool append)
433 IScenePresence sp, SceneObjectGroup group, uint attachmentPt, bool silent, bool addToInventory, bool resumeScripts, bool append)
434 { 482 {
483// m_log.DebugFormat(
484// "[ATTACHMENTS MODULE]: Attaching object {0} {1} to {2} point {3} from ground (silent = {4})",
485// group.Name, group.LocalId, sp.Name, attachmentPt, silent);
486
487
435 if (group.GetSittingAvatarsCount() != 0) 488 if (group.GetSittingAvatarsCount() != 0)
436 { 489 {
437 if (DebugLevel > 0) 490 if (DebugLevel > 0)
@@ -442,7 +495,23 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
442 return false; 495 return false;
443 } 496 }
444 497
498 List<SceneObjectGroup> attachments = sp.GetAttachments(attachmentPt);
499 if (attachments.Contains(group))
500 {
501// if (DebugLevel > 0)
502// m_log.WarnFormat(
503// "[ATTACHMENTS MODULE]: Ignoring request to attach {0} {1} to {2} on {3} since it's already attached",
504// group.Name, group.LocalId, sp.Name, attachmentPt);
505
506 return false;
507 }
508
445 Vector3 attachPos = group.AbsolutePosition; 509 Vector3 attachPos = group.AbsolutePosition;
510
511 // TODO: this short circuits multiple attachments functionality in LL viewer 2.1+ and should
512 // be removed when that functionality is implemented in opensim
513 attachmentPt &= 0x7f;
514
446 // If the attachment point isn't the same as the one previously used 515 // If the attachment point isn't the same as the one previously used
447 // set it's offset position = 0 so that it appears on the attachment point 516 // set it's offset position = 0 so that it appears on the attachment point
448 // and not in a weird location somewhere unknown. 517 // and not in a weird location somewhere unknown.
@@ -470,7 +539,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
470 { 539 {
471 attachmentPt = (uint)group.RootPart.Shape.LastAttachPoint; 540 attachmentPt = (uint)group.RootPart.Shape.LastAttachPoint;
472 attachPos = group.RootPart.AttachedPos; 541 attachPos = group.RootPart.AttachedPos;
473 group.HasGroupChanged = true;
474 } 542 }
475 543
476 // if we still didn't find a suitable attachment point....... 544 // if we still didn't find a suitable attachment point.......
@@ -481,21 +549,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
481 attachPos = Vector3.Zero; 549 attachPos = Vector3.Zero;
482 } 550 }
483 551
484 group.AttachmentPoint = attachmentPt;
485 group.AbsolutePosition = attachPos;
486
487 List<SceneObjectGroup> attachments = sp.GetAttachments(attachmentPt);
488
489 if (attachments.Contains(group))
490 {
491 if (DebugLevel > 0)
492 m_log.WarnFormat(
493 "[ATTACHMENTS MODULE]: Ignoring request to attach {0} {1} to {2} on {3} since it's already attached",
494 group.Name, group.LocalId, sp.Name, attachmentPt);
495
496 return false;
497 }
498
499 // If we already have 5, remove the oldest until only 4 are left. Skip over temp ones 552 // If we already have 5, remove the oldest until only 4 are left. Skip over temp ones
500 while (attachments.Count >= 5) 553 while (attachments.Count >= 5)
501 { 554 {
@@ -514,11 +567,16 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
514 } 567 }
515 } 568 }
516 569
570 group.DetachFromBackup();
571
517 lock (sp.AttachmentsSyncLock) 572 lock (sp.AttachmentsSyncLock)
518 { 573 {
574 group.AttachmentPoint = attachmentPt;
575 group.RootPart.AttachedPos = attachPos;
576
519 if (addToInventory && sp.PresenceType != PresenceType.Npc) 577 if (addToInventory && sp.PresenceType != PresenceType.Npc)
520 UpdateUserInventoryWithAttachment(sp, group, attachmentPt, append); 578 UpdateUserInventoryWithAttachment(sp, group, attachmentPt, append);
521 579
522 AttachToAgent(sp, group, attachmentPt, attachPos, silent); 580 AttachToAgent(sp, group, attachmentPt, attachPos, silent);
523 581
524 if (resumeScripts) 582 if (resumeScripts)
@@ -529,8 +587,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
529 group.ResumeScripts(); 587 group.ResumeScripts();
530 } 588 }
531 589
590 else
532 // Do this last so that event listeners have access to all the effects of the attachment 591 // Do this last so that event listeners have access to all the effects of the attachment
533 m_scene.EventManager.TriggerOnAttach(group.LocalId, group.FromItemID, sp.UUID); 592 // this can't be done when creating scripts:
593 // scripts do internal enqueue of attach event
594 // and not all scripts are loaded at this point
595 m_scene.EventManager.TriggerOnAttach(group.LocalId, group.FromItemID, sp.UUID);
534 } 596 }
535 597
536 return true; 598 return true;
@@ -546,7 +608,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
546 ShowAttachInUserInventory(sp, attachmentPt, newAttachmentItemID, group, append); 608 ShowAttachInUserInventory(sp, attachmentPt, newAttachmentItemID, group, append);
547 } 609 }
548 610
549 public SceneObjectGroup RezSingleAttachmentFromInventory(IScenePresence sp, UUID itemID, uint AttachmentPt) 611 public ISceneEntity RezSingleAttachmentFromInventory(IScenePresence sp, UUID itemID, uint AttachmentPt)
612 {
613 return RezSingleAttachmentFromInventory(sp, itemID, AttachmentPt, null);
614 }
615
616 public ISceneEntity RezSingleAttachmentFromInventory(IScenePresence sp, UUID itemID, uint AttachmentPt, XmlDocument doc)
550 { 617 {
551 if (!Enabled) 618 if (!Enabled)
552 return null; 619 return null;
@@ -557,8 +624,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
557 (AttachmentPoint)AttachmentPt, itemID, sp.Name, m_scene.Name); 624 (AttachmentPoint)AttachmentPt, itemID, sp.Name, m_scene.Name);
558 625
559 // We check the attachments in the avatar appearance here rather than the objects attached to the 626 // We check the attachments in the avatar appearance here rather than the objects attached to the
560 // ScenePresence itself so that we can ignore calls by viewer 2/3 to attach objects on startup. We are 627 // ScenePresence itself so that we can ignore calls by viewer 2/3 to attach objects on startup. We are
561 // already doing this in ScenePresence.MakeRootAgent(). Simulator-side attaching needs to be done 628 // already doing this in ScenePresence.MakeRootAgent(). Simulator-side attaching needs to be done
562 // because pre-outfit folder viewers (most version 1 viewers) require it. 629 // because pre-outfit folder viewers (most version 1 viewers) require it.
563 bool alreadyOn = false; 630 bool alreadyOn = false;
564 List<AvatarAttachment> existingAttachments = sp.Appearance.GetAttachments(); 631 List<AvatarAttachment> existingAttachments = sp.Appearance.GetAttachments();
@@ -584,7 +651,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
584 bool append = (AttachmentPt & 0x80) != 0; 651 bool append = (AttachmentPt & 0x80) != 0;
585 AttachmentPt &= 0x7f; 652 AttachmentPt &= 0x7f;
586 653
587 return RezSingleAttachmentFromInventoryInternal(sp, itemID, UUID.Zero, AttachmentPt, append); 654 return RezSingleAttachmentFromInventoryInternal(sp, itemID, UUID.Zero, AttachmentPt, append, doc);
588 } 655 }
589 656
590 public void RezMultipleAttachmentsFromInventory(IScenePresence sp, List<KeyValuePair<UUID, uint>> rezlist) 657 public void RezMultipleAttachmentsFromInventory(IScenePresence sp, List<KeyValuePair<UUID, uint>> rezlist)
@@ -594,7 +661,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
594 661
595 if (DebugLevel > 0) 662 if (DebugLevel > 0)
596 m_log.DebugFormat( 663 m_log.DebugFormat(
597 "[ATTACHMENTS MODULE]: Rezzing {0} attachments from inventory for {1} in {2}", 664 "[ATTACHMENTS MODULE]: Rezzing {0} attachments from inventory for {1} in {2}",
598 rezlist.Count, sp.Name, m_scene.Name); 665 rezlist.Count, sp.Name, m_scene.Name);
599 666
600 foreach (KeyValuePair<UUID, uint> rez in rezlist) 667 foreach (KeyValuePair<UUID, uint> rez in rezlist)
@@ -605,7 +672,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
605 672
606 public void DetachSingleAttachmentToGround(IScenePresence sp, uint soLocalId) 673 public void DetachSingleAttachmentToGround(IScenePresence sp, uint soLocalId)
607 { 674 {
608 DetachSingleAttachmentToGround(sp, soLocalId, sp.AbsolutePosition, Quaternion.Identity); 675 Vector3 pos = new Vector3(2.5f, 0f, 0f);
676 pos *= ((ScenePresence)sp).Rotation;
677 pos += sp.AbsolutePosition;
678 DetachSingleAttachmentToGround(sp, soLocalId, pos, Quaternion.Identity);
609 } 679 }
610 680
611 public void DetachSingleAttachmentToGround(IScenePresence sp, uint soLocalId, Vector3 absolutePos, Quaternion absoluteRot) 681 public void DetachSingleAttachmentToGround(IScenePresence sp, uint soLocalId, Vector3 absolutePos, Quaternion absoluteRot)
@@ -649,26 +719,31 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
649 if (changed && m_scene.AvatarFactory != null) 719 if (changed && m_scene.AvatarFactory != null)
650 m_scene.AvatarFactory.QueueAppearanceSave(sp.UUID); 720 m_scene.AvatarFactory.QueueAppearanceSave(sp.UUID);
651 721
722 so.RootPart.Shape.LastAttachPoint = (byte)so.AttachmentPoint;
723
652 sp.RemoveAttachment(so); 724 sp.RemoveAttachment(so);
653 so.FromItemID = UUID.Zero; 725 so.FromItemID = UUID.Zero;
654 726
727 so.AttachedAvatar = UUID.Zero;
728 so.ClearPartAttachmentData();
729
655 SceneObjectPart rootPart = so.RootPart; 730 SceneObjectPart rootPart = so.RootPart;
731
732 rootPart.SetParentLocalId(0);
656 so.AbsolutePosition = absolutePos; 733 so.AbsolutePosition = absolutePos;
657 if (absoluteRot != Quaternion.Identity) 734 if (absoluteRot != Quaternion.Identity)
658 { 735 {
659 so.UpdateGroupRotationR(absoluteRot); 736 so.UpdateGroupRotationR(absoluteRot);
660 } 737 }
661 so.AttachedAvatar = UUID.Zero; 738
662 rootPart.SetParentLocalId(0);
663 so.ClearPartAttachmentData();
664 rootPart.ApplyPhysics(rootPart.GetEffectiveObjectFlags(), rootPart.VolumeDetectActive);
665 so.HasGroupChanged = true;
666 so.RootPart.Shape.LastAttachPoint = (byte)so.AttachmentPoint;
667 rootPart.Rezzed = DateTime.Now;
668 rootPart.RemFlag(PrimFlags.TemporaryOnRez); 739 rootPart.RemFlag(PrimFlags.TemporaryOnRez);
740
741 so.ApplyPhysics();
742
743 rootPart.Rezzed = DateTime.Now;
669 so.AttachToBackup(); 744 so.AttachToBackup();
670 m_scene.EventManager.TriggerParcelPrimCountTainted(); 745 m_scene.EventManager.TriggerParcelPrimCountTainted();
671 rootPart.ScheduleFullUpdate(); 746
672 rootPart.ClearUndoState(); 747 rootPart.ClearUndoState();
673 748
674 List<UUID> uuids = new List<UUID>(); 749 List<UUID> uuids = new List<UUID>();
@@ -678,6 +753,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
678 } 753 }
679 754
680 m_scene.EventManager.TriggerOnAttach(so.LocalId, so.UUID, UUID.Zero); 755 m_scene.EventManager.TriggerOnAttach(so.LocalId, so.UUID, UUID.Zero);
756
757 // Attach (NULL) stops scripts. We don't want that. Resume them.
758 so.ResumeScripts();
759 so.HasGroupChanged = true;
760 so.RootPart.ScheduleFullUpdate();
761 so.ScheduleGroupForTerseUpdate();
681 } 762 }
682 763
683 public void DetachSingleAttachmentToInv(IScenePresence sp, SceneObjectGroup so) 764 public void DetachSingleAttachmentToInv(IScenePresence sp, SceneObjectGroup so)
@@ -691,9 +772,32 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
691 return; 772 return;
692 } 773 }
693 774
775 // If this didn't come from inventory, it also shouldn't go there
776 // on detach. It's likely a temp attachment.
777 if (so.FromItemID == UUID.Zero)
778 {
779 // Retirn value is ignored
780 PrepareScriptInstanceForSave(so, true);
781
782 lock (sp.AttachmentsSyncLock)
783 {
784 bool changed = sp.Appearance.DetachAttachment(so.FromItemID);
785 if (changed && m_scene.AvatarFactory != null)
786 m_scene.AvatarFactory.QueueAppearanceSave(sp.UUID);
787
788 sp.RemoveAttachment(so);
789 }
790
791 m_scene.DeleteSceneObject(so, false, false);
792 so.RemoveScriptInstances(true);
793 so.Clear();
794
795 return;
796 }
797
694 if (DebugLevel > 0) 798 if (DebugLevel > 0)
695 m_log.DebugFormat( 799 m_log.DebugFormat(
696 "[ATTACHMENTS MODULE]: Detaching object {0} {1} (FromItemID {2}) for {3} in {4}", 800 "[ATTACHMENTS MODULE]: Detaching object {0} {1} (FromItemID {2}) for {3} in {4}",
697 so.Name, so.LocalId, so.FromItemID, sp.Name, m_scene.Name); 801 so.Name, so.LocalId, so.FromItemID, sp.Name, m_scene.Name);
698 802
699 // Scripts MUST be snapshotted before the object is 803 // Scripts MUST be snapshotted before the object is
@@ -716,14 +820,14 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
716 UpdateDetachedObject(sp, so, scriptedState); 820 UpdateDetachedObject(sp, so, scriptedState);
717 } 821 }
718 } 822 }
719 823
720 public void UpdateAttachmentPosition(SceneObjectGroup sog, Vector3 pos) 824 public void UpdateAttachmentPosition(SceneObjectGroup sog, Vector3 pos)
721 { 825 {
722 if (!Enabled) 826 if (!Enabled)
723 return; 827 return;
724 828
725 sog.UpdateGroupPosition(pos); 829 sog.UpdateGroupPosition(pos);
726 sog.HasGroupChanged = true; 830 sog.HasGroupChanged = true;
727 } 831 }
728 832
729 #endregion 833 #endregion
@@ -732,7 +836,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
732 836
733 // This is public but is not part of the IAttachmentsModule interface. 837 // This is public but is not part of the IAttachmentsModule interface.
734 // RegionCombiner module needs to poke at it to deliver client events. 838 // RegionCombiner module needs to poke at it to deliver client events.
735 // This breaks the encapsulation of the module and should get fixed somehow. 839 // This breaks the encapsulation of the module and should get fixed somehow.
736 public void SubscribeToClientEvents(IClientAPI client) 840 public void SubscribeToClientEvents(IClientAPI client)
737 { 841 {
738 client.OnRezSingleAttachmentFromInv += Client_OnRezSingleAttachmentFromInv; 842 client.OnRezSingleAttachmentFromInv += Client_OnRezSingleAttachmentFromInv;
@@ -745,7 +849,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
745 849
746 // This is public but is not part of the IAttachmentsModule interface. 850 // This is public but is not part of the IAttachmentsModule interface.
747 // RegionCombiner module needs to poke at it to deliver client events. 851 // RegionCombiner module needs to poke at it to deliver client events.
748 // This breaks the encapsulation of the module and should get fixed somehow. 852 // This breaks the encapsulation of the module and should get fixed somehow.
749 public void UnsubscribeFromClientEvents(IClientAPI client) 853 public void UnsubscribeFromClientEvents(IClientAPI client)
750 { 854 {
751 client.OnRezSingleAttachmentFromInv -= Client_OnRezSingleAttachmentFromInv; 855 client.OnRezSingleAttachmentFromInv -= Client_OnRezSingleAttachmentFromInv;
@@ -791,11 +895,34 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
791 895
792 string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(grp, scriptedState); 896 string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(grp, scriptedState);
793 897
794 InventoryItemBase item = new InventoryItemBase(grp.FromItemID, sp.UUID); 898 InventoryItemBase item = m_scene.InventoryService.GetItem(sp.UUID, grp.FromItemID);
795 item = m_scene.InventoryService.GetItem(item);
796 899
797 if (item != null) 900 if (item != null)
798 { 901 {
902 // attach is rez, need to update permissions
903 item.Flags &= ~(uint)(InventoryItemFlags.ObjectSlamPerm | InventoryItemFlags.ObjectOverwriteBase |
904 InventoryItemFlags.ObjectOverwriteOwner | InventoryItemFlags.ObjectOverwriteGroup |
905 InventoryItemFlags.ObjectOverwriteEveryone | InventoryItemFlags.ObjectOverwriteNextOwner);
906
907 uint permsBase = (uint)(PermissionMask.Copy | PermissionMask.Transfer |
908 PermissionMask.Modify | PermissionMask.Move |
909 PermissionMask.Export | PermissionMask.FoldedMask);
910
911 permsBase &= grp.CurrentAndFoldedNextPermissions();
912 permsBase |= (uint)PermissionMask.Move;
913 item.BasePermissions = permsBase;
914 item.CurrentPermissions = permsBase;
915 item.NextPermissions = permsBase & grp.RootPart.NextOwnerMask | (uint)PermissionMask.Move;
916 item.EveryOnePermissions = permsBase & grp.RootPart.EveryoneMask;
917 item.GroupPermissions = permsBase & grp.RootPart.GroupMask;
918 item.CurrentPermissions &=
919 ((uint)PermissionMask.Copy |
920 (uint)PermissionMask.Transfer |
921 (uint)PermissionMask.Modify |
922 (uint)PermissionMask.Move |
923 (uint)PermissionMask.Export |
924 (uint)PermissionMask.FoldedMask); // Preserve folded permissions ??
925
799 AssetBase asset = m_scene.CreateAsset( 926 AssetBase asset = m_scene.CreateAsset(
800 grp.GetPartName(grp.LocalId), 927 grp.GetPartName(grp.LocalId),
801 grp.GetPartDescription(grp.LocalId), 928 grp.GetPartDescription(grp.LocalId),
@@ -826,7 +953,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
826 /// Attach this scene object to the given avatar. 953 /// Attach this scene object to the given avatar.
827 /// </summary> 954 /// </summary>
828 /// <remarks> 955 /// <remarks>
829 /// This isn't publicly available since attachments should always perform the corresponding inventory 956 /// This isn't publicly available since attachments should always perform the corresponding inventory
830 /// operation (to show the attach in user inventory and update the asset with positional information). 957 /// operation (to show the attach in user inventory and update the asset with positional information).
831 /// </remarks> 958 /// </remarks>
832 /// <param name="sp"></param> 959 /// <param name="sp"></param>
@@ -846,16 +973,24 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
846 m_scene.DeleteFromStorage(so.UUID); 973 m_scene.DeleteFromStorage(so.UUID);
847 m_scene.EventManager.TriggerParcelPrimCountTainted(); 974 m_scene.EventManager.TriggerParcelPrimCountTainted();
848 975
849 so.AttachedAvatar = sp.UUID;
850 976
851 if (so.RootPart.PhysActor != null) 977 foreach (SceneObjectPart part in so.Parts)
852 so.RootPart.RemoveFromPhysics(); 978 {
979// if (part.KeyframeMotion != null)
980// part.KeyframeMotion.Suspend();
981
982 if (part.PhysActor != null)
983 {
984 part.RemoveFromPhysics();
985 }
986 }
853 987
854 so.AbsolutePosition = attachOffset;
855 so.RootPart.AttachedPos = attachOffset;
856 so.IsAttachment = true;
857 so.RootPart.SetParentLocalId(sp.LocalId); 988 so.RootPart.SetParentLocalId(sp.LocalId);
989 so.AttachedAvatar = sp.UUID;
858 so.AttachmentPoint = attachmentpoint; 990 so.AttachmentPoint = attachmentpoint;
991 so.RootPart.AttachedPos = attachOffset;
992 so.AbsolutePosition = attachOffset;
993 so.IsAttachment = true;
859 994
860 sp.AddAttachment(so); 995 sp.AddAttachment(so);
861 996
@@ -879,7 +1014,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
879 1014
880 // Fudge below is an extremely unhelpful comment. It's probably here so that the scheduled full update 1015 // Fudge below is an extremely unhelpful comment. It's probably here so that the scheduled full update
881 // will succeed, as that will not update if an attachment is selected. 1016 // will succeed, as that will not update if an attachment is selected.
882 so.IsSelected = false; // fudge.... 1017 so.IsSelected = false; // fudge....
883 1018
884 so.ScheduleGroupForFullUpdate(); 1019 so.ScheduleGroupForFullUpdate();
885 } 1020 }
@@ -923,7 +1058,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
923 /// </summary> 1058 /// </summary>
924 /// <remarks> 1059 /// <remarks>
925 /// This involves triggering the detach event and getting the script state (which also stops the script) 1060 /// This involves triggering the detach event and getting the script state (which also stops the script)
926 /// This MUST be done outside sp.AttachmentsSyncLock, since otherwise there is a chance of deadlock if a 1061 /// This MUST be done outside sp.AttachmentsSyncLock, since otherwise there is a chance of deadlock if a
927 /// running script is performing attachment operations. 1062 /// running script is performing attachment operations.
928 /// </remarks> 1063 /// </remarks>
929 /// <returns> 1064 /// <returns>
@@ -939,7 +1074,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
939 if (fireDetachEvent) 1074 if (fireDetachEvent)
940 { 1075 {
941 m_scene.EventManager.TriggerOnAttach(grp.LocalId, grp.FromItemID, UUID.Zero); 1076 m_scene.EventManager.TriggerOnAttach(grp.LocalId, grp.FromItemID, UUID.Zero);
942
943 // Allow detach event time to do some work before stopping the script 1077 // Allow detach event time to do some work before stopping the script
944 Thread.Sleep(2); 1078 Thread.Sleep(2);
945 } 1079 }
@@ -971,6 +1105,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
971 // Remove the object from the scene so no more updates 1105 // Remove the object from the scene so no more updates
972 // are sent. Doing this before the below changes will ensure 1106 // are sent. Doing this before the below changes will ensure
973 // updates can't cause "HUD artefacts" 1107 // updates can't cause "HUD artefacts"
1108
974 m_scene.DeleteSceneObject(so, false, false); 1109 m_scene.DeleteSceneObject(so, false, false);
975 1110
976 // Prepare sog for storage 1111 // Prepare sog for storage
@@ -989,23 +1124,37 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
989 1124
990 // Now, remove the scripts 1125 // Now, remove the scripts
991 so.RemoveScriptInstances(true); 1126 so.RemoveScriptInstances(true);
1127 so.Clear();
992 } 1128 }
993 1129
994 protected SceneObjectGroup RezSingleAttachmentFromInventoryInternal( 1130 protected SceneObjectGroup RezSingleAttachmentFromInventoryInternal(
995 IScenePresence sp, UUID itemID, UUID assetID, uint attachmentPt, bool append) 1131 IScenePresence sp, UUID itemID, UUID assetID, uint attachmentPt, bool append, XmlDocument doc)
996 { 1132 {
997 if (m_invAccessModule == null) 1133 if (m_invAccessModule == null)
998 return null; 1134 return null;
999 1135
1000 SceneObjectGroup objatt; 1136 SceneObjectGroup objatt;
1001 1137
1138 UUID rezGroupID;
1139
1140 // This will fail if the user aborts login. sp will exist
1141 // but ControllintClient will be null.
1142 try
1143 {
1144 rezGroupID = sp.ControllingClient.ActiveGroupId;
1145 }
1146 catch
1147 {
1148 return null;
1149 }
1150
1002 if (itemID != UUID.Zero) 1151 if (itemID != UUID.Zero)
1003 objatt = m_invAccessModule.RezObject(sp.ControllingClient, 1152 objatt = m_invAccessModule.RezObject(sp.ControllingClient,
1004 itemID, Vector3.Zero, Vector3.Zero, UUID.Zero, (byte)1, true, 1153 itemID, rezGroupID, Vector3.Zero, Vector3.Zero, UUID.Zero, (byte)1, true,
1005 false, false, sp.UUID, true); 1154 false, false, sp.UUID, true);
1006 else 1155 else
1007 objatt = m_invAccessModule.RezObject(sp.ControllingClient, 1156 objatt = m_invAccessModule.RezObject(sp.ControllingClient,
1008 null, assetID, Vector3.Zero, Vector3.Zero, UUID.Zero, (byte)1, true, 1157 null, rezGroupID, assetID, Vector3.Zero, Vector3.Zero, UUID.Zero, (byte)1, true,
1009 false, false, sp.UUID, true); 1158 false, false, sp.UUID, true);
1010 1159
1011 if (objatt == null) 1160 if (objatt == null)
@@ -1018,7 +1167,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
1018 } 1167 }
1019 else if (itemID == UUID.Zero) 1168 else if (itemID == UUID.Zero)
1020 { 1169 {
1021 // We need to have a FromItemID for multiple attachments on a single attach point to appear. This is 1170 // We need to have a FromItemID for multiple attachments on a single attach point to appear. This is
1022 // true on Singularity 1.8.5 and quite possibly other viewers as well. As NPCs don't have an inventory 1171 // true on Singularity 1.8.5 and quite possibly other viewers as well. As NPCs don't have an inventory
1023 // we will satisfy this requirement by inserting a random UUID. 1172 // we will satisfy this requirement by inserting a random UUID.
1024 objatt.FromItemID = UUID.Random(); 1173 objatt.FromItemID = UUID.Random();
@@ -1043,6 +1192,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
1043 // This will throw if the attachment fails 1192 // This will throw if the attachment fails
1044 try 1193 try
1045 { 1194 {
1195 if (doc != null)
1196 {
1197 objatt.LoadScriptState(doc);
1198 objatt.ResetOwnerChangeFlag();
1199 }
1200
1046 AttachObjectInternal(sp, objatt, attachmentPt, false, true, true, append); 1201 AttachObjectInternal(sp, objatt, attachmentPt, false, true, true, append);
1047 } 1202 }
1048 catch (Exception e) 1203 catch (Exception e)
@@ -1058,7 +1213,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
1058 } 1213 }
1059 1214
1060 if (tainted) 1215 if (tainted)
1061 objatt.HasGroupChanged = true; 1216 objatt.HasGroupChanged = true;
1062 1217
1063 if (ThrottlePer100PrimsRezzed > 0) 1218 if (ThrottlePer100PrimsRezzed > 0)
1064 { 1219 {
@@ -1100,8 +1255,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
1100 return; 1255 return;
1101 } 1256 }
1102 1257
1103 InventoryItemBase item = new InventoryItemBase(itemID, sp.UUID); 1258 InventoryItemBase item = m_scene.InventoryService.GetItem(sp.UUID, itemID);
1104 item = m_scene.InventoryService.GetItem(item);
1105 if (item == null) 1259 if (item == null)
1106 return; 1260 return;
1107 1261
@@ -1185,7 +1339,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
1185 if (part == null) 1339 if (part == null)
1186 return; 1340 return;
1187 1341
1188 if (!m_scene.Permissions.CanTakeObject(part.UUID, remoteClient.AgentId)) 1342 SceneObjectGroup group = part.ParentGroup;
1343
1344 if (!m_scene.Permissions.CanTakeObject(group, sp))
1189 { 1345 {
1190 remoteClient.SendAgentAlertMessage( 1346 remoteClient.SendAgentAlertMessage(
1191 "You don't have sufficient permissions to attach this object", false); 1347 "You don't have sufficient permissions to attach this object", false);
@@ -1197,7 +1353,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
1197 AttachmentPt &= 0x7f; 1353 AttachmentPt &= 0x7f;
1198 1354
1199 // Calls attach with a Zero position 1355 // Calls attach with a Zero position
1200 if (AttachObject(sp, part.ParentGroup, AttachmentPt, false, true, append)) 1356 if (AttachObject(sp, group , AttachmentPt, false, true, append))
1201 { 1357 {
1202 if (DebugLevel > 0) 1358 if (DebugLevel > 0)
1203 m_log.Debug( 1359 m_log.Debug(
@@ -1205,7 +1361,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
1205 + ", AttachmentPoint: " + AttachmentPt); 1361 + ", AttachmentPoint: " + AttachmentPt);
1206 1362
1207 // Save avatar attachment information 1363 // Save avatar attachment information
1208 m_scene.EventManager.TriggerOnAttach(objectLocalID, part.ParentGroup.FromItemID, remoteClient.AgentId); 1364 m_scene.AvatarFactory.QueueAppearanceSave(sp.UUID);
1209 } 1365 }
1210 } 1366 }
1211 catch (Exception e) 1367 catch (Exception e)
@@ -1222,7 +1378,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
1222 ScenePresence sp = m_scene.GetScenePresence(remoteClient.AgentId); 1378 ScenePresence sp = m_scene.GetScenePresence(remoteClient.AgentId);
1223 SceneObjectGroup group = m_scene.GetGroupByPrim(objectLocalID); 1379 SceneObjectGroup group = m_scene.GetGroupByPrim(objectLocalID);
1224 1380
1225 if (sp != null && group != null && group.FromItemID != UUID.Zero) 1381 if (sp != null && group != null)
1226 DetachSingleAttachmentToInv(sp, group); 1382 DetachSingleAttachmentToInv(sp, group);
1227 } 1383 }
1228 1384
@@ -1256,7 +1412,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
1256 if (sp != null) 1412 if (sp != null)
1257 DetachSingleAttachmentToGround(sp, soLocalId); 1413 DetachSingleAttachmentToGround(sp, soLocalId);
1258 } 1414 }
1259
1260 #endregion 1415 #endregion
1261 } 1416 }
1262} 1417}
diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs
index 0ac3add..941853c 100644
--- a/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs
@@ -55,6 +55,7 @@ using OpenSim.Tests.Common;
55 55
56namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests 56namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests
57{ 57{
58/*
58 /// <summary> 59 /// <summary>
59 /// Attachment tests 60 /// Attachment tests
60 /// </summary> 61 /// </summary>
@@ -200,7 +201,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests
200 Assert.That(so.Backup, Is.True); 201 Assert.That(so.Backup, Is.True);
201 202
202 m_numberOfAttachEventsFired = 0; 203 m_numberOfAttachEventsFired = 0;
203 scene.AttachmentsModule.AttachObject(sp, so, (uint)AttachmentPoint.Chest, false, true, false); 204 scene.AttachmentsModule.AttachObject(sp, so, (uint)AttachmentPoint.Chest, false, true, false);
204 205
205 // Check status on scene presence 206 // Check status on scene presence
206 Assert.That(sp.HasAttachments(), Is.True); 207 Assert.That(sp.HasAttachments(), Is.True);
@@ -215,11 +216,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests
215 Assert.That(attSo.Backup, Is.False); 216 Assert.That(attSo.Backup, Is.False);
216 217
217 // Check item status 218 // Check item status
218 Assert.That( 219// Assert.That(
219 sp.Appearance.GetAttachpoint(attSo.FromItemID), 220// sp.Appearance.GetAttachpoint(attSo.FromItemID),
220 Is.EqualTo((int)AttachmentPoint.Chest)); 221// Is.EqualTo((int)AttachmentPoint.Chest));
221 222
222 InventoryItemBase attachmentItem = scene.InventoryService.GetItem(new InventoryItemBase(attSo.FromItemID)); 223 InventoryItemBase attachmentItem = scene.InventoryService.GetItem(sp.UUID, attSo.FromItemID);
223 Assert.That(attachmentItem, Is.Not.Null); 224 Assert.That(attachmentItem, Is.Not.Null);
224 Assert.That(attachmentItem.Name, Is.EqualTo(attName)); 225 Assert.That(attachmentItem.Name, Is.EqualTo(attName));
225 226
@@ -262,11 +263,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests
262 Assert.That(attSo.IsTemporary, Is.False); 263 Assert.That(attSo.IsTemporary, Is.False);
263 264
264 // Check item status 265 // Check item status
265 Assert.That( 266// Assert.That(
266 sp.Appearance.GetAttachpoint(attSo.FromItemID), 267// sp.Appearance.GetAttachpoint(attSo.FromItemID),
267 Is.EqualTo((int)AttachmentPoint.LeftHand)); 268// Is.EqualTo((int)AttachmentPoint.LeftHand));
268 269
269 InventoryItemBase attachmentItem = scene.InventoryService.GetItem(new InventoryItemBase(attSo.FromItemID)); 270 InventoryItemBase attachmentItem = scene.InventoryService.GetItem(sp.UUID, attSo.FromItemID);
270 Assert.That(attachmentItem, Is.Not.Null); 271 Assert.That(attachmentItem, Is.Not.Null);
271 Assert.That(attachmentItem.Name, Is.EqualTo(so.Name)); 272 Assert.That(attachmentItem.Name, Is.EqualTo(so.Name));
272 273
@@ -281,7 +282,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests
281 282
282 // Test wearing a different attachment from the ground. 283 // Test wearing a different attachment from the ground.
283 { 284 {
284 scene.AttachmentsModule.AttachObject(sp, so2, (uint)AttachmentPoint.Default, false, true, false); 285 scene.AttachmentsModule.AttachObject(sp, so2, (uint)AttachmentPoint.Default, false, true, false);
285 286
286 // Check status on scene presence 287 // Check status on scene presence
287 Assert.That(sp.HasAttachments(), Is.True); 288 Assert.That(sp.HasAttachments(), Is.True);
@@ -295,11 +296,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests
295 Assert.That(attSo.IsTemporary, Is.False); 296 Assert.That(attSo.IsTemporary, Is.False);
296 297
297 // Check item status 298 // Check item status
298 Assert.That( 299// Assert.That(
299 sp.Appearance.GetAttachpoint(attSo.FromItemID), 300// sp.Appearance.GetAttachpoint(attSo.FromItemID),
300 Is.EqualTo((int)AttachmentPoint.LeftHand)); 301// Is.EqualTo((int)AttachmentPoint.LeftHand));
301 302
302 InventoryItemBase attachmentItem = scene.InventoryService.GetItem(new InventoryItemBase(attSo.FromItemID)); 303 InventoryItemBase attachmentItem = scene.InventoryService.GetItem(sp.UUID, attSo.FromItemID);
303 Assert.That(attachmentItem, Is.Not.Null); 304 Assert.That(attachmentItem, Is.Not.Null);
304 Assert.That(attachmentItem.Name, Is.EqualTo(so2.Name)); 305 Assert.That(attachmentItem.Name, Is.EqualTo(so2.Name));
305 306
@@ -314,7 +315,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests
314 315
315 // Test rewearing an already worn attachment from ground. Nothing should happen. 316 // Test rewearing an already worn attachment from ground. Nothing should happen.
316 { 317 {
317 scene.AttachmentsModule.AttachObject(sp, so2, (uint)AttachmentPoint.Default, false, true, false); 318 scene.AttachmentsModule.AttachObject(sp, so2, (uint)AttachmentPoint.Default, false, true, false);
318 319
319 // Check status on scene presence 320 // Check status on scene presence
320 Assert.That(sp.HasAttachments(), Is.True); 321 Assert.That(sp.HasAttachments(), Is.True);
@@ -328,11 +329,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests
328 Assert.That(attSo.IsTemporary, Is.False); 329 Assert.That(attSo.IsTemporary, Is.False);
329 330
330 // Check item status 331 // Check item status
331 Assert.That( 332// Assert.That(
332 sp.Appearance.GetAttachpoint(attSo.FromItemID), 333// sp.Appearance.GetAttachpoint(attSo.FromItemID),
333 Is.EqualTo((int)AttachmentPoint.LeftHand)); 334// Is.EqualTo((int)AttachmentPoint.LeftHand));
334 335
335 InventoryItemBase attachmentItem = scene.InventoryService.GetItem(new InventoryItemBase(attSo.FromItemID)); 336 InventoryItemBase attachmentItem = scene.InventoryService.GetItem(sp.UUID, attSo.FromItemID);
336 Assert.That(attachmentItem, Is.Not.Null); 337 Assert.That(attachmentItem, Is.Not.Null);
337 Assert.That(attachmentItem.Name, Is.EqualTo(so2.Name)); 338 Assert.That(attachmentItem.Name, Is.EqualTo(so2.Name));
338 339
@@ -372,7 +373,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests
372 sp2.AbsolutePosition = new Vector3(0, 0, 0); 373 sp2.AbsolutePosition = new Vector3(0, 0, 0);
373 sp2.HandleAgentRequestSit(sp2.ControllingClient, sp2.UUID, so.UUID, Vector3.Zero); 374 sp2.HandleAgentRequestSit(sp2.ControllingClient, sp2.UUID, so.UUID, Vector3.Zero);
374 375
375 scene.AttachmentsModule.AttachObject(sp, so, (uint)AttachmentPoint.Chest, false, true, false); 376 scene.AttachmentsModule.AttachObject(sp, so, (uint)AttachmentPoint.Chest, false, true, false);
376 377
377 Assert.That(sp.HasAttachments(), Is.False); 378 Assert.That(sp.HasAttachments(), Is.False);
378 Assert.That(scene.GetSceneObjectGroups().Count, Is.EqualTo(1)); 379 Assert.That(scene.GetSceneObjectGroups().Count, Is.EqualTo(1));
@@ -410,8 +411,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests
410 Assert.IsFalse(attSo.Backup); 411 Assert.IsFalse(attSo.Backup);
411 412
412 // Check appearance status 413 // Check appearance status
413 Assert.That(sp.Appearance.GetAttachments().Count, Is.EqualTo(1)); 414// Assert.That(sp.Appearance.GetAttachments().Count, Is.EqualTo(1));
414 Assert.That(sp.Appearance.GetAttachpoint(attItem.ID), Is.EqualTo((int)AttachmentPoint.Chest)); 415// Assert.That(sp.Appearance.GetAttachpoint(attItem.ID), Is.EqualTo((int)AttachmentPoint.Chest));
415 Assert.That(scene.GetSceneObjectGroups().Count, Is.EqualTo(1)); 416 Assert.That(scene.GetSceneObjectGroups().Count, Is.EqualTo(1));
416 417
417 // Check events 418 // Check events
@@ -435,8 +436,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests
435 Assert.That(attSo.IsTemporary, Is.False); 436 Assert.That(attSo.IsTemporary, Is.False);
436 437
437 // Check appearance status 438 // Check appearance status
438 Assert.That(sp.Appearance.GetAttachments().Count, Is.EqualTo(1)); 439// Assert.That(sp.Appearance.GetAttachments().Count, Is.EqualTo(1));
439 Assert.That(sp.Appearance.GetAttachpoint(attItem.ID), Is.EqualTo((int)AttachmentPoint.Chest)); 440// Assert.That(sp.Appearance.GetAttachpoint(attItem.ID), Is.EqualTo((int)AttachmentPoint.Chest));
440 Assert.That(scene.GetSceneObjectGroups().Count, Is.EqualTo(1)); 441 Assert.That(scene.GetSceneObjectGroups().Count, Is.EqualTo(1));
441 442
442 // Check events 443 // Check events
@@ -474,8 +475,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests
474 Assert.That(attSo.IsAttachment); 475 Assert.That(attSo.IsAttachment);
475 476
476 // Check appearance status 477 // Check appearance status
477 Assert.That(sp.Appearance.GetAttachments().Count, Is.EqualTo(1)); 478// Assert.That(sp.Appearance.GetAttachments().Count, Is.EqualTo(1));
478 Assert.That(sp.Appearance.GetAttachpoint(attItem1.ID), Is.EqualTo((int)AttachmentPoint.LeftHand)); 479// Assert.That(sp.Appearance.GetAttachpoint(attItem1.ID), Is.EqualTo((int)AttachmentPoint.LeftHand));
479 Assert.That(scene.GetSceneObjectGroups().Count, Is.EqualTo(1)); 480 Assert.That(scene.GetSceneObjectGroups().Count, Is.EqualTo(1));
480 481
481 // Check events 482 // Check events
@@ -484,7 +485,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests
484 485
485 // Test wearing a second attachment at the same position 486 // Test wearing a second attachment at the same position
486 // Until multiple attachments at one point is implemented, this will remove the first attachment 487 // Until multiple attachments at one point is implemented, this will remove the first attachment
487 // This test relies on both attachments having the same default attachment point (in this case LeftHand 488 // This test relies on both attachments having the same default attachment point (in this case LeftHand
488 // since none other has been set). 489 // since none other has been set).
489 { 490 {
490 scene.AttachmentsModule.RezSingleAttachmentFromInventory(sp, attItem2.ID, (uint)AttachmentPoint.Default); 491 scene.AttachmentsModule.RezSingleAttachmentFromInventory(sp, attItem2.ID, (uint)AttachmentPoint.Default);
@@ -499,8 +500,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests
499 Assert.That(attSo.IsAttachment); 500 Assert.That(attSo.IsAttachment);
500 501
501 // Check appearance status 502 // Check appearance status
502 Assert.That(sp.Appearance.GetAttachments().Count, Is.EqualTo(1)); 503// Assert.That(sp.Appearance.GetAttachments().Count, Is.EqualTo(1));
503 Assert.That(sp.Appearance.GetAttachpoint(attItem2.ID), Is.EqualTo((int)AttachmentPoint.LeftHand)); 504// Assert.That(sp.Appearance.GetAttachpoint(attItem2.ID), Is.EqualTo((int)AttachmentPoint.LeftHand));
504 Assert.That(scene.GetSceneObjectGroups().Count, Is.EqualTo(1)); 505 Assert.That(scene.GetSceneObjectGroups().Count, Is.EqualTo(1));
505 506
506 // Check events 507 // Check events
@@ -521,8 +522,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests
521 Assert.That(attSo.IsAttachment); 522 Assert.That(attSo.IsAttachment);
522 523
523 // Check appearance status 524 // Check appearance status
524 Assert.That(sp.Appearance.GetAttachments().Count, Is.EqualTo(1)); 525// Assert.That(sp.Appearance.GetAttachments().Count, Is.EqualTo(1));
525 Assert.That(sp.Appearance.GetAttachpoint(attItem2.ID), Is.EqualTo((int)AttachmentPoint.LeftHand)); 526// Assert.That(sp.Appearance.GetAttachpoint(attItem2.ID), Is.EqualTo((int)AttachmentPoint.LeftHand));
526 Assert.That(scene.GetSceneObjectGroups().Count, Is.EqualTo(1)); 527 Assert.That(scene.GetSceneObjectGroups().Count, Is.EqualTo(1));
527 528
528 // Check events 529 // Check events
@@ -556,6 +557,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests
556 // In the future, we need to be able to do this programatically more predicably. 557 // In the future, we need to be able to do this programatically more predicably.
557 scene.EventManager.OnChatFromWorld += OnChatFromWorld; 558 scene.EventManager.OnChatFromWorld += OnChatFromWorld;
558 559
560 m_chatEvent.Reset();
559 scene.AttachmentsModule.RezSingleAttachmentFromInventory(sp, userItem.ID, (uint)AttachmentPoint.Chest); 561 scene.AttachmentsModule.RezSingleAttachmentFromInventory(sp, userItem.ID, (uint)AttachmentPoint.Chest);
560 562
561 m_chatEvent.WaitOne(60000); 563 m_chatEvent.WaitOne(60000);
@@ -596,10 +598,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests
596 Assert.That(attachments.Count, Is.EqualTo(0)); 598 Assert.That(attachments.Count, Is.EqualTo(0));
597 599
598 // Check appearance status 600 // Check appearance status
599 Assert.That(sp.Appearance.GetAttachments().Count, Is.EqualTo(0)); 601// Assert.That(sp.Appearance.GetAttachments().Count, Is.EqualTo(0));
600 602
601 // Check item status 603 // Check item status
602 Assert.That(scene.InventoryService.GetItem(new InventoryItemBase(attItem.ID)), Is.Null); 604 Assert.That(scene.InventoryService.GetItem(sp.UUID, attItem.ID), Is.Null);
603 605
604 // Check object in scene 606 // Check object in scene
605 SceneObjectGroup soInScene = scene.GetSceneObjectGroup("att"); 607 SceneObjectGroup soInScene = scene.GetSceneObjectGroup("att");
@@ -634,7 +636,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests
634 Assert.That(attachments.Count, Is.EqualTo(0)); 636 Assert.That(attachments.Count, Is.EqualTo(0));
635 637
636 // Check item status 638 // Check item status
637 Assert.That(sp.Appearance.GetAttachpoint(attItem.ID), Is.EqualTo(0)); 639// Assert.That(sp.Appearance.GetAttachpoint(attItem.ID), Is.EqualTo(0));
638 640
639 Assert.That(scene.GetSceneObjectGroups().Count, Is.EqualTo(0)); 641 Assert.That(scene.GetSceneObjectGroups().Count, Is.EqualTo(0));
640 642
@@ -669,15 +671,16 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests
669 // In the future, we need to be able to do this programatically more predicably. 671 // In the future, we need to be able to do this programatically more predicably.
670 scene.EventManager.OnChatFromWorld += OnChatFromWorld; 672 scene.EventManager.OnChatFromWorld += OnChatFromWorld;
671 673
674 m_chatEvent.Reset();
672 SceneObjectGroup rezzedSo 675 SceneObjectGroup rezzedSo
673 = scene.AttachmentsModule.RezSingleAttachmentFromInventory(sp, userItem.ID, (uint)AttachmentPoint.Chest); 676 = (SceneObjectGroup)(scene.AttachmentsModule.RezSingleAttachmentFromInventory(sp, userItem.ID, (uint)AttachmentPoint.Chest));
674 677
675 // Wait for chat to signal rezzed script has been started. 678 // Wait for chat to signal rezzed script has been started.
676 m_chatEvent.WaitOne(60000); 679 m_chatEvent.WaitOne(60000);
677 680
678 scene.AttachmentsModule.DetachSingleAttachmentToInv(sp, rezzedSo); 681 scene.AttachmentsModule.DetachSingleAttachmentToInv(sp, rezzedSo);
679 682
680 InventoryItemBase userItemUpdated = scene.InventoryService.GetItem(userItem); 683 InventoryItemBase userItemUpdated = scene.InventoryService.GetItem(userItem.Owner, userItem.ID);
681 AssetBase asset = scene.AssetService.Get(userItemUpdated.AssetID.ToString()); 684 AssetBase asset = scene.AssetService.Get(userItemUpdated.AssetID.ToString());
682 685
683 // TODO: It would probably be better here to check script state via the saving and retrieval of state 686 // TODO: It would probably be better here to check script state via the saving and retrieval of state
@@ -689,7 +692,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests
689 Assert.That(scriptStateNodes.Count, Is.EqualTo(1)); 692 Assert.That(scriptStateNodes.Count, Is.EqualTo(1));
690 693
691 // Re-rez the attachment to check script running state 694 // Re-rez the attachment to check script running state
692 SceneObjectGroup reRezzedSo = scene.AttachmentsModule.RezSingleAttachmentFromInventory(sp, userItem.ID, (uint)AttachmentPoint.Chest); 695 SceneObjectGroup reRezzedSo = (SceneObjectGroup)(scene.AttachmentsModule.RezSingleAttachmentFromInventory(sp, userItem.ID, (uint)AttachmentPoint.Chest));
693 696
694 // Wait for chat to signal rezzed script has been started. 697 // Wait for chat to signal rezzed script has been started.
695 m_chatEvent.WaitOne(60000); 698 m_chatEvent.WaitOne(60000);
@@ -719,13 +722,13 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests
719 acd.Appearance.SetAttachment((int)AttachmentPoint.Chest, attItem.ID, attItem.AssetID); 722 acd.Appearance.SetAttachment((int)AttachmentPoint.Chest, attItem.ID, attItem.AssetID);
720 ScenePresence presence = SceneHelpers.AddScenePresence(scene, acd); 723 ScenePresence presence = SceneHelpers.AddScenePresence(scene, acd);
721 724
722 SceneObjectGroup rezzedAtt = presence.GetAttachments()[0]; 725 UUID rezzedAttID = presence.GetAttachments()[0].UUID;
723 726
724 m_numberOfAttachEventsFired = 0; 727 m_numberOfAttachEventsFired = 0;
725 scene.CloseAgent(presence.UUID, false); 728 scene.CloseAgent(presence.UUID, false);
726 729
727 // Check that we can't retrieve this attachment from the scene. 730 // Check that we can't retrieve this attachment from the scene.
728 Assert.That(scene.GetSceneObjectGroup(rezzedAtt.UUID), Is.Null); 731 Assert.That(scene.GetSceneObjectGroup(rezzedAttID), Is.Null);
729 732
730 // Check events 733 // Check events
731 Assert.That(m_numberOfAttachEventsFired, Is.EqualTo(0)); 734 Assert.That(m_numberOfAttachEventsFired, Is.EqualTo(0));
@@ -802,7 +805,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests
802 Assert.That(m_numberOfAttachEventsFired, Is.EqualTo(0)); 805 Assert.That(m_numberOfAttachEventsFired, Is.EqualTo(0));
803 } 806 }
804 807
805/* 808
806 [Test] 809 [Test]
807 public void TestSameSimulatorNeighbouringRegionsTeleportV1() 810 public void TestSameSimulatorNeighbouringRegionsTeleportV1()
808 { 811 {
@@ -842,7 +845,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests
842 sceneB, config, new CapabilitiesModule(), etmB, attModB, new BasicInventoryAccessModule()); 845 sceneB, config, new CapabilitiesModule(), etmB, attModB, new BasicInventoryAccessModule());
843 846
844 // FIXME: Hack - this is here temporarily to revert back to older entity transfer behaviour 847 // FIXME: Hack - this is here temporarily to revert back to older entity transfer behaviour
845 lscm.ServiceVersion = 0.1f; 848 //lscm.ServiceVersion = 0.1f;
846 849
847 UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(sceneA, 0x1); 850 UserAccount ua1 = UserAccountHelpers.CreateUserWithInventory(sceneA, 0x1);
848 851
@@ -910,7 +913,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests
910 // Check events 913 // Check events
911 Assert.That(m_numberOfAttachEventsFired, Is.EqualTo(0)); 914 Assert.That(m_numberOfAttachEventsFired, Is.EqualTo(0));
912 } 915 }
913*/ 916
914 917
915 [Test] 918 [Test]
916 public void TestSameSimulatorNeighbouringRegionsTeleportV2() 919 public void TestSameSimulatorNeighbouringRegionsTeleportV2()
@@ -972,8 +975,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests
972 // Both these operations will occur on different threads and will wait for each other. 975 // Both these operations will occur on different threads and will wait for each other.
973 // We have to do this via ThreadPool directly since FireAndForget has been switched to sync for the V1 976 // We have to do this via ThreadPool directly since FireAndForget has been switched to sync for the V1
974 // test protocol, where we are trying to avoid unpredictable async operations in regression tests. 977 // test protocol, where we are trying to avoid unpredictable async operations in regression tests.
975 tc.OnTestClientSendRegionTeleport 978 tc.OnTestClientSendRegionTeleport
976 += (regionHandle, simAccess, regionExternalEndPoint, locationID, flags, capsURL) 979 += (regionHandle, simAccess, regionExternalEndPoint, locationID, flags, capsURL)
977 => ThreadPool.UnsafeQueueUserWorkItem(o => destinationTestClients[0].CompleteMovement(), null); 980 => ThreadPool.UnsafeQueueUserWorkItem(o => destinationTestClients[0].CompleteMovement(), null);
978 981
979 m_numberOfAttachEventsFired = 0; 982 m_numberOfAttachEventsFired = 0;
@@ -1023,4 +1026,5 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests
1023 Assert.That(m_numberOfAttachEventsFired, Is.EqualTo(0)); 1026 Assert.That(m_numberOfAttachEventsFired, Is.EqualTo(0));
1024 } 1027 }
1025 } 1028 }
1029*/
1026} 1030}