diff options
author | Justin Clark-Casey (justincc) | 2010-03-03 22:14:06 +0000 |
---|---|---|
committer | Justin Clark-Casey (justincc) | 2010-03-03 22:14:06 +0000 |
commit | edb176447ba9cd6d29bd45d9b3714aa0dab9cbf9 (patch) | |
tree | 5cd33ef765c28d2265b4e119f78ca5a1104ca590 /OpenSim/Region/CoreModules/Framework | |
parent | Actually make EventManager.OnAttach() fire when an object is attached. Previ... (diff) | |
download | opensim-SC_OLD-edb176447ba9cd6d29bd45d9b3714aa0dab9cbf9.zip opensim-SC_OLD-edb176447ba9cd6d29bd45d9b3714aa0dab9cbf9.tar.gz opensim-SC_OLD-edb176447ba9cd6d29bd45d9b3714aa0dab9cbf9.tar.bz2 opensim-SC_OLD-edb176447ba9cd6d29bd45d9b3714aa0dab9cbf9.tar.xz |
Fix bug where approximately half the time, attachments would rez only their root prim until right clicked (or otherwise updated).
The root cause of this problem was that multiple ObjectUpdates were being sent on attachment which differed enough to confuse the client.
Sometimes these would eliminate each other and sometimes not, depending on whether the scheduler looked at the queued updates.
The solution here is to only schedule the ObjectUpdate once the attachment code has done all it needs to do.
Diffstat (limited to 'OpenSim/Region/CoreModules/Framework')
-rw-r--r-- | OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs index e0df288..0fc467b 100644 --- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs +++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs | |||
@@ -411,6 +411,8 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
411 | /// <summary> | 411 | /// <summary> |
412 | /// Rez an object into the scene from the user's inventory | 412 | /// Rez an object into the scene from the user's inventory |
413 | /// </summary> | 413 | /// </summary> |
414 | /// FIXME: It would be really nice if inventory access modules didn't also actually do the work of rezzing | ||
415 | /// things to the scene. The caller should be doing that, I think. | ||
414 | /// <param name="remoteClient"></param> | 416 | /// <param name="remoteClient"></param> |
415 | /// <param name="itemID"></param> | 417 | /// <param name="itemID"></param> |
416 | /// <param name="RayEnd"></param> | 418 | /// <param name="RayEnd"></param> |
@@ -500,13 +502,17 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
500 | group.RootPart.IsAttachment = true; | 502 | group.RootPart.IsAttachment = true; |
501 | } | 503 | } |
502 | 504 | ||
503 | m_Scene.AddNewSceneObject(group, true); | 505 | // For attachments, we must make sure that only a single object update occurs after we've finished |
506 | // all the necessary operations. | ||
507 | m_Scene.AddNewSceneObject(group, true, false); | ||
504 | 508 | ||
505 | // m_log.InfoFormat("ray end point for inventory rezz is {0} {1} {2} ", RayEnd.X, RayEnd.Y, RayEnd.Z); | 509 | // m_log.InfoFormat("ray end point for inventory rezz is {0} {1} {2} ", RayEnd.X, RayEnd.Y, RayEnd.Z); |
506 | // if attachment we set it's asset id so object updates can reflect that | 510 | // if attachment we set it's asset id so object updates can reflect that |
507 | // if not, we set it's position in world. | 511 | // if not, we set it's position in world. |
508 | if (!attachment) | 512 | if (!attachment) |
509 | { | 513 | { |
514 | group.ScheduleGroupForFullUpdate(); | ||
515 | |||
510 | float offsetHeight = 0; | 516 | float offsetHeight = 0; |
511 | pos = m_Scene.GetNewRezLocation( | 517 | pos = m_Scene.GetNewRezLocation( |
512 | RayStart, RayEnd, RayTargetID, Quaternion.Identity, | 518 | RayStart, RayEnd, RayTargetID, Quaternion.Identity, |
@@ -562,6 +568,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
562 | part.GroupMask = 0; // DO NOT propagate here | 568 | part.GroupMask = 0; // DO NOT propagate here |
563 | } | 569 | } |
564 | } | 570 | } |
571 | |||
565 | group.ApplyNextOwnerPermissions(); | 572 | group.ApplyNextOwnerPermissions(); |
566 | } | 573 | } |
567 | } | 574 | } |
@@ -569,7 +576,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
569 | foreach (SceneObjectPart part in partList) | 576 | foreach (SceneObjectPart part in partList) |
570 | { | 577 | { |
571 | if (part.OwnerID != item.Owner) | 578 | if (part.OwnerID != item.Owner) |
572 | { | 579 | { |
573 | part.LastOwnerID = part.OwnerID; | 580 | part.LastOwnerID = part.OwnerID; |
574 | part.OwnerID = item.Owner; | 581 | part.OwnerID = item.Owner; |
575 | part.Inventory.ChangeInventoryOwner(item.Owner); | 582 | part.Inventory.ChangeInventoryOwner(item.Owner); |
@@ -591,10 +598,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
591 | { | 598 | { |
592 | group.ClearPartAttachmentData(); | 599 | group.ClearPartAttachmentData(); |
593 | } | 600 | } |
594 | } | 601 | |
595 | |||
596 | if (!attachment) | ||
597 | { | ||
598 | // Fire on_rez | 602 | // Fire on_rez |
599 | group.CreateScriptInstances(0, true, m_Scene.DefaultScriptEngine, 0); | 603 | group.CreateScriptInstances(0, true, m_Scene.DefaultScriptEngine, 0); |
600 | 604 | ||