refactor: move SOG.DetachToGround() to AttachmentsModule.DetachSceneObjectToGround() and remove redundant code

bulletsim
Justin Clark-Casey (justincc) 2011-08-26 22:49:11 +01:00
parent ae614c1264
commit 5f3ffc195f
2 changed files with 36 additions and 42 deletions

View File

@ -472,7 +472,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
if (changed && m_scene.AvatarFactory != null)
m_scene.AvatarFactory.QueueAppearanceSave(remoteClient.AgentId);
so.DetachToGround();
presence.RemoveAttachment(so);
DetachSceneObjectToGround(so, presence);
List<UUID> uuids = new List<UUID>();
uuids.Add(inventoryID);
@ -482,6 +483,33 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
m_scene.EventManager.TriggerOnAttach(so.LocalId, sceneObjectID, UUID.Zero);
}
/// <summary>
/// Detach the given scene objet to the ground.
/// </summary>
/// <remarks>
/// The caller has to take care of all the other work in updating avatar appearance, inventory, etc.
/// </remarks>
/// <param name="so">The scene object to detach.</param>
/// <param name="sp">The scene presence from which the scene object is being detached.</param>
private void DetachSceneObjectToGround(SceneObjectGroup so, ScenePresence sp)
{
SceneObjectPart rootPart = so.RootPart;
rootPart.FromItemID = UUID.Zero;
so.AbsolutePosition = sp.AbsolutePosition;
so.ForEachPart(part => part.AttachedAvatar = UUID.Zero);
rootPart.SetParentLocalId(0);
so.ClearPartAttachmentData();
rootPart.ApplyPhysics(rootPart.GetEffectiveObjectFlags(), rootPart.VolumeDetectActive, m_scene.m_physicalPrim);
so.HasGroupChanged = true;
rootPart.Rezzed = DateTime.Now;
rootPart.RemFlag(PrimFlags.TemporaryOnRez);
so.AttachToBackup();
m_scene.EventManager.TriggerParcelPrimCountTainted();
rootPart.ScheduleFullUpdate();
rootPart.ClearUndoState();
}
// What makes this method odd and unique is it tries to detach using an UUID.... Yay for standards.
// To LocalId or UUID, *THAT* is the question. How now Brown UUID??

View File

@ -979,45 +979,18 @@ namespace OpenSim.Region.Framework.Scenes
return m_rootPart.Shape.State;
}
public void SetAttachmentPoint(byte point)
{
SceneObjectPart[] parts = m_parts.GetArray();
for (int i = 0; i < parts.Length; i++)
parts[i].SetAttachmentPoint(point);
}
public void ClearPartAttachmentData()
{
SetAttachmentPoint((Byte)0);
}
public void DetachToGround()
{
ScenePresence avatar = m_scene.GetScenePresence(m_rootPart.AttachedAvatar);
if (avatar == null)
return;
avatar.RemoveAttachment(this);
Vector3 detachedpos = new Vector3(127f,127f,127f);
if (avatar == null)
return;
detachedpos = avatar.AbsolutePosition;
RootPart.FromItemID = UUID.Zero;
AbsolutePosition = detachedpos;
m_rootPart.AttachedAvatar = UUID.Zero;
SceneObjectPart[] parts = m_parts.GetArray();
for (int i = 0; i < parts.Length; i++)
parts[i].AttachedAvatar = UUID.Zero;
m_rootPart.SetParentLocalId(0);
SetAttachmentPoint((byte)0);
m_rootPart.ApplyPhysics(m_rootPart.GetEffectiveObjectFlags(), m_rootPart.VolumeDetectActive, m_scene.m_physicalPrim);
HasGroupChanged = true;
RootPart.Rezzed = DateTime.Now;
RootPart.RemFlag(PrimFlags.TemporaryOnRez);
AttachToBackup();
m_scene.EventManager.TriggerParcelPrimCountTainted();
m_rootPart.ScheduleFullUpdate();
m_rootPart.ClearUndoState();
}
/// <summary>
///
/// </summary>
@ -3349,13 +3322,6 @@ namespace OpenSim.Region.Framework.Scenes
return String.Format("{0} {1} ({2})", Name, UUID, AbsolutePosition);
}
public void SetAttachmentPoint(byte point)
{
SceneObjectPart[] parts = m_parts.GetArray();
for (int i = 0; i < parts.Length; i++)
parts[i].SetAttachmentPoint(point);
}
#region ISceneObject
public virtual ISceneObject CloneForNewScene()