move common code into AttachmentsModule.DeleteAttachmentsFromScene()
parent
3aa86d22d1
commit
7d58b5fa15
|
@ -148,6 +148,16 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
|
|||
}
|
||||
}
|
||||
|
||||
public void DeleteAttachmentsFromScene(IScenePresence sp, bool silent)
|
||||
{
|
||||
foreach (SceneObjectGroup sop in sp.GetAttachments())
|
||||
{
|
||||
sop.Scene.DeleteSceneObject(sop, silent);
|
||||
}
|
||||
|
||||
sp.ClearAttachments();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Called by client
|
||||
/// </summary>
|
||||
|
|
|
@ -559,11 +559,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
|
|||
|
||||
protected virtual void AgentHasMovedAway(ScenePresence sp, bool logout)
|
||||
{
|
||||
foreach (SceneObjectGroup sop in sp.GetAttachments())
|
||||
{
|
||||
sop.Scene.DeleteSceneObject(sop, true);
|
||||
}
|
||||
sp.ClearAttachments();
|
||||
sp.Scene.AttachmentsModule.DeleteAttachmentsFromScene(sp, true);
|
||||
}
|
||||
|
||||
protected void KillEntity(Scene scene, uint localID)
|
||||
|
|
|
@ -47,6 +47,15 @@ namespace OpenSim.Region.Framework.Interfaces
|
|||
/// <param name="sp"></param>
|
||||
void SaveChangedAttachments(IScenePresence sp);
|
||||
|
||||
/// <summary>
|
||||
/// Delete all the presence's attachments from the scene
|
||||
/// </summary>
|
||||
/// <param name="sp">
|
||||
/// This is done when a root agent leaves/is demoted to child (for instance, on logout, teleport or region cross).
|
||||
/// </param>
|
||||
/// <param name="silent"></param>
|
||||
void DeleteAttachmentsFromScene(IScenePresence sp, bool silent);
|
||||
|
||||
/// <summary>
|
||||
/// Attach an object to an avatar from the world.
|
||||
/// </summary>
|
||||
|
|
|
@ -62,9 +62,22 @@ namespace OpenSim.Region.Framework.Interfaces
|
|||
/// A copy of the list.
|
||||
/// </returns>
|
||||
/// <remarks>
|
||||
/// Do not change this list directly - use methods such as
|
||||
/// AddAttachment() and RemoveAttachment().
|
||||
/// Do not change this list directly - use the attachments module.
|
||||
/// </remarks>
|
||||
List<SceneObjectGroup> GetAttachments();
|
||||
|
||||
/// <summary>
|
||||
/// The scene objects attached to this avatar at a specific attachment point.
|
||||
/// </summary>
|
||||
/// <param name="attachmentPoint"></param>
|
||||
/// <returns></returns>
|
||||
List<SceneObjectGroup> GetAttachments(uint attachmentPoint);
|
||||
|
||||
bool HasAttachments();
|
||||
|
||||
// Don't use these methods directly. Instead, use the AttachmentsModule
|
||||
void AddAttachment(SceneObjectGroup gobj);
|
||||
void RemoveAttachment(SceneObjectGroup gobj);
|
||||
void ClearAttachments();
|
||||
}
|
||||
}
|
|
@ -3401,19 +3401,7 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
|
||||
public void Close()
|
||||
{
|
||||
lock (m_attachments)
|
||||
{
|
||||
// Delete attachments from scene
|
||||
// Don't try to save, as this thread won't live long
|
||||
// enough to complete the save. This would cause no copy
|
||||
// attachments to poof!
|
||||
//
|
||||
foreach (SceneObjectGroup grp in m_attachments)
|
||||
{
|
||||
m_scene.DeleteSceneObject(grp, false);
|
||||
}
|
||||
m_attachments.Clear();
|
||||
}
|
||||
m_scene.AttachmentsModule.DeleteAttachmentsFromScene(this, false);
|
||||
|
||||
lock (m_knownChildRegions)
|
||||
{
|
||||
|
|
|
@ -143,11 +143,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC
|
|||
if (!m_avatars.ContainsKey(agentId))
|
||||
return false;
|
||||
|
||||
// FIXME: An extremely bad bit of code that reaches directly into the attachments list and manipulates it
|
||||
foreach (SceneObjectGroup att in sp.GetAttachments())
|
||||
scene.DeleteSceneObject(att, false);
|
||||
|
||||
sp.ClearAttachments();
|
||||
scene.AttachmentsModule.DeleteAttachmentsFromScene(sp, false);
|
||||
|
||||
AvatarAppearance npcAppearance = new AvatarAppearance(appearance, true);
|
||||
sp.Appearance = npcAppearance;
|
||||
|
|
Loading…
Reference in New Issue