diff --git a/OpenSim/Data/Tests/InventoryTests.cs b/OpenSim/Data/Tests/InventoryTests.cs
index dc0325911d..9c2a2d6fd5 100644
--- a/OpenSim/Data/Tests/InventoryTests.cs
+++ b/OpenSim/Data/Tests/InventoryTests.cs
@@ -323,7 +323,7 @@ namespace OpenSim.Data.Tests
.IgnoreProperty(x => x.InvType)
.IgnoreProperty(x => x.CreatorIdAsUuid)
.IgnoreProperty(x => x.Description)
- .IgnoreProperty(x => x.CreatorId)
+ .IgnoreProperty(x => x.CreatorIdentification)
.IgnoreProperty(x => x.CreatorData));
inventoryScrambler.Scramble(expected);
@@ -334,7 +334,7 @@ namespace OpenSim.Data.Tests
.IgnoreProperty(x => x.InvType)
.IgnoreProperty(x => x.CreatorIdAsUuid)
.IgnoreProperty(x => x.Description)
- .IgnoreProperty(x => x.CreatorId)
+ .IgnoreProperty(x => x.CreatorIdentification)
.IgnoreProperty(x => x.CreatorData));
}
diff --git a/OpenSim/Framework/AgentCircuitData.cs b/OpenSim/Framework/AgentCircuitData.cs
index cc9fcea2e7..1600bdc00d 100644
--- a/OpenSim/Framework/AgentCircuitData.cs
+++ b/OpenSim/Framework/AgentCircuitData.cs
@@ -302,31 +302,26 @@ namespace OpenSim.Framework
if (args["start_pos"] != null)
Vector3.TryParse(args["start_pos"].AsString(), out startpos);
-// DEBUG ON
- m_log.WarnFormat("[AGENTCIRCUITDATA] agentid={0}, child={1}, startpos={2}",AgentID,child,startpos.ToString());
-// DEBUG OFF
+ m_log.InfoFormat("[AGENTCIRCUITDATA] agentid={0}, child={1}, startpos={2}",AgentID,child,startpos.ToString());
try {
- // Unpack various appearance elements
- Appearance = new AvatarAppearance(AgentID);
+ // Unpack various appearance elements
+ Appearance = new AvatarAppearance(AgentID);
- // Eventually this code should be deprecated, use full appearance
- // packing in packed_appearance
- if (args["appearance_serial"] != null)
- Appearance.Serial = args["appearance_serial"].AsInteger();
+ // Eventually this code should be deprecated, use full appearance
+ // packing in packed_appearance
+ if (args["appearance_serial"] != null)
+ Appearance.Serial = args["appearance_serial"].AsInteger();
- if (args.ContainsKey("packed_appearance") && (args["packed_appearance"].Type == OSDType.Map))
- {
- Appearance.Unpack((OSDMap)args["packed_appearance"]);
-// DEBUG ON
- m_log.WarnFormat("[AGENTCIRCUITDATA] unpacked appearance");
-// DEBUG OFF
+ if (args.ContainsKey("packed_appearance") && (args["packed_appearance"].Type == OSDType.Map))
+ {
+ Appearance.Unpack((OSDMap)args["packed_appearance"]);
+ m_log.InfoFormat("[AGENTCIRCUITDATA] unpacked appearance");
+ }
+ else
+ m_log.Warn("[AGENTCIRCUITDATA] failed to find a valid packed_appearance");
}
-// DEBUG ON
- else
- m_log.Warn("[AGENTCIRCUITDATA] failed to find a valid packed_appearance");
-// DEBUG OFF
- } catch (Exception e)
+ catch (Exception e)
{
m_log.ErrorFormat("[AGENTCIRCUITDATA] failed to unpack appearance; {0}",e.Message);
}
diff --git a/OpenSim/Framework/AssetLandmark.cs b/OpenSim/Framework/AssetLandmark.cs
index 7806c1fc2d..f433235ec8 100644
--- a/OpenSim/Framework/AssetLandmark.cs
+++ b/OpenSim/Framework/AssetLandmark.cs
@@ -51,8 +51,16 @@ namespace OpenSim.Framework
string[] parts = temp.Split('\n');
int.TryParse(parts[0].Substring(17, 1), out Version);
UUID.TryParse(parts[1].Substring(10, 36), out RegionID);
- // the vector is stored with spaces as separators, not with commas ("10.3 32.5 43" instead of "10.3, 32.5, 43")
- Vector3.TryParse(parts[2].Substring(10, parts[2].Length - 10).Replace(" ", ","), out Position);
+ // The position is a vector with spaces as separators ("10.3 32.5 43").
+ // Parse each scalar separately to take into account the system's culture setting.
+ string[] scalars = parts[2].Substring(10, parts[2].Length - 10).Split(' ');
+ if (scalars.Length > 0)
+ System.Single.TryParse(scalars[0], out Position.X);
+ if (scalars.Length > 1)
+ System.Single.TryParse(scalars[1], out Position.Y);
+ if (scalars.Length > 2)
+ System.Single.TryParse(scalars[2], out Position.Z);
+
ulong.TryParse(parts[3].Substring(14, parts[3].Length - 14), out RegionHandle);
}
}
diff --git a/OpenSim/Framework/ChildAgentDataUpdate.cs b/OpenSim/Framework/ChildAgentDataUpdate.cs
index a2273385e0..ce0b2fb784 100644
--- a/OpenSim/Framework/ChildAgentDataUpdate.cs
+++ b/OpenSim/Framework/ChildAgentDataUpdate.cs
@@ -331,9 +331,7 @@ namespace OpenSim.Framework
public virtual OSDMap Pack()
{
-// DEBUG ON
- m_log.WarnFormat("[CHILDAGENTDATAUPDATE] Pack data");
-// DEBUG OFF
+ m_log.InfoFormat("[CHILDAGENTDATAUPDATE] Pack data");
OSDMap args = new OSDMap();
args["message_type"] = OSD.FromString("AgentData");
@@ -454,9 +452,7 @@ namespace OpenSim.Framework
///
public virtual void Unpack(OSDMap args)
{
-// DEBUG ON
- m_log.WarnFormat("[CHILDAGENTDATAUPDATE] Unpack data");
-// DEBUG OFF
+ m_log.InfoFormat("[CHILDAGENTDATAUPDATE] Unpack data");
if (args.ContainsKey("region_id"))
UUID.TryParse(args["region_id"].AsString(), out RegionID);
@@ -613,10 +609,8 @@ namespace OpenSim.Framework
if (args.ContainsKey("packed_appearance") && (args["packed_appearance"]).Type == OSDType.Map)
Appearance = new AvatarAppearance(AgentID,(OSDMap)args["packed_appearance"]);
-// DEBUG ON
else
m_log.WarnFormat("[CHILDAGENTDATAUPDATE] No packed appearance");
-// DEBUG OFF
if ((args["controllers"] != null) && (args["controllers"]).Type == OSDType.Array)
{
diff --git a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs
index 0df4585eec..ab1c206f9a 100644
--- a/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/AvatarFactory/AvatarFactoryModule.cs
@@ -183,7 +183,7 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
});
}
- // m_log.WarnFormat("[AVFACTORY]: Complete texture check for {0}",client.AgentId);
+ m_log.WarnFormat("[AVFACTORY]: Complete texture check for {0}",client.AgentId);
}
// Process the visual params, this may change height as well
@@ -196,12 +196,6 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
sp.SetHeight(sp.Appearance.AvatarHeight);
}
}
-
- // Send the appearance back to the avatar, not clear that this is needed
- sp.ControllingClient.SendAvatarDataImmediate(sp);
- // AvatarAppearance avp = sp.Appearance;
- // sp.ControllingClient.SendAppearance(avp.Owner,avp.VisualParams,avp.Texture.GetBytes());
-
}
@@ -274,21 +268,6 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
// Send the appearance to everyone in the scene
sp.SendAppearanceToAllOtherAgents();
- // sp.ControllingClient.SendAvatarDataImmediate(sp);
-
- // Send the appearance back to the avatar
- // AvatarAppearance avp = sp.Appearance;
- // sp.ControllingClient.SendAppearance(avp.Owner, avp.VisualParams, avp.Texture.GetBytes());
-
-/*
-// this needs to be fixed, the flag should be on scene presence not the region module
- // Start the animations if necessary
- if (!m_startAnimationSet)
- {
- sp.Animator.UpdateMovementAnimations();
- m_startAnimationSet = true;
- }
-*/
}
private void HandleAppearanceSave(UUID agentid)
@@ -374,6 +353,7 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
// m_log.WarnFormat("[AVFACTORY]: AvatarIsWearing called for {0}", client.AgentId);
+ // operate on a copy of the appearance so we don't have to lock anything
AvatarAppearance avatAppearance = new AvatarAppearance(sp.Appearance, false);
foreach (AvatarWearingArgs.Wearable wear in e.NowWearing)
@@ -388,9 +368,11 @@ namespace OpenSim.Region.CoreModules.Avatar.AvatarFactory
SetAppearanceAssets(sp.UUID, ref avatAppearance);
// could get fancier with the locks here, but in the spirit of "last write wins"
- // this should work correctly
+ // this should work correctly, also, we don't need to send the appearance here
+ // since the "iswearing" will trigger a new set of visual param and baked texture changes
+ // when those complete, the new appearance will be sent
sp.Appearance = avatAppearance;
- m_scene.AvatarService.SetAppearance(client.AgentId, sp.Appearance);
+ QueueAppearanceSave(client.AgentId);
}
private void SetAppearanceAssets(UUID userID, ref AvatarAppearance appearance)
diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
index f02a9228e5..b57dc88fdb 100644
--- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
@@ -903,8 +903,10 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
}
agent.MakeChildAgent();
+
// now we have a child agent in this region. Request all interesting data about other (root) agents
- agent.SendInitialFullUpdateToAllClients();
+ agent.SendOtherAgentsAvatarDataToMe();
+ agent.SendOtherAgentsAppearanceToMe();
CrossAttachmentsIntoNewRegion(neighbourRegion, agent, true);
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 70aceb126f..90223b134f 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -2324,16 +2324,14 @@ namespace OpenSim.Region.Framework.Scenes
m_log.DebugFormat("[SCENE]: Problem adding scene object {0} in {1} ", sog.UUID, RegionInfo.RegionName);
return false;
}
-
- newObject.RootPart.ParentGroup.CreateScriptInstances(0, false, DefaultScriptEngine, 2);
+
+ newObject.RootPart.ParentGroup.CreateScriptInstances(0, false, DefaultScriptEngine, GetStateSource(newObject));
newObject.ResumeScripts();
// Do this as late as possible so that listeners have full access to the incoming object
EventManager.TriggerOnIncomingSceneObject(newObject);
- TriggerChangedTeleport(newObject);
-
return true;
}
@@ -2441,7 +2439,7 @@ namespace OpenSim.Region.Framework.Scenes
return true;
}
- private void TriggerChangedTeleport(SceneObjectGroup sog)
+ private int GetStateSource(SceneObjectGroup sog)
{
ScenePresence sp = GetScenePresence(sog.OwnerID);
@@ -2452,13 +2450,12 @@ namespace OpenSim.Region.Framework.Scenes
if (aCircuit != null && (aCircuit.teleportFlags != (uint)TeleportFlags.Default))
{
// This will get your attention
- //m_log.Error("[XXX] Triggering ");
+ //m_log.Error("[XXX] Triggering CHANGED_TELEPORT");
- // Trigger CHANGED_TELEPORT
- sp.Scene.EventManager.TriggerOnScriptChangedEvent(sog.LocalId, (uint)Changed.TELEPORT);
+ return 5; // StateSource.Teleporting
}
-
}
+ return 2; // StateSource.PrimCrossing
}
#endregion
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index db69093f83..82214bf0ee 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -445,8 +445,36 @@ namespace OpenSim.Region.Framework.Scenes
PhysicsActor actor = m_physicsActor;
if (actor != null)
m_pos = actor.Position;
+ else
+ {
+ // Obtain the correct position of a seated avatar.
+ // In addition to providing the correct position while
+ // the avatar is seated, this value will also
+ // be used as the location to unsit to.
+ //
+ // If m_parentID is not 0, assume we are a seated avatar
+ // and we should return the position based on the sittarget
+ // offset and rotation of the prim we are seated on.
+ //
+ // Generally, m_pos will contain the position of the avatar
+ // in the sim unless the avatar is on a sit target. While
+ // on a sit target, m_pos will contain the desired offset
+ // without the parent rotation applied.
+ if (m_parentID != 0)
+ {
+ SceneObjectPart part = m_scene.GetSceneObjectPart(m_parentID);
+ if (part != null)
+ {
+ return m_parentPosition + (m_pos * part.GetWorldRotation());
+ }
+ else
+ {
+ return m_parentPosition + m_pos;
+ }
+ }
+ }
- return m_parentPosition + m_pos;
+ return m_pos;
}
set
{
@@ -703,7 +731,9 @@ namespace OpenSim.Region.Framework.Scenes
// Note: This won't send data *to* other clients in that region (children don't send)
// MIC: This gets called again in CompleteMovement
- SendInitialFullUpdateToAllClients();
+ // SendInitialFullUpdateToAllClients();
+ SendOtherAgentsAvatarDataToMe();
+ SendOtherAgentsAppearanceToMe();
RegisterToEvents();
SetDirectionVectors();
@@ -1613,7 +1643,7 @@ namespace OpenSim.Region.Framework.Scenes
{
AbsolutePosition = part.AbsolutePosition;
Velocity = Vector3.Zero;
- SendFullUpdateToAllClients();
+ SendAvatarDataToAllAgents();
//HandleAgentSit(ControllingClient, m_requestedSitTargetUUID);
}
@@ -1688,7 +1718,7 @@ namespace OpenSim.Region.Framework.Scenes
m_parentPosition = Vector3.Zero;
m_parentID = 0;
- SendFullUpdateToAllClients();
+ SendAvatarDataToAllAgents();
m_requestedSitTargetID = 0;
if (m_physicsActor != null && m_appearance != null)
{
@@ -2154,7 +2184,7 @@ namespace OpenSim.Region.Framework.Scenes
RemoveFromPhysicalScene();
Animator.TrySetMovementAnimation(sitAnimation);
- SendFullUpdateToAllClients();
+ SendAvatarDataToAllAgents();
// This may seem stupid, but Our Full updates don't send avatar rotation :P
// So we're also sending a terse update (which has avatar rotation)
// [Update] We do now.
@@ -2379,165 +2409,169 @@ namespace OpenSim.Region.Framework.Scenes
}
///
- /// Tell other client about this avatar (The client previously didn't know or had outdated details about this avatar)
+ /// Do everything required once a client completes its movement into a region and becomes
+ /// a root agent.
///
- ///
- public void SendFullUpdateToOtherClient(ScenePresence remoteAvatar)
- {
- // 2 stage check is needed.
- if (remoteAvatar == null)
- return;
-
- IClientAPI cl = remoteAvatar.ControllingClient;
- if (cl == null)
- return;
-
- if (m_appearance.Texture == null)
- return;
-
-// MT: This is needed for sit. It's legal to send it to oneself, and the name
-// of the method is a misnomer
-//
-// if (LocalId == remoteAvatar.LocalId)
-// {
-// m_log.WarnFormat("[SCENEPRESENCE]: An agent is attempting to send avatar data to itself; {0}", UUID);
-// return;
-// }
-
- if (IsChildAgent)
- {
- m_log.WarnFormat("[SCENEPRESENCE]: A child agent is attempting to send out avatar data; {0}", UUID);
- return;
- }
-
- remoteAvatar.m_controllingClient.SendAvatarDataImmediate(this);
- m_scene.StatsReporter.AddAgentUpdates(1);
- }
-
- ///
- /// Tell *ALL* agents about this agent
- ///
- public void SendInitialFullUpdateToAllClients()
- {
- m_perfMonMS = Util.EnvironmentTickCount();
- int avUpdates = 0;
- m_scene.ForEachScenePresence(delegate(ScenePresence avatar)
- {
- ++avUpdates;
-
- // Don't update ourselves
- if (avatar.LocalId == LocalId)
- return;
-
- // If this is a root agent, then get info about the avatar
- if (!IsChildAgent)
- {
- SendFullUpdateToOtherClient(avatar);
- }
-
- // If the other avatar is a root
- if (!avatar.IsChildAgent)
- {
- avatar.SendFullUpdateToOtherClient(this);
- avatar.SendAppearanceToOtherAgent(this);
- avatar.Animator.SendAnimPackToClient(ControllingClient);
- }
- });
-
- m_scene.StatsReporter.AddAgentUpdates(avUpdates);
- m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS));
-
- //Animator.SendAnimPack();
- }
-
- public void SendFullUpdateToAllClients()
- {
- m_perfMonMS = Util.EnvironmentTickCount();
-
- // only send update from root agents to other clients; children are only "listening posts"
- if (IsChildAgent)
- {
- m_log.Warn("[SCENEPRESENCE] attempt to send update from a childagent");
- return;
- }
-
- int count = 0;
- m_scene.ForEachScenePresence(delegate(ScenePresence sp)
- {
- if (sp.IsChildAgent)
- return;
- SendFullUpdateToOtherClient(sp);
- ++count;
- });
- m_scene.StatsReporter.AddAgentUpdates(count);
- m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS));
-
- Animator.SendAnimPack();
- }
-
- ///
- /// Do everything required once a client completes its movement into a region
- ///
- public void SendInitialData()
+ private void SendInitialData()
{
// Moved this into CompleteMovement to ensure that m_appearance is initialized before
// the inventory arrives
// m_scene.GetAvatarAppearance(m_controllingClient, out m_appearance);
- m_controllingClient.SendAvatarDataImmediate(this);
+ // This agent just became root. We are going to tell everyone about it. The process of
+ // getting other avatars information was initiated in the constructor... don't do it
+ // again here...
+ SendAvatarDataToAllAgents();
+
+ // We have an appearance but we may not have the baked textures. Check the asset cache
+ // to see if all the baked textures are already here.
if (m_scene.AvatarFactory != null)
{
if (m_scene.AvatarFactory.ValidateBakedTextureCache(m_controllingClient))
{
// m_log.WarnFormat("[SCENEPRESENCE]: baked textures are in the cache for {0}", Name);
- m_controllingClient.SendAppearance(
- m_appearance.Owner,m_appearance.VisualParams,m_appearance.Texture.GetBytes());
+ SendAppearanceToAgent(this);
+
+ // If the avatars baked textures are all in the cache, then we have a
+ // complete appearance... send it out, if not, then we'll send it when
+ // the avatar finishes updating its appearance
+ SendAppearanceToAllOtherAgents();
}
}
else
{
m_log.WarnFormat("[SCENEPRESENCE]: AvatarFactory not set for {0}", Name);
}
-
- SendInitialFullUpdateToAllClients();
}
///
- ///
+ /// Send this agent's avatar data to all other root and child agents in the scene
+ /// This agent must be root. This avatar will receive its own update.
///
- public void SendAppearanceToAllOtherAgents()
+ public void SendAvatarDataToAllAgents()
{
-// DEBUG ON
-// m_log.WarnFormat("[SCENEPRESENCE]: Send appearance from {0} to all other agents", m_uuid);
-// DEBUG OFF
+ // only send update from root agents to other clients; children are only "listening posts"
+ if (IsChildAgent)
+ {
+ m_log.Warn("[SCENEPRESENCE] attempt to send avatar data from a child agent");
+ return;
+ }
+
m_perfMonMS = Util.EnvironmentTickCount();
+ int count = 0;
m_scene.ForEachScenePresence(delegate(ScenePresence scenePresence)
{
- if (scenePresence.UUID != UUID)
- {
- SendAppearanceToOtherAgent(scenePresence);
- }
+ SendAvatarDataToAgent(scenePresence);
+ count++;
});
+ m_scene.StatsReporter.AddAgentUpdates(count);
m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS));
}
///
- /// Send appearance data to an agent that isn't this one.
+ /// Send avatar data for all other root agents to this agent, this agent
+ /// can be either a child or root
+ ///
+ public void SendOtherAgentsAvatarDataToMe()
+ {
+ m_perfMonMS = Util.EnvironmentTickCount();
+
+ int count = 0;
+ m_scene.ForEachScenePresence(delegate(ScenePresence scenePresence)
+ {
+ // only send information about root agents
+ if (scenePresence.IsChildAgent)
+ return;
+
+ // only send information about other root agents
+ if (scenePresence.UUID == UUID)
+ return;
+
+ scenePresence.SendAvatarDataToAgent(this);
+ count++;
+ });
+
+ m_scene.StatsReporter.AddAgentUpdates(count);
+ m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS));
+ }
+
+ ///
+ /// Send avatar data to an agent.
///
///
- public void SendAppearanceToOtherAgent(ScenePresence avatar)
+ private void SendAvatarDataToAgent(ScenePresence avatar)
{
- if (LocalId == avatar.LocalId)
+// m_log.WarnFormat("[SP] Send avatar data from {0} to {1}",m_uuid,avatar.ControllingClient.AgentId);
+
+ avatar.ControllingClient.SendAvatarDataImmediate(this);
+ Animator.SendAnimPackToClient(avatar.ControllingClient);
+ }
+
+ ///
+ /// Send this agent's appearance to all other root and child agents in the scene
+ /// This agent must be root.
+ ///
+ public void SendAppearanceToAllOtherAgents()
+ {
+ // only send update from root agents to other clients; children are only "listening posts"
+ if (IsChildAgent)
{
- m_log.WarnFormat("[SCENE PRESENCE]: An agent is attempting to send appearance data to itself; {0}", UUID);
+ m_log.Warn("[SCENEPRESENCE] attempt to send avatar data from a child agent");
return;
}
+
+ m_perfMonMS = Util.EnvironmentTickCount();
-// DEBUG ON
+ int count = 0;
+ m_scene.ForEachScenePresence(delegate(ScenePresence scenePresence)
+ {
+ if (scenePresence.UUID == UUID)
+ return;
+
+ SendAppearanceToAgent(scenePresence);
+ count++;
+ });
+
+ m_scene.StatsReporter.AddAgentUpdates(count);
+ m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS));
+ }
+
+ ///
+ /// Send appearance from all other root agents to this agent. this agent
+ /// can be either root or child
+ ///
+ public void SendOtherAgentsAppearanceToMe()
+ {
+ m_perfMonMS = Util.EnvironmentTickCount();
+
+ int count = 0;
+ m_scene.ForEachScenePresence(delegate(ScenePresence scenePresence)
+ {
+ // only send information about root agents
+ if (scenePresence.IsChildAgent)
+ return;
+
+ // only send information about other root agents
+ if (scenePresence.UUID == UUID)
+ return;
+
+ scenePresence.SendAppearanceToAgent(this);
+ count++;
+ });
+
+ m_scene.StatsReporter.AddAgentUpdates(count);
+ m_scene.StatsReporter.AddAgentTime(Util.EnvironmentTickCountSubtract(m_perfMonMS));
+ }
+
+ ///
+ /// Send appearance data to an agent.
+ ///
+ ///
+ private void SendAppearanceToAgent(ScenePresence avatar)
+ {
// m_log.WarnFormat("[SP] Send appearance from {0} to {1}",m_uuid,avatar.ControllingClient.AgentId);
-// DEBUG OFF
avatar.ControllingClient.SendAppearance(
m_appearance.Owner, m_appearance.VisualParams, m_appearance.Texture.GetBytes());
@@ -3050,9 +3084,6 @@ namespace OpenSim.Region.Framework.Scenes
public void CopyFrom(AgentData cAgent)
{
-// DEBUG ON
- m_log.ErrorFormat("[SCENEPRESENCE] CALLING COPYFROM");
-// DEBUG OFF
m_originRegionID = cAgent.RegionID;
m_callbackURI = cAgent.CallbackURI;
diff --git a/OpenSim/Region/Framework/Scenes/UuidGatherer.cs b/OpenSim/Region/Framework/Scenes/UuidGatherer.cs
index aee2d1086a..3978a7d3ae 100644
--- a/OpenSim/Region/Framework/Scenes/UuidGatherer.cs
+++ b/OpenSim/Region/Framework/Scenes/UuidGatherer.cs
@@ -86,23 +86,33 @@ namespace OpenSim.Region.Framework.Scenes
/// The assets gathered
public void GatherAssetUuids(UUID assetUuid, AssetType assetType, IDictionary assetUuids)
{
- assetUuids[assetUuid] = assetType;
-
- if (AssetType.Bodypart == assetType || AssetType.Clothing == assetType)
- {
- GetWearableAssetUuids(assetUuid, assetUuids);
+ try
+ {
+ assetUuids[assetUuid] = assetType;
+
+ if (AssetType.Bodypart == assetType || AssetType.Clothing == assetType)
+ {
+ GetWearableAssetUuids(assetUuid, assetUuids);
+ }
+ else if (AssetType.Gesture == assetType)
+ {
+ GetGestureAssetUuids(assetUuid, assetUuids);
+ }
+ else if (AssetType.LSLText == assetType)
+ {
+ GetScriptAssetUuids(assetUuid, assetUuids);
+ }
+ else if (AssetType.Object == assetType)
+ {
+ GetSceneObjectAssetUuids(assetUuid, assetUuids);
+ }
}
- else if (AssetType.Gesture == assetType)
+ catch (Exception)
{
- GetGestureAssetUuids(assetUuid, assetUuids);
- }
- else if (AssetType.LSLText == assetType)
- {
- GetScriptAssetUuids(assetUuid, assetUuids);
- }
- else if (AssetType.Object == assetType)
- {
- GetSceneObjectAssetUuids(assetUuid, assetUuids);
+ m_log.ErrorFormat(
+ "[UUID GATHERER]: Failed to gather uuids for asset id {0}, type {1}",
+ assetUuid, assetType);
+ throw;
}
}
diff --git a/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchVoiceModule.cs b/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchVoiceModule.cs
index a583ccaae5..e9c545308c 100644
--- a/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchVoiceModule.cs
+++ b/OpenSim/Region/OptionalModules/Avatar/Voice/FreeSwitchVoice/FreeSwitchVoiceModule.cs
@@ -132,7 +132,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice
m_FreeswitchService = ServerUtils.LoadPlugin(serviceDll, args);
string jsonConfig = m_FreeswitchService.GetJsonConfig();
- m_log.Debug("[FreeSwitchVoice]: Configuration string: " + jsonConfig);
+ //m_log.Debug("[FreeSwitchVoice]: Configuration string: " + jsonConfig);
OSDMap map = (OSDMap)OSDParser.DeserializeJson(jsonConfig);
m_freeSwitchAPIPrefix = map["APIPrefix"].AsString();
@@ -363,8 +363,8 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice
try
{
- m_log.DebugFormat("[FreeSwitchVoice][PROVISIONVOICE]: request: {0}, path: {1}, param: {2}",
- request, path, param);
+ //m_log.DebugFormat("[FreeSwitchVoice][PROVISIONVOICE]: request: {0}, path: {1}, param: {2}",
+ // request, path, param);
//XmlElement resp;
string agentname = "x" + Convert.ToBase64String(agentID.GetBytes());
@@ -445,8 +445,8 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice
// voice channel
LandData land = scene.GetLandData(avatar.AbsolutePosition.X, avatar.AbsolutePosition.Y);
- m_log.DebugFormat("[FreeSwitchVoice][PARCELVOICE]: region \"{0}\": Parcel \"{1}\" ({2}): avatar \"{3}\": request: {4}, path: {5}, param: {6}",
- scene.RegionInfo.RegionName, land.Name, land.LocalID, avatarName, request, path, param);
+ //m_log.DebugFormat("[FreeSwitchVoice][PARCELVOICE]: region \"{0}\": Parcel \"{1}\" ({2}): avatar \"{3}\": request: {4}, path: {5}, param: {6}",
+ // scene.RegionInfo.RegionName, land.Name, land.LocalID, avatarName, request, path, param);
// TODO: EstateSettings don't seem to get propagated...
// if (!scene.RegionInfo.EstateSettings.AllowVoice)
@@ -592,7 +592,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice
response["int_response_code"] = 200;
- m_log.DebugFormat("[FreeSwitchVoice] FreeSwitchSLVoiceGetPreloginHTTPHandler return {0}",response["str_response_string"]);
+ //m_log.DebugFormat("[FreeSwitchVoice] FreeSwitchSLVoiceGetPreloginHTTPHandler return {0}",response["str_response_string"]);
return response;
}
@@ -664,7 +664,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice
response["str_response_string"] = resp.ToString();
Regex normalizeEndLines = new Regex(@"\r\n", RegexOptions.Compiled | RegexOptions.Singleline | RegexOptions.Multiline);
- m_log.DebugFormat("[FREESWITCH]: {0}", normalizeEndLines.Replace((string)response["str_response_string"],""));
+ //m_log.DebugFormat("[FREESWITCH]: {0}", normalizeEndLines.Replace((string)response["str_response_string"],""));
return response;
}
@@ -696,8 +696,8 @@ namespace OpenSim.Region.OptionalModules.Avatar.Voice.FreeSwitchVoice
}
}
- m_log.DebugFormat("[FreeSwitchVoice]: AUTH, URI: {0}, Content-Type:{1}, Body{2}", uri, contenttype,
- requestbody);
+ //m_log.DebugFormat("[FreeSwitchVoice]: AUTH, URI: {0}, Content-Type:{1}, Body{2}", uri, contenttype,
+ // requestbody);
Hashtable response = new Hashtable();
response["str_response_string"] = string.Format(@"
diff --git a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs
index 0c8113e604..ccf52892dc 100644
--- a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs
+++ b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs
@@ -1173,10 +1173,13 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
presence = scene.GetScenePresence(AgentID);
if (presence != null)
{
- presence.Grouptitle = Title;
+ if (presence.Grouptitle != Title)
+ {
+ presence.Grouptitle = Title;
- // FixMe: Ter suggests a "Schedule" method that I can't find.
- presence.SendFullUpdateToAllClients();
+ if (! presence.IsChildAgent)
+ presence.SendAvatarDataToAllAgents();
+ }
}
}
}
diff --git a/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs b/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs
index 0c99d8cb95..8b7871bbaa 100644
--- a/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs
+++ b/OpenSim/Region/ScriptEngine/Interfaces/IScriptInstance.cs
@@ -42,7 +42,8 @@ namespace OpenSim.Region.ScriptEngine.Interfaces
NewRez = 1,
PrimCrossing = 2,
ScriptedRez = 3,
- AttachedRez = 4
+ AttachedRez = 4,
+ Teleporting = 5
}
public interface IScriptWorkItem
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index d06b134985..3c5f2d03c8 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -7759,24 +7759,59 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
break;
case (int)ScriptBaseClass.PRIM_BUMP_SHINY:
- // TODO--------------
if (remain < 1)
return res;
face=(int)rules.GetLSLIntegerItem(idx++);
- res.Add(new LSL_Integer(0));
- res.Add(new LSL_Integer(0));
+ tex = part.Shape.Textures;
+ if (face == ScriptBaseClass.ALL_SIDES)
+ {
+ for (face = 0; face < GetNumberOfSides(part); face++)
+ {
+ Primitive.TextureEntryFace texface = tex.GetFace((uint)face);
+ // Convert Shininess to PRIM_SHINY_*
+ res.Add(new LSL_Integer((uint)texface.Shiny >> 6));
+ // PRIM_BUMP_*
+ res.Add(new LSL_Integer((int)texface.Bump));
+ }
+ }
+ else
+ {
+ if (face >= 0 && face < GetNumberOfSides(part))
+ {
+ Primitive.TextureEntryFace texface = tex.GetFace((uint)face);
+ // Convert Shininess to PRIM_SHINY_*
+ res.Add(new LSL_Integer((uint)texface.Shiny >> 6));
+ // PRIM_BUMP_*
+ res.Add(new LSL_Integer((int)texface.Bump));
+ }
+ }
break;
case (int)ScriptBaseClass.PRIM_FULLBRIGHT:
- // TODO--------------
if (remain < 1)
return res;
face=(int)rules.GetLSLIntegerItem(idx++);
- res.Add(new LSL_Integer(0));
+ tex = part.Shape.Textures;
+ if (face == ScriptBaseClass.ALL_SIDES)
+ {
+ for (face = 0; face < GetNumberOfSides(part); face++)
+ {
+ Primitive.TextureEntryFace texface = tex.GetFace((uint)face);
+ res.Add(new LSL_Integer(texface.Fullbright ? 1 : 0));
+ }
+ }
+ else
+ {
+ if (face >= 0 && face < GetNumberOfSides(part))
+ {
+ Primitive.TextureEntryFace texface = tex.GetFace((uint)face);
+ res.Add(new LSL_Integer(texface.Fullbright ? 1 : 0));
+ }
+ }
break;
case (int)ScriptBaseClass.PRIM_FLEXIBLE:
@@ -7797,14 +7832,29 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
break;
case (int)ScriptBaseClass.PRIM_TEXGEN:
- // TODO--------------
- // (PRIM_TEXGEN_DEFAULT, PRIM_TEXGEN_PLANAR)
if (remain < 1)
return res;
face=(int)rules.GetLSLIntegerItem(idx++);
- res.Add(new LSL_Integer(0));
+ tex = part.Shape.Textures;
+ if (face == ScriptBaseClass.ALL_SIDES)
+ {
+ for (face = 0; face < GetNumberOfSides(part); face++)
+ {
+ MappingType texgen = tex.GetFace((uint)face).TexMapType;
+ // Convert MappingType to PRIM_TEXGEN_DEFAULT, PRIM_TEXGEN_PLANAR etc.
+ res.Add(new LSL_Integer((uint)texgen >> 1));
+ }
+ }
+ else
+ {
+ if (face >= 0 && face < GetNumberOfSides(part))
+ {
+ MappingType texgen = tex.GetFace((uint)face).TexMapType;
+ res.Add(new LSL_Integer((uint)texgen >> 1));
+ }
+ }
break;
case (int)ScriptBaseClass.PRIM_POINT_LIGHT:
@@ -7823,14 +7873,30 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
break;
case (int)ScriptBaseClass.PRIM_GLOW:
- // TODO--------------
if (remain < 1)
return res;
face=(int)rules.GetLSLIntegerItem(idx++);
- res.Add(new LSL_Float(0));
+ tex = part.Shape.Textures;
+ if (face == ScriptBaseClass.ALL_SIDES)
+ {
+ for (face = 0; face < GetNumberOfSides(part); face++)
+ {
+ Primitive.TextureEntryFace texface = tex.GetFace((uint)face);
+ res.Add(new LSL_Float(texface.Glow));
+ }
+ }
+ else
+ {
+ if (face >= 0 && face < GetNumberOfSides(part))
+ {
+ Primitive.TextureEntryFace texface = tex.GetFace((uint)face);
+ res.Add(new LSL_Float(texface.Glow));
+ }
+ }
break;
+
case (int)ScriptBaseClass.PRIM_TEXT:
Color4 textColor = part.GetTextColor();
res.Add(part.Text);
diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
index 660e9a36f3..8e712b60fe 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
@@ -390,19 +390,22 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
}
else if (m_stateSource == StateSource.RegionStart)
{
-// m_log.Debug("[Script] Posted changed(CHANGED_REGION_RESTART) to script");
+ //m_log.Debug("[Script] Posted changed(CHANGED_REGION_RESTART) to script");
PostEvent(new EventParams("changed",
- new Object[] { new LSL_Types.LSLInteger((int)Changed.REGION_RESTART) },
- new DetectParams[0]));
+ new Object[] { new LSL_Types.LSLInteger((int)Changed.REGION_RESTART) }, new DetectParams[0]));
}
- else if (m_stateSource == StateSource.PrimCrossing)
+ else if (m_stateSource == StateSource.PrimCrossing || m_stateSource == StateSource.Teleporting)
{
// CHANGED_REGION
PostEvent(new EventParams("changed",
- new Object[] { new LSL_Types.LSLInteger((int)Changed.REGION) },
- new DetectParams[0]));
+ new Object[] { new LSL_Types.LSLInteger((int)Changed.REGION) }, new DetectParams[0]));
+
+ // CHANGED_TELEPORT
+ if (m_stateSource == StateSource.Teleporting)
+ PostEvent(new EventParams("changed",
+ new Object[] { new LSL_Types.LSLInteger((int)Changed.TELEPORT) }, new DetectParams[0]));
}
- }
+ }
else
{
Start();
diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiTest.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiTest.cs
index dfc9aa3dea..1d55b95f30 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiTest.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiTest.cs
@@ -47,6 +47,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
{
private const double ANGLE_ACCURACY_IN_RADIANS = 1E-6;
+ private const double VECTOR_COMPONENT_ACCURACY = 0.0000005d;
private LSL_Api m_lslApi;
[SetUp]
@@ -164,5 +165,28 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
Assert.Greater(eulerCalc.z, eulerCheck.z - ANGLE_ACCURACY_IN_RADIANS, "TestllRot2Euler Z lower bounds check fail");
Assert.Less(eulerCalc.z, eulerCheck.z + ANGLE_ACCURACY_IN_RADIANS, "TestllRot2Euler Z upper bounds check fail");
}
+
+ [Test]
+ // llVecNorm test.
+ public void TestllVecNorm()
+ {
+ // Check special case for normalizing zero vector.
+ CheckllVecNorm(new LSL_Types.Vector3(0.0d, 0.0d, 0.0d), new LSL_Types.Vector3(0.0d, 0.0d, 0.0d));
+ // Check various vectors.
+ CheckllVecNorm(new LSL_Types.Vector3(10.0d, 25.0d, 0.0d), new LSL_Types.Vector3(0.371391d, 0.928477d, 0.0d));
+ CheckllVecNorm(new LSL_Types.Vector3(1.0d, 0.0d, 0.0d), new LSL_Types.Vector3(1.0d, 0.0d, 0.0d));
+ CheckllVecNorm(new LSL_Types.Vector3(-90.0d, 55.0d, 2.0d), new LSL_Types.Vector3(-0.853128d, 0.521356d, 0.018958d));
+ CheckllVecNorm(new LSL_Types.Vector3(255.0d, 255.0d, 255.0d), new LSL_Types.Vector3(0.577350d, 0.577350d, 0.577350d));
+ }
+
+ public void CheckllVecNorm(LSL_Types.Vector3 vec, LSL_Types.Vector3 vecNormCheck)
+ {
+ // Call LSL function to normalize the vector.
+ LSL_Types.Vector3 vecNorm = m_lslApi.llVecNorm(vec);
+ // Check each vector component against expected result.
+ Assert.AreEqual(vecNorm.x, vecNormCheck.x, VECTOR_COMPONENT_ACCURACY, "TestllVecNorm vector check fail on x component");
+ Assert.AreEqual(vecNorm.y, vecNormCheck.y, VECTOR_COMPONENT_ACCURACY, "TestllVecNorm vector check fail on y component");
+ Assert.AreEqual(vecNorm.z, vecNormCheck.z, VECTOR_COMPONENT_ACCURACY, "TestllVecNorm vector check fail on z component");
+ }
}
}
diff --git a/OpenSim/Services/HypergridService/GatekeeperService.cs b/OpenSim/Services/HypergridService/GatekeeperService.cs
index 3f5c4f1400..0aa53527c7 100644
--- a/OpenSim/Services/HypergridService/GatekeeperService.cs
+++ b/OpenSim/Services/HypergridService/GatekeeperService.cs
@@ -333,7 +333,8 @@ namespace OpenSim.Services.HypergridService
string addressee = parts[0];
m_log.DebugFormat("[GATEKEEPER SERVICE]: Verifying {0} against {1}", addressee, m_ExternalName);
- return (addressee == m_ExternalName);
+
+ return string.Equals(addressee, m_ExternalName, StringComparison.OrdinalIgnoreCase);
}
#endregion