From d0432133172f4147f7401f214c703611978423cd Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Wed, 27 Jun 2012 00:41:46 +0100
Subject: refactor: Move ScenePresence <-> AgentData attachments copying code
into AttachmentsModule.
---
.../Framework/Interfaces/IAttachmentsModule.cs | 14 ++++++++
.../Region/Framework/Interfaces/IScenePresence.cs | 6 ++++
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 41 +++-------------------
3 files changed, 24 insertions(+), 37 deletions(-)
(limited to 'OpenSim/Region/Framework')
diff --git a/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs b/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs
index fde5de1..375d334 100644
--- a/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs
+++ b/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs
@@ -36,6 +36,20 @@ namespace OpenSim.Region.Framework.Interfaces
public interface IAttachmentsModule
{
///
+ /// Copy attachment data from a ScenePresence into the AgentData structure for transmission to another simulator
+ ///
+ ///
+ ///
+ void CopyAttachments(IScenePresence sp, AgentData ad);
+
+ ///
+ /// Copy attachment data from an AgentData structure into a ScenePresence.
+ ///
+ ///
+ ///
+ void CopyAttachments(AgentData ad, IScenePresence sp);
+
+ ///
/// RezAttachments. This should only be called upon login on the first region.
/// Attachment rezzings on crossings and TPs are done in a different way.
///
diff --git a/OpenSim/Region/Framework/Interfaces/IScenePresence.cs b/OpenSim/Region/Framework/Interfaces/IScenePresence.cs
index 5e43843..19a8236 100644
--- a/OpenSim/Region/Framework/Interfaces/IScenePresence.cs
+++ b/OpenSim/Region/Framework/Interfaces/IScenePresence.cs
@@ -41,6 +41,12 @@ namespace OpenSim.Region.Framework.Interfaces
public interface IScenePresence : ISceneAgent
{
///
+ /// Copy of the script states while the agent is in transit. This state may
+ /// need to be placed back in case of transfer fail.
+ ///
+ List InTransitScriptStates { get; }
+
+ ///
/// The AttachmentsModule synchronizes on this to avoid race conditions between commands to add and remove attachments.
///
///
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 909c7c8..c7a670f 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -3084,31 +3084,8 @@ namespace OpenSim.Region.Framework.Scenes
}
catch { }
- // Attachment objects
- List attachments = GetAttachments();
- if (attachments.Count > 0)
- {
- cAgent.AttachmentObjects = new List();
- cAgent.AttachmentObjectStates = new List();
-// IScriptModule se = m_scene.RequestModuleInterface();
- InTransitScriptStates.Clear();
-
- foreach (SceneObjectGroup sog in attachments)
- {
- // We need to make a copy and pass that copy
- // because of transfers withn the same sim
- ISceneObject clone = sog.CloneForNewScene();
- // Attachment module assumes that GroupPosition holds the offsets...!
- ((SceneObjectGroup)clone).RootPart.GroupPosition = sog.RootPart.AttachedPos;
- ((SceneObjectGroup)clone).IsAttachment = false;
- cAgent.AttachmentObjects.Add(clone);
- string state = sog.GetStateSnapshot();
- cAgent.AttachmentObjectStates.Add(state);
- InTransitScriptStates.Add(state);
- // Let's remove the scripts of the original object here
- sog.RemoveScriptInstances(true);
- }
- }
+ if (Scene.AttachmentsModule != null)
+ Scene.AttachmentsModule.CopyAttachments(this, cAgent);
}
private void CopyFrom(AgentData cAgent)
@@ -3178,18 +3155,8 @@ namespace OpenSim.Region.Framework.Scenes
if (cAgent.Anims != null)
Animator.Animations.FromArray(cAgent.Anims);
- if (cAgent.AttachmentObjects != null && cAgent.AttachmentObjects.Count > 0)
- {
- m_attachments = new List();
- int i = 0;
- foreach (ISceneObject so in cAgent.AttachmentObjects)
- {
- ((SceneObjectGroup)so).LocalId = 0;
- ((SceneObjectGroup)so).RootPart.ClearUpdateSchedule();
- so.SetState(cAgent.AttachmentObjectStates[i++], m_scene);
- m_scene.IncomingCreateObject(Vector3.Zero, so);
- }
- }
+ if (Scene.AttachmentsModule != null)
+ Scene.AttachmentsModule.CopyAttachments(cAgent, this);
}
public bool CopyAgent(out IAgentData agent)
--
cgit v1.1