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/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/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index e479628467..216eb51e3a 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -2384,16 +2384,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;
}
@@ -2520,7 +2518,7 @@ namespace OpenSim.Region.Framework.Scenes
return true;
}
- private void TriggerChangedTeleport(SceneObjectGroup sog)
+ private int GetStateSource(SceneObjectGroup sog)
{
ScenePresence sp = GetScenePresence(sog.OwnerID);
@@ -2531,13 +2529,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 98a3b29c62..24c809b23b 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -464,16 +464,36 @@ namespace OpenSim.Region.Framework.Scenes
// if (actor != null)
if ((actor != null) && (m_parentID == 0)) // KF Do NOT update m_pos here if Av is sitting!
m_pos = actor.Position;
-
- // If we're sitting, we need to update our position
- if (m_parentID != 0)
+ else
{
- SceneObjectPart part = m_scene.GetSceneObjectPart(m_parentID);
- if (part != null)
- m_parentPosition = part.AbsolutePosition;
+ // 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
{
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/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/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
index 5288cd3f3c..9548253f99 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
@@ -391,19 +391,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");
+ }
}
}