refactor: Move ScenePresence <-> AgentData attachments copying code into AttachmentsModule.
parent
5bec5bcf71
commit
d043213317
|
@ -100,6 +100,56 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
|
||||||
|
|
||||||
#region IAttachmentsModule
|
#region IAttachmentsModule
|
||||||
|
|
||||||
|
public void CopyAttachments(IScenePresence sp, AgentData ad)
|
||||||
|
{
|
||||||
|
lock (sp.AttachmentsSyncLock)
|
||||||
|
{
|
||||||
|
// Attachment objects
|
||||||
|
List<SceneObjectGroup> attachments = sp.GetAttachments();
|
||||||
|
if (attachments.Count > 0)
|
||||||
|
{
|
||||||
|
ad.AttachmentObjects = new List<ISceneObject>();
|
||||||
|
ad.AttachmentObjectStates = new List<string>();
|
||||||
|
// IScriptModule se = m_scene.RequestModuleInterface<IScriptModule>();
|
||||||
|
sp.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;
|
||||||
|
ad.AttachmentObjects.Add(clone);
|
||||||
|
string state = sog.GetStateSnapshot();
|
||||||
|
ad.AttachmentObjectStates.Add(state);
|
||||||
|
sp.InTransitScriptStates.Add(state);
|
||||||
|
// Let's remove the scripts of the original object here
|
||||||
|
sog.RemoveScriptInstances(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void CopyAttachments(AgentData ad, IScenePresence sp)
|
||||||
|
{
|
||||||
|
if (ad.AttachmentObjects != null && ad.AttachmentObjects.Count > 0)
|
||||||
|
{
|
||||||
|
lock (sp.AttachmentsSyncLock)
|
||||||
|
sp.ClearAttachments();
|
||||||
|
|
||||||
|
int i = 0;
|
||||||
|
foreach (ISceneObject so in ad.AttachmentObjects)
|
||||||
|
{
|
||||||
|
((SceneObjectGroup)so).LocalId = 0;
|
||||||
|
((SceneObjectGroup)so).RootPart.ClearUpdateSchedule();
|
||||||
|
so.SetState(ad.AttachmentObjectStates[i++], m_scene);
|
||||||
|
m_scene.IncomingCreateObject(Vector3.Zero, so);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// RezAttachments. This should only be called upon login on the first region.
|
/// RezAttachments. This should only be called upon login on the first region.
|
||||||
/// Attachment rezzings on crossings and TPs are done in a different way.
|
/// Attachment rezzings on crossings and TPs are done in a different way.
|
||||||
|
|
|
@ -35,6 +35,20 @@ namespace OpenSim.Region.Framework.Interfaces
|
||||||
{
|
{
|
||||||
public interface IAttachmentsModule
|
public interface IAttachmentsModule
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Copy attachment data from a ScenePresence into the AgentData structure for transmission to another simulator
|
||||||
|
/// </summary>
|
||||||
|
/// <param name='sp'></param>
|
||||||
|
/// <param name='ad'></param>
|
||||||
|
void CopyAttachments(IScenePresence sp, AgentData ad);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Copy attachment data from an AgentData structure into a ScenePresence.
|
||||||
|
/// </summary>
|
||||||
|
/// <param name='ad'></param>
|
||||||
|
/// <param name='sp'></param>
|
||||||
|
void CopyAttachments(AgentData ad, IScenePresence sp);
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// RezAttachments. This should only be called upon login on the first region.
|
/// RezAttachments. This should only be called upon login on the first region.
|
||||||
/// Attachment rezzings on crossings and TPs are done in a different way.
|
/// Attachment rezzings on crossings and TPs are done in a different way.
|
||||||
|
|
|
@ -40,6 +40,12 @@ namespace OpenSim.Region.Framework.Interfaces
|
||||||
/// </remarks>
|
/// </remarks>
|
||||||
public interface IScenePresence : ISceneAgent
|
public interface IScenePresence : ISceneAgent
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Copy of the script states while the agent is in transit. This state may
|
||||||
|
/// need to be placed back in case of transfer fail.
|
||||||
|
/// </summary>
|
||||||
|
List<string> InTransitScriptStates { get; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// The AttachmentsModule synchronizes on this to avoid race conditions between commands to add and remove attachments.
|
/// The AttachmentsModule synchronizes on this to avoid race conditions between commands to add and remove attachments.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
|
|
|
@ -3084,31 +3084,8 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
}
|
}
|
||||||
catch { }
|
catch { }
|
||||||
|
|
||||||
// Attachment objects
|
if (Scene.AttachmentsModule != null)
|
||||||
List<SceneObjectGroup> attachments = GetAttachments();
|
Scene.AttachmentsModule.CopyAttachments(this, cAgent);
|
||||||
if (attachments.Count > 0)
|
|
||||||
{
|
|
||||||
cAgent.AttachmentObjects = new List<ISceneObject>();
|
|
||||||
cAgent.AttachmentObjectStates = new List<string>();
|
|
||||||
// IScriptModule se = m_scene.RequestModuleInterface<IScriptModule>();
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void CopyFrom(AgentData cAgent)
|
private void CopyFrom(AgentData cAgent)
|
||||||
|
@ -3178,18 +3155,8 @@ namespace OpenSim.Region.Framework.Scenes
|
||||||
if (cAgent.Anims != null)
|
if (cAgent.Anims != null)
|
||||||
Animator.Animations.FromArray(cAgent.Anims);
|
Animator.Animations.FromArray(cAgent.Anims);
|
||||||
|
|
||||||
if (cAgent.AttachmentObjects != null && cAgent.AttachmentObjects.Count > 0)
|
if (Scene.AttachmentsModule != null)
|
||||||
{
|
Scene.AttachmentsModule.CopyAttachments(cAgent, this);
|
||||||
m_attachments = new List<SceneObjectGroup>();
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public bool CopyAgent(out IAgentData agent)
|
public bool CopyAgent(out IAgentData agent)
|
||||||
|
|
Loading…
Reference in New Issue