diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 74c2d89399..93dfeea834 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -5726,13 +5726,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
if (remain < 7)
return;
- bool flexi = (LSL_Types.LSLInteger)rules.Data[idx++];
- int softness = (LSL_Types.LSLInteger)rules.Data[idx++];
- float gravity = (float)(LSL_Types.LSLFloat)rules.Data[idx++];
- float friction = (float)(LSL_Types.LSLFloat)rules.Data[idx++];
- float wind = (float)(LSL_Types.LSLFloat)rules.Data[idx++];
- float tension = (float)(LSL_Types.LSLFloat)rules.Data[idx++];
- LSL_Types.Vector3 force = (LSL_Types.Vector3)rules.Data[idx++];
+ bool flexi = rules.GetLSLIntegerItem(idx++);
+ int softness = rules.GetLSLIntegerItem(idx++);
+ float gravity = (float)rules.GetLSLFloatItem(idx++);
+ float friction = (float)rules.GetLSLFloatItem(idx++);
+ float wind = (float)rules.GetLSLFloatItem(idx++);
+ float tension = (float)rules.GetLSLFloatItem(idx++);
+ LSL_Types.Vector3 force = rules.GetVector3Item(idx++);
SetFlexi(part, flexi, softness, gravity, friction, wind, tension, force);
diff --git a/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs b/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs
index 85abdb0bac..4713283e75 100644
--- a/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs
@@ -421,6 +421,58 @@ namespace OpenSim.Region.ScriptEngine.Shared
}
}
+ // Member functions to obtain item as specific types.
+ // For cases where implicit conversions would apply if items
+ // were not in a list (e.g. integer to float, but not float
+ // to integer) functions check for alternate types so as to
+ // down-cast from Object to the correct type.
+ // Note: no checks for item index being valid are performed
+
+ public LSL_Types.LSLFloat GetLSLFloatItem( int itemIndex )
+ {
+ if (m_data[itemIndex] is LSL_Types.LSLInteger)
+ {
+ return (LSL_Types.LSLInteger)m_data[itemIndex];
+ }
+ else
+ {
+ return (LSL_Types.LSLFloat)m_data[itemIndex];
+ }
+ }
+
+ public LSL_Types.LSLString GetLSLStringItem(int itemIndex)
+ {
+ if (m_data[itemIndex] is LSL_Types.key)
+ {
+ return (LSL_Types.key)m_data[itemIndex];
+ }
+ else
+ {
+ return (LSL_Types.LSLString)m_data[itemIndex];
+ }
+ }
+
+ public LSL_Types.LSLInteger GetLSLIntegerItem(int itemIndex)
+ {
+ return (LSL_Types.LSLInteger)m_data[itemIndex];
+ }
+
+ public LSL_Types.Vector3 GetVector3Item(int itemIndex)
+ {
+ return (LSL_Types.Vector3)m_data[itemIndex];
+ }
+
+ public LSL_Types.Quaternion GetQuaternionItem(int itemIndex)
+ {
+ return (LSL_Types.Quaternion)m_data[itemIndex];
+ }
+
+ public LSL_Types.key GetKeyItem(int itemIndex)
+ {
+ return (LSL_Types.key)m_data[itemIndex];
+ }
+
+
public static list operator +(list a, list b)
{
object[] tmp;
@@ -1164,7 +1216,12 @@ namespace OpenSim.Region.ScriptEngine.Shared
static public implicit operator String(key k)
{
- return k.value;
+ return k.value;
+ }
+
+ static public implicit operator LSLString(key k)
+ {
+ return k.value;
}
public static bool operator ==(key k1, key k2)
@@ -1190,6 +1247,11 @@ namespace OpenSim.Region.ScriptEngine.Shared
return value.GetHashCode();
}
+ public override string ToString()
+ {
+ return value;
+ }
+
#endregion
}
diff --git a/OpenSim/Tests/Region/ScriptEngine/Shared/LSL_TypesTestList.cs b/OpenSim/Tests/Region/ScriptEngine/Shared/LSL_TypesTestList.cs
index 9e8d7169f6..ca59c97eff 100644
--- a/OpenSim/Tests/Region/ScriptEngine/Shared/LSL_TypesTestList.cs
+++ b/OpenSim/Tests/Region/ScriptEngine/Shared/LSL_TypesTestList.cs
@@ -157,6 +157,105 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
Assert.AreEqual(testValue, (LSL_Types.Quaternion)testList.Data[0]);
}
+//====================================================================================
+ ///
+ /// Tests GetLSLIntegerItem for LSLInteger item.
+ ///
+ [Test]
+ public void TestGetLSLIntegerItemForLSLIntegerItem()
+ {
+ LSL_Types.LSLInteger testValue = new LSL_Types.LSLInteger(999911);
+ LSL_Types.list testList = new LSL_Types.list(testValue);
+
+ Assert.AreEqual(testValue, testList.GetLSLIntegerItem(0));
+ }
+
+ ///
+ /// Tests GetLSLFloatItem for LSLFloat item.
+ ///
+ [Test]
+ public void TestGetLSLFloatItemForLSLFloatItem()
+ {
+ LSL_Types.LSLFloat testValue = new LSL_Types.LSLFloat(321.45687876);
+ LSL_Types.list testList = new LSL_Types.list(testValue);
+
+ Assert.AreEqual(testValue, testList.GetLSLFloatItem(0));
+ }
+
+ ///
+ /// Tests GetLSLFloatItem for LSLInteger item.
+ ///
+ [Test]
+ public void TestGetLSLFloatItemForLSLIntegerItem()
+ {
+ LSL_Types.LSLInteger testValue = new LSL_Types.LSLInteger(3060987);
+ LSL_Types.LSLFloat testFloatValue = new LSL_Types.LSLFloat(testValue);
+ LSL_Types.list testList = new LSL_Types.list(testValue);
+
+ Assert.AreEqual(testFloatValue, testList.GetLSLFloatItem(0));
+ }
+
+ ///
+ /// Tests GetLSLStringItem for LSLString item.
+ ///
+ [Test]
+ public void TestGetLSLStringItemForLSLStringItem()
+ {
+ LSL_Types.LSLString testValue = new LSL_Types.LSLString("hello all");
+ LSL_Types.list testList = new LSL_Types.list(testValue);
+
+ Assert.AreEqual(testValue, testList.GetLSLStringItem(0));
+ }
+
+ ///
+ /// Tests GetLSLStringItem for key item.
+ ///
+ [Test]
+ public void TestGetLSLStringItemForKeyItem()
+ {
+ LSL_Types.key testValue
+ = new LSL_Types.key("98000000-0000-2222-3333-100000001000");
+ LSL_Types.LSLString testStringValue = new LSL_Types.LSLString(testValue);
+ LSL_Types.list testList = new LSL_Types.list(testValue);
+
+ Assert.AreEqual(testStringValue, testList.GetLSLStringItem(0));
+ }
+
+ ///
+ /// Tests GetVector3Item for Vector3 item.
+ ///
+ [Test]
+ public void TestGetVector3ItemForVector3Item()
+ {
+ LSL_Types.Vector3 testValue = new LSL_Types.Vector3(92.34, 58.98754, -0.10987);
+ LSL_Types.list testList = new LSL_Types.list(testValue);
+
+ Assert.AreEqual(testValue, testList.GetVector3Item(0));
+ }
+ ///
+ /// Tests GetQuaternionItem for Quaternion item.
+ ///
+ [Test]
+ public void TestGetQuaternionItemForQuaternionItem()
+ {
+ LSL_Types.Quaternion testValue = new LSL_Types.Quaternion(12.64, 59.43723, 765.3421, 4.00987);
+ LSL_Types.list testList = new LSL_Types.list(testValue);
+
+ Assert.AreEqual(testValue, testList.GetQuaternionItem(0));
+ }
+
+ ///
+ /// Tests GetKeyItem for key item.
+ ///
+ [Test]
+ public void TestGetKeyItemForKeyItem()
+ {
+ LSL_Types.key testValue
+ = new LSL_Types.key("00000000-0000-2222-3333-100000001012");
+ LSL_Types.list testList = new LSL_Types.list(testValue);
+
+ Assert.AreEqual(testValue, testList.GetKeyItem(0));
+ }
}
}