diff options
-rw-r--r-- | OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | 76 |
1 files changed, 69 insertions, 7 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 3591d14..e87ec1c 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | |||
@@ -4957,12 +4957,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
4957 | { | 4957 | { |
4958 | return 0; | 4958 | return 0; |
4959 | } | 4959 | } |
4960 | |||
4961 | // Vectors & Rotations always return zero in SL, but | ||
4962 | // keys don't always return zero, it seems to be a bit complex. | ||
4963 | else if (src.Data[index] is LSL_Vector || | ||
4964 | src.Data[index] is LSL_Rotation) | ||
4965 | { | ||
4966 | return 0; | ||
4967 | } | ||
4960 | try | 4968 | try |
4961 | { | 4969 | { |
4970 | |||
4962 | if (src.Data[index] is LSL_Integer) | 4971 | if (src.Data[index] is LSL_Integer) |
4963 | return (LSL_Integer) src.Data[index]; | 4972 | return (LSL_Integer)src.Data[index]; |
4964 | else if (src.Data[index] is LSL_Float) | 4973 | else if (src.Data[index] is LSL_Float) |
4965 | return Convert.ToInt32(((LSL_Float) src.Data[index]).value); | 4974 | return Convert.ToInt32(((LSL_Float)src.Data[index]).value); |
4966 | return new LSL_Integer(src.Data[index].ToString()); | 4975 | return new LSL_Integer(src.Data[index].ToString()); |
4967 | } | 4976 | } |
4968 | catch (FormatException) | 4977 | catch (FormatException) |
@@ -4982,14 +4991,30 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
4982 | { | 4991 | { |
4983 | return 0.0; | 4992 | return 0.0; |
4984 | } | 4993 | } |
4994 | |||
4995 | // Vectors & Rotations always return zero in SL | ||
4996 | else if (src.Data[index] is LSL_Vector || | ||
4997 | src.Data[index] is LSL_Rotation) | ||
4998 | { | ||
4999 | return 0; | ||
5000 | } | ||
5001 | // valid keys seem to get parsed as integers then converted to floats | ||
5002 | else | ||
5003 | { | ||
5004 | UUID uuidt; | ||
5005 | if (src.Data[index] is LSL_Key && UUID.TryParse(src.Data[index].ToString(), out uuidt)) | ||
5006 | { | ||
5007 | return Convert.ToDouble(new LSL_Integer(src.Data[index].ToString()).value); | ||
5008 | } | ||
5009 | } | ||
4985 | try | 5010 | try |
4986 | { | 5011 | { |
4987 | if (src.Data[index] is LSL_Integer) | 5012 | if (src.Data[index] is LSL_Integer) |
4988 | return Convert.ToDouble(((LSL_Integer) src.Data[index]).value); | 5013 | return Convert.ToDouble(((LSL_Integer)src.Data[index]).value); |
4989 | else if (src.Data[index] is LSL_Float) | 5014 | else if (src.Data[index] is LSL_Float) |
4990 | return Convert.ToDouble(((LSL_Float) src.Data[index]).value); | 5015 | return Convert.ToDouble(((LSL_Float)src.Data[index]).value); |
4991 | else if (src.Data[index] is LSL_String) | 5016 | else if (src.Data[index] is LSL_String) |
4992 | return Convert.ToDouble(((LSL_String) src.Data[index]).m_string); | 5017 | return Convert.ToDouble(((LSL_String)src.Data[index]).m_string); |
4993 | return Convert.ToDouble(src.Data[index]); | 5018 | return Convert.ToDouble(src.Data[index]); |
4994 | } | 5019 | } |
4995 | catch (FormatException) | 5020 | catch (FormatException) |
@@ -5012,17 +5037,30 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
5012 | return src.Data[index].ToString(); | 5037 | return src.Data[index].ToString(); |
5013 | } | 5038 | } |
5014 | 5039 | ||
5015 | public LSL_String llList2Key(LSL_List src, int index) | 5040 | public LSL_Key llList2Key(LSL_List src, int index) |
5016 | { | 5041 | { |
5017 | m_host.AddScriptLPS(1); | 5042 | m_host.AddScriptLPS(1); |
5018 | if (index < 0) | 5043 | if (index < 0) |
5019 | { | 5044 | { |
5020 | index = src.Length + index; | 5045 | index = src.Length + index; |
5021 | } | 5046 | } |
5047 | |||
5022 | if (index >= src.Length || index < 0) | 5048 | if (index >= src.Length || index < 0) |
5023 | { | 5049 | { |
5024 | return ""; | 5050 | return ""; |
5025 | } | 5051 | } |
5052 | |||
5053 | // SL spits out an empty string for types other than key & string | ||
5054 | // At the time of patching, LSL_Key is currently LSL_String, | ||
5055 | // so the OR check may be a little redundant, but it's being done | ||
5056 | // for completion and should LSL_Key ever be implemented | ||
5057 | // as it's own struct | ||
5058 | else if (!(src.Data[index] is LSL_String || | ||
5059 | src.Data[index] is LSL_Key)) | ||
5060 | { | ||
5061 | return ""; | ||
5062 | } | ||
5063 | |||
5026 | return src.Data[index].ToString(); | 5064 | return src.Data[index].ToString(); |
5027 | } | 5065 | } |
5028 | 5066 | ||
@@ -5041,6 +5079,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
5041 | { | 5079 | { |
5042 | return (LSL_Vector)src.Data[index]; | 5080 | return (LSL_Vector)src.Data[index]; |
5043 | } | 5081 | } |
5082 | |||
5083 | // SL spits always out ZERO_VECTOR for anything other than | ||
5084 | // strings or vectors. Although keys always return ZERO_VECTOR, | ||
5085 | // it is currently difficult to make the distinction between | ||
5086 | // a string, a key as string and a string that by coincidence | ||
5087 | // is a string, so we're going to leave that up to the | ||
5088 | // LSL_Vector constructor. | ||
5089 | else if (!(src.Data[index] is LSL_String || | ||
5090 | src.Data[index] is LSL_Vector)) | ||
5091 | { | ||
5092 | return new LSL_Vector(0, 0, 0); | ||
5093 | } | ||
5044 | else | 5094 | else |
5045 | { | 5095 | { |
5046 | return new LSL_Vector(src.Data[index].ToString()); | 5096 | return new LSL_Vector(src.Data[index].ToString()); |
@@ -5058,7 +5108,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
5058 | { | 5108 | { |
5059 | return new LSL_Rotation(0, 0, 0, 1); | 5109 | return new LSL_Rotation(0, 0, 0, 1); |
5060 | } | 5110 | } |
5061 | if (src.Data[index].GetType() == typeof(LSL_Rotation)) | 5111 | |
5112 | // SL spits always out ZERO_ROTATION for anything other than | ||
5113 | // strings or vectors. Although keys always return ZERO_ROTATION, | ||
5114 | // it is currently difficult to make the distinction between | ||
5115 | // a string, a key as string and a string that by coincidence | ||
5116 | // is a string, so we're going to leave that up to the | ||
5117 | // LSL_Rotation constructor. | ||
5118 | else if (!(src.Data[index] is LSL_String || | ||
5119 | src.Data[index] is LSL_Rotation)) | ||
5120 | { | ||
5121 | return new LSL_Rotation(0, 0, 0, 1); | ||
5122 | } | ||
5123 | else if (src.Data[index].GetType() == typeof(LSL_Rotation)) | ||
5062 | { | 5124 | { |
5063 | return (LSL_Rotation)src.Data[index]; | 5125 | return (LSL_Rotation)src.Data[index]; |
5064 | } | 5126 | } |