From 1e1270166f6d574916ada7b2bd5923115bd07052 Mon Sep 17 00:00:00 2001 From: Melanie Date: Wed, 22 Feb 2012 20:40:44 +0100 Subject: Adjust sit target and the llSetLinkPrimitiveParams sit position hack to match SL. --- .../Shared/Api/Implementation/LSL_Api.cs | 60 +++++++++++++++++----- 1 file changed, 46 insertions(+), 14 deletions(-) (limited to 'OpenSim/Region/ScriptEngine/Shared') diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 2a23c59..84792c0 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -7542,27 +7542,59 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api int remain = rules.Length - idx; - - switch (code) { case (int)ScriptBaseClass.PRIM_POSITION: - if (remain < 1) - return; - LSL_Vector v; - v = rules.GetVector3Item(idx++); - av.OffsetPosition = new Vector3((float)v.x, (float)v.y, (float)v.z); - av.SendAvatarDataToAllAgents(); + { + if (remain < 1) + return; + LSL_Vector v; + v = rules.GetVector3Item(idx++); + + SceneObjectPart part = World.GetSceneObjectPart(av.ParentID); + if (part == null) + break; + + LSL_Rotation localRot = ScriptBaseClass.ZERO_ROTATION; + LSL_Vector localPos = ScriptBaseClass.ZERO_VECTOR; + if (llGetLinkNumber() > 1) + { + localRot = llGetLocalRot(); + localPos = llGetLocalPos(); + } + + v -= localPos; + v /= localRot; + LSL_Vector sitOffset = (llRot2Up(new LSL_Rotation(av.Rotation.X, av.Rotation.Y, av.Rotation.Z, av.Rotation.W)) * av.Appearance.AvatarHeight * 0.02638f); + + v = v + 2 * sitOffset; + + av.OffsetPosition = new Vector3((float)v.x, (float)v.y, (float)v.z); + av.SendAvatarDataToAllAgents(); + + } break; case (int)ScriptBaseClass.PRIM_ROTATION: - if (remain < 1) - return; - LSL_Rotation r; - r = rules.GetQuaternionItem(idx++); - av.Rotation = new Quaternion((float)r.x, (float)r.y, (float)r.z, (float)r.s); - av.SendAvatarDataToAllAgents(); + { + if (remain < 1) + return; + + LSL_Rotation localRot = ScriptBaseClass.ZERO_ROTATION; + LSL_Vector localPos = ScriptBaseClass.ZERO_VECTOR; + if (llGetLinkNumber() > 1) + { + localRot = llGetLocalRot(); + localPos = llGetLocalPos(); + } + + LSL_Rotation r; + r = rules.GetQuaternionItem(idx++); + r = r * llGetRootRotation() / localRot; + av.Rotation = new Quaternion((float)r.x, (float)r.y, (float)r.z, (float)r.s); + av.SendAvatarDataToAllAgents(); + } break; } } -- cgit v1.1