aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorSignpostMarv2012-08-13 12:20:19 +0100
committerMelanie2012-08-13 19:17:19 +0100
commit58c630c18e3540fc1c33fda5f12bbcba540f44cb (patch)
treeff3bd9b611e61ddf25a9264ea9de53c8b732a54a
parentMerge branch 'bulletsim7' (diff)
downloadopensim-SC-58c630c18e3540fc1c33fda5f12bbcba540f44cb.zip
opensim-SC-58c630c18e3540fc1c33fda5f12bbcba540f44cb.tar.gz
opensim-SC-58c630c18e3540fc1c33fda5f12bbcba540f44cb.tar.bz2
opensim-SC-58c630c18e3540fc1c33fda5f12bbcba540f44cb.tar.xz
attempt at replicating behaviour of llList2thing functions in SL
Committed with changes. Please don't sign comments with your name. Please don't use your own coding style, use the OpenSim project style. Please don't modify unrelated whitespace. Signed-off-by: Melanie <melanie@t-data.com>
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs76
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 }