aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/ScriptEngine/Shared
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/ScriptEngine/Shared')
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs120
1 files changed, 88 insertions, 32 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index b4134a4..94b9d40 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -5122,7 +5122,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
5122 else if (src.Data[index] is LSL_Float) 5122 else if (src.Data[index] is LSL_Float)
5123 return Convert.ToDouble(((LSL_Float) src.Data[index]).value); 5123 return Convert.ToDouble(((LSL_Float) src.Data[index]).value);
5124 else if (src.Data[index] is LSL_String) 5124 else if (src.Data[index] is LSL_String)
5125 return Convert.ToDouble(Regex.Replace(((LSL_String)src.Data[index]).m_string, "[^0-9]", "")); 5125 {
5126 string str = ((LSL_String) src.Data[index]).m_string;
5127 Match m = Regex.Match(str, "^\\s*(-?\\+?[,0-9]+\\.?[0-9]*)");
5128 if (m != Match.Empty)
5129 {
5130 str = m.Value;
5131 double d = 0.0;
5132 if (!Double.TryParse(str, out d))
5133 return 0.0;
5134
5135 return d;
5136 }
5137 return 0.0;
5138 }
5126 return Convert.ToDouble(src.Data[index]); 5139 return Convert.ToDouble(src.Data[index]);
5127 } 5140 }
5128 catch (FormatException) 5141 catch (FormatException)
@@ -7823,55 +7836,98 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7823 m_host.AddScriptLPS(1); 7836 m_host.AddScriptLPS(1);
7824 UUID objID = UUID.Zero; 7837 UUID objID = UUID.Zero;
7825 LSL_List result = new LSL_List(); 7838 LSL_List result = new LSL_List();
7839
7840 // If the ID is not valid, return null result
7826 if (!UUID.TryParse(obj, out objID)) 7841 if (!UUID.TryParse(obj, out objID))
7827 { 7842 {
7828 result.Add(new LSL_Vector()); 7843 result.Add(new LSL_Vector());
7829 result.Add(new LSL_Vector()); 7844 result.Add(new LSL_Vector());
7830 return result; 7845 return result;
7831 } 7846 }
7847
7848 // Check if this is an attached prim. If so, replace
7849 // the UUID with the avatar UUID and report it's bounding box
7850 SceneObjectPart part = World.GetSceneObjectPart(objID);
7851 if (part != null && part.ParentGroup.IsAttachment)
7852 objID = part.ParentGroup.RootPart.AttachedAvatar;
7853
7854 // Find out if this is an avatar ID. If so, return it's box
7832 ScenePresence presence = World.GetScenePresence(objID); 7855 ScenePresence presence = World.GetScenePresence(objID);
7833 if (presence != null) 7856 if (presence != null)
7834 { 7857 {
7835 if (presence.ParentID == 0) // not sat on an object 7858 // As per LSL Wiki, there is no difference between sitting
7859 // and standing avatar since server 1.36
7860 LSL_Vector lower;
7861 LSL_Vector upper;
7862 if (presence.Animator.Animations.DefaultAnimation.AnimID
7863 == AnimationSet.Animations.AnimsUUID["SIT_GROUND_CONSTRAINED"])
7836 { 7864 {
7837 LSL_Vector lower; 7865 // This is for ground sitting avatars
7838 LSL_Vector upper; 7866 float height = presence.Appearance.AvatarHeight / 2.66666667f;
7839 if (presence.Animator.Animations.DefaultAnimation.AnimID 7867 lower = new LSL_Vector(-0.3375f, -0.45f, height * -1.0f);
7840 == AnimationSet.Animations.AnimsUUID["SIT_GROUND_CONSTRAINED"]) 7868 upper = new LSL_Vector(0.3375f, 0.45f, 0.0f);
7841 {
7842 // This is for ground sitting avatars
7843 float height = presence.Appearance.AvatarHeight / 2.66666667f;
7844 lower = new LSL_Vector(-0.3375f, -0.45f, height * -1.0f);
7845 upper = new LSL_Vector(0.3375f, 0.45f, 0.0f);
7846 }
7847 else
7848 {
7849 // This is for standing/flying avatars
7850 float height = presence.Appearance.AvatarHeight / 2.0f;
7851 lower = new LSL_Vector(-0.225f, -0.3f, height * -1.0f);
7852 upper = new LSL_Vector(0.225f, 0.3f, height + 0.05f);
7853 }
7854 result.Add(lower);
7855 result.Add(upper);
7856 return result;
7857 } 7869 }
7858 else 7870 else
7859 { 7871 {
7860 // sitting on an object so we need the bounding box of that 7872 // This is for standing/flying avatars
7861 // which should include the avatar so set the UUID to the 7873 float height = presence.Appearance.AvatarHeight / 2.0f;
7862 // UUID of the object the avatar is sat on and allow it to fall through 7874 lower = new LSL_Vector(-0.225f, -0.3f, height * -1.0f);
7863 // to processing an object 7875 upper = new LSL_Vector(0.225f, 0.3f, height + 0.05f);
7864 SceneObjectPart p = World.GetSceneObjectPart(presence.ParentID);
7865 objID = p.UUID;
7866 } 7876 }
7877
7878 // Adjust to the documented error offsets (see LSL Wiki)
7879 lower += new LSL_Vector(0.05f, 0.05f, 0.05f);
7880 upper -= new LSL_Vector(0.05f, 0.05f, 0.05f);
7881
7882 if (lower.x > upper.x)
7883 lower.x = upper.x;
7884 if (lower.y > upper.y)
7885 lower.y = upper.y;
7886 if (lower.z > upper.z)
7887 lower.z = upper.z;
7888
7889 result.Add(lower);
7890 result.Add(upper);
7891 return result;
7867 } 7892 }
7868 SceneObjectPart part = World.GetSceneObjectPart(objID); 7893
7894 part = World.GetSceneObjectPart(objID);
7869 // Currently only works for single prims without a sitting avatar 7895 // Currently only works for single prims without a sitting avatar
7870 if (part != null) 7896 if (part != null)
7871 { 7897 {
7872 Vector3 halfSize = part.Scale / 2.0f; 7898 float minX;
7873 LSL_Vector lower = new LSL_Vector(halfSize.X * -1.0f, halfSize.Y * -1.0f, halfSize.Z * -1.0f); 7899 float maxX;
7874 LSL_Vector upper = new LSL_Vector(halfSize.X, halfSize.Y, halfSize.Z); 7900 float minY;
7901 float maxY;
7902 float minZ;
7903 float maxZ;
7904
7905 // This BBox is in sim coordinates, with the offset being
7906 // a contained point.
7907 Vector3[] offsets = World.GetCombinedBoundingBox(new List<SceneObjectGroup> { part.ParentGroup },
7908 out minX, out maxX, out minY, out maxY, out minZ, out maxZ);
7909
7910 minX -= offsets[0].X;
7911 maxX -= offsets[0].X;
7912 minY -= offsets[0].Y;
7913 maxY -= offsets[0].Y;
7914 minZ -= offsets[0].Z;
7915 maxZ -= offsets[0].Z;
7916
7917 LSL_Vector lower;
7918 LSL_Vector upper;
7919
7920 // Adjust to the documented error offsets (see LSL Wiki)
7921 lower = new LSL_Vector(minX + 0.05f, minY + 0.05f, minZ + 0.05f);
7922 upper = new LSL_Vector(maxX - 0.05f, maxY - 0.05f, maxZ - 0.05f);
7923
7924 if (lower.x > upper.x)
7925 lower.x = upper.x;
7926 if (lower.y > upper.y)
7927 lower.y = upper.y;
7928 if (lower.z > upper.z)
7929 lower.z = upper.z;
7930
7875 result.Add(lower); 7931 result.Add(lower);
7876 result.Add(upper); 7932 result.Add(upper);
7877 return result; 7933 return result;