From 124602c6c25e0974dc5b4e260097c4ffa0d6bbf5 Mon Sep 17 00:00:00 2001
From: UbitUmarov
Date: Fri, 2 Oct 2015 22:47:31 +0100
Subject:  reduce some diferences with master

---
 .../Shared/Api/Implementation/LSL_Api.cs           | 516 +++++++++++----------
 1 file changed, 260 insertions(+), 256 deletions(-)

diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index ba41499..33e34fb 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -1928,7 +1928,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
             string userAgent = m_UrlModule.GetHttpHeader(new UUID(id), "user-agent");
             if (userAgent.IndexOf("SecondLife") < 0)
                 return; // Not the embedded browser. Is this check good enough?
-
+				
             // Use the IP address of the client and check against the request
             // seperate logins from the same IP will allow all of them to get non-text/plain as long
             // as the owner is in the region. Same as SL!
@@ -2174,9 +2174,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
                     foreach (SceneObjectPart part in parts)
                         SetAlpha(part, alpha, face);
                 }
-                finally
-                {
-                }
+                finally { }
             }
         }
 
@@ -2366,10 +2364,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
                     foreach (SceneObjectPart part in parts)
                         SetTexture(part, texture, face);
                 }
-                finally
-                {
-                }
-            }
+                finally { }
+             }
             ScriptSleep(m_sleepMsOnSetLinkTexture);
         }
 
@@ -2736,13 +2732,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
         public void llSetRot(LSL_Rotation rot)
         {
             m_host.AddScriptLPS(1);
-
-
-            // Teravus:  if (m_host.ParentID == 0) is bug code because the ParentID for the Avatar will cause this to be nonzero for root prim attachments
-            // which is then treated like a child prim rotation and it's offset gets cumulatively multiplied against.
-            // to fix the scripted rotations we also have to check to see if the root part localid is the same as the host's localid.
-            // RootPart != null should shortcircuit
-            
+          
             // try to let this work as in SL...
             if (m_host.ParentID == 0 || (m_host.ParentGroup != null && m_host == m_host.ParentGroup.RootPart))
             {
@@ -2781,7 +2771,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
 
             // keep using physactor ideia of isphysical
             // it should be SOP ideia of that
-            // not much of a issue with ubitODE
+            // not much of a issue with ubOde
             if (pa != null && pa.IsPhysical)
                 isphys = true;
             else
@@ -2923,6 +2913,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
             return force;
         }
 
+        public void llSetVelocity(LSL_Vector vel, int local)
+        {
+            m_host.AddScriptLPS(1);
+            m_host.SetVelocity(new Vector3((float)vel.x, (float)vel.y, (float)vel.z), local != 0);
+        }
+		
+        public void llSetAngularVelocity(LSL_Vector avel, int local)
+        {
+            m_host.AddScriptLPS(1);
+            m_host.SetAngularVelocity(new Vector3((float)avel.x, (float)avel.y, (float)avel.z), local != 0);
+        }
         public LSL_Integer llTarget(LSL_Vector position, double range)
         {
             m_host.AddScriptLPS(1);
@@ -3000,11 +3001,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
             llSetTorque(torque, local);
         }
 
-        public void llSetVelocity(LSL_Vector vel, int local)
-        {
-            m_host.AddScriptLPS(1);
-            m_host.SetVelocity(new Vector3((float)vel.x, (float)vel.y, (float)vel.z), local != 0);
-        }
 
         public LSL_Vector llGetVel()
         {
@@ -3033,12 +3029,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
             return new LSL_Vector(m_host.Acceleration);
         }
 
-        public void llSetAngularVelocity(LSL_Vector avel, int local)
-        {
-            m_host.AddScriptLPS(1);
-            m_host.SetAngularVelocity(new Vector3((float)avel.x, (float)avel.y, (float)avel.z), local != 0);
-        }
-
         public LSL_Vector llGetOmega()
         {
             m_host.AddScriptLPS(1);
@@ -3700,6 +3690,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
                     {
                         // Unregister controls from Presence
                         presence.UnRegisterControlEventsToScript(m_host.LocalId, m_item.ItemID);
+                     // Remove Take Control permission.
+                        m_item.PermsMask &= ~ScriptBaseClass.PERMISSION_TAKE_CONTROLS;
                     }
                 }
             }
@@ -4289,9 +4281,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
                     foreach (SceneObjectPart part in parts)
                         part.SetFaceColorAlpha(face, color, null);
                 }
-                finally
-                {
-                }
+                finally { }
             }
         }
 
@@ -4428,10 +4418,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
                             parentPrim.DelinkFromGroup(part.LocalId, true);
                         }
                     }
-                    finally
-                    {
-                    }
-                }
+                    finally { }
+                 }
 
                 parentPrim.HasGroupChanged = true;
                 parentPrim.ScheduleGroupForFullUpdate();
@@ -4450,10 +4438,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
                             newRoot.ParentGroup.LinkToGroup(part.ParentGroup);
                         }
                     }
-                    finally
-                    {
-                    }                    
-                    
+                    finally { }
                     
                     newRoot.ParentGroup.HasGroupChanged = true;
                     newRoot.ParentGroup.ScheduleGroupForFullUpdate();
@@ -4847,24 +4832,27 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
 
                 switch (data)
                 {
-                    case 1: // DATA_ONLINE (0|1)
+                    case ScriptBaseClass.DATA_ONLINE: // DATA_ONLINE (0|1)
                         if (pinfo != null && pinfo.RegionID != UUID.Zero)
                             reply = "1";
                         else
                             reply = "0";
                         break;
-                    case 2: // DATA_NAME (First Last)
+                    case ScriptBaseClass.DATA_NAME: // DATA_NAME (First Last)
                         reply = account.FirstName + " " + account.LastName;
                         break;
-                    case 3: // DATA_BORN (YYYY-MM-DD)
+                    case ScriptBaseClass.DATA_BORN: // DATA_BORN (YYYY-MM-DD)
                         DateTime born = new DateTime(1970, 1, 1, 0, 0, 0, 0);
                         born = born.AddSeconds(account.Created);
                         reply = born.ToString("yyyy-MM-dd");
                         break;
-                    case 4: // DATA_RATING (0,0,0,0,0,0)
+                    case ScriptBaseClass.DATA_RATING: // DATA_RATING (0,0,0,0,0,0)
                         reply = "0,0,0,0,0,0";
                         break;
-                    case 8: // DATA_PAYINFO (0|1|2|3)
+                    case 7: // DATA_USERLEVEL (integer).  This is not available in LL and so has no constant.
+                        reply = account.UserLevel.ToString();
+                        break;
+                    case ScriptBaseClass.DATA_PAYINFO: // DATA_PAYINFO (0|1|2|3)
                         reply = "0";
                         break;
                     default:
@@ -5025,22 +5013,22 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
 
                 ScenePresence presence = World.GetScenePresence(agentId);
 
+                if (presence == null || presence.PresenceType == PresenceType.Npc)
+                    return;
+
                 // Can't TP sitting avatars
                 if (presence.ParentID != 0) // Sitting
                     return;
-
-                if (presence != null && presence.PresenceType != PresenceType.Npc)
+                   				
+                if (m_item.PermsGranter == agentId)
                 {
-                    if (m_item.PermsGranter == agentId)
-                    {
-                        // If attached using llAttachToAvatarTemp, cowardly refuse
-                        if (m_host.ParentGroup.AttachmentPoint != 0 && m_host.ParentGroup.FromItemID == UUID.Zero)
-                            return;
+                    // If attached using llAttachToAvatarTemp, cowardly refuse
+                    if (m_host.ParentGroup.AttachmentPoint != 0 && m_host.ParentGroup.FromItemID == UUID.Zero)
+                        return;
 
-                        if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TELEPORT) != 0)
-                        {
-                            World.RequestTeleportLocation(presence.ControllingClient, regionHandle, targetPos, targetLookAt, (uint)TeleportFlags.ViaLocation);
-                        }
+                    if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TELEPORT) != 0)
+                    {
+                       World.RequestTeleportLocation(presence.ControllingClient, regionHandle, targetPos, targetLookAt, (uint)TeleportFlags.ViaLocation);
                     }
                 }
             }
@@ -8583,6 +8571,142 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
             }
         }
 
+        public void llSetKeyframedMotion(LSL_List frames, LSL_List options)
+        {
+            SceneObjectGroup group = m_host.ParentGroup;
+
+            if (group.RootPart.PhysActor != null && group.RootPart.PhysActor.IsPhysical)
+                return;
+            if (group.IsAttachment)
+                return;
+
+            if (frames.Data.Length > 0) // We are getting a new motion
+            {
+                if (group.RootPart.KeyframeMotion != null)
+                    group.RootPart.KeyframeMotion.Delete();
+                group.RootPart.KeyframeMotion = null;
+
+                int idx = 0;
+
+                KeyframeMotion.PlayMode mode = KeyframeMotion.PlayMode.Forward;
+                KeyframeMotion.DataFormat data = KeyframeMotion.DataFormat.Translation | KeyframeMotion.DataFormat.Rotation;
+
+                while (idx < options.Data.Length)
+                {
+                    int option = (int)options.GetLSLIntegerItem(idx++);
+                    int remain = options.Data.Length - idx;
+
+                    switch (option)
+                    {
+                        case ScriptBaseClass.KFM_MODE:
+                            if (remain < 1)
+                                break;
+                            int modeval = (int)options.GetLSLIntegerItem(idx++);
+                            switch(modeval)
+                            {
+                                case ScriptBaseClass.KFM_FORWARD:
+                                    mode = KeyframeMotion.PlayMode.Forward;
+                                    break;
+                                case ScriptBaseClass.KFM_REVERSE:
+                                    mode = KeyframeMotion.PlayMode.Reverse;
+                                    break;
+                                case ScriptBaseClass.KFM_LOOP:
+                                    mode = KeyframeMotion.PlayMode.Loop;
+                                    break;
+                                case ScriptBaseClass.KFM_PING_PONG:
+                                    mode = KeyframeMotion.PlayMode.PingPong;
+                                    break;
+                            }
+                            break;
+                        case ScriptBaseClass.KFM_DATA:
+                            if (remain < 1)
+                                break;
+                            int dataval = (int)options.GetLSLIntegerItem(idx++);
+                            data = (KeyframeMotion.DataFormat)dataval;
+                            break;
+                    }
+                }
+
+                group.RootPart.KeyframeMotion = new KeyframeMotion(group, mode, data);
+
+                idx = 0;
+
+                int elemLength = 2;
+                if (data == (KeyframeMotion.DataFormat.Translation | KeyframeMotion.DataFormat.Rotation))
+                    elemLength = 3;
+
+                List<KeyframeMotion.Keyframe> keyframes = new List<KeyframeMotion.Keyframe>();
+                while (idx < frames.Data.Length)
+                {
+                    int remain = frames.Data.Length - idx;
+
+                    if (remain < elemLength)
+                        break;
+
+                    KeyframeMotion.Keyframe frame = new KeyframeMotion.Keyframe();
+                    frame.Position = null;
+                    frame.Rotation = null;
+
+                    if ((data & KeyframeMotion.DataFormat.Translation) != 0)
+                    {
+                        LSL_Types.Vector3 tempv = frames.GetVector3Item(idx++);
+                        frame.Position = new Vector3((float)tempv.x, (float)tempv.y, (float)tempv.z);
+                    }
+                    if ((data & KeyframeMotion.DataFormat.Rotation) != 0)
+                    {
+                        LSL_Types.Quaternion tempq = frames.GetQuaternionItem(idx++);
+                        Quaternion q = new Quaternion((float)tempq.x, (float)tempq.y, (float)tempq.z, (float)tempq.s);
+                        q.Normalize();
+                        frame.Rotation = q;
+                    }
+
+                    float tempf = (float)frames.GetLSLFloatItem(idx++);
+                    frame.TimeMS = (int)(tempf * 1000.0f);
+
+                    keyframes.Add(frame);
+                }
+
+                group.RootPart.KeyframeMotion.SetKeyframes(keyframes.ToArray());
+                group.RootPart.KeyframeMotion.Start();
+            }
+            else
+            {
+                if (group.RootPart.KeyframeMotion == null)
+                    return;
+
+                if (options.Data.Length == 0)
+                {
+                    group.RootPart.KeyframeMotion.Stop();
+                    return;
+                }
+
+                int idx = 0;
+
+                while (idx < options.Data.Length)
+                {
+                    int option = (int)options.GetLSLIntegerItem(idx++);
+
+                    switch (option)
+                    {
+                        case ScriptBaseClass.KFM_COMMAND:
+                            int cmd = (int)options.GetLSLIntegerItem(idx++);
+                            switch (cmd)
+                            {
+                                case ScriptBaseClass.KFM_CMD_PLAY:
+                                    group.RootPart.KeyframeMotion.Start();
+                                    break;
+                                case ScriptBaseClass.KFM_CMD_STOP:
+                                    group.RootPart.KeyframeMotion.Stop();
+                                    break;
+                                case ScriptBaseClass.KFM_CMD_PAUSE:
+                                    group.RootPart.KeyframeMotion.Pause();
+                                    break;
+                            }
+                            break;
+                    }
+                }
+            }
+        }
 
         public LSL_List llGetPhysicsMaterial()
         {
@@ -8682,7 +8806,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
                             if (remain < 1)
                                 return new LSL_List();
 
-                            v=rules.GetVector3Item(idx++);
+                            try
+                            {
+                                v = rules.GetVector3Item(idx++);
+                            }
+                            catch(InvalidCastException)
+                            {
+                                if(code == ScriptBaseClass.PRIM_POSITION)
+                                    Error(originFunc, string.Format("Error running rule #{0} -> PRIM_POSITION: arg #{1} - parameter 1 must be vector", rulesParsed, idx - idxStart - 1));
+                                else
+                                    Error(originFunc, string.Format("Error running rule #{0} -> PRIM_POS_LOCAL: arg #{1} - parameter 1 must be vector", rulesParsed, idx - idxStart - 1));
+                                return new LSL_List();
+                            }
                             if (part.IsRoot && !part.ParentGroup.IsAttachment)
                                 currentPosition = GetSetPosTarget(part, v, currentPosition, true);
                             else
@@ -10444,6 +10579,43 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
             return result;
         }
 
+        /// <summary>
+        /// Helper to calculate bounding box of an avatar.
+        /// </summary>
+        private void BoundingBoxOfScenePresence(ScenePresence sp, out Vector3 lower, out Vector3 upper)
+        {
+            // Adjust from OS model
+            // avatar height = visual height - 0.2, bounding box height = visual height
+            // to SL model
+            // avatar height = visual height, bounding box height = visual height + 0.2
+            float height = sp.Appearance.AvatarHeight + m_avatarHeightCorrection;
+
+            // According to avatar bounding box in SL 2015-04-18:
+            // standing = <-0.275,-0.35,-0.1-0.5*h> : <0.275,0.35,0.1+0.5*h>
+            // groundsitting = <-0.3875,-0.5,-0.05-0.375*h> : <0.3875,0.5,0.5>
+            // sitting = <-0.5875,-0.35,-0.35-0.375*h> : <0.1875,0.35,-0.25+0.25*h>
+
+            // When avatar is sitting
+            if (sp.ParentPart != null)
+            {
+                lower = new Vector3(m_lABB1SitX0, m_lABB1SitY0, m_lABB1SitZ0 + m_lABB1SitZ1 * height);
+                upper = new Vector3(m_lABB2SitX0, m_lABB2SitY0, m_lABB2SitZ0 + m_lABB2SitZ1 * height);
+            }
+            // When avatar is groundsitting
+            else if (sp.Animator.Animations.ImplicitDefaultAnimation.AnimID == DefaultAvatarAnimations.AnimsUUID["SIT_GROUND_CONSTRAINED"])
+            {
+                lower = new Vector3(m_lABB1GrsX0, m_lABB1GrsY0, m_lABB1GrsZ0 + m_lABB1GrsZ1 * height);
+                upper = new Vector3(m_lABB2GrsX0, m_lABB2GrsY0, m_lABB2GrsZ0 + m_lABB2GrsZ1 * height);
+            }
+            // When avatar is standing or flying
+            else
+            {
+                lower = new Vector3(m_lABB1StdX0, m_lABB1StdY0, m_lABB1StdZ0 + m_lABB1StdZ1 * height);
+                upper = new Vector3(m_lABB2StdX0, m_lABB2StdY0, m_lABB2StdZ0 + m_lABB2StdZ1 * height);
+            }
+        }
+
+
         public LSL_Vector llGetGeometricCenter()
         {
             return new LSL_Vector(m_host.GetGeometricCenter());
@@ -10560,6 +10732,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
                         res.Add(GetPartRot(part));
                         break;
 
+                    case (int)ScriptBaseClass.PRIM_PHYSICS_SHAPE_TYPE:
+                        res.Add(new LSL_Integer((int)part.PhysicsShapeType));
+                        break;
+
                     case (int)ScriptBaseClass.PRIM_TYPE:
                         // implementing box
                         PrimitiveBaseShape Shape = part.Shape;
@@ -12116,17 +12292,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
             int width = 0;
             int height = 0;
 
-            uint commandToSend = 0;
+            ParcelMediaCommandEnum? commandToSend = null;
             float time = 0.0f; // default is from start
 
             ScenePresence presence = null;
 
             for (int i = 0; i < commandList.Data.Length; i++)
             {
-                uint command = (uint)(commandList.GetLSLIntegerItem(i));
+                ParcelMediaCommandEnum command = (ParcelMediaCommandEnum)commandList.Data[i];
                 switch (command)
                 {
-                    case (uint)ParcelMediaCommandEnum.Agent:
+                    case ParcelMediaCommandEnum.Agent:
                         // we send only to one agent
                         if ((i + 1) < commandList.Length)
                         {
@@ -12143,25 +12319,25 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
                         }
                         break;
 
-                    case (uint)ParcelMediaCommandEnum.Loop:
+                    case ParcelMediaCommandEnum.Loop:
                         loop = 1;
                         commandToSend = command;
                         update = true; //need to send the media update packet to set looping
                         break;
 
-                    case (uint)ParcelMediaCommandEnum.Play:
+                    case ParcelMediaCommandEnum.Play:
                         loop = 0;
                         commandToSend = command;
                         update = true; //need to send the media update packet to make sure it doesn't loop
                         break;
 
-                    case (uint)ParcelMediaCommandEnum.Pause:
-                    case (uint)ParcelMediaCommandEnum.Stop:
-                    case (uint)ParcelMediaCommandEnum.Unload:
+                    case ParcelMediaCommandEnum.Pause:
+                    case ParcelMediaCommandEnum.Stop:
+                    case ParcelMediaCommandEnum.Unload:
                         commandToSend = command;
                         break;
 
-                    case (uint)ParcelMediaCommandEnum.Url:
+                    case ParcelMediaCommandEnum.Url:
                         if ((i + 1) < commandList.Length)
                         {
                             if (commandList.Data[i + 1] is LSL_String)
@@ -12174,7 +12350,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
                         }
                         break;
 
-                    case (uint)ParcelMediaCommandEnum.Texture:
+                    case ParcelMediaCommandEnum.Texture:
                         if ((i + 1) < commandList.Length)
                         {
                             if (commandList.Data[i + 1] is LSL_String)
@@ -12187,7 +12363,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
                         }
                         break;
 
-                    case (uint)ParcelMediaCommandEnum.Time:
+                    case ParcelMediaCommandEnum.Time:
                         if ((i + 1) < commandList.Length)
                         {
                             if (commandList.Data[i + 1] is LSL_Float)
@@ -12199,7 +12375,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
                         }
                         break;
 
-                    case (uint)ParcelMediaCommandEnum.AutoAlign:
+                    case ParcelMediaCommandEnum.AutoAlign:
                         if ((i + 1) < commandList.Length)
                         {
                             if (commandList.Data[i + 1] is LSL_Integer)
@@ -12213,7 +12389,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
                         }
                         break;
 
-                    case (uint)ParcelMediaCommandEnum.Type:
+                    case ParcelMediaCommandEnum.Type:
                         if ((i + 1) < commandList.Length)
                         {
                             if (commandList.Data[i + 1] is LSL_String)
@@ -12226,7 +12402,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
                         }
                         break;
 
-                    case (uint)ParcelMediaCommandEnum.Desc:
+                    case ParcelMediaCommandEnum.Desc:
                         if ((i + 1) < commandList.Length)
                         {
                             if (commandList.Data[i + 1] is LSL_String)
@@ -12239,7 +12415,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
                         }
                         break;
 
-                    case (uint)ParcelMediaCommandEnum.Size:
+                    case ParcelMediaCommandEnum.Size:
                         if ((i + 2) < commandList.Length)
                         {
                             if (commandList.Data[i + 1] is LSL_Integer)
@@ -12309,7 +12485,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
                 }
             }
 
-            if (commandToSend != 0)
+            if (commandToSend != null)
             {
                 // the commandList contained a start/stop/... command, too
                 if (presence == null)
@@ -12320,16 +12496,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
                         if (sp.currentParcelUUID == landData.GlobalID)
                         {
                             sp.ControllingClient.SendParcelMediaCommand(0x4, // TODO what is this?
-                                                                           (ParcelMediaCommandEnum)commandToSend,
-                                                                           time);
+                                            (ParcelMediaCommandEnum)commandToSend, time);
                         }
                     });
                 }
                 else if (!presence.IsChildAgent)
                 {
                     presence.ControllingClient.SendParcelMediaCommand(0x4, // TODO what is this?
-                                                                      (ParcelMediaCommandEnum)commandToSend,
-                                                                      time);
+                                            (ParcelMediaCommandEnum)commandToSend, time);
                 }
             }
             ScriptSleep(m_sleepMsOnParcelMediaCommandList);
@@ -13815,6 +13989,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
             return result;
         }
 
+        public void print(string str)
+        {
+            // yes, this is a real LSL function. See: http://wiki.secondlife.com/wiki/Print
+            IOSSL_Api ossl = (IOSSL_Api)m_ScriptEngine.GetApi(m_item.ItemID, "OSSL");
+            if (ossl != null)
+            {
+                ossl.CheckThreatLevel(ThreatLevel.High, "print");
+                m_log.Info("LSL print():" + str);
+            }
+        }	
+        	
         public LSL_Integer llGetLinkNumberOfSides(LSL_Integer link)
         {
             List<SceneObjectPart> parts = GetLinkParts(link);
@@ -14384,47 +14569,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
 
             return list;
         }
-
-
-        // this is wrong, except on a few trivial cases
-        // keeping it for now just for raycast v3
         
-        /// <summary>
-        /// Helper to calculate bounding box of an avatar.
-        /// </summary>
-        private void BoundingBoxOfScenePresence(ScenePresence sp, out Vector3 lower, out Vector3 upper)
-        {
-            // Adjust from OS model
-            // avatar height = visual height - 0.2, bounding box height = visual height
-            // to SL model
-            // avatar height = visual height, bounding box height = visual height + 0.2
-            float height = sp.Appearance.AvatarHeight + m_avatarHeightCorrection;
-
-            // According to avatar bounding box in SL 2015-04-18:
-            // standing = <-0.275,-0.35,-0.1-0.5*h> : <0.275,0.35,0.1+0.5*h>
-            // groundsitting = <-0.3875,-0.5,-0.05-0.375*h> : <0.3875,0.5,0.5>
-            // sitting = <-0.5875,-0.35,-0.35-0.375*h> : <0.1875,0.35,-0.25+0.25*h>
-
-            // When avatar is sitting
-            if (sp.ParentPart != null)
-            {
-                lower = new Vector3(m_lABB1SitX0, m_lABB1SitY0, m_lABB1SitZ0 + m_lABB1SitZ1 * height);
-                upper = new Vector3(m_lABB2SitX0, m_lABB2SitY0, m_lABB2SitZ0 + m_lABB2SitZ1 * height);
-            }
-            // When avatar is groundsitting
-            else if (sp.Animator.Animations.ImplicitDefaultAnimation.AnimID == DefaultAvatarAnimations.AnimsUUID["SIT_GROUND_CONSTRAINED"])
-            {
-                lower = new Vector3(m_lABB1GrsX0, m_lABB1GrsY0, m_lABB1GrsZ0 + m_lABB1GrsZ1 * height);
-                upper = new Vector3(m_lABB2GrsX0, m_lABB2GrsY0, m_lABB2GrsZ0 + m_lABB2GrsZ1 * height);
-            }
-            // When avatar is standing or flying
-            else
-            {
-                lower = new Vector3(m_lABB1StdX0, m_lABB1StdY0, m_lABB1StdZ0 + m_lABB1StdZ1 * height);
-                upper = new Vector3(m_lABB2StdX0, m_lABB2StdY0, m_lABB2StdZ0 + m_lABB2StdZ1 * height);
-            }
-        }
-
 
         /// <summary>
         /// Implementation of llCastRay similar to SL 2015-04-21.
@@ -15547,145 +15692,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
 
         #endregion
 
-        public void llSetKeyframedMotion(LSL_List frames, LSL_List options)
-        {
-            SceneObjectGroup group = m_host.ParentGroup;
-
-            if (group.RootPart.PhysActor != null && group.RootPart.PhysActor.IsPhysical)
-                return;
-            if (group.IsAttachment)
-                return;
-
-            if (frames.Data.Length > 0) // We are getting a new motion
-            {
-                if (group.RootPart.KeyframeMotion != null)
-                    group.RootPart.KeyframeMotion.Delete();
-                group.RootPart.KeyframeMotion = null;
-
-                int idx = 0;
-
-                KeyframeMotion.PlayMode mode = KeyframeMotion.PlayMode.Forward;
-                KeyframeMotion.DataFormat data = KeyframeMotion.DataFormat.Translation | KeyframeMotion.DataFormat.Rotation;
-
-                while (idx < options.Data.Length)
-                {
-                    int option = (int)options.GetLSLIntegerItem(idx++);
-                    int remain = options.Data.Length - idx;
-
-                    switch (option)
-                    {
-                        case ScriptBaseClass.KFM_MODE:
-                            if (remain < 1)
-                                break;
-                            int modeval = (int)options.GetLSLIntegerItem(idx++);
-                            switch(modeval)
-                            {
-                                case ScriptBaseClass.KFM_FORWARD:
-                                    mode = KeyframeMotion.PlayMode.Forward;
-                                    break;
-                                case ScriptBaseClass.KFM_REVERSE:
-                                    mode = KeyframeMotion.PlayMode.Reverse;
-                                    break;
-                                case ScriptBaseClass.KFM_LOOP:
-                                    mode = KeyframeMotion.PlayMode.Loop;
-                                    break;
-                                case ScriptBaseClass.KFM_PING_PONG:
-                                    mode = KeyframeMotion.PlayMode.PingPong;
-                                    break;
-                            }
-                            break;
-                        case ScriptBaseClass.KFM_DATA:
-                            if (remain < 1)
-                                break;
-                            int dataval = (int)options.GetLSLIntegerItem(idx++);
-                            data = (KeyframeMotion.DataFormat)dataval;
-                            break;
-                    }
-                }
-
-                group.RootPart.KeyframeMotion = new KeyframeMotion(group, mode, data);
-
-                idx = 0;
-
-                int elemLength = 2;
-                if (data == (KeyframeMotion.DataFormat.Translation | KeyframeMotion.DataFormat.Rotation))
-                    elemLength = 3;
-
-                List<KeyframeMotion.Keyframe> keyframes = new List<KeyframeMotion.Keyframe>();
-                while (idx < frames.Data.Length)
-                {
-                    int remain = frames.Data.Length - idx;
-
-                    if (remain < elemLength)
-                        break;
-
-                    KeyframeMotion.Keyframe frame = new KeyframeMotion.Keyframe();
-                    frame.Position = null;
-                    frame.Rotation = null;
-
-                    if ((data & KeyframeMotion.DataFormat.Translation) != 0)
-                    {
-                        LSL_Types.Vector3 tempv = frames.GetVector3Item(idx++);
-                        frame.Position = new Vector3((float)tempv.x, (float)tempv.y, (float)tempv.z);
-                    }
-                    if ((data & KeyframeMotion.DataFormat.Rotation) != 0)
-                    {
-                        LSL_Types.Quaternion tempq = frames.GetQuaternionItem(idx++);
-                        Quaternion q = new Quaternion((float)tempq.x, (float)tempq.y, (float)tempq.z, (float)tempq.s);
-                        q.Normalize();
-                        frame.Rotation = q;
-                    }
-
-                    float tempf = (float)frames.GetLSLFloatItem(idx++);
-                    frame.TimeMS = (int)(tempf * 1000.0f);
-
-                    keyframes.Add(frame);
-                }
-
-                group.RootPart.KeyframeMotion.SetKeyframes(keyframes.ToArray());
-                group.RootPart.KeyframeMotion.Start();
-            }
-            else
-            {
-                if (group.RootPart.KeyframeMotion == null)
-                    return;
-
-                if (options.Data.Length == 0)
-                {
-                    group.RootPart.KeyframeMotion.Stop();
-                    return;
-                }
-                    
-                int code = (int)options.GetLSLIntegerItem(0);
-
-                int idx = 0;
-
-                while (idx < options.Data.Length)
-                {
-                    int option = (int)options.GetLSLIntegerItem(idx++);
-                    int remain = options.Data.Length - idx;
-
-                    switch (option)
-                    {
-                        case ScriptBaseClass.KFM_COMMAND:
-                            int cmd = (int)options.GetLSLIntegerItem(idx++);
-                            switch (cmd)
-                            {
-                                case ScriptBaseClass.KFM_CMD_PLAY:
-                                    group.RootPart.KeyframeMotion.Start();
-                                    break;
-                                case ScriptBaseClass.KFM_CMD_STOP:
-                                    group.RootPart.KeyframeMotion.Stop();
-                                    break;
-                                case ScriptBaseClass.KFM_CMD_PAUSE:
-                                    group.RootPart.KeyframeMotion.Pause();
-                                    break;
-                            }
-                            break;
-                    }
-                }
-            }
-        }
 
         protected LSL_List SetPrimParams(ScenePresence av, LSL_List rules, string originFunc, ref uint rulesParsed)
         {
@@ -16104,8 +16110,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
             return new LSL_List();
         }
 
-
-
         public void llSetAnimationOverride(LSL_String animState, LSL_String anim)
         {
             string state = String.Empty;
-- 
cgit v1.1