From aec16c2a0a9283d28361eb21b16495421a77b46a Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Mon, 27 Jul 2009 23:13:31 +0000
Subject: Than you, otakup0pe, for a patch to correct llSetPos & friends'
 behavior for child prims. Fixes Mantis #3931

---
 .../Shared/Api/Implementation/LSL_Api.cs           | 38 ++++++++++++++--------
 1 file changed, 24 insertions(+), 14 deletions(-)

(limited to 'OpenSim/Region')

diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 2c3002a..c7c416c 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -1849,15 +1849,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
 
             ScriptSleep(200);
         }
-
+	// Capped movemment if distance > 10m (http://wiki.secondlife.com/wiki/LlSetPos)
+	// note linked setpos is capped "differently"
+	private LSL_Vector SetPosAdjust(LSL_Vector start, LSL_Vector end)
+	{
+		if ( llVecDist(start, end) > 10.0f * m_ScriptDistanceFactor ) {
+			return start + m_ScriptDistanceFactor * 10.0f * llVecNorm(end - start);
+		} else {
+			return end;
+		}
+	}
         protected void SetPos(SceneObjectPart part, LSL_Vector targetPos)
         {
             // Capped movemment if distance > 10m (http://wiki.secondlife.com/wiki/LlSetPos)
             LSL_Vector currentPos = llGetLocalPos();
-            if (llVecDist(currentPos, targetPos) > 10.0f * m_ScriptDistanceFactor)
-            {
-                targetPos = currentPos + m_ScriptDistanceFactor * 10.0f * llVecNorm(targetPos - currentPos);
-            }
 
             float ground = World.GetGroundHeight((float)targetPos.x, (float)targetPos.y);
             bool disable_underground_movement = m_ScriptEngine.Config.GetBoolean("DisableUndergroundMovement", true);
@@ -1867,22 +1872,27 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
             {
                 if ((targetPos.z < ground) && disable_underground_movement)
                     targetPos.z = ground;
-                part.UpdateOffSet(new Vector3((float)targetPos.x, (float)targetPos.y, (float)targetPos.z));
-            }
+					LSL_Vector real_vec = SetPosAdjust(currentPos, targetPos);
+					part.UpdateOffSet(new Vector3((float)real_vec.x, (float)real_vec.y, (float)real_vec.z));            }
             else if (part.ParentGroup.RootPart == part)
             {
                 if ((targetPos.z < ground) && disable_underground_movement)
                     targetPos.z = ground;
                 SceneObjectGroup parent = part.ParentGroup;
-                parent.UpdateGroupPosition(new Vector3((float)targetPos.x, (float)targetPos.y, (float)targetPos.z));
+				LSL_Vector real_vec = SetPosAdjust(currentPos, targetPos);
+				parent.UpdateGroupPosition(new Vector3((float)real_vec.x, (float)real_vec.y, (float)real_vec.z));
             }
             else
-            {
-                part.OffsetPosition = new Vector3((float)targetPos.x, (float)targetPos.y, (float)targetPos.z);
-                SceneObjectGroup parent = part.ParentGroup;
-                parent.HasGroupChanged = true;
-                parent.ScheduleGroupForTerseUpdate();
-            }
+			{
+				//it's late... i think this is right ?
+				if ( llVecDist(new LSL_Vector(0,0,0), targetPos) <= 10.0f )
+				{
+					part.OffsetPosition = new Vector3((float)targetPos.x, (float)targetPos.y, (float)targetPos.z);
+					SceneObjectGroup parent = part.ParentGroup;
+					parent.HasGroupChanged = true;
+					parent.ScheduleGroupForTerseUpdate();
+				}
+			}
         }
 
         public LSL_Vector llGetPos()
-- 
cgit v1.1