From b997174d08919fc69f29109b28e054d995672d0e Mon Sep 17 00:00:00 2001 From: Teravus Ovares (Dan Olivares) Date: Mon, 31 Aug 2009 20:07:33 -0400 Subject: * Fix attachment cross issues with new borders. --- OpenSim/Region/Framework/Scenes/Scene.cs | 7 ++++++- OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | 18 ++++++++++++++++++ OpenSim/Region/Framework/Scenes/ScenePresence.cs | 2 +- 3 files changed, 25 insertions(+), 2 deletions(-) (limited to 'OpenSim/Region/Framework/Scenes') diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index b8c8f32..f4a0d2e 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -1710,7 +1710,12 @@ namespace OpenSim.Region.Framework.Scenes int thisx = (int)RegionInfo.RegionLocX; int thisy = (int)RegionInfo.RegionLocY; - ulong newRegionHandle = 0; + + // use this if no borders were crossed! + ulong newRegionHandle + = Util.UIntsToLong((uint)((thisx) * Constants.RegionSize), + (uint)((thisy) * Constants.RegionSize)); + Vector3 pos = attemptedPosition; if (TestBorderCross(attemptedPosition, Cardinals.W)) diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index e5c6bf1..d72ed7d 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs @@ -1477,8 +1477,26 @@ namespace OpenSim.Region.Framework.Scenes SceneObjectGroup dupe = (SceneObjectGroup)MemberwiseClone(); dupe.m_isBackedUp = false; dupe.m_parts = new Dictionary(); + + // Warning, The following code related to previousAttachmentStatus is needed so that clones of + // attachments do not bordercross while they're being duplicated. This is hacktastic! + // Normally, setting AbsolutePosition will bordercross a prim if it's outside the region! + // unless IsAttachment is true!, so to prevent border crossing, we save it's attachment state + // (which should be false anyway) set it as an Attachment and then set it's Absolute Position, + // then restore it's attachment state + + // This is only necessary when userExposed is false! + + bool previousAttachmentStatus = dupe.RootPart.IsAttachment; + + if (!userExposed) + dupe.RootPart.IsAttachment = true; + dupe.AbsolutePosition = new Vector3(AbsolutePosition.X, AbsolutePosition.Y, AbsolutePosition.Z); + if (!userExposed) + dupe.RootPart.IsAttachment = previousAttachmentStatus; + dupe.CopyRootPart(m_rootPart, OwnerID, GroupID, userExposed); dupe.m_rootPart.LinkNum = m_rootPart.LinkNum; diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 46e3289..857dc11 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -3509,8 +3509,8 @@ namespace OpenSim.Region.Framework.Scenes { // Set the parent localID to 0 so it transfers over properly. gobj.RootPart.SetParentLocalId(0); - gobj.RootPart.IsAttachment = false; gobj.AbsolutePosition = gobj.RootPart.AttachedPos; + gobj.RootPart.IsAttachment = false; //gobj.RootPart.LastOwnerID = gobj.GetFromAssetID(); m_log.DebugFormat("[ATTACHMENT]: Sending attachment {0} to region {1}", gobj.UUID, regionHandle); m_scene.CrossPrimGroupIntoNewRegion(regionHandle, gobj, silent); -- cgit v1.1