From cff586df68c01282d1ce6ef2875e342280e3bd1b Mon Sep 17 00:00:00 2001 From: Tedd Hansen Date: Sat, 15 Sep 2007 16:16:57 +0000 Subject: Bugfixed: llListRandomize Implemented: llListSort, llList2ListStrided, llDeleteSubString, llInsertString --- .../Compiler/Server_API/LSL_BuiltIn_Commands.cs | 76 ++++++++++++++++++++-- 1 file changed, 69 insertions(+), 7 deletions(-) (limited to 'OpenSim/Region/ScriptEngine/DotNetEngine') diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/Server_API/LSL_BuiltIn_Commands.cs b/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/Server_API/LSL_BuiltIn_Commands.cs index 80e52c3..f95811e 100644 --- a/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/Server_API/LSL_BuiltIn_Commands.cs +++ b/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/Server_API/LSL_BuiltIn_Commands.cs @@ -13,6 +13,11 @@ using System.Runtime.Remoting.Lifetime; namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler { + // + // !!!IMPORTANT!!! + // + // REMEMBER TO UPDATE http://opensimulator.org/wiki/LlFunction_implementation_status + // /// /// Contains all LSL ll-functions. This class will be in Default AppDomain. @@ -321,9 +326,14 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler return src.Substring(start, end); } - public string llDeleteSubString(string src, int start, int end) { NotImplemented("llDeleteSubString"); return ""; } - public string llInsertString(string dst, int position, string src) { NotImplemented("llInsertString"); return ""; } - + public string llDeleteSubString(string src, int start, int end) + { + return src.Remove(start, end - start); + } + public string llInsertString(string dst, int position, string src) + { + return dst.Insert(position, src); + } public string llToUpper(string src) { return src.ToUpper(); @@ -472,9 +482,40 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler public LSL_Types.Vector3 llGetCenterOfMass() { NotImplemented("llGetCenterOfMass"); return new LSL_Types.Vector3(); } public List llListSort(List src, int stride, int ascending) { - //SortedList sorted = new SortedList(); - //foreach (string s in src) - NotImplemented("llListSort"); return new List(); ; + SortedList> sorted = new SortedList>(); + // Add chunks to an array + int s = stride; + if (s < 1) + s = 1; + int c = 0; + List chunk = new List(); + string chunkString = ""; + foreach (string element in src) + { + c++; + if (c > s) + { + sorted.Add(chunkString, chunk); + chunkString = ""; + chunk = new List(); + c = 0; + } + chunk.Add(element); + chunkString += element.ToString(); + } + if (chunk.Count > 0) + sorted.Add(chunkString, chunk); + + List ret = new List(); + foreach (List ls in sorted.Values) + { + ret.AddRange(ls); + } + + if (ascending == LSL.LSL_BaseClass.TRUE) + return ret; + ret.Reverse(); + return ret; } public int llGetListLength(List src) @@ -587,6 +628,8 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler } chunk.Add(element); } + if (chunk.Count > 0) + tmp.Add(chunk); // Decreate array back into a list int rnd; @@ -605,7 +648,26 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler } - public List llList2ListStrided(List src, int start, int end, int stride) { NotImplemented("llList2ListStrided"); return new List(); } + public List llList2ListStrided(List src, int start, int end, int stride) + { + List ret = new List(); + int s = stride; + if (s < 1) + s = 1; + + int sc = s; + for (int i = start; i < src.Count; i++) { + sc--; + if (sc ==0) { + sc = s; + // Addthis + ret.Add(src[i]); + } + if (i == end) + break; + } + return ret; + } public LSL_Types.Vector3 llGetRegionCorner() { -- cgit v1.1