aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region')
-rw-r--r--OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs30
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs46
2 files changed, 35 insertions, 41 deletions
diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
index 42a18c5..93920b0 100644
--- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
@@ -472,7 +472,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
472 if (changed && m_scene.AvatarFactory != null) 472 if (changed && m_scene.AvatarFactory != null)
473 m_scene.AvatarFactory.QueueAppearanceSave(remoteClient.AgentId); 473 m_scene.AvatarFactory.QueueAppearanceSave(remoteClient.AgentId);
474 474
475 so.DetachToGround(); 475 presence.RemoveAttachment(so);
476 DetachSceneObjectToGround(so, presence);
476 477
477 List<UUID> uuids = new List<UUID>(); 478 List<UUID> uuids = new List<UUID>();
478 uuids.Add(inventoryID); 479 uuids.Add(inventoryID);
@@ -482,6 +483,33 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
482 483
483 m_scene.EventManager.TriggerOnAttach(so.LocalId, sceneObjectID, UUID.Zero); 484 m_scene.EventManager.TriggerOnAttach(so.LocalId, sceneObjectID, UUID.Zero);
484 } 485 }
486
487 /// <summary>
488 /// Detach the given scene objet to the ground.
489 /// </summary>
490 /// <remarks>
491 /// The caller has to take care of all the other work in updating avatar appearance, inventory, etc.
492 /// </remarks>
493 /// <param name="so">The scene object to detach.</param>
494 /// <param name="sp">The scene presence from which the scene object is being detached.</param>
495 private void DetachSceneObjectToGround(SceneObjectGroup so, ScenePresence sp)
496 {
497 SceneObjectPart rootPart = so.RootPart;
498
499 rootPart.FromItemID = UUID.Zero;
500 so.AbsolutePosition = sp.AbsolutePosition;
501 so.ForEachPart(part => part.AttachedAvatar = UUID.Zero);
502 rootPart.SetParentLocalId(0);
503 so.ClearPartAttachmentData();
504 rootPart.ApplyPhysics(rootPart.GetEffectiveObjectFlags(), rootPart.VolumeDetectActive, m_scene.m_physicalPrim);
505 so.HasGroupChanged = true;
506 rootPart.Rezzed = DateTime.Now;
507 rootPart.RemFlag(PrimFlags.TemporaryOnRez);
508 so.AttachToBackup();
509 m_scene.EventManager.TriggerParcelPrimCountTainted();
510 rootPart.ScheduleFullUpdate();
511 rootPart.ClearUndoState();
512 }
485 513
486 // What makes this method odd and unique is it tries to detach using an UUID.... Yay for standards. 514 // What makes this method odd and unique is it tries to detach using an UUID.... Yay for standards.
487 // To LocalId or UUID, *THAT* is the question. How now Brown UUID?? 515 // To LocalId or UUID, *THAT* is the question. How now Brown UUID??
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 00e3363..e3b8fc8 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -979,43 +979,16 @@ namespace OpenSim.Region.Framework.Scenes
979 return m_rootPart.Shape.State; 979 return m_rootPart.Shape.State;
980 } 980 }
981 981
982 public void ClearPartAttachmentData() 982 public void SetAttachmentPoint(byte point)
983 {
984 SetAttachmentPoint((Byte)0);
985 }
986
987 public void DetachToGround()
988 { 983 {
989 ScenePresence avatar = m_scene.GetScenePresence(m_rootPart.AttachedAvatar);
990 if (avatar == null)
991 return;
992
993 avatar.RemoveAttachment(this);
994
995 Vector3 detachedpos = new Vector3(127f,127f,127f);
996 if (avatar == null)
997 return;
998
999 detachedpos = avatar.AbsolutePosition;
1000 RootPart.FromItemID = UUID.Zero;
1001
1002 AbsolutePosition = detachedpos;
1003 m_rootPart.AttachedAvatar = UUID.Zero;
1004
1005 SceneObjectPart[] parts = m_parts.GetArray(); 984 SceneObjectPart[] parts = m_parts.GetArray();
1006 for (int i = 0; i < parts.Length; i++) 985 for (int i = 0; i < parts.Length; i++)
1007 parts[i].AttachedAvatar = UUID.Zero; 986 parts[i].SetAttachmentPoint(point);
987 }
1008 988
1009 m_rootPart.SetParentLocalId(0); 989 public void ClearPartAttachmentData()
1010 SetAttachmentPoint((byte)0); 990 {
1011 m_rootPart.ApplyPhysics(m_rootPart.GetEffectiveObjectFlags(), m_rootPart.VolumeDetectActive, m_scene.m_physicalPrim); 991 SetAttachmentPoint((Byte)0);
1012 HasGroupChanged = true;
1013 RootPart.Rezzed = DateTime.Now;
1014 RootPart.RemFlag(PrimFlags.TemporaryOnRez);
1015 AttachToBackup();
1016 m_scene.EventManager.TriggerParcelPrimCountTainted();
1017 m_rootPart.ScheduleFullUpdate();
1018 m_rootPart.ClearUndoState();
1019 } 992 }
1020 993
1021 /// <summary> 994 /// <summary>
@@ -3349,13 +3322,6 @@ namespace OpenSim.Region.Framework.Scenes
3349 return String.Format("{0} {1} ({2})", Name, UUID, AbsolutePosition); 3322 return String.Format("{0} {1} ({2})", Name, UUID, AbsolutePosition);
3350 } 3323 }
3351 3324
3352 public void SetAttachmentPoint(byte point)
3353 {
3354 SceneObjectPart[] parts = m_parts.GetArray();
3355 for (int i = 0; i < parts.Length; i++)
3356 parts[i].SetAttachmentPoint(point);
3357 }
3358
3359 #region ISceneObject 3325 #region ISceneObject
3360 3326
3361 public virtual ISceneObject CloneForNewScene() 3327 public virtual ISceneObject CloneForNewScene()