Merge branch 'master' into careminster-presence-refactor

avinationmerge
Melanie 2011-05-05 00:34:48 +01:00
commit 6008ffe943
3 changed files with 48 additions and 10 deletions

View File

@ -1785,11 +1785,15 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
protected void ReInstantiateScripts(ScenePresence sp) protected void ReInstantiateScripts(ScenePresence sp)
{ {
int i = 0;
sp.Attachments.ForEach(delegate(SceneObjectGroup sog) sp.Attachments.ForEach(delegate(SceneObjectGroup sog)
{ {
sog.SetState(sp.InTransitScriptStates[i++], sp.Scene);
sog.CreateScriptInstances(0, false, sp.Scene.DefaultScriptEngine, 0); sog.CreateScriptInstances(0, false, sp.Scene.DefaultScriptEngine, 0);
sog.ResumeScripts(); sog.ResumeScripts();
}); });
sp.InTransitScriptStates.Clear();
} }
#endregion #endregion

View File

@ -594,9 +594,18 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
} }
} }
} }
// This is a hook to do some per-asset post-processing for subclasses that need that
if (remoteClient != null)
ExportAsset(remoteClient.AgentId, assetID);
return assetID; return assetID;
} }
protected virtual void ExportAsset(UUID agentID, UUID assetID)
{
// nothing to do here
}
/// <summary> /// <summary>
/// Rez an object into the scene from the user's inventory /// Rez an object into the scene from the user's inventory
@ -1025,9 +1034,5 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
} }
#endregion #endregion
protected virtual void ExportAsset(UUID agentID, UUID assetID)
{
}
} }
} }

View File

@ -252,6 +252,16 @@ namespace OpenSim.Region.Framework.Scenes
// holds the seed cap for the child agent in that region // holds the seed cap for the child agent in that region
private Dictionary<ulong, string> m_knownChildRegions = new Dictionary<ulong, string>(); private Dictionary<ulong, string> m_knownChildRegions = new Dictionary<ulong, string>();
/// <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>
public List<string> InTransitScriptStates
{
get { return m_InTransitScriptStates; }
}
private List<string> m_InTransitScriptStates = new List<string>();
/// <summary> /// <summary>
/// Implemented Control Flags /// Implemented Control Flags
/// </summary> /// </summary>
@ -2812,6 +2822,7 @@ namespace OpenSim.Region.Framework.Scenes
// vars to support reduced update frequency when velocity is unchanged // vars to support reduced update frequency when velocity is unchanged
private Vector3 lastVelocitySentToAllClients = Vector3.Zero; private Vector3 lastVelocitySentToAllClients = Vector3.Zero;
private Vector3 lastPositionSentToAllClients = Vector3.Zero;
private int lastTerseUpdateToAllClientsTick = Util.EnvironmentTickCount(); private int lastTerseUpdateToAllClientsTick = Util.EnvironmentTickCount();
/// <summary> /// <summary>
@ -2821,14 +2832,29 @@ namespace OpenSim.Region.Framework.Scenes
{ {
int currentTick = Util.EnvironmentTickCount(); int currentTick = Util.EnvironmentTickCount();
// decrease update frequency when avatar is moving but velocity is not changing // Decrease update frequency when avatar is moving but velocity is
if (m_velocity.Length() < 0.01f // not changing.
|| Vector3.Distance(lastVelocitySentToAllClients, m_velocity) > 0.01f // If there is a mismatch between distance travelled and expected
|| currentTick - lastTerseUpdateToAllClientsTick > 1500) // distance based on last velocity sent and velocity hasnt changed,
// then send a new terse update
float timeSinceLastUpdate = (currentTick - lastTerseUpdateToAllClientsTick) * 0.001f;
Vector3 expectedPosition = lastPositionSentToAllClients + lastVelocitySentToAllClients * timeSinceLastUpdate;
float distanceError = Vector3.Distance(OffsetPosition, expectedPosition);
float speed = Velocity.Length();
float velocidyDiff = Vector3.Distance(lastVelocitySentToAllClients, Velocity);
if (speed < 0.01f // allow rotation updates if avatar position is unchanged
|| Math.Abs(distanceError) > 0.25f // arbitrary distance error threshold
|| velocidyDiff > 0.01f) // did velocity change from last update?
{ {
m_perfMonMS = currentTick; m_perfMonMS = currentTick;
lastVelocitySentToAllClients = m_velocity; lastVelocitySentToAllClients = Velocity;
lastTerseUpdateToAllClientsTick = currentTick; lastTerseUpdateToAllClientsTick = currentTick;
lastPositionSentToAllClients = OffsetPosition;
m_scene.ForEachClient(SendTerseUpdateToClient); m_scene.ForEachClient(SendTerseUpdateToClient);
@ -3543,6 +3569,7 @@ namespace OpenSim.Region.Framework.Scenes
cAgent.AttachmentObjects = new List<ISceneObject>(); cAgent.AttachmentObjects = new List<ISceneObject>();
cAgent.AttachmentObjectStates = new List<string>(); cAgent.AttachmentObjectStates = new List<string>();
IScriptModule se = m_scene.RequestModuleInterface<IScriptModule>(); IScriptModule se = m_scene.RequestModuleInterface<IScriptModule>();
m_InTransitScriptStates.Clear();
foreach (SceneObjectGroup sog in m_attachments) foreach (SceneObjectGroup sog in m_attachments)
{ {
// We need to make a copy and pass that copy // We need to make a copy and pass that copy
@ -3552,7 +3579,9 @@ namespace OpenSim.Region.Framework.Scenes
((SceneObjectGroup)clone).RootPart.GroupPosition = sog.RootPart.AttachedPos; ((SceneObjectGroup)clone).RootPart.GroupPosition = sog.RootPart.AttachedPos;
((SceneObjectGroup)clone).RootPart.IsAttachment = false; ((SceneObjectGroup)clone).RootPart.IsAttachment = false;
cAgent.AttachmentObjects.Add(clone); cAgent.AttachmentObjects.Add(clone);
cAgent.AttachmentObjectStates.Add(sog.GetStateSnapshot()); string state = sog.GetStateSnapshot();
cAgent.AttachmentObjectStates.Add(state);
m_InTransitScriptStates.Add(state);
// Let's remove the scripts of the original object here // Let's remove the scripts of the original object here
sog.RemoveScriptInstances(true); sog.RemoveScriptInstances(true);
} }