diff options
author | Teravus Ovares | 2008-05-30 12:27:06 +0000 |
---|---|---|
committer | Teravus Ovares | 2008-05-30 12:27:06 +0000 |
commit | 1a47ff8094ee414a47aebd310826906d89428a09 (patch) | |
tree | 0e90b3a33f43ff8617a077bb57b86d6b28e63e71 /OpenSim/Region | |
parent | * Fixed a dangling event hook that I added. (diff) | |
download | opensim-SC_OLD-1a47ff8094ee414a47aebd310826906d89428a09.zip opensim-SC_OLD-1a47ff8094ee414a47aebd310826906d89428a09.tar.gz opensim-SC_OLD-1a47ff8094ee414a47aebd310826906d89428a09.tar.bz2 opensim-SC_OLD-1a47ff8094ee414a47aebd310826906d89428a09.tar.xz |
* This is Melanie's XEngine script engine. I've not tested this real well, however, it's confirmed to compile and OpenSimulator to run successfully without this script engine active.
Diffstat (limited to '')
22 files changed, 15908 insertions, 0 deletions
diff --git a/OpenSim/Region/ScriptEngine/XEngine/AsyncCommandManager.cs b/OpenSim/Region/ScriptEngine/XEngine/AsyncCommandManager.cs new file mode 100644 index 0000000..4ec7916 --- /dev/null +++ b/OpenSim/Region/ScriptEngine/XEngine/AsyncCommandManager.cs | |||
@@ -0,0 +1,270 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSim Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.Collections; | ||
30 | using System.Collections.Generic; | ||
31 | using System.Threading; | ||
32 | using libsecondlife; | ||
33 | using OpenSim.Framework; | ||
34 | using OpenSim.Region.Environment.Interfaces; | ||
35 | using OpenSim.Region.ScriptEngine.XEngine.AsyncCommandPlugins; | ||
36 | using Timer=OpenSim.Region.ScriptEngine.XEngine.AsyncCommandPlugins.Timer; | ||
37 | using Dataserver=OpenSim.Region.ScriptEngine.XEngine.AsyncCommandPlugins.Dataserver; | ||
38 | |||
39 | namespace OpenSim.Region.ScriptEngine.XEngine | ||
40 | { | ||
41 | /// <summary> | ||
42 | /// Handles LSL commands that takes long time and returns an event, for example timers, HTTP requests, etc. | ||
43 | /// </summary> | ||
44 | public class AsyncCommandManager | ||
45 | { | ||
46 | private static Thread cmdHandlerThread; | ||
47 | private static int cmdHandlerThreadCycleSleepms; | ||
48 | |||
49 | public XEngine m_ScriptEngine; | ||
50 | |||
51 | public Dataserver m_Dataserver; | ||
52 | public Timer m_Timer; | ||
53 | public HttpRequest m_HttpRequest; | ||
54 | public Listener m_Listener; | ||
55 | public SensorRepeat m_SensorRepeat; | ||
56 | public XmlRequest m_XmlRequest; | ||
57 | |||
58 | public AsyncCommandManager(XEngine _ScriptEngine) | ||
59 | { | ||
60 | m_ScriptEngine = _ScriptEngine; | ||
61 | ReadConfig(); | ||
62 | |||
63 | // Create instances of all plugins | ||
64 | m_Dataserver = new Dataserver(this); | ||
65 | m_Timer = new Timer(this); | ||
66 | m_HttpRequest = new HttpRequest(this); | ||
67 | m_Listener = new Listener(this); | ||
68 | m_SensorRepeat = new SensorRepeat(this); | ||
69 | m_XmlRequest = new XmlRequest(this); | ||
70 | |||
71 | StartThread(); | ||
72 | } | ||
73 | |||
74 | private static void StartThread() | ||
75 | { | ||
76 | if (cmdHandlerThread == null) | ||
77 | { | ||
78 | // Start the thread that will be doing the work | ||
79 | cmdHandlerThread = new Thread(CmdHandlerThreadLoop); | ||
80 | cmdHandlerThread.Name = "AsyncLSLCmdHandlerThread"; | ||
81 | cmdHandlerThread.Priority = ThreadPriority.BelowNormal; | ||
82 | cmdHandlerThread.IsBackground = true; | ||
83 | cmdHandlerThread.Start(); | ||
84 | ThreadTracker.Add(cmdHandlerThread); | ||
85 | } | ||
86 | } | ||
87 | |||
88 | public void ReadConfig() | ||
89 | { | ||
90 | cmdHandlerThreadCycleSleepms = m_ScriptEngine.ScriptConfigSource.GetInt("AsyncLLCommandLoopms", 100); | ||
91 | } | ||
92 | |||
93 | ~AsyncCommandManager() | ||
94 | { | ||
95 | // Shut down thread | ||
96 | try | ||
97 | { | ||
98 | if (cmdHandlerThread != null) | ||
99 | { | ||
100 | if (cmdHandlerThread.IsAlive == true) | ||
101 | { | ||
102 | cmdHandlerThread.Abort(); | ||
103 | //cmdHandlerThread.Join(); | ||
104 | } | ||
105 | } | ||
106 | } | ||
107 | catch | ||
108 | { | ||
109 | } | ||
110 | } | ||
111 | |||
112 | private static void CmdHandlerThreadLoop() | ||
113 | { | ||
114 | while (true) | ||
115 | { | ||
116 | try | ||
117 | { | ||
118 | while (true) | ||
119 | { | ||
120 | Thread.Sleep(cmdHandlerThreadCycleSleepms); | ||
121 | |||
122 | foreach (XEngine xe in XEngine.ScriptEngines) | ||
123 | { | ||
124 | xe.m_ASYNCLSLCommandManager.DoOneCmdHandlerPass(); | ||
125 | } | ||
126 | } | ||
127 | } | ||
128 | catch | ||
129 | { | ||
130 | } | ||
131 | } | ||
132 | } | ||
133 | |||
134 | internal void DoOneCmdHandlerPass() | ||
135 | { | ||
136 | // Check timers | ||
137 | m_Timer.CheckTimerEvents(); | ||
138 | // Check HttpRequests | ||
139 | m_HttpRequest.CheckHttpRequests(); | ||
140 | // Check XMLRPCRequests | ||
141 | m_XmlRequest.CheckXMLRPCRequests(); | ||
142 | // Check Listeners | ||
143 | m_Listener.CheckListeners(); | ||
144 | // Check Sensors | ||
145 | m_SensorRepeat.CheckSenseRepeaterEvents(); | ||
146 | // Check dataserver | ||
147 | m_Dataserver.ExpireRequests(); | ||
148 | } | ||
149 | |||
150 | /// <summary> | ||
151 | /// Remove a specific script (and all its pending commands) | ||
152 | /// </summary> | ||
153 | /// <param name="localID"></param> | ||
154 | /// <param name="itemID"></param> | ||
155 | public void RemoveScript(uint localID, LLUUID itemID) | ||
156 | { | ||
157 | // Remove a specific script | ||
158 | |||
159 | // Remove dataserver events | ||
160 | m_Dataserver.RemoveEvents(localID, itemID); | ||
161 | |||
162 | // Remove from: Timers | ||
163 | m_Timer.UnSetTimerEvents(localID, itemID); | ||
164 | |||
165 | // Remove from: HttpRequest | ||
166 | IHttpRequests iHttpReq = | ||
167 | m_ScriptEngine.World.RequestModuleInterface<IHttpRequests>(); | ||
168 | iHttpReq.StopHttpRequest(localID, itemID); | ||
169 | |||
170 | IWorldComm comms = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); | ||
171 | comms.DeleteListener(itemID); | ||
172 | |||
173 | IXMLRPC xmlrpc = m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>(); | ||
174 | xmlrpc.DeleteChannels(itemID); | ||
175 | xmlrpc.CancelSRDRequests(itemID); | ||
176 | |||
177 | // Remove Sensors | ||
178 | m_SensorRepeat.UnSetSenseRepeaterEvents(localID, itemID); | ||
179 | |||
180 | } | ||
181 | |||
182 | public Object[] GetSerializationData(LLUUID itemID) | ||
183 | { | ||
184 | List<Object> data = new List<Object>(); | ||
185 | |||
186 | Object[] listeners=m_Listener.GetSerializationData(itemID); | ||
187 | if(listeners.Length > 0) | ||
188 | { | ||
189 | data.Add("listener"); | ||
190 | data.Add(listeners.Length); | ||
191 | data.AddRange(listeners); | ||
192 | } | ||
193 | |||
194 | Object[] timers=m_Timer.GetSerializationData(itemID); | ||
195 | if(timers.Length > 0) | ||
196 | { | ||
197 | data.Add("timer"); | ||
198 | data.Add(timers.Length); | ||
199 | data.AddRange(timers); | ||
200 | } | ||
201 | |||
202 | Object[] sensors=m_SensorRepeat.GetSerializationData(itemID); | ||
203 | if(sensors.Length > 0) | ||
204 | { | ||
205 | data.Add("sensor"); | ||
206 | data.Add(sensors.Length); | ||
207 | data.AddRange(sensors); | ||
208 | } | ||
209 | |||
210 | return data.ToArray(); | ||
211 | } | ||
212 | |||
213 | public void CreateFromData(uint localID, LLUUID itemID, LLUUID hostID, | ||
214 | Object[] data) | ||
215 | { | ||
216 | int idx=0; | ||
217 | int len; | ||
218 | |||
219 | while(idx < data.Length) | ||
220 | { | ||
221 | string type = data[idx].ToString(); | ||
222 | len = (int)data[idx+1]; | ||
223 | idx+=2; | ||
224 | |||
225 | if(len > 0) | ||
226 | { | ||
227 | Object[] item = new Object[len]; | ||
228 | Array.Copy(data, idx, item, 0, len); | ||
229 | |||
230 | idx+=len; | ||
231 | |||
232 | switch(type) | ||
233 | { | ||
234 | case "listener": | ||
235 | m_Listener.CreateFromData(localID, itemID, hostID, | ||
236 | item); | ||
237 | break; | ||
238 | case "timer": | ||
239 | m_Timer.CreateFromData(localID, itemID, hostID, item); | ||
240 | break; | ||
241 | case "sensor": | ||
242 | m_SensorRepeat.CreateFromData(localID, itemID, hostID, | ||
243 | item); | ||
244 | break; | ||
245 | } | ||
246 | } | ||
247 | } | ||
248 | } | ||
249 | |||
250 | #region Check llRemoteData channels | ||
251 | |||
252 | |||
253 | #endregion | ||
254 | |||
255 | #region Check llListeners | ||
256 | |||
257 | |||
258 | #endregion | ||
259 | |||
260 | /// <summary> | ||
261 | /// If set to true then threads and stuff should try to make a graceful exit | ||
262 | /// </summary> | ||
263 | public bool PleaseShutdown | ||
264 | { | ||
265 | get { return _PleaseShutdown; } | ||
266 | set { _PleaseShutdown = value; } | ||
267 | } | ||
268 | private bool _PleaseShutdown = false; | ||
269 | } | ||
270 | } | ||
diff --git a/OpenSim/Region/ScriptEngine/XEngine/AsyncCommandPlugins/Dataserver.cs b/OpenSim/Region/ScriptEngine/XEngine/AsyncCommandPlugins/Dataserver.cs new file mode 100644 index 0000000..794a015 --- /dev/null +++ b/OpenSim/Region/ScriptEngine/XEngine/AsyncCommandPlugins/Dataserver.cs | |||
@@ -0,0 +1,127 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSim Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.Collections; | ||
30 | using System.Collections.Generic; | ||
31 | using libsecondlife; | ||
32 | using OpenSim.Region.ScriptEngine.XEngine.Script; | ||
33 | |||
34 | namespace OpenSim.Region.ScriptEngine.XEngine.AsyncCommandPlugins | ||
35 | { | ||
36 | public class Dataserver | ||
37 | { | ||
38 | public AsyncCommandManager m_CmdManager; | ||
39 | |||
40 | private Dictionary<string, DataserverRequest> DataserverRequests = | ||
41 | new Dictionary<string, DataserverRequest>(); | ||
42 | |||
43 | public Dataserver(AsyncCommandManager CmdManager) | ||
44 | { | ||
45 | m_CmdManager = CmdManager; | ||
46 | } | ||
47 | |||
48 | private class DataserverRequest | ||
49 | { | ||
50 | public uint localID; | ||
51 | public LLUUID itemID; | ||
52 | |||
53 | public LLUUID ID; | ||
54 | public string handle; | ||
55 | |||
56 | public DateTime startTime; | ||
57 | } | ||
58 | |||
59 | public LLUUID RegisterRequest(uint localID, LLUUID itemID, | ||
60 | string identifier) | ||
61 | { | ||
62 | lock(DataserverRequests) | ||
63 | { | ||
64 | if(DataserverRequests.ContainsKey(identifier)) | ||
65 | return LLUUID.Zero; | ||
66 | |||
67 | DataserverRequest ds = new DataserverRequest(); | ||
68 | |||
69 | ds.localID = localID; | ||
70 | ds.itemID = itemID; | ||
71 | |||
72 | ds.ID = LLUUID.Random(); | ||
73 | ds.handle = identifier; | ||
74 | |||
75 | ds.startTime = DateTime.Now; | ||
76 | |||
77 | DataserverRequests[identifier]=ds; | ||
78 | |||
79 | return ds.ID; | ||
80 | } | ||
81 | } | ||
82 | |||
83 | public void DataserverReply(string identifier, string reply) | ||
84 | { | ||
85 | DataserverRequest ds; | ||
86 | |||
87 | lock(DataserverRequests) | ||
88 | { | ||
89 | if(!DataserverRequests.ContainsKey(identifier)) | ||
90 | return; | ||
91 | |||
92 | ds=DataserverRequests[identifier]; | ||
93 | DataserverRequests.Remove(identifier); | ||
94 | } | ||
95 | |||
96 | m_CmdManager.m_ScriptEngine.PostObjectEvent(ds.localID, | ||
97 | new XEventParams( "dataserver", new Object[] | ||
98 | { new LSL_Types.LSLString(ds.ID.ToString()), | ||
99 | new LSL_Types.LSLString(reply)}, | ||
100 | new XDetectParams[0])); | ||
101 | } | ||
102 | |||
103 | public void RemoveEvents(uint localID, LLUUID itemID) | ||
104 | { | ||
105 | lock(DataserverRequests) | ||
106 | { | ||
107 | foreach (DataserverRequest ds in new List<DataserverRequest>(DataserverRequests.Values)) | ||
108 | { | ||
109 | if(ds.itemID == itemID) | ||
110 | DataserverRequests.Remove(ds.handle); | ||
111 | } | ||
112 | } | ||
113 | } | ||
114 | |||
115 | public void ExpireRequests() | ||
116 | { | ||
117 | lock(DataserverRequests) | ||
118 | { | ||
119 | foreach (DataserverRequest ds in new List<DataserverRequest>(DataserverRequests.Values)) | ||
120 | { | ||
121 | if(ds.startTime > DateTime.Now.AddSeconds(30)) | ||
122 | DataserverRequests.Remove(ds.handle); | ||
123 | } | ||
124 | } | ||
125 | } | ||
126 | } | ||
127 | } | ||
diff --git a/OpenSim/Region/ScriptEngine/XEngine/AsyncCommandPlugins/Eventstream.cs b/OpenSim/Region/ScriptEngine/XEngine/AsyncCommandPlugins/Eventstream.cs new file mode 100644 index 0000000..9112b9c --- /dev/null +++ b/OpenSim/Region/ScriptEngine/XEngine/AsyncCommandPlugins/Eventstream.cs | |||
@@ -0,0 +1,76 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSim Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.Collections; | ||
30 | using System.Collections.Generic; | ||
31 | using libsecondlife; | ||
32 | using OpenSim.Region.Environment.Scenes; | ||
33 | |||
34 | namespace OpenSim.Region.ScriptEngine.XEngine.AsyncCommandPlugins | ||
35 | { | ||
36 | public class Eventstream | ||
37 | { | ||
38 | public AsyncCommandManager m_CmdManager; | ||
39 | |||
40 | private class Event | ||
41 | { | ||
42 | public uint LocalID; | ||
43 | public string EventName; | ||
44 | public Dictionary<LLUUID, XDetectParams> DetectParams; | ||
45 | } | ||
46 | |||
47 | private Dictionary<uint, Dictionary<string, Event> > m_Events = | ||
48 | new Dictionary<uint, Dictionary<string, Event> >(); | ||
49 | |||
50 | public Eventstream(AsyncCommandManager CmdManager) | ||
51 | { | ||
52 | m_CmdManager = CmdManager; | ||
53 | } | ||
54 | |||
55 | public void AddObjectEvent(uint localID, string eventName, XDetectParams det) | ||
56 | { | ||
57 | SceneObjectPart part = m_CmdManager.m_ScriptEngine.World. | ||
58 | GetSceneObjectPart(localID); | ||
59 | |||
60 | if(part == null) // Can't register events for non-prims | ||
61 | return; | ||
62 | |||
63 | if(!part.ContainsScripts()) | ||
64 | return; | ||
65 | |||
66 | } | ||
67 | |||
68 | public void RemoveObjectEvent(uint localID, string eventName, LLUUID id) | ||
69 | { | ||
70 | } | ||
71 | |||
72 | public void RemoveObjects(uint localID) | ||
73 | { | ||
74 | } | ||
75 | } | ||
76 | } | ||
diff --git a/OpenSim/Region/ScriptEngine/XEngine/AsyncCommandPlugins/HttpRequest.cs b/OpenSim/Region/ScriptEngine/XEngine/AsyncCommandPlugins/HttpRequest.cs new file mode 100644 index 0000000..977e3f9 --- /dev/null +++ b/OpenSim/Region/ScriptEngine/XEngine/AsyncCommandPlugins/HttpRequest.cs | |||
@@ -0,0 +1,89 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSim Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using OpenSim.Region.Environment.Interfaces; | ||
30 | using OpenSim.Region.Environment.Modules.Scripting.HttpRequest; | ||
31 | using OpenSim.Region.ScriptEngine.XEngine.Script; | ||
32 | |||
33 | namespace OpenSim.Region.ScriptEngine.XEngine.AsyncCommandPlugins | ||
34 | { | ||
35 | public class HttpRequest | ||
36 | { | ||
37 | public AsyncCommandManager m_CmdManager; | ||
38 | |||
39 | public HttpRequest(AsyncCommandManager CmdManager) | ||
40 | { | ||
41 | m_CmdManager = CmdManager; | ||
42 | } | ||
43 | |||
44 | public void CheckHttpRequests() | ||
45 | { | ||
46 | if (m_CmdManager.m_ScriptEngine.World == null) | ||
47 | return; | ||
48 | |||
49 | IHttpRequests iHttpReq = | ||
50 | m_CmdManager.m_ScriptEngine.World.RequestModuleInterface<IHttpRequests>(); | ||
51 | |||
52 | HttpRequestClass httpInfo = null; | ||
53 | |||
54 | if (iHttpReq != null) | ||
55 | httpInfo = iHttpReq.GetNextCompletedRequest(); | ||
56 | |||
57 | while (httpInfo != null) | ||
58 | { | ||
59 | //m_ScriptEngine.Log.Info("[AsyncLSL]:" + httpInfo.response_body + httpInfo.status); | ||
60 | |||
61 | // Deliver data to prim's remote_data handler | ||
62 | // | ||
63 | // TODO: Returning null for metadata, since the lsl function | ||
64 | // only returns the byte for HTTP_BODY_TRUNCATED, which is not | ||
65 | // implemented here yet anyway. Should be fixed if/when maxsize | ||
66 | // is supported | ||
67 | |||
68 | iHttpReq.RemoveCompletedRequest(httpInfo.reqID); | ||
69 | |||
70 | object[] resobj = new object[] | ||
71 | { | ||
72 | new LSL_Types.LSLString(httpInfo.reqID.ToString()), | ||
73 | new LSL_Types.LSLInteger(httpInfo.status), | ||
74 | new LSL_Types.list(), | ||
75 | new LSL_Types.LSLString(httpInfo.response_body) | ||
76 | }; | ||
77 | |||
78 | foreach (XEngine xe in XEngine.ScriptEngines) | ||
79 | { | ||
80 | if(xe.PostObjectEvent(httpInfo.localID, | ||
81 | new XEventParams("http_response", | ||
82 | resobj, new XDetectParams[0]))) | ||
83 | break; | ||
84 | } | ||
85 | httpInfo = iHttpReq.GetNextCompletedRequest(); | ||
86 | } | ||
87 | } | ||
88 | } | ||
89 | } | ||
diff --git a/OpenSim/Region/ScriptEngine/XEngine/AsyncCommandPlugins/Listener.cs b/OpenSim/Region/ScriptEngine/XEngine/AsyncCommandPlugins/Listener.cs new file mode 100644 index 0000000..1144c00 --- /dev/null +++ b/OpenSim/Region/ScriptEngine/XEngine/AsyncCommandPlugins/Listener.cs | |||
@@ -0,0 +1,91 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSim Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using libsecondlife; | ||
30 | using OpenSim.Region.Environment.Interfaces; | ||
31 | using OpenSim.Region.Environment.Modules.Scripting.WorldComm; | ||
32 | using OpenSim.Region.ScriptEngine.XEngine.Script; | ||
33 | |||
34 | namespace OpenSim.Region.ScriptEngine.XEngine.AsyncCommandPlugins | ||
35 | { | ||
36 | public class Listener | ||
37 | { | ||
38 | // private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); | ||
39 | |||
40 | public AsyncCommandManager m_CmdManager; | ||
41 | |||
42 | public Listener(AsyncCommandManager CmdManager) | ||
43 | { | ||
44 | m_CmdManager = CmdManager; | ||
45 | } | ||
46 | |||
47 | public void CheckListeners() | ||
48 | { | ||
49 | if (m_CmdManager.m_ScriptEngine.World == null) | ||
50 | return; | ||
51 | IWorldComm comms = m_CmdManager.m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); | ||
52 | |||
53 | if (comms != null) | ||
54 | { | ||
55 | while (comms.HasMessages()) | ||
56 | { | ||
57 | ListenerInfo lInfo = comms.GetNextMessage(); | ||
58 | |||
59 | //Deliver data to prim's listen handler | ||
60 | object[] resobj = new object[] | ||
61 | { | ||
62 | new LSL_Types.LSLInteger(lInfo.GetChannel()), | ||
63 | new LSL_Types.LSLString(lInfo.GetName()), | ||
64 | new LSL_Types.LSLString(lInfo.GetID().ToString()), | ||
65 | new LSL_Types.LSLString(lInfo.GetMessage()) | ||
66 | }; | ||
67 | |||
68 | m_CmdManager.m_ScriptEngine.PostScriptEvent( | ||
69 | lInfo.GetItemID(), new XEventParams( | ||
70 | "listen", resobj, | ||
71 | new XDetectParams[0])); | ||
72 | } | ||
73 | } | ||
74 | } | ||
75 | |||
76 | public Object[] GetSerializationData(LLUUID itemID) | ||
77 | { | ||
78 | IWorldComm comms = m_CmdManager.m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); | ||
79 | |||
80 | return comms.GetSerializationData(itemID); | ||
81 | } | ||
82 | |||
83 | public void CreateFromData(uint localID, LLUUID itemID, LLUUID hostID, | ||
84 | Object[] data) | ||
85 | { | ||
86 | IWorldComm comms = m_CmdManager.m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); | ||
87 | |||
88 | comms.CreateFromData(localID, itemID, hostID, data); | ||
89 | } | ||
90 | } | ||
91 | } | ||
diff --git a/OpenSim/Region/ScriptEngine/XEngine/AsyncCommandPlugins/SensorRepeat.cs b/OpenSim/Region/ScriptEngine/XEngine/AsyncCommandPlugins/SensorRepeat.cs new file mode 100644 index 0000000..5a87bb0 --- /dev/null +++ b/OpenSim/Region/ScriptEngine/XEngine/AsyncCommandPlugins/SensorRepeat.cs | |||
@@ -0,0 +1,391 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSim Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.Collections.Generic; | ||
30 | using libsecondlife; | ||
31 | using OpenSim.Framework; | ||
32 | using OpenSim.Region.Environment.Scenes; | ||
33 | using OpenSim.Region.ScriptEngine.XEngine.Script; | ||
34 | |||
35 | namespace OpenSim.Region.ScriptEngine.XEngine.AsyncCommandPlugins | ||
36 | { | ||
37 | public class SensorRepeat | ||
38 | { | ||
39 | public AsyncCommandManager m_CmdManager; | ||
40 | |||
41 | public SensorRepeat(AsyncCommandManager CmdManager) | ||
42 | { | ||
43 | m_CmdManager = CmdManager; | ||
44 | } | ||
45 | |||
46 | public Dictionary<uint, Dictionary<LLUUID, LSL_Types.list>> SenseEvents = | ||
47 | new Dictionary<uint, Dictionary<LLUUID, LSL_Types.list>>(); | ||
48 | private Object SenseLock = new Object(); | ||
49 | |||
50 | // | ||
51 | // SenseRepeater and Sensors | ||
52 | // | ||
53 | private class SenseRepeatClass | ||
54 | { | ||
55 | public uint localID; | ||
56 | public LLUUID itemID; | ||
57 | public double interval; | ||
58 | public DateTime next; | ||
59 | |||
60 | public string name; | ||
61 | public LLUUID keyID; | ||
62 | public int type; | ||
63 | public double range; | ||
64 | public double arc; | ||
65 | public SceneObjectPart host; | ||
66 | } | ||
67 | |||
68 | private List<SenseRepeatClass> SenseRepeaters = new List<SenseRepeatClass>(); | ||
69 | private object SenseRepeatListLock = new object(); | ||
70 | |||
71 | public void SetSenseRepeatEvent(uint m_localID, LLUUID m_itemID, | ||
72 | string name, LLUUID keyID, int type, double range, double arc, double sec, SceneObjectPart host) | ||
73 | { | ||
74 | Console.WriteLine("SetSensorEvent"); | ||
75 | |||
76 | // Always remove first, in case this is a re-set | ||
77 | UnSetSenseRepeaterEvents(m_localID, m_itemID); | ||
78 | if (sec == 0) // Disabling timer | ||
79 | return; | ||
80 | |||
81 | // Add to timer | ||
82 | SenseRepeatClass ts = new SenseRepeatClass(); | ||
83 | ts.localID = m_localID; | ||
84 | ts.itemID = m_itemID; | ||
85 | ts.interval = sec; | ||
86 | ts.name = name; | ||
87 | ts.keyID = keyID; | ||
88 | ts.type = type; | ||
89 | ts.range = range; | ||
90 | ts.arc = arc; | ||
91 | ts.host = host; | ||
92 | |||
93 | ts.next = DateTime.Now.ToUniversalTime().AddSeconds(ts.interval); | ||
94 | lock (SenseRepeatListLock) | ||
95 | { | ||
96 | SenseRepeaters.Add(ts); | ||
97 | } | ||
98 | } | ||
99 | |||
100 | public void UnSetSenseRepeaterEvents(uint m_localID, LLUUID m_itemID) | ||
101 | { | ||
102 | // Remove from timer | ||
103 | lock (SenseRepeatListLock) | ||
104 | { | ||
105 | List<SenseRepeatClass> NewSensors = new List<SenseRepeatClass>(); | ||
106 | foreach (SenseRepeatClass ts in SenseRepeaters) | ||
107 | { | ||
108 | if (ts.localID != m_localID && ts.itemID != m_itemID) | ||
109 | { | ||
110 | NewSensors.Add(ts); | ||
111 | } | ||
112 | } | ||
113 | SenseRepeaters.Clear(); | ||
114 | SenseRepeaters = NewSensors; | ||
115 | } | ||
116 | } | ||
117 | |||
118 | public void CheckSenseRepeaterEvents() | ||
119 | { | ||
120 | // Nothing to do here? | ||
121 | if (SenseRepeaters.Count == 0) | ||
122 | return; | ||
123 | |||
124 | lock (SenseRepeatListLock) | ||
125 | { | ||
126 | // Go through all timers | ||
127 | foreach (SenseRepeatClass ts in SenseRepeaters) | ||
128 | { | ||
129 | // Time has passed? | ||
130 | if (ts.next.ToUniversalTime() < DateTime.Now.ToUniversalTime()) | ||
131 | { | ||
132 | SensorSweep(ts); | ||
133 | // set next interval | ||
134 | ts.next = DateTime.Now.ToUniversalTime().AddSeconds(ts.interval); | ||
135 | } | ||
136 | } | ||
137 | } // lock | ||
138 | } | ||
139 | |||
140 | public void SenseOnce(uint m_localID, LLUUID m_itemID, | ||
141 | string name, LLUUID keyID, int type, | ||
142 | double range, double arc, SceneObjectPart host) | ||
143 | { | ||
144 | // Add to timer | ||
145 | SenseRepeatClass ts = new SenseRepeatClass(); | ||
146 | ts.localID = m_localID; | ||
147 | ts.itemID = m_itemID; | ||
148 | ts.interval = 0; | ||
149 | ts.name = name; | ||
150 | ts.keyID = keyID; | ||
151 | ts.type = type; | ||
152 | ts.range = range; | ||
153 | ts.arc = arc; | ||
154 | ts.host = host; | ||
155 | SensorSweep(ts); | ||
156 | } | ||
157 | |||
158 | public LSL_Types.list GetSensorList(uint m_localID, LLUUID m_itemID) | ||
159 | { | ||
160 | lock (SenseLock) | ||
161 | { | ||
162 | Dictionary<LLUUID, LSL_Types.list> Obj = null; | ||
163 | if (!SenseEvents.TryGetValue(m_localID, out Obj)) | ||
164 | { | ||
165 | m_CmdManager.m_ScriptEngine.Log.Info("[AsyncLSL]: GetSensorList missing localID: " + m_localID); | ||
166 | return null; | ||
167 | } | ||
168 | lock (Obj) | ||
169 | { | ||
170 | // Get script | ||
171 | LSL_Types.list SenseList = null; | ||
172 | if (!Obj.TryGetValue(m_itemID, out SenseList)) | ||
173 | { | ||
174 | m_CmdManager.m_ScriptEngine.Log.Info("[AsyncLSL]: GetSensorList missing itemID: " + m_itemID); | ||
175 | return null; | ||
176 | } | ||
177 | return SenseList; | ||
178 | } | ||
179 | } | ||
180 | } | ||
181 | |||
182 | private void SensorSweep(SenseRepeatClass ts) | ||
183 | { | ||
184 | //m_ScriptEngine.Log.Info("[AsyncLSL]:Enter SensorSweep"); | ||
185 | SceneObjectPart SensePoint = ts.host; | ||
186 | |||
187 | if (SensePoint == null) | ||
188 | { | ||
189 | //m_ScriptEngine.Log.Info("[AsyncLSL]: Enter SensorSweep (SensePoint == null) for "+ts.itemID.ToString()); | ||
190 | return; | ||
191 | } | ||
192 | //m_ScriptEngine.Log.Info("[AsyncLSL]: Enter SensorSweep Scan"); | ||
193 | |||
194 | LLVector3 sensorPos = SensePoint.AbsolutePosition; | ||
195 | LLVector3 regionPos = new LLVector3(m_CmdManager.m_ScriptEngine.World.RegionInfo.RegionLocX * Constants.RegionSize, m_CmdManager.m_ScriptEngine.World.RegionInfo.RegionLocY * Constants.RegionSize, 0); | ||
196 | LLVector3 fromRegionPos = sensorPos + regionPos; | ||
197 | |||
198 | LLQuaternion q = SensePoint.RotationOffset; | ||
199 | LSL_Types.Quaternion r = new LSL_Types.Quaternion(q.X, q.Y, q.Z, q.W); | ||
200 | LSL_Types.Vector3 forward_dir = (new LSL_Types.Vector3(1, 0, 0) * r); | ||
201 | double mag_fwd = LSL_Types.Vector3.Mag(forward_dir); | ||
202 | |||
203 | // Here we should do some smart culling ... | ||
204 | // math seems quicker than strings so try that first | ||
205 | LSL_Types.list SensedObjects = new LSL_Types.list(); | ||
206 | LSL_Types.Vector3 ZeroVector = new LSL_Types.Vector3(0, 0, 0); | ||
207 | |||
208 | foreach (EntityBase ent in m_CmdManager.m_ScriptEngine.World.Entities.Values) | ||
209 | { | ||
210 | LLVector3 toRegionPos = ent.AbsolutePosition + regionPos; | ||
211 | double dis = Math.Abs((double)Util.GetDistanceTo(toRegionPos, fromRegionPos)); | ||
212 | if (dis <= ts.range) | ||
213 | { | ||
214 | // In Range, is it the right Type ? | ||
215 | int objtype = 0; | ||
216 | |||
217 | if (m_CmdManager.m_ScriptEngine.World.GetScenePresence(ent.UUID) != null) objtype |= 0x01; // actor | ||
218 | if (ent.Velocity.Equals(ZeroVector)) | ||
219 | objtype |= 0x04; // passive non-moving | ||
220 | else | ||
221 | objtype |= 0x02; // active moving | ||
222 | if (ent is IScript) objtype |= 0x08; // Scripted. It COULD have one hidden ... | ||
223 | |||
224 | if (((ts.type & objtype) != 0) || ((ts.type & objtype) == ts.type)) | ||
225 | { | ||
226 | // docs claim AGENT|ACTIVE should find agent objects OR active objects | ||
227 | // so the bitwise AND with object type should be non-zero | ||
228 | |||
229 | // Right type too, what about the other params , key and name ? | ||
230 | bool keep = true; | ||
231 | if (ts.arc < Math.PI) | ||
232 | { | ||
233 | // not omni-directional. Can you see it ? | ||
234 | // vec forward_dir = llRot2Fwd(llGetRot()) | ||
235 | // vec obj_dir = toRegionPos-fromRegionPos | ||
236 | // dot=dot(forward_dir,obj_dir) | ||
237 | // mag_fwd = mag(forward_dir) | ||
238 | // mag_obj = mag(obj_dir) | ||
239 | // ang = acos(dot /(mag_fwd*mag_obj)) | ||
240 | double ang_obj = 0; | ||
241 | try | ||
242 | { | ||
243 | LLVector3 diff = toRegionPos - fromRegionPos; | ||
244 | LSL_Types.Vector3 obj_dir = new LSL_Types.Vector3(diff.X, diff.Y, diff.Z); | ||
245 | double dot = LSL_Types.Vector3.Dot(forward_dir, obj_dir); | ||
246 | double mag_obj = LSL_Types.Vector3.Mag(obj_dir); | ||
247 | ang_obj = Math.Acos(dot / (mag_fwd * mag_obj)); | ||
248 | } | ||
249 | catch | ||
250 | { | ||
251 | } | ||
252 | |||
253 | if (ang_obj > ts.arc) keep = false; | ||
254 | } | ||
255 | |||
256 | if (keep && (ts.keyID != LLUUID.Zero) && (ts.keyID != ent.UUID)) | ||
257 | { | ||
258 | keep = false; | ||
259 | } | ||
260 | |||
261 | if (keep && (ts.name.Length > 0)) | ||
262 | { | ||
263 | string avatarname=null; | ||
264 | string objectname=null; | ||
265 | string entname =ent.Name; | ||
266 | |||
267 | // try avatar username surname | ||
268 | UserProfileData profile = m_CmdManager.m_ScriptEngine.World.CommsManager.UserService.GetUserProfile(ent.UUID); | ||
269 | if (profile != null) | ||
270 | { | ||
271 | avatarname = profile.FirstName + " " + profile.SurName; | ||
272 | } | ||
273 | // try an scene object | ||
274 | SceneObjectPart SOP = m_CmdManager.m_ScriptEngine.World.GetSceneObjectPart(ent.UUID); | ||
275 | if (SOP != null) | ||
276 | { | ||
277 | objectname = SOP.Name; | ||
278 | } | ||
279 | |||
280 | if ((ts.name != entname) && (ts.name != avatarname) && (ts.name != objectname)) | ||
281 | { | ||
282 | keep = false; | ||
283 | } | ||
284 | } | ||
285 | |||
286 | if (keep == true) SensedObjects.Add(ent.UUID); | ||
287 | } | ||
288 | } | ||
289 | } | ||
290 | //m_ScriptEngine.Log.Info("[AsyncLSL]: Enter SensorSweep SenseLock"); | ||
291 | |||
292 | lock (SenseLock) | ||
293 | { | ||
294 | // Create object if it doesn't exist | ||
295 | if (SenseEvents.ContainsKey(ts.localID) == false) | ||
296 | { | ||
297 | SenseEvents.Add(ts.localID, new Dictionary<LLUUID, LSL_Types.list>()); | ||
298 | } | ||
299 | // clear if previous traces exist | ||
300 | Dictionary<LLUUID, LSL_Types.list> Obj; | ||
301 | SenseEvents.TryGetValue(ts.localID, out Obj); | ||
302 | if (Obj.ContainsKey(ts.itemID) == true) | ||
303 | Obj.Remove(ts.itemID); | ||
304 | |||
305 | // note list may be zero length | ||
306 | Obj.Add(ts.itemID, SensedObjects); | ||
307 | |||
308 | if (SensedObjects.Length == 0) | ||
309 | { | ||
310 | // send a "no_sensor" | ||
311 | // Add it to queue | ||
312 | m_CmdManager.m_ScriptEngine.PostScriptEvent(ts.itemID, | ||
313 | new XEventParams("no_sensor", new Object[0], | ||
314 | new XDetectParams[0])); | ||
315 | } | ||
316 | else | ||
317 | { | ||
318 | XDetectParams[] detect = | ||
319 | new XDetectParams[SensedObjects.Length]; | ||
320 | |||
321 | int idx; | ||
322 | for(idx = 0 ; idx < SensedObjects.Length; idx++) | ||
323 | { | ||
324 | detect[idx].Key=(LLUUID)(SensedObjects.Data[idx]); | ||
325 | } | ||
326 | |||
327 | m_CmdManager.m_ScriptEngine.PostScriptEvent(ts.itemID, | ||
328 | new XEventParams("sensor", | ||
329 | new Object[] { | ||
330 | new LSL_Types.LSLInteger(SensedObjects.Length) }, | ||
331 | detect)); | ||
332 | } | ||
333 | } | ||
334 | } | ||
335 | |||
336 | public Object[] GetSerializationData(LLUUID itemID) | ||
337 | { | ||
338 | List<Object> data = new List<Object>(); | ||
339 | |||
340 | foreach (SenseRepeatClass ts in SenseRepeaters) | ||
341 | { | ||
342 | if(ts.itemID == itemID) | ||
343 | { | ||
344 | data.Add(ts.interval); | ||
345 | data.Add(ts.name); | ||
346 | data.Add(ts.keyID); | ||
347 | data.Add(ts.type); | ||
348 | data.Add(ts.range); | ||
349 | data.Add(ts.arc); | ||
350 | } | ||
351 | } | ||
352 | return data.ToArray(); | ||
353 | } | ||
354 | |||
355 | public void CreateFromData(uint localID, LLUUID itemID, LLUUID objectID, | ||
356 | Object[] data) | ||
357 | { | ||
358 | SceneObjectPart part = | ||
359 | m_CmdManager.m_ScriptEngine.World.GetSceneObjectPart( | ||
360 | objectID); | ||
361 | |||
362 | if(part == null) | ||
363 | return; | ||
364 | |||
365 | int idx=0; | ||
366 | |||
367 | while(idx < data.Length) | ||
368 | { | ||
369 | SenseRepeatClass ts = new SenseRepeatClass(); | ||
370 | |||
371 | ts.localID = localID; | ||
372 | ts.itemID = itemID; | ||
373 | |||
374 | ts.interval = (double)data[idx]; | ||
375 | ts.name = (string)data[idx+1]; | ||
376 | ts.keyID = (LLUUID)data[idx+2]; | ||
377 | ts.type = (int)data[idx+3]; | ||
378 | ts.range = (double)data[idx+4]; | ||
379 | ts.arc = (double)data[idx+5]; | ||
380 | ts.host = part; | ||
381 | |||
382 | ts.next = | ||
383 | DateTime.Now.ToUniversalTime().AddSeconds(ts.interval); | ||
384 | |||
385 | SenseRepeaters.Add(ts); | ||
386 | idx += 6; | ||
387 | } | ||
388 | } | ||
389 | |||
390 | } | ||
391 | } | ||
diff --git a/OpenSim/Region/ScriptEngine/XEngine/AsyncCommandPlugins/Timer.cs b/OpenSim/Region/ScriptEngine/XEngine/AsyncCommandPlugins/Timer.cs new file mode 100644 index 0000000..09a5818 --- /dev/null +++ b/OpenSim/Region/ScriptEngine/XEngine/AsyncCommandPlugins/Timer.cs | |||
@@ -0,0 +1,163 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSim Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.Collections; | ||
30 | using System.Collections.Generic; | ||
31 | using libsecondlife; | ||
32 | |||
33 | namespace OpenSim.Region.ScriptEngine.XEngine.AsyncCommandPlugins | ||
34 | { | ||
35 | public class Timer | ||
36 | { | ||
37 | public AsyncCommandManager m_CmdManager; | ||
38 | |||
39 | public Timer(AsyncCommandManager CmdManager) | ||
40 | { | ||
41 | m_CmdManager = CmdManager; | ||
42 | } | ||
43 | |||
44 | // | ||
45 | // TIMER | ||
46 | // | ||
47 | private class TimerClass | ||
48 | { | ||
49 | public uint localID; | ||
50 | public LLUUID itemID; | ||
51 | //public double interval; | ||
52 | public long interval; | ||
53 | //public DateTime next; | ||
54 | public long next; | ||
55 | } | ||
56 | |||
57 | private List<TimerClass> Timers = new List<TimerClass>(); | ||
58 | private object TimerListLock = new object(); | ||
59 | |||
60 | public void SetTimerEvent(uint m_localID, LLUUID m_itemID, double sec) | ||
61 | { | ||
62 | Console.WriteLine("SetTimerEvent"); | ||
63 | |||
64 | // Always remove first, in case this is a re-set | ||
65 | UnSetTimerEvents(m_localID, m_itemID); | ||
66 | if (sec == 0) // Disabling timer | ||
67 | return; | ||
68 | |||
69 | // Add to timer | ||
70 | TimerClass ts = new TimerClass(); | ||
71 | ts.localID = m_localID; | ||
72 | ts.itemID = m_itemID; | ||
73 | ts.interval = Convert.ToInt64(sec * 10000000); // How many 100 nanoseconds (ticks) should we wait | ||
74 | // 2193386136332921 ticks | ||
75 | // 219338613 seconds | ||
76 | |||
77 | //ts.next = DateTime.Now.ToUniversalTime().AddSeconds(ts.interval); | ||
78 | ts.next = DateTime.Now.Ticks + ts.interval; | ||
79 | lock (TimerListLock) | ||
80 | { | ||
81 | Timers.Add(ts); | ||
82 | } | ||
83 | } | ||
84 | |||
85 | public void UnSetTimerEvents(uint m_localID, LLUUID m_itemID) | ||
86 | { | ||
87 | // Remove from timer | ||
88 | lock (TimerListLock) | ||
89 | { | ||
90 | foreach (TimerClass ts in new ArrayList(Timers)) | ||
91 | { | ||
92 | if (ts.localID == m_localID && ts.itemID == m_itemID) | ||
93 | Timers.Remove(ts); | ||
94 | } | ||
95 | } | ||
96 | } | ||
97 | |||
98 | public void CheckTimerEvents() | ||
99 | { | ||
100 | // Nothing to do here? | ||
101 | if (Timers.Count == 0) | ||
102 | return; | ||
103 | |||
104 | lock (TimerListLock) | ||
105 | { | ||
106 | // Go through all timers | ||
107 | foreach (TimerClass ts in Timers) | ||
108 | { | ||
109 | // Time has passed? | ||
110 | if (ts.next < DateTime.Now.Ticks) | ||
111 | { | ||
112 | // Console.WriteLine("Time has passed: Now: " + DateTime.Now.Ticks + ", Passed: " + ts.next); | ||
113 | // Add it to queue | ||
114 | m_CmdManager.m_ScriptEngine.PostScriptEvent(ts.itemID, | ||
115 | new XEventParams("timer", new Object[0], | ||
116 | new XDetectParams[0])); | ||
117 | // set next interval | ||
118 | |||
119 | //ts.next = DateTime.Now.ToUniversalTime().AddSeconds(ts.interval); | ||
120 | ts.next = DateTime.Now.Ticks + ts.interval; | ||
121 | } | ||
122 | } | ||
123 | } | ||
124 | } | ||
125 | |||
126 | public Object[] GetSerializationData(LLUUID itemID) | ||
127 | { | ||
128 | List<Object> data = new List<Object>(); | ||
129 | |||
130 | lock (TimerListLock) | ||
131 | { | ||
132 | foreach (TimerClass ts in Timers) | ||
133 | { | ||
134 | if(ts.itemID == itemID) | ||
135 | { | ||
136 | data.Add(ts.interval); | ||
137 | data.Add(ts.next-DateTime.Now.Ticks); | ||
138 | } | ||
139 | } | ||
140 | } | ||
141 | return data.ToArray(); | ||
142 | } | ||
143 | |||
144 | public void CreateFromData(uint localID, LLUUID itemID, LLUUID objectID, | ||
145 | Object[] data) | ||
146 | { | ||
147 | int idx=0; | ||
148 | |||
149 | while(idx < data.Length) | ||
150 | { | ||
151 | TimerClass ts = new TimerClass(); | ||
152 | |||
153 | ts.localID = localID; | ||
154 | ts.itemID = itemID; | ||
155 | ts.interval = (long)data[idx]; | ||
156 | ts.next = DateTime.Now.Ticks + (long)data[idx+1]; | ||
157 | idx += 2; | ||
158 | |||
159 | Timers.Add(ts); | ||
160 | } | ||
161 | } | ||
162 | } | ||
163 | } | ||
diff --git a/OpenSim/Region/ScriptEngine/XEngine/AsyncCommandPlugins/XmlRequest.cs b/OpenSim/Region/ScriptEngine/XEngine/AsyncCommandPlugins/XmlRequest.cs new file mode 100644 index 0000000..2714d11 --- /dev/null +++ b/OpenSim/Region/ScriptEngine/XEngine/AsyncCommandPlugins/XmlRequest.cs | |||
@@ -0,0 +1,115 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSim Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using OpenSim.Region.Environment.Interfaces; | ||
30 | using OpenSim.Region.Environment.Modules.Scripting.XMLRPC; | ||
31 | using OpenSim.Region.ScriptEngine.XEngine.Script; | ||
32 | |||
33 | namespace OpenSim.Region.ScriptEngine.XEngine.AsyncCommandPlugins | ||
34 | { | ||
35 | public class XmlRequest | ||
36 | { | ||
37 | public AsyncCommandManager m_CmdManager; | ||
38 | |||
39 | public XmlRequest(AsyncCommandManager CmdManager) | ||
40 | { | ||
41 | m_CmdManager = CmdManager; | ||
42 | } | ||
43 | |||
44 | public void CheckXMLRPCRequests() | ||
45 | { | ||
46 | if (m_CmdManager.m_ScriptEngine.World == null) | ||
47 | return; | ||
48 | |||
49 | IXMLRPC xmlrpc = m_CmdManager.m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>(); | ||
50 | |||
51 | if (xmlrpc != null) | ||
52 | { | ||
53 | RPCRequestInfo rInfo = xmlrpc.GetNextCompletedRequest(); | ||
54 | |||
55 | while (rInfo != null) | ||
56 | { | ||
57 | xmlrpc.RemoveCompletedRequest(rInfo.GetMessageID()); | ||
58 | |||
59 | //Deliver data to prim's remote_data handler | ||
60 | object[] resobj = new object[] | ||
61 | { | ||
62 | new LSL_Types.LSLInteger(2), | ||
63 | new LSL_Types.LSLString( | ||
64 | rInfo.GetChannelKey().ToString()), | ||
65 | new LSL_Types.LSLString( | ||
66 | rInfo.GetMessageID().ToString()), | ||
67 | new LSL_Types.LSLString(String.Empty), | ||
68 | new LSL_Types.LSLInteger(rInfo.GetIntValue()), | ||
69 | new LSL_Types.LSLString(rInfo.GetStrVal()) | ||
70 | }; | ||
71 | |||
72 | foreach (XEngine xe in XEngine.ScriptEngines) | ||
73 | { | ||
74 | if(xe.PostScriptEvent( | ||
75 | rInfo.GetItemID(), new XEventParams( | ||
76 | "remote_data", resobj, | ||
77 | new XDetectParams[0]))) | ||
78 | break; | ||
79 | } | ||
80 | |||
81 | rInfo = xmlrpc.GetNextCompletedRequest(); | ||
82 | } | ||
83 | |||
84 | SendRemoteDataRequest srdInfo = xmlrpc.GetNextCompletedSRDRequest(); | ||
85 | |||
86 | while (srdInfo != null) | ||
87 | { | ||
88 | xmlrpc.RemoveCompletedSRDRequest(srdInfo.GetReqID()); | ||
89 | |||
90 | //Deliver data to prim's remote_data handler | ||
91 | object[] resobj = new object[] | ||
92 | { | ||
93 | new LSL_Types.LSLInteger(3), | ||
94 | new LSL_Types.LSLString(srdInfo.channel.ToString()), | ||
95 | new LSL_Types.LSLString(srdInfo.GetReqID().ToString()), | ||
96 | new LSL_Types.LSLString(String.Empty), | ||
97 | new LSL_Types.LSLInteger(srdInfo.idata), | ||
98 | new LSL_Types.LSLString(srdInfo.sdata) | ||
99 | }; | ||
100 | |||
101 | foreach (XEngine xe in XEngine.ScriptEngines) | ||
102 | { | ||
103 | if(xe.PostScriptEvent( | ||
104 | srdInfo.m_itemID, new XEventParams( | ||
105 | "remote_data", resobj, | ||
106 | new XDetectParams[0]))) | ||
107 | break; | ||
108 | } | ||
109 | |||
110 | srdInfo = xmlrpc.GetNextCompletedSRDRequest(); | ||
111 | } | ||
112 | } | ||
113 | } | ||
114 | } | ||
115 | } | ||
diff --git a/OpenSim/Region/ScriptEngine/XEngine/Compiler.cs b/OpenSim/Region/ScriptEngine/XEngine/Compiler.cs new file mode 100644 index 0000000..980d9e6 --- /dev/null +++ b/OpenSim/Region/ScriptEngine/XEngine/Compiler.cs | |||
@@ -0,0 +1,515 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSim Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.CodeDom.Compiler; | ||
30 | using System.Collections.Generic; | ||
31 | using System.Globalization; | ||
32 | using System.IO; | ||
33 | using Microsoft.CSharp; | ||
34 | using Microsoft.JScript; | ||
35 | using Microsoft.VisualBasic; | ||
36 | using OpenSim.Region.Environment.Interfaces; | ||
37 | |||
38 | namespace OpenSim.Region.ScriptEngine.XEngine | ||
39 | { | ||
40 | public class Compiler | ||
41 | { | ||
42 | private static readonly log4net.ILog m_log | ||
43 | = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); | ||
44 | |||
45 | // * Uses "LSL2Converter" to convert LSL to C# if necessary. | ||
46 | // * Compiles C#-code into an assembly | ||
47 | // * Returns assembly name ready for AppDomain load. | ||
48 | // | ||
49 | // Assembly is compiled using LSL_BaseClass as base. Look at debug C# code file created when LSL script is compiled for full details. | ||
50 | // | ||
51 | |||
52 | internal enum enumCompileType | ||
53 | { | ||
54 | lsl = 0, | ||
55 | cs = 1, | ||
56 | vb = 2, | ||
57 | js = 3 | ||
58 | } | ||
59 | |||
60 | /// <summary> | ||
61 | /// This contains number of lines WE use for header when compiling script. User will get error in line x-LinesToRemoveOnError when error occurs. | ||
62 | /// </summary> | ||
63 | public int LinesToRemoveOnError = 3; | ||
64 | private enumCompileType DefaultCompileLanguage; | ||
65 | private bool WriteScriptSourceToDebugFile; | ||
66 | private bool CompileWithDebugInformation; | ||
67 | private Dictionary<string, bool> AllowedCompilers = new Dictionary<string, bool>(StringComparer.CurrentCultureIgnoreCase); | ||
68 | private Dictionary<string, enumCompileType> LanguageMapping = new Dictionary<string, enumCompileType>(StringComparer.CurrentCultureIgnoreCase); | ||
69 | |||
70 | private string FilePrefix; | ||
71 | private string ScriptEnginesPath = "ScriptEngines"; | ||
72 | |||
73 | private static LSL2CSConverter LSL_Converter = new LSL2CSConverter(); | ||
74 | private static CSharpCodeProvider CScodeProvider = new CSharpCodeProvider(); | ||
75 | private static VBCodeProvider VBcodeProvider = new VBCodeProvider(); | ||
76 | private static JScriptCodeProvider JScodeProvider = new JScriptCodeProvider(); | ||
77 | |||
78 | private static int instanceID = new Random().Next(0, int.MaxValue); // Unique number to use on our compiled files | ||
79 | private static UInt64 scriptCompileCounter = 0; // And a counter | ||
80 | |||
81 | public XEngine m_scriptEngine; | ||
82 | public Compiler(XEngine scriptEngine) | ||
83 | { | ||
84 | m_scriptEngine = scriptEngine; | ||
85 | ReadConfig(); | ||
86 | } | ||
87 | public bool in_startup = true; | ||
88 | public void ReadConfig() | ||
89 | { | ||
90 | |||
91 | // Get some config | ||
92 | WriteScriptSourceToDebugFile = m_scriptEngine.ScriptConfigSource.GetBoolean("WriteScriptSourceToDebugFile", true); | ||
93 | CompileWithDebugInformation = m_scriptEngine.ScriptConfigSource.GetBoolean("CompileWithDebugInformation", true); | ||
94 | |||
95 | // Get file prefix from scriptengine name and make it file system safe: | ||
96 | FilePrefix = m_scriptEngine.ScriptEngineName; | ||
97 | foreach (char c in Path.GetInvalidFileNameChars()) | ||
98 | { | ||
99 | FilePrefix = FilePrefix.Replace(c, '_'); | ||
100 | } | ||
101 | |||
102 | // First time we start? Delete old files | ||
103 | if (in_startup) | ||
104 | { | ||
105 | in_startup = false; | ||
106 | DeleteOldFiles(); | ||
107 | } | ||
108 | |||
109 | // Map name and enum type of our supported languages | ||
110 | LanguageMapping.Add(enumCompileType.cs.ToString(), enumCompileType.cs); | ||
111 | LanguageMapping.Add(enumCompileType.vb.ToString(), enumCompileType.vb); | ||
112 | LanguageMapping.Add(enumCompileType.lsl.ToString(), enumCompileType.lsl); | ||
113 | LanguageMapping.Add(enumCompileType.js.ToString(), enumCompileType.js); | ||
114 | |||
115 | // Allowed compilers | ||
116 | string allowComp = m_scriptEngine.ScriptConfigSource.GetString("AllowedCompilers", "lsl,cs,vb,js"); | ||
117 | AllowedCompilers.Clear(); | ||
118 | |||
119 | #if DEBUG | ||
120 | m_scriptEngine.Log.Debug("[" + m_scriptEngine.ScriptEngineName + "]: Allowed languages: " + allowComp); | ||
121 | #endif | ||
122 | |||
123 | |||
124 | foreach (string strl in allowComp.Split(',')) | ||
125 | { | ||
126 | string strlan = strl.Trim(" \t".ToCharArray()).ToLower(); | ||
127 | if (!LanguageMapping.ContainsKey(strlan)) | ||
128 | { | ||
129 | m_scriptEngine.Log.Error("[" + m_scriptEngine.ScriptEngineName + "]: Config error. Compiler is unable to recognize language type \"" + strlan + "\" specified in \"AllowedCompilers\"."); | ||
130 | } | ||
131 | else | ||
132 | { | ||
133 | #if DEBUG | ||
134 | //m_scriptEngine.Log.Debug("[" + m_scriptEngine.ScriptEngineName + "]: Config OK. Compiler recognized language type \"" + strlan + "\" specified in \"AllowedCompilers\"."); | ||
135 | #endif | ||
136 | } | ||
137 | AllowedCompilers.Add(strlan, true); | ||
138 | } | ||
139 | if (AllowedCompilers.Count == 0) | ||
140 | m_scriptEngine.Log.Error("[" + m_scriptEngine.ScriptEngineName + "]: Config error. Compiler could not recognize any language in \"AllowedCompilers\". Scripts will not be executed!"); | ||
141 | |||
142 | // Default language | ||
143 | string defaultCompileLanguage = m_scriptEngine.ScriptConfigSource.GetString("DefaultCompileLanguage", "lsl").ToLower(); | ||
144 | |||
145 | // Is this language recognized at all? | ||
146 | if (!LanguageMapping.ContainsKey(defaultCompileLanguage)) | ||
147 | { | ||
148 | m_scriptEngine.Log.Error("[" + m_scriptEngine.ScriptEngineName + "]: " + | ||
149 | "Config error. Default language \"" + defaultCompileLanguage + "\" specified in \"DefaultCompileLanguage\" is not recognized as a valid language. Changing default to: \"lsl\"."); | ||
150 | defaultCompileLanguage = "lsl"; | ||
151 | } | ||
152 | |||
153 | // Is this language in allow-list? | ||
154 | if (!AllowedCompilers.ContainsKey(defaultCompileLanguage)) | ||
155 | { | ||
156 | m_scriptEngine.Log.Error("[" + m_scriptEngine.ScriptEngineName + "]: " + | ||
157 | "Config error. Default language \"" + defaultCompileLanguage + "\"specified in \"DefaultCompileLanguage\" is not in list of \"AllowedCompilers\". Scripts may not be executed!"); | ||
158 | } | ||
159 | else | ||
160 | { | ||
161 | #if DEBUG | ||
162 | // m_scriptEngine.Log.Debug("[" + m_scriptEngine.ScriptEngineName + "]: " + | ||
163 | // "Config OK. Default language \"" + defaultCompileLanguage + "\" specified in \"DefaultCompileLanguage\" is recognized as a valid language."); | ||
164 | #endif | ||
165 | // LANGUAGE IS IN ALLOW-LIST | ||
166 | DefaultCompileLanguage = LanguageMapping[defaultCompileLanguage]; | ||
167 | } | ||
168 | |||
169 | // We now have an allow-list, a mapping list, and a default language | ||
170 | |||
171 | } | ||
172 | |||
173 | /// <summary> | ||
174 | /// Delete old script files | ||
175 | /// </summary> | ||
176 | private void DeleteOldFiles() | ||
177 | { | ||
178 | |||
179 | // CREATE FOLDER IF IT DOESNT EXIST | ||
180 | if (!Directory.Exists(ScriptEnginesPath)) | ||
181 | { | ||
182 | try | ||
183 | { | ||
184 | Directory.CreateDirectory(ScriptEnginesPath); | ||
185 | } | ||
186 | catch (Exception ex) | ||
187 | { | ||
188 | m_scriptEngine.Log.Error("[" + m_scriptEngine.ScriptEngineName + "]: Exception trying to create ScriptEngine directory \"" + ScriptEnginesPath + "\": " + ex.ToString()); | ||
189 | } | ||
190 | } | ||
191 | |||
192 | if (!Directory.Exists(Path.Combine(ScriptEnginesPath, | ||
193 | m_scriptEngine.World.RegionInfo.RegionID.ToString()))) | ||
194 | { | ||
195 | try | ||
196 | { | ||
197 | Directory.CreateDirectory(Path.Combine(ScriptEnginesPath, | ||
198 | m_scriptEngine.World.RegionInfo.RegionID.ToString())); | ||
199 | } | ||
200 | catch (Exception ex) | ||
201 | { | ||
202 | m_scriptEngine.Log.Error("[" + m_scriptEngine.ScriptEngineName + "]: Exception trying to create ScriptEngine directory \"" + Path.Combine(ScriptEnginesPath, | ||
203 | m_scriptEngine.World.RegionInfo.RegionID.ToString())+ "\": " + ex.ToString()); | ||
204 | } | ||
205 | } | ||
206 | |||
207 | foreach (string file in Directory.GetFiles(Path.Combine(ScriptEnginesPath, | ||
208 | m_scriptEngine.World.RegionInfo.RegionID.ToString()))) | ||
209 | { | ||
210 | //m_scriptEngine.Log.Error("[" + m_scriptEngine.ScriptEngineName + "]: FILE FOUND: " + file); | ||
211 | |||
212 | if (file.ToLower().StartsWith(FilePrefix + "_compiled_") || | ||
213 | file.ToLower().StartsWith(FilePrefix + "_source_")) | ||
214 | { | ||
215 | try | ||
216 | { | ||
217 | File.Delete(file); | ||
218 | } | ||
219 | catch (Exception ex) | ||
220 | { | ||
221 | m_scriptEngine.Log.Error("[" + m_scriptEngine.ScriptEngineName + "]: Exception trying delete old script file \"" + file + "\": " + ex.ToString()); | ||
222 | } | ||
223 | |||
224 | } | ||
225 | } | ||
226 | |||
227 | } | ||
228 | |||
229 | ////private ICodeCompiler icc = codeProvider.CreateCompiler(); | ||
230 | //public string CompileFromFile(string LSOFileName) | ||
231 | //{ | ||
232 | // switch (Path.GetExtension(LSOFileName).ToLower()) | ||
233 | // { | ||
234 | // case ".txt": | ||
235 | // case ".lsl": | ||
236 | // Common.ScriptEngineBase.Common.SendToDebug("Source code is LSL, converting to CS"); | ||
237 | // return CompileFromLSLText(File.ReadAllText(LSOFileName)); | ||
238 | // case ".cs": | ||
239 | // Common.ScriptEngineBase.Common.SendToDebug("Source code is CS"); | ||
240 | // return CompileFromCSText(File.ReadAllText(LSOFileName)); | ||
241 | // default: | ||
242 | // throw new Exception("Unknown script type."); | ||
243 | // } | ||
244 | //} | ||
245 | |||
246 | /// <summary> | ||
247 | /// Converts script from LSL to CS and calls CompileFromCSText | ||
248 | /// </summary> | ||
249 | /// <param name="Script">LSL script</param> | ||
250 | /// <returns>Filename to .dll assembly</returns> | ||
251 | public string PerformScriptCompile(string Script, string asset) | ||
252 | { | ||
253 | string OutFile = Path.Combine(ScriptEnginesPath, Path.Combine( | ||
254 | m_scriptEngine.World.RegionInfo.RegionID.ToString(), | ||
255 | FilePrefix + "_compiled_" + asset + ".dll")); | ||
256 | // string OutFile = Path.Combine(ScriptEnginesPath, | ||
257 | // FilePrefix + "_compiled_" + asset + ".dll"); | ||
258 | |||
259 | if(File.Exists(OutFile)) | ||
260 | return OutFile; | ||
261 | |||
262 | if (!Directory.Exists(ScriptEnginesPath)) | ||
263 | { | ||
264 | try | ||
265 | { | ||
266 | Directory.CreateDirectory(ScriptEnginesPath); | ||
267 | } | ||
268 | catch (Exception ex) | ||
269 | { | ||
270 | } | ||
271 | } | ||
272 | |||
273 | if (!Directory.Exists(Path.Combine(ScriptEnginesPath, | ||
274 | m_scriptEngine.World.RegionInfo.RegionID.ToString()))) | ||
275 | { | ||
276 | try | ||
277 | { | ||
278 | Directory.CreateDirectory(ScriptEnginesPath); | ||
279 | } | ||
280 | catch (Exception ex) | ||
281 | { | ||
282 | } | ||
283 | } | ||
284 | |||
285 | enumCompileType l = DefaultCompileLanguage; | ||
286 | |||
287 | |||
288 | if (Script.StartsWith("//c#", true, CultureInfo.InvariantCulture)) | ||
289 | l = enumCompileType.cs; | ||
290 | if (Script.StartsWith("//vb", true, CultureInfo.InvariantCulture)) | ||
291 | { | ||
292 | l = enumCompileType.vb; | ||
293 | // We need to remove //vb, it won't compile with that | ||
294 | |||
295 | Script = Script.Substring(4, Script.Length - 4); | ||
296 | } | ||
297 | if (Script.StartsWith("//lsl", true, CultureInfo.InvariantCulture)) | ||
298 | l = enumCompileType.lsl; | ||
299 | |||
300 | if (Script.StartsWith("//js", true, CultureInfo.InvariantCulture)) | ||
301 | l = enumCompileType.js; | ||
302 | |||
303 | if (!AllowedCompilers.ContainsKey(l.ToString())) | ||
304 | { | ||
305 | // Not allowed to compile to this language! | ||
306 | string errtext = String.Empty; | ||
307 | errtext += "The compiler for language \"" + l.ToString() + "\" is not in list of allowed compilers. Script will not be executed!"; | ||
308 | throw new Exception(errtext); | ||
309 | } | ||
310 | |||
311 | string compileScript = Script; | ||
312 | |||
313 | if (l == enumCompileType.lsl) | ||
314 | { | ||
315 | // Its LSL, convert it to C# | ||
316 | compileScript = LSL_Converter.Convert(Script); | ||
317 | l = enumCompileType.cs; | ||
318 | } | ||
319 | |||
320 | // Insert additional assemblies here | ||
321 | |||
322 | //ADAM: Disabled for the moment until it's working right. | ||
323 | bool enableCommanderLSL = false; | ||
324 | |||
325 | if (enableCommanderLSL == true && l == enumCompileType.cs) | ||
326 | { | ||
327 | foreach (KeyValuePair<string, | ||
328 | ICommander> com | ||
329 | in m_scriptEngine.World.GetCommanders()) | ||
330 | { | ||
331 | compileScript = com.Value.GenerateRuntimeAPI() + compileScript; | ||
332 | } | ||
333 | } | ||
334 | |||
335 | // End of insert | ||
336 | |||
337 | |||
338 | switch (l) | ||
339 | { | ||
340 | case enumCompileType.cs: | ||
341 | compileScript = CreateCSCompilerScript(compileScript); | ||
342 | break; | ||
343 | case enumCompileType.vb: | ||
344 | compileScript = CreateVBCompilerScript(compileScript); | ||
345 | break; | ||
346 | case enumCompileType.js: | ||
347 | compileScript = CreateJSCompilerScript(compileScript); | ||
348 | break; | ||
349 | } | ||
350 | |||
351 | // m_log.Debug("[ScriptEngine.DotNetEngine]: Preparing to compile the following LSL to C# translated code"); | ||
352 | // m_log.Debug(""); | ||
353 | // m_log.Debug(compileScript); | ||
354 | |||
355 | return CompileFromDotNetText(compileScript, l, asset); | ||
356 | } | ||
357 | |||
358 | private static string CreateJSCompilerScript(string compileScript) | ||
359 | { | ||
360 | compileScript = String.Empty + | ||
361 | "import OpenSim.Region.ScriptEngine.XEngine.Script; import System.Collections.Generic;\r\n" + | ||
362 | "package SecondLife {\r\n" + | ||
363 | "class Script extends OpenSim.Region.ScriptEngine.XEngine.Script.BuiltIn_Commands_BaseClass { \r\n" + | ||
364 | compileScript + | ||
365 | "} }\r\n"; | ||
366 | return compileScript; | ||
367 | } | ||
368 | |||
369 | private static string CreateCSCompilerScript(string compileScript) | ||
370 | { | ||
371 | |||
372 | |||
373 | compileScript = String.Empty + | ||
374 | "using OpenSim.Region.ScriptEngine.XEngine.Script; using System.Collections.Generic;\r\n" + | ||
375 | String.Empty + "namespace SecondLife { " + | ||
376 | String.Empty + "public class Script : OpenSim.Region.ScriptEngine.XEngine.Script.BuiltIn_Commands_BaseClass { \r\n" + | ||
377 | @"public Script() { } " + | ||
378 | compileScript + | ||
379 | "} }\r\n"; | ||
380 | return compileScript; | ||
381 | } | ||
382 | |||
383 | private static string CreateVBCompilerScript(string compileScript) | ||
384 | { | ||
385 | compileScript = String.Empty + | ||
386 | "Imports OpenSim.Region.ScriptEngine.XEngine.Script: Imports System.Collections.Generic: " + | ||
387 | String.Empty + "NameSpace SecondLife:" + | ||
388 | String.Empty + "Public Class Script: Inherits OpenSim.Region.ScriptEngine.XEngine.Script.BuiltIn_Commands_BaseClass: " + | ||
389 | "\r\nPublic Sub New()\r\nEnd Sub: " + | ||
390 | compileScript + | ||
391 | ":End Class :End Namespace\r\n"; | ||
392 | return compileScript; | ||
393 | } | ||
394 | |||
395 | /// <summary> | ||
396 | /// Compile .NET script to .Net assembly (.dll) | ||
397 | /// </summary> | ||
398 | /// <param name="Script">CS script</param> | ||
399 | /// <returns>Filename to .dll assembly</returns> | ||
400 | internal string CompileFromDotNetText(string Script, enumCompileType lang, string asset) | ||
401 | { | ||
402 | string ext = "." + lang.ToString(); | ||
403 | |||
404 | // Output assembly name | ||
405 | scriptCompileCounter++; | ||
406 | string OutFile = Path.Combine(ScriptEnginesPath, Path.Combine( | ||
407 | m_scriptEngine.World.RegionInfo.RegionID.ToString(), | ||
408 | FilePrefix + "_compiled_" + asset + ".dll")); | ||
409 | #if DEBUG | ||
410 | // m_scriptEngine.Log.Debug("[" + m_scriptEngine.ScriptEngineName + "]: Starting compile of \"" + OutFile + "\"."); | ||
411 | #endif | ||
412 | try | ||
413 | { | ||
414 | File.Delete(OutFile); | ||
415 | } | ||
416 | catch (Exception e) // NOTLEGIT - Should be just catching FileIOException | ||
417 | { | ||
418 | //m_scriptEngine.Log.Error("[" + m_scriptEngine.ScriptEngineName + "]: Unable to delete old existring script-file before writing new. Compile aborted: " + e.ToString()); | ||
419 | throw new Exception("Unable to delete old existring script-file before writing new. Compile aborted: " + e.ToString()); | ||
420 | } | ||
421 | //string OutFile = Path.Combine("ScriptEngines", "SecondLife.Script.dll"); | ||
422 | |||
423 | // DEBUG - write source to disk | ||
424 | if (WriteScriptSourceToDebugFile) | ||
425 | { | ||
426 | string srcFileName = FilePrefix + "_source_" + Path.GetFileNameWithoutExtension(OutFile) + ext; | ||
427 | try | ||
428 | { | ||
429 | File.WriteAllText( | ||
430 | Path.Combine("ScriptEngines", srcFileName), | ||
431 | Script); | ||
432 | } | ||
433 | catch (Exception ex) // NOTLEGIT - Should be just catching FileIOException | ||
434 | { | ||
435 | m_scriptEngine.Log.Error("[" + m_scriptEngine.ScriptEngineName + "]: Exception while trying to write script source to file \"" + srcFileName + "\": " + ex.ToString()); | ||
436 | } | ||
437 | } | ||
438 | |||
439 | // Do actual compile | ||
440 | CompilerParameters parameters = new CompilerParameters(); | ||
441 | |||
442 | parameters.IncludeDebugInformation = true; | ||
443 | |||
444 | // Add all available assemblies | ||
445 | // foreach (Assembly asm in AppDomain.CurrentDomain.GetAssemblies()) | ||
446 | // { | ||
447 | // Console.WriteLine("Adding assembly: " + asm.Location); | ||
448 | // parameters.ReferencedAssemblies.Add(asm.Location); | ||
449 | // } | ||
450 | |||
451 | string rootPath = Path.GetDirectoryName(AppDomain.CurrentDomain.BaseDirectory); | ||
452 | string rootPathSE = Path.GetDirectoryName(GetType().Assembly.Location); | ||
453 | //Console.WriteLine("Assembly location: " + rootPath); | ||
454 | parameters.ReferencedAssemblies.Add(Path.Combine(rootPath, "OpenSim.Region.ScriptEngine.XEngine.Script.dll")); | ||
455 | // parameters.ReferencedAssemblies.Add(Path.Combine(rootPathSE, "OpenSim.Region.ScriptEngine.XEngine.dll")); | ||
456 | |||
457 | //parameters.ReferencedAssemblies.Add("OpenSim.Region.Environment"); | ||
458 | parameters.GenerateExecutable = false; | ||
459 | parameters.OutputAssembly = OutFile; | ||
460 | parameters.IncludeDebugInformation = CompileWithDebugInformation; | ||
461 | //parameters.WarningLevel = 1; // Should be 4? | ||
462 | parameters.TreatWarningsAsErrors = false; | ||
463 | |||
464 | //Console.WriteLine(Script); | ||
465 | CompilerResults results; | ||
466 | switch (lang) | ||
467 | { | ||
468 | case enumCompileType.vb: | ||
469 | results = VBcodeProvider.CompileAssemblyFromSource(parameters, Script); | ||
470 | break; | ||
471 | case enumCompileType.cs: | ||
472 | results = CScodeProvider.CompileAssemblyFromSource(parameters, Script); | ||
473 | break; | ||
474 | case enumCompileType.js: | ||
475 | results = JScodeProvider.CompileAssemblyFromSource(parameters, Script); | ||
476 | break; | ||
477 | default: | ||
478 | throw new Exception("Compiler is not able to recongnize language type \"" + lang.ToString() + "\""); | ||
479 | } | ||
480 | |||
481 | // Check result | ||
482 | // Go through errors | ||
483 | |||
484 | // | ||
485 | // WARNINGS AND ERRORS | ||
486 | // | ||
487 | if (results.Errors.Count > 0) | ||
488 | { | ||
489 | string errtext = String.Empty; | ||
490 | foreach (CompilerError CompErr in results.Errors) | ||
491 | { | ||
492 | errtext += "Line number " + (CompErr.Line - LinesToRemoveOnError) + | ||
493 | ", Error Number: " + CompErr.ErrorNumber + | ||
494 | ", '" + CompErr.ErrorText + "'\r\n"; | ||
495 | } | ||
496 | if (!File.Exists(OutFile)) | ||
497 | { | ||
498 | throw new Exception(errtext); | ||
499 | } | ||
500 | } | ||
501 | |||
502 | |||
503 | // | ||
504 | // NO ERRORS, BUT NO COMPILED FILE | ||
505 | // | ||
506 | if (!File.Exists(OutFile)) | ||
507 | { | ||
508 | string errtext = String.Empty; | ||
509 | errtext += "No compile error. But not able to locate compiled file."; | ||
510 | throw new Exception(errtext); | ||
511 | } | ||
512 | return OutFile; | ||
513 | } | ||
514 | } | ||
515 | } | ||
diff --git a/OpenSim/Region/ScriptEngine/XEngine/EventManager.cs b/OpenSim/Region/ScriptEngine/XEngine/EventManager.cs new file mode 100644 index 0000000..734c837 --- /dev/null +++ b/OpenSim/Region/ScriptEngine/XEngine/EventManager.cs | |||
@@ -0,0 +1,293 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSim Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using libsecondlife; | ||
30 | using OpenSim.Framework; | ||
31 | using OpenSim.Region.Environment.Modules.Avatar.Currency.SampleMoney; | ||
32 | using OpenSim.Region.Environment.Scenes; | ||
33 | using OpenSim.Region.Environment.Interfaces; | ||
34 | using OpenSim.Region.ScriptEngine.XEngine.Script; | ||
35 | using Axiom.Math; | ||
36 | |||
37 | namespace OpenSim.Region.ScriptEngine.XEngine | ||
38 | { | ||
39 | /// <summary> | ||
40 | /// Prepares events so they can be directly executed upon a script by EventQueueManager, then queues it. | ||
41 | /// </summary> | ||
42 | public class EventManager | ||
43 | { | ||
44 | private XEngine myScriptEngine; | ||
45 | |||
46 | public EventManager(XEngine _ScriptEngine) | ||
47 | { | ||
48 | myScriptEngine = _ScriptEngine; | ||
49 | |||
50 | myScriptEngine.Log.Info("[XEngine] Hooking up to server events"); | ||
51 | myScriptEngine.World.EventManager.OnObjectGrab += touch_start; | ||
52 | myScriptEngine.World.EventManager.OnObjectDeGrab += touch_end; | ||
53 | myScriptEngine.World.EventManager.OnScriptChangedEvent += changed; | ||
54 | myScriptEngine.World.EventManager.OnScriptAtTargetEvent += at_target; | ||
55 | myScriptEngine.World.EventManager.OnScriptNotAtTargetEvent += not_at_target; | ||
56 | myScriptEngine.World.EventManager.OnScriptControlEvent += control; | ||
57 | IMoneyModule money=myScriptEngine.World.RequestModuleInterface<IMoneyModule>(); | ||
58 | if (money != null) | ||
59 | { | ||
60 | money.OnObjectPaid+=HandleObjectPaid; | ||
61 | } | ||
62 | } | ||
63 | |||
64 | private void HandleObjectPaid(LLUUID objectID, LLUUID agentID, | ||
65 | int amount) | ||
66 | { | ||
67 | SceneObjectPart part = | ||
68 | myScriptEngine.World.GetSceneObjectPart(objectID); | ||
69 | |||
70 | if (part != null) | ||
71 | { | ||
72 | money(part.LocalId, agentID, amount); | ||
73 | } | ||
74 | } | ||
75 | |||
76 | public void touch_start(uint localID, LLVector3 offsetPos, | ||
77 | IClientAPI remoteClient) | ||
78 | { | ||
79 | // Add to queue for all scripts in ObjectID object | ||
80 | XDetectParams[] det = new XDetectParams[1]; | ||
81 | det[0].Key = remoteClient.AgentId; | ||
82 | |||
83 | myScriptEngine.PostObjectEvent(localID, new XEventParams( | ||
84 | "touch_start", new Object[] { new LSL_Types.LSLInteger(1) }, | ||
85 | det)); | ||
86 | } | ||
87 | |||
88 | public void touch(uint localID, LLVector3 offsetPos, | ||
89 | IClientAPI remoteClient) | ||
90 | { | ||
91 | // Add to queue for all scripts in ObjectID object | ||
92 | XDetectParams[] det = new XDetectParams[1]; | ||
93 | det[0].Key = remoteClient.AgentId; | ||
94 | det[0].OffsetPos = new LSL_Types.Vector3(offsetPos.X, | ||
95 | offsetPos.Y, | ||
96 | offsetPos.Z); | ||
97 | |||
98 | myScriptEngine.PostObjectEvent(localID, new XEventParams( | ||
99 | "touch", new Object[] { new LSL_Types.LSLInteger(1) }, | ||
100 | det)); | ||
101 | } | ||
102 | |||
103 | public void touch_end(uint localID, IClientAPI remoteClient) | ||
104 | { | ||
105 | // Add to queue for all scripts in ObjectID object | ||
106 | XDetectParams[] det = new XDetectParams[1]; | ||
107 | det[0].Key = remoteClient.AgentId; | ||
108 | |||
109 | myScriptEngine.PostObjectEvent(localID, new XEventParams( | ||
110 | "touch_end", new Object[] { new LSL_Types.LSLInteger(1) }, | ||
111 | det)); | ||
112 | } | ||
113 | |||
114 | public void changed(uint localID, uint change) | ||
115 | { | ||
116 | // Add to queue for all scripts in localID, Object pass change. | ||
117 | myScriptEngine.PostObjectEvent(localID, new XEventParams( | ||
118 | "changed",new object[] { new LSL_Types.LSLInteger(change) }, | ||
119 | new XDetectParams[0])); | ||
120 | } | ||
121 | |||
122 | // state_entry: not processed here | ||
123 | // state_exit: not processed here | ||
124 | |||
125 | public void money(uint localID, LLUUID agentID, int amount) | ||
126 | { | ||
127 | myScriptEngine.PostObjectEvent(localID, new XEventParams( | ||
128 | "money", new object[] { | ||
129 | new LSL_Types.LSLString(agentID.ToString()), | ||
130 | new LSL_Types.LSLInteger(amount) }, | ||
131 | new XDetectParams[0])); | ||
132 | } | ||
133 | |||
134 | public void collision_start(uint localID, LLUUID itemID, | ||
135 | IClientAPI remoteClient) | ||
136 | { | ||
137 | // Add to queue for all scripts in ObjectID object | ||
138 | XDetectParams[] det = new XDetectParams[1]; | ||
139 | det[0].Key = remoteClient.AgentId; | ||
140 | |||
141 | myScriptEngine.PostObjectEvent(localID, new XEventParams( | ||
142 | "collision_start", | ||
143 | new Object[] { new LSL_Types.LSLInteger(1) }, | ||
144 | det)); | ||
145 | } | ||
146 | |||
147 | public void collision(uint localID, LLUUID itemID, | ||
148 | IClientAPI remoteClient) | ||
149 | { | ||
150 | // Add to queue for all scripts in ObjectID object | ||
151 | XDetectParams[] det = new XDetectParams[1]; | ||
152 | det[0].Key = remoteClient.AgentId; | ||
153 | |||
154 | myScriptEngine.PostObjectEvent(localID, new XEventParams( | ||
155 | "collision", new Object[] { new LSL_Types.LSLInteger(1) }, | ||
156 | det)); | ||
157 | } | ||
158 | |||
159 | public void collision_end(uint localID, LLUUID itemID, | ||
160 | IClientAPI remoteClient) | ||
161 | { | ||
162 | // Add to queue for all scripts in ObjectID object | ||
163 | XDetectParams[] det = new XDetectParams[1]; | ||
164 | det[0].Key = remoteClient.AgentId; | ||
165 | |||
166 | myScriptEngine.PostObjectEvent(localID, new XEventParams( | ||
167 | "collision_end", | ||
168 | new Object[] { new LSL_Types.LSLInteger(1) }, | ||
169 | det)); | ||
170 | } | ||
171 | |||
172 | public void land_collision_start(uint localID, LLUUID itemID) | ||
173 | { | ||
174 | myScriptEngine.PostObjectEvent(localID, new XEventParams( | ||
175 | "land_collision_start", | ||
176 | new object[0], | ||
177 | new XDetectParams[0])); | ||
178 | } | ||
179 | |||
180 | public void land_collision(uint localID, LLUUID itemID) | ||
181 | { | ||
182 | myScriptEngine.PostObjectEvent(localID, new XEventParams( | ||
183 | "land_collision", | ||
184 | new object[0], | ||
185 | new XDetectParams[0])); | ||
186 | } | ||
187 | |||
188 | public void land_collision_end(uint localID, LLUUID itemID) | ||
189 | { | ||
190 | myScriptEngine.PostObjectEvent(localID, new XEventParams( | ||
191 | "land_collision_end", | ||
192 | new object[0], | ||
193 | new XDetectParams[0])); | ||
194 | } | ||
195 | |||
196 | // timer: not handled here | ||
197 | // listen: not handled here | ||
198 | |||
199 | public void on_rez(uint localID, LLUUID itemID, int startParam) | ||
200 | { | ||
201 | myScriptEngine.PostObjectEvent(localID, new XEventParams( | ||
202 | "on_rez",new object[] { | ||
203 | new LSL_Types.LSLInteger(startParam)}, | ||
204 | new XDetectParams[0])); | ||
205 | } | ||
206 | |||
207 | public void control(uint localID, LLUUID itemID, LLUUID agentID, uint held, uint change) | ||
208 | { | ||
209 | myScriptEngine.PostObjectEvent(localID, new XEventParams( | ||
210 | "control",new object[] { | ||
211 | new LSL_Types.LSLString(agentID.ToString()), | ||
212 | new LSL_Types.LSLInteger(held), | ||
213 | new LSL_Types.LSLInteger(change)}, | ||
214 | new XDetectParams[0])); | ||
215 | } | ||
216 | |||
217 | public void email(uint localID, LLUUID itemID, string timeSent, | ||
218 | string address, string subject, string message, int numLeft) | ||
219 | { | ||
220 | myScriptEngine.PostObjectEvent(localID, new XEventParams( | ||
221 | "email",new object[] { | ||
222 | new LSL_Types.LSLString(timeSent), | ||
223 | new LSL_Types.LSLString(address), | ||
224 | new LSL_Types.LSLString(subject), | ||
225 | new LSL_Types.LSLString(message), | ||
226 | new LSL_Types.LSLInteger(numLeft)}, | ||
227 | new XDetectParams[0])); | ||
228 | } | ||
229 | |||
230 | public void at_target(uint localID, uint handle, LLVector3 targetpos, | ||
231 | LLVector3 atpos) | ||
232 | { | ||
233 | myScriptEngine.PostObjectEvent(localID, new XEventParams( | ||
234 | "at_target", new object[] { | ||
235 | new LSL_Types.LSLInteger(handle), | ||
236 | new LSL_Types.Vector3(targetpos.X,targetpos.Y,targetpos.Z), | ||
237 | new LSL_Types.Vector3(atpos.X,atpos.Y,atpos.Z) }, | ||
238 | new XDetectParams[0])); | ||
239 | } | ||
240 | |||
241 | public void not_at_target(uint localID) | ||
242 | { | ||
243 | myScriptEngine.PostObjectEvent(localID, new XEventParams( | ||
244 | "not_at_target",new object[0], | ||
245 | new XDetectParams[0])); | ||
246 | } | ||
247 | |||
248 | public void at_rot_target(uint localID, LLUUID itemID) | ||
249 | { | ||
250 | myScriptEngine.PostObjectEvent(localID, new XEventParams( | ||
251 | "at_rot_target",new object[0], | ||
252 | new XDetectParams[0])); | ||
253 | } | ||
254 | |||
255 | public void not_at_rot_target(uint localID, LLUUID itemID) | ||
256 | { | ||
257 | myScriptEngine.PostObjectEvent(localID, new XEventParams( | ||
258 | "not_at_rot_target",new object[0], | ||
259 | new XDetectParams[0])); | ||
260 | } | ||
261 | |||
262 | // run_time_permissions: not handled here | ||
263 | |||
264 | public void attach(uint localID, LLUUID itemID, LLUUID avatar) | ||
265 | { | ||
266 | myScriptEngine.PostObjectEvent(localID, new XEventParams( | ||
267 | "attach",new object[] { | ||
268 | new LSL_Types.LSLString(avatar.ToString()) }, | ||
269 | new XDetectParams[0])); | ||
270 | } | ||
271 | |||
272 | // dataserver: not handled here | ||
273 | // link_message: not handled here | ||
274 | |||
275 | public void moving_start(uint localID, LLUUID itemID) | ||
276 | { | ||
277 | myScriptEngine.PostObjectEvent(localID, new XEventParams( | ||
278 | "moving_start",new object[0], | ||
279 | new XDetectParams[0])); | ||
280 | } | ||
281 | |||
282 | public void moving_end(uint localID, LLUUID itemID) | ||
283 | { | ||
284 | myScriptEngine.PostObjectEvent(localID, new XEventParams( | ||
285 | "moving_end",new object[0], | ||
286 | new XDetectParams[0])); | ||
287 | } | ||
288 | |||
289 | // object_rez: not handled here | ||
290 | // remote_data: not handled here | ||
291 | // http_response: not handled here | ||
292 | } | ||
293 | } | ||
diff --git a/OpenSim/Region/ScriptEngine/XEngine/Executor.cs b/OpenSim/Region/ScriptEngine/XEngine/Executor.cs new file mode 100644 index 0000000..40075ec --- /dev/null +++ b/OpenSim/Region/ScriptEngine/XEngine/Executor.cs | |||
@@ -0,0 +1,136 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSim Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.Collections.Generic; | ||
30 | using System.Reflection; | ||
31 | using OpenSim.Region.ScriptEngine.XEngine.Script; | ||
32 | |||
33 | namespace OpenSim.Region.ScriptEngine.XEngine | ||
34 | { | ||
35 | public class Executor : ExecutorBase | ||
36 | { | ||
37 | // Cache functions by keeping a reference to them in a dictionary | ||
38 | private Dictionary<string, MethodInfo> Events = new Dictionary<string, MethodInfo>(); | ||
39 | private Dictionary<string, scriptEvents> m_stateEvents = new Dictionary<string, scriptEvents>(); | ||
40 | |||
41 | public Executor(IScript script) : base(script) | ||
42 | { | ||
43 | initEventFlags(); | ||
44 | } | ||
45 | |||
46 | |||
47 | protected override scriptEvents DoGetStateEventFlags() | ||
48 | { | ||
49 | //Console.WriteLine("Get event flags for " + m_Script.State); | ||
50 | |||
51 | // Check to see if we've already computed the flags for this state | ||
52 | scriptEvents eventFlags = scriptEvents.None; | ||
53 | if (m_stateEvents.ContainsKey(m_Script.State)) | ||
54 | { | ||
55 | m_stateEvents.TryGetValue(m_Script.State, out eventFlags); | ||
56 | return eventFlags; | ||
57 | } | ||
58 | |||
59 | Type type=m_Script.GetType(); | ||
60 | |||
61 | // Fill in the events for this state, cache the results in the map | ||
62 | foreach (KeyValuePair<string, scriptEvents> kvp in m_eventFlagsMap) | ||
63 | { | ||
64 | string evname = m_Script.State + "_event_" + kvp.Key; | ||
65 | //Console.WriteLine("Trying event "+evname); | ||
66 | try | ||
67 | { | ||
68 | MethodInfo mi = type.GetMethod(evname); | ||
69 | if (mi != null) | ||
70 | { | ||
71 | //Console.WriteLine("Found handler for " + kvp.Key); | ||
72 | eventFlags |= kvp.Value; | ||
73 | } | ||
74 | } | ||
75 | catch(Exception e) | ||
76 | { | ||
77 | //Console.WriteLine("Exeption in GetMethod:\n"+e.ToString()); | ||
78 | } | ||
79 | } | ||
80 | |||
81 | // Save the flags we just computed and return the result | ||
82 | if(eventFlags != 0) | ||
83 | m_stateEvents.Add(m_Script.State, eventFlags); | ||
84 | |||
85 | //Console.WriteLine("Returning {0:x}", eventFlags); | ||
86 | return (eventFlags); | ||
87 | } | ||
88 | |||
89 | protected override void DoExecuteEvent(string FunctionName, object[] args) | ||
90 | { | ||
91 | // IMPORTANT: Types and MemberInfo-derived objects require a LOT of memory. | ||
92 | // Instead use RuntimeTypeHandle, RuntimeFieldHandle and RunTimeHandle (IntPtr) instead! | ||
93 | |||
94 | string EventName = m_Script.State + "_event_" + FunctionName; | ||
95 | |||
96 | //#if DEBUG | ||
97 | // Console.WriteLine("ScriptEngine: Script event function name: " + EventName); | ||
98 | //#endif | ||
99 | |||
100 | if (Events.ContainsKey(EventName) == false) | ||
101 | { | ||
102 | // Not found, create | ||
103 | Type type = m_Script.GetType(); | ||
104 | try | ||
105 | { | ||
106 | MethodInfo mi = type.GetMethod(EventName); | ||
107 | Events.Add(EventName, mi); | ||
108 | } | ||
109 | catch | ||
110 | { | ||
111 | Console.WriteLine("Event {0}not found", EventName); | ||
112 | // Event name not found, cache it as not found | ||
113 | Events.Add(EventName, null); | ||
114 | } | ||
115 | } | ||
116 | |||
117 | // Get event | ||
118 | MethodInfo ev = null; | ||
119 | Events.TryGetValue(EventName, out ev); | ||
120 | |||
121 | if (ev == null) // No event by that name! | ||
122 | { | ||
123 | //Console.WriteLine("ScriptEngine Can not find any event named: \String.Empty + EventName + "\String.Empty); | ||
124 | return; | ||
125 | } | ||
126 | |||
127 | //cfk 2-7-08 dont need this right now and the default Linux build has DEBUG defined | ||
128 | #if DEBUG | ||
129 | //Console.WriteLine("ScriptEngine: Executing function name: " + EventName); | ||
130 | #endif | ||
131 | // Found | ||
132 | ev.Invoke(m_Script, args); | ||
133 | |||
134 | } | ||
135 | } | ||
136 | } | ||
diff --git a/OpenSim/Region/ScriptEngine/XEngine/ExecutorBase.cs b/OpenSim/Region/ScriptEngine/XEngine/ExecutorBase.cs new file mode 100644 index 0000000..3775372 --- /dev/null +++ b/OpenSim/Region/ScriptEngine/XEngine/ExecutorBase.cs | |||
@@ -0,0 +1,181 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSim Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.Collections.Generic; | ||
30 | using System.Runtime.Remoting.Lifetime; | ||
31 | using OpenSim.Region.ScriptEngine.XEngine.Script; | ||
32 | |||
33 | namespace OpenSim.Region.ScriptEngine.XEngine | ||
34 | { | ||
35 | public abstract class ExecutorBase : MarshalByRefObject | ||
36 | { | ||
37 | /// <summary> | ||
38 | /// Contains the script to execute functions in. | ||
39 | /// </summary> | ||
40 | protected IScript m_Script; | ||
41 | |||
42 | protected Dictionary<string, scriptEvents> m_eventFlagsMap = new Dictionary<string, scriptEvents>(); | ||
43 | |||
44 | [Flags] | ||
45 | public enum scriptEvents : int | ||
46 | { | ||
47 | None = 0, | ||
48 | attach = 1, | ||
49 | collision = 15, | ||
50 | collision_end = 32, | ||
51 | collision_start = 64, | ||
52 | control = 128, | ||
53 | dataserver = 256, | ||
54 | email = 512, | ||
55 | http_response = 1024, | ||
56 | land_collision = 2048, | ||
57 | land_collision_end = 4096, | ||
58 | land_collision_start = 8192, | ||
59 | at_target = 16384, | ||
60 | listen = 32768, | ||
61 | money = 65536, | ||
62 | moving_end = 131072, | ||
63 | moving_start = 262144, | ||
64 | not_at_rot_target = 524288, | ||
65 | not_at_target = 1048576, | ||
66 | remote_data = 8388608, | ||
67 | run_time_permissions = 268435456, | ||
68 | state_entry = 1073741824, | ||
69 | state_exit = 2, | ||
70 | timer = 4, | ||
71 | touch = 8, | ||
72 | touch_end = 536870912, | ||
73 | touch_start = 2097152, | ||
74 | object_rez = 4194304 | ||
75 | } | ||
76 | |||
77 | /// <summary> | ||
78 | /// Create a new instance of ExecutorBase | ||
79 | /// </summary> | ||
80 | /// <param name="Script"></param> | ||
81 | public ExecutorBase(IScript Script) | ||
82 | { | ||
83 | m_Script = Script; | ||
84 | initEventFlags(); | ||
85 | } | ||
86 | |||
87 | /// <summary> | ||
88 | /// Make sure our object does not timeout when in AppDomain. (Called by ILease base class) | ||
89 | /// </summary> | ||
90 | /// <returns></returns> | ||
91 | public override Object InitializeLifetimeService() | ||
92 | { | ||
93 | //Console.WriteLine("Executor: InitializeLifetimeService()"); | ||
94 | // return null; | ||
95 | ILease lease = (ILease)base.InitializeLifetimeService(); | ||
96 | |||
97 | if (lease.CurrentState == LeaseState.Initial) | ||
98 | { | ||
99 | lease.InitialLeaseTime = TimeSpan.Zero; // TimeSpan.FromMinutes(1); | ||
100 | // lease.SponsorshipTimeout = TimeSpan.FromMinutes(2); | ||
101 | // lease.RenewOnCallTime = TimeSpan.FromSeconds(2); | ||
102 | } | ||
103 | return lease; | ||
104 | } | ||
105 | |||
106 | /// <summary> | ||
107 | /// Get current AppDomain | ||
108 | /// </summary> | ||
109 | /// <returns>Current AppDomain</returns> | ||
110 | public AppDomain GetAppDomain() | ||
111 | { | ||
112 | return AppDomain.CurrentDomain; | ||
113 | } | ||
114 | |||
115 | /// <summary> | ||
116 | /// Execute a specific function/event in script. | ||
117 | /// </summary> | ||
118 | /// <param name="FunctionName">Name of function to execute</param> | ||
119 | /// <param name="args">Arguments to pass to function</param> | ||
120 | public void ExecuteEvent(string FunctionName, object[] args) | ||
121 | { | ||
122 | DoExecuteEvent(FunctionName, args); | ||
123 | } | ||
124 | |||
125 | protected abstract void DoExecuteEvent(string FunctionName, object[] args); | ||
126 | |||
127 | /// <summary> | ||
128 | /// Compute the events handled by the current state of the script | ||
129 | /// </summary> | ||
130 | /// <returns>state mask</returns> | ||
131 | public scriptEvents GetStateEventFlags() | ||
132 | { | ||
133 | return DoGetStateEventFlags(); | ||
134 | } | ||
135 | |||
136 | protected abstract scriptEvents DoGetStateEventFlags(); | ||
137 | |||
138 | protected void initEventFlags() | ||
139 | { | ||
140 | // Initialize the table if it hasn't already been done | ||
141 | if (m_eventFlagsMap.Count > 0) | ||
142 | { | ||
143 | return; | ||
144 | } | ||
145 | |||
146 | m_eventFlagsMap.Add("attach", scriptEvents.attach); | ||
147 | // m_eventFlagsMap.Add("at_rot_target",(long)scriptEvents.at_rot_target); | ||
148 | m_eventFlagsMap.Add("at_target", scriptEvents.at_target); | ||
149 | // m_eventFlagsMap.Add("changed",(long)scriptEvents.changed); | ||
150 | m_eventFlagsMap.Add("collision", scriptEvents.collision); | ||
151 | m_eventFlagsMap.Add("collision_end", scriptEvents.collision_end); | ||
152 | m_eventFlagsMap.Add("collision_start", scriptEvents.collision_start); | ||
153 | m_eventFlagsMap.Add("control", scriptEvents.control); | ||
154 | m_eventFlagsMap.Add("dataserver", scriptEvents.dataserver); | ||
155 | m_eventFlagsMap.Add("email", scriptEvents.email); | ||
156 | m_eventFlagsMap.Add("http_response", scriptEvents.http_response); | ||
157 | m_eventFlagsMap.Add("land_collision", scriptEvents.land_collision); | ||
158 | m_eventFlagsMap.Add("land_collision_end", scriptEvents.land_collision_end); | ||
159 | m_eventFlagsMap.Add("land_collision_start", scriptEvents.land_collision_start); | ||
160 | // m_eventFlagsMap.Add("link_message",scriptEvents.link_message); | ||
161 | m_eventFlagsMap.Add("listen", scriptEvents.listen); | ||
162 | m_eventFlagsMap.Add("money", scriptEvents.money); | ||
163 | m_eventFlagsMap.Add("moving_end", scriptEvents.moving_end); | ||
164 | m_eventFlagsMap.Add("moving_start", scriptEvents.moving_start); | ||
165 | m_eventFlagsMap.Add("not_at_rot_target", scriptEvents.not_at_rot_target); | ||
166 | m_eventFlagsMap.Add("not_at_target", scriptEvents.not_at_target); | ||
167 | // m_eventFlagsMap.Add("no_sensor",(long)scriptEvents.no_sensor); | ||
168 | // m_eventFlagsMap.Add("on_rez",(long)scriptEvents.on_rez); | ||
169 | m_eventFlagsMap.Add("remote_data", scriptEvents.remote_data); | ||
170 | m_eventFlagsMap.Add("run_time_permissions", scriptEvents.run_time_permissions); | ||
171 | // m_eventFlagsMap.Add("sensor",(long)scriptEvents.sensor); | ||
172 | m_eventFlagsMap.Add("state_entry", scriptEvents.state_entry); | ||
173 | m_eventFlagsMap.Add("state_exit", scriptEvents.state_exit); | ||
174 | m_eventFlagsMap.Add("timer", scriptEvents.timer); | ||
175 | m_eventFlagsMap.Add("touch", scriptEvents.touch); | ||
176 | m_eventFlagsMap.Add("touch_end", scriptEvents.touch_end); | ||
177 | m_eventFlagsMap.Add("touch_start", scriptEvents.touch_start); | ||
178 | m_eventFlagsMap.Add("object_rez", scriptEvents.object_rez); | ||
179 | } | ||
180 | } | ||
181 | } | ||
diff --git a/OpenSim/Region/ScriptEngine/XEngine/LSL2CSConverter.cs b/OpenSim/Region/ScriptEngine/XEngine/LSL2CSConverter.cs new file mode 100644 index 0000000..9c59108 --- /dev/null +++ b/OpenSim/Region/ScriptEngine/XEngine/LSL2CSConverter.cs | |||
@@ -0,0 +1,363 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSim Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS AS IS AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | * | ||
27 | */ | ||
28 | |||
29 | using System; | ||
30 | using System.Collections.Generic; | ||
31 | using System.Text.RegularExpressions; | ||
32 | |||
33 | namespace OpenSim.Region.ScriptEngine.XEngine | ||
34 | { | ||
35 | public class LSL2CSConverter | ||
36 | { | ||
37 | // Uses regex to convert LSL code to C# code. | ||
38 | |||
39 | //private Regex rnw = new Regex(@"[a-zA-Z0-9_\-]", RegexOptions.Compiled); | ||
40 | private Dictionary<string, string> dataTypes = new Dictionary<string, string>(); | ||
41 | private Dictionary<string, string> quotes = new Dictionary<string, string>(); | ||
42 | // c Style | ||
43 | private Regex cstylecomments = new Regex(@"/\*(.|[\r\n])*?\*/", RegexOptions.Compiled | RegexOptions.Multiline); | ||
44 | // c# one liners | ||
45 | private Regex nonCommentFwsl = new Regex("\"[a-zA-Z0-9.,:/\\n ]+//[^\"+]+([\\\\\\\"+]+)?(\\s+)?[\"+](\\s+)?(;)?", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline); | ||
46 | private Regex conelinecomments = new Regex(@"[^:].?([\/]{2}[^\n]*)|([\n]{1,}[\/]{2}[^\n]*)", RegexOptions.Compiled | RegexOptions.Multiline); | ||
47 | // ([^\"])((?:[a-zA-Z])\.[a-zA-Z].?)([^\"]) | ||
48 | |||
49 | // value we're looking for: (?:[a-zA-Z])\.[a-zA-Z] | ||
50 | public LSL2CSConverter() | ||
51 | { | ||
52 | // Only the types we need to convert | ||
53 | dataTypes.Add("void", "void"); | ||
54 | dataTypes.Add("integer", "LSL_Types.LSLInteger"); | ||
55 | dataTypes.Add("float", "double"); | ||
56 | dataTypes.Add("string", "LSL_Types.LSLString"); | ||
57 | dataTypes.Add("key", "LSL_Types.LSLString"); | ||
58 | dataTypes.Add("vector", "LSL_Types.Vector3"); | ||
59 | dataTypes.Add("rotation", "LSL_Types.Quaternion"); | ||
60 | dataTypes.Add("list", "LSL_Types.list"); | ||
61 | dataTypes.Add("null", "null"); | ||
62 | } | ||
63 | |||
64 | public string Convert(string Script) | ||
65 | { | ||
66 | quotes.Clear(); | ||
67 | string Return = String.Empty; | ||
68 | Script = " \r\n" + Script; | ||
69 | |||
70 | // | ||
71 | // Prepare script for processing | ||
72 | // | ||
73 | |||
74 | // Clean up linebreaks | ||
75 | Script = Regex.Replace(Script, @"\r\n", "\n"); | ||
76 | Script = Regex.Replace(Script, @"\n", "\r\n"); | ||
77 | |||
78 | // QUOTE REPLACEMENT | ||
79 | // temporarily replace quotes so we can work our magic on the script without | ||
80 | // always considering if we are inside our outside quotes's | ||
81 | // TODO: Does this work on half-quotes in strings? ;) | ||
82 | string _Script = String.Empty; | ||
83 | string C; | ||
84 | bool in_quote = false; | ||
85 | bool quote_replaced = false; | ||
86 | string quote_replacement_string = "Q_U_O_T_E_REPLACEMENT_"; | ||
87 | string quote = String.Empty; | ||
88 | bool last_was_escape = false; | ||
89 | int quote_replaced_count = 0; | ||
90 | |||
91 | string removefwnoncomments = nonCommentFwsl.Replace(Script, "\"\";"); | ||
92 | |||
93 | string removecomments = conelinecomments.Replace(removefwnoncomments, ""); | ||
94 | removecomments = cstylecomments.Replace(removecomments, ""); | ||
95 | string[] localscript = removecomments.Split('"'); | ||
96 | string checkscript = String.Empty; | ||
97 | bool flip = true; | ||
98 | |||
99 | for (int p = 0; p < localscript.Length; p++) | ||
100 | { | ||
101 | //if (localscript[p].Length >= 1) | ||
102 | //{ | ||
103 | if (!localscript[p].EndsWith(@"\")) | ||
104 | { | ||
105 | flip = !flip; | ||
106 | //System.Console.WriteLine("Flip:" + flip.ToString() + " - " + localscript[p] + " ! " + localscript[p].EndsWith(@"\").ToString()); | ||
107 | } | ||
108 | //} | ||
109 | //else | ||
110 | //{ | ||
111 | // flip = !flip; | ||
112 | // System.Console.WriteLine("Flip:" + flip.ToString() + " - " + localscript[p]); | ||
113 | //} | ||
114 | if (!flip) | ||
115 | checkscript += localscript[p]; | ||
116 | } | ||
117 | |||
118 | //System.Console.WriteLine("SCRIPT:" + checkscript); | ||
119 | |||
120 | // checks for alpha.alpha way of referring to objects in C# | ||
121 | // ignores alpha.x alpha.y, alpha.z for refering to vector components | ||
122 | Match SecurityM; | ||
123 | |||
124 | // BROKEN: this check is very wrong. It block's any url in strings. | ||
125 | SecurityM = Regex.Match(checkscript, @"(?:[a-zA-Z])\.(?:[a-wA-Z]|[a-zA-Z][a-zA-Z])", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline); | ||
126 | |||
127 | if (SecurityM.Success) | ||
128 | throw new Exception("CS0103: 'The . symbol cannot be used in LSL except in float values or vector components'. Detected around: " + SecurityM.Captures[0].Value); | ||
129 | |||
130 | SecurityM = Regex.Match(checkscript, @"typeof\s", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline); | ||
131 | if (SecurityM.Success) | ||
132 | throw new Exception("CS0103: 'The object.typeof method isn't allowed in LSL'"); | ||
133 | |||
134 | SecurityM = Regex.Match(checkscript, @"GetType\(", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline); | ||
135 | if (SecurityM.Success) | ||
136 | throw new Exception("CS0103: 'The object.GetType method isn't allowed in LSL'"); | ||
137 | |||
138 | for (int p = 0; p < Script.Length; p++) | ||
139 | { | ||
140 | C = Script.Substring(p, 1); | ||
141 | while (true) | ||
142 | { | ||
143 | // found " and last was not \ so this is not an escaped \" | ||
144 | if (C == "\"" && last_was_escape == false) | ||
145 | { | ||
146 | // Toggle inside/outside quote | ||
147 | in_quote = !in_quote; | ||
148 | if (in_quote) | ||
149 | { | ||
150 | quote_replaced_count++; | ||
151 | } | ||
152 | else | ||
153 | { | ||
154 | if (quote == String.Empty) | ||
155 | { | ||
156 | // We didn't replace quote, probably because of empty string? | ||
157 | _Script += quote_replacement_string + | ||
158 | quote_replaced_count.ToString().PadLeft(5, "0".ToCharArray()[0]); | ||
159 | } | ||
160 | // We just left a quote | ||
161 | quotes.Add( | ||
162 | quote_replacement_string + | ||
163 | quote_replaced_count.ToString().PadLeft(5, "0".ToCharArray()[0]), quote); | ||
164 | quote = String.Empty; | ||
165 | } | ||
166 | break; | ||
167 | } | ||
168 | |||
169 | if (!in_quote) | ||
170 | { | ||
171 | // We are not inside a quote | ||
172 | quote_replaced = false; | ||
173 | } | ||
174 | else | ||
175 | { | ||
176 | // We are inside a quote | ||
177 | if (!quote_replaced) | ||
178 | { | ||
179 | // Replace quote | ||
180 | _Script += quote_replacement_string + | ||
181 | quote_replaced_count.ToString().PadLeft(5, "0".ToCharArray()[0]); | ||
182 | quote_replaced = true; | ||
183 | } | ||
184 | quote += C; | ||
185 | break; | ||
186 | } | ||
187 | _Script += C; | ||
188 | break; | ||
189 | } | ||
190 | last_was_escape = false; | ||
191 | if (C == @"\") | ||
192 | { | ||
193 | last_was_escape = true; | ||
194 | } | ||
195 | } | ||
196 | Script = _Script; | ||
197 | // | ||
198 | // END OF QUOTE REPLACEMENT | ||
199 | // | ||
200 | |||
201 | // | ||
202 | // PROCESS STATES | ||
203 | // Remove state definitions and add state names to start of each event within state | ||
204 | // | ||
205 | int ilevel = 0; | ||
206 | int lastlevel = 0; | ||
207 | string ret = String.Empty; | ||
208 | string cache = String.Empty; | ||
209 | bool in_state = false; | ||
210 | string current_statename = String.Empty; | ||
211 | for (int p = 0; p < Script.Length; p++) | ||
212 | { | ||
213 | C = Script.Substring(p, 1); | ||
214 | while (true) | ||
215 | { | ||
216 | // inc / dec level | ||
217 | if (C == @"{") | ||
218 | ilevel++; | ||
219 | if (C == @"}") | ||
220 | ilevel--; | ||
221 | if (ilevel < 0) | ||
222 | ilevel = 0; | ||
223 | cache += C; | ||
224 | |||
225 | // if level == 0, add to return | ||
226 | if (ilevel == 1 && lastlevel == 0) | ||
227 | { | ||
228 | // 0 => 1: Get last | ||
229 | Match m = | ||
230 | //Regex.Match(cache, @"(?![a-zA-Z_]+)\s*([a-zA-Z_]+)[^a-zA-Z_\(\)]*{", | ||
231 | Regex.Match(cache, @"(?![a-zA-Z_]+)\s*(state\s+)?(?<statename>[a-zA-Z_][a-zA-Z_0-9]*)[^a-zA-Z_0-9\(\)]*{", | ||
232 | |||
233 | RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline); | ||
234 | |||
235 | in_state = false; | ||
236 | if (m.Success) | ||
237 | { | ||
238 | // Go back to level 0, this is not a state | ||
239 | in_state = true; | ||
240 | current_statename = m.Groups["statename"].Captures[0].Value; | ||
241 | //Console.WriteLine("Current statename: " + current_statename); | ||
242 | cache = | ||
243 | //@"(?<s1>(?![a-zA-Z_]+)\s*)" + @"([a-zA-Z_]+)(?<s2>[^a-zA-Z_\(\)]*){", | ||
244 | Regex.Replace(cache, | ||
245 | @"(?<s1>(?![a-zA-Z_]+)\s*)" + @"(state\s+)?([a-zA-Z_][a-zA-Z_0-9]*)(?<s2>[^a-zA-Z_0-9\(\)]*){", | ||
246 | "${s1}${s2}", | ||
247 | RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline | RegexOptions.IgnoreCase); | ||
248 | } | ||
249 | ret += cache; | ||
250 | cache = String.Empty; | ||
251 | } | ||
252 | if (ilevel == 0 && lastlevel == 1) | ||
253 | { | ||
254 | // 1 => 0: Remove last } | ||
255 | if (in_state == true) | ||
256 | { | ||
257 | cache = cache.Remove(cache.Length - 1, 1); | ||
258 | //cache = Regex.Replace(cache, "}$", String.Empty, RegexOptions.Multiline | RegexOptions.Singleline); | ||
259 | |||
260 | //Replace function names | ||
261 | // void dataserver(key query_id, string data) { | ||
262 | //cache = Regex.Replace(cache, @"([^a-zA-Z_]\s*)((?!if|switch|for)[a-zA-Z_]+\s*\([^\)]*\)[^{]*{)", "$1" + "<STATE>" + "$2", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline); | ||
263 | //Console.WriteLine("Replacing using statename: " + current_statename); | ||
264 | cache = | ||
265 | Regex.Replace(cache, | ||
266 | @"^(\s*)((?!(if|switch|for|while)[^a-zA-Z0-9_])[a-zA-Z0-9_]*\s*\([^\)]*\)[^;]*\{)", | ||
267 | @"$1public " + current_statename + "_event_$2", | ||
268 | RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline | RegexOptions.IgnoreCase); | ||
269 | } | ||
270 | |||
271 | ret += cache; | ||
272 | cache = String.Empty; | ||
273 | in_state = true; | ||
274 | current_statename = String.Empty; | ||
275 | } | ||
276 | |||
277 | break; | ||
278 | } | ||
279 | lastlevel = ilevel; | ||
280 | } | ||
281 | ret += cache; | ||
282 | cache = String.Empty; | ||
283 | |||
284 | Script = ret; | ||
285 | ret = String.Empty; | ||
286 | |||
287 | foreach (string key in dataTypes.Keys) | ||
288 | { | ||
289 | string val; | ||
290 | dataTypes.TryGetValue(key, out val); | ||
291 | |||
292 | // Replace CAST - (integer) with (int) | ||
293 | Script = | ||
294 | Regex.Replace(Script, @"\(" + key + @"\)", @"(" + val + ")", | ||
295 | RegexOptions.Compiled | RegexOptions.Multiline); | ||
296 | // Replace return types and function variables - integer a() and f(integer a, integer a) | ||
297 | Script = | ||
298 | Regex.Replace(Script, @"(^|;|}|[\(,])(\s*)" + key + @"(\s+)", @"$1$2" + val + "$3", | ||
299 | RegexOptions.Compiled | RegexOptions.Multiline); | ||
300 | Script = | ||
301 | Regex.Replace(Script, @"(^|;|}|[\(,])(\s*)" + key + @"(\s*)[,]", @"$1$2" + val + "$3,", | ||
302 | RegexOptions.Compiled | RegexOptions.Multiline); | ||
303 | } | ||
304 | |||
305 | // Add "void" in front of functions that needs it | ||
306 | Script = | ||
307 | Regex.Replace(Script, | ||
308 | @"^(\s*public\s+)?((?!(if|switch|for)[^a-zA-Z0-9_])[a-zA-Z0-9_]*\s*\([^\)]*\)[^;]*\{)", | ||
309 | @"$1void $2", RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline); | ||
310 | |||
311 | // Replace <x,y,z> and <x,y,z,r> | ||
312 | Script = | ||
313 | Regex.Replace(Script, @"<([^,>;]*,[^,>;]*,[^,>;]*,[^,>;]*)>", @"new LSL_Types.Quaternion($1)", | ||
314 | RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline); | ||
315 | Script = | ||
316 | Regex.Replace(Script, @"<([^,>;)]*,[^,>;]*,[^,>;]*)>", @"new LSL_Types.Vector3($1)", | ||
317 | RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline); | ||
318 | |||
319 | // Replace List []'s | ||
320 | Script = | ||
321 | Regex.Replace(Script, @"\[([^\]]*)\]", @"new LSL_Types.list($1)", | ||
322 | RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline); | ||
323 | |||
324 | // Replace (string) to .ToString() // | ||
325 | Script = | ||
326 | Regex.Replace(Script, @"\(string\)\s*([a-zA-Z0-9_.]+(\s*\([^\)]*\))?)", @"$1.ToString()", | ||
327 | RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline); | ||
328 | Script = | ||
329 | Regex.Replace(Script, @"\((float|int)\)\s*([a-zA-Z0-9_.]+(\s*\([^\)]*\))?)", @"$1.Parse($2)", | ||
330 | RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline); | ||
331 | |||
332 | // Replace "state STATENAME" with "state("statename")" | ||
333 | Script = | ||
334 | Regex.Replace(Script, @"(state)\s+([^;\n\r]+)(;[\r\n\s])", "$1(\"$2\")$3", | ||
335 | RegexOptions.Compiled | RegexOptions.Multiline | RegexOptions.Singleline | RegexOptions.IgnoreCase); | ||
336 | |||
337 | // REPLACE BACK QUOTES | ||
338 | foreach (string key in quotes.Keys) | ||
339 | { | ||
340 | string val; | ||
341 | quotes.TryGetValue(key, out val); | ||
342 | Script = Script.Replace(key, "\"" + val + "\""); | ||
343 | } | ||
344 | |||
345 | //System.Console.WriteLine(Script); | ||
346 | Return = String.Empty;// + | ||
347 | //"using OpenSim.Region.ScriptEngine.Common; using System.Collections.Generic;"; | ||
348 | |||
349 | //Return += String.Empty + | ||
350 | // "namespace SecondLife { "; | ||
351 | //Return += String.Empty + | ||
352 | // //"[Serializable] " + | ||
353 | // "public class Script : OpenSim.Region.ScriptEngine.Common.LSL_BaseClass { "; | ||
354 | //Return += @"public Script() { } "; | ||
355 | Return += Script; | ||
356 | //Return += "} }\r\n"; | ||
357 | |||
358 | quotes.Clear(); | ||
359 | |||
360 | return Return; | ||
361 | } | ||
362 | } | ||
363 | } | ||
diff --git a/OpenSim/Region/ScriptEngine/XEngine/LSL_ScriptCommands.cs b/OpenSim/Region/ScriptEngine/XEngine/LSL_ScriptCommands.cs new file mode 100644 index 0000000..ca209b6 --- /dev/null +++ b/OpenSim/Region/ScriptEngine/XEngine/LSL_ScriptCommands.cs | |||
@@ -0,0 +1,6474 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSim Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.Collections; | ||
30 | using System.Collections.Generic; | ||
31 | using System.Runtime.Remoting.Lifetime; | ||
32 | using System.Text; | ||
33 | using System.Threading; | ||
34 | using Axiom.Math; | ||
35 | using libsecondlife; | ||
36 | using OpenSim.Framework; | ||
37 | using OpenSim.Region.Environment; | ||
38 | using OpenSim.Region.Environment.Interfaces; | ||
39 | using OpenSim.Region.Environment.Modules.Avatar.Currency.SampleMoney; | ||
40 | using OpenSim.Region.Environment.Modules.World.Land; | ||
41 | using OpenSim.Region.Environment.Scenes; | ||
42 | using OpenSim.Region.ScriptEngine.XEngine; | ||
43 | using OpenSim.Region.ScriptEngine.XEngine.Script; | ||
44 | |||
45 | |||
46 | namespace OpenSim.Region.ScriptEngine.XEngine | ||
47 | { | ||
48 | /// <summary> | ||
49 | /// Contains all LSL ll-functions. This class will be in Default AppDomain. | ||
50 | /// </summary> | ||
51 | public class LSL_ScriptCommands : MarshalByRefObject, ILSL_ScriptCommands | ||
52 | { | ||
53 | // private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); | ||
54 | |||
55 | internal XEngine m_ScriptEngine; | ||
56 | internal XScriptInstance m_Instance; | ||
57 | internal SceneObjectPart m_host; | ||
58 | internal uint m_localID; | ||
59 | internal LLUUID m_itemID; | ||
60 | internal bool throwErrorOnNotImplemented = true; | ||
61 | |||
62 | public LSL_ScriptCommands(XEngine ScriptEngine, XScriptInstance instance, SceneObjectPart host, uint localID, LLUUID itemID) | ||
63 | { | ||
64 | m_ScriptEngine = ScriptEngine; | ||
65 | m_Instance = instance; | ||
66 | m_host = host; | ||
67 | m_localID = localID; | ||
68 | m_itemID = itemID; | ||
69 | |||
70 | //m_log.Info(ScriptEngineName, "LSL_BaseClass.Start() called. Hosted by [" + m_host.Name + ":" + m_host.UUID + "@" + m_host.AbsolutePosition + "]"); | ||
71 | } | ||
72 | |||
73 | private DateTime m_timer = DateTime.Now; | ||
74 | private string m_state = "default"; | ||
75 | private bool m_waitingForScriptAnswer=false; | ||
76 | |||
77 | |||
78 | public string State | ||
79 | { | ||
80 | get { return m_Instance.State; } | ||
81 | set { m_Instance.State = value; } | ||
82 | } | ||
83 | |||
84 | public void state(string newState) | ||
85 | { | ||
86 | m_Instance.SetState(newState); | ||
87 | } | ||
88 | |||
89 | // Object never expires | ||
90 | public override Object InitializeLifetimeService() | ||
91 | { | ||
92 | //Console.WriteLine("LSL_BuiltIn_Commands: InitializeLifetimeService()"); | ||
93 | // return null; | ||
94 | ILease lease = (ILease)base.InitializeLifetimeService(); | ||
95 | |||
96 | if (lease.CurrentState == LeaseState.Initial) | ||
97 | { | ||
98 | lease.InitialLeaseTime = TimeSpan.Zero; // TimeSpan.FromMinutes(1); | ||
99 | // lease.SponsorshipTimeout = TimeSpan.FromMinutes(2); | ||
100 | // lease.RenewOnCallTime = TimeSpan.FromSeconds(2); | ||
101 | } | ||
102 | return lease; | ||
103 | } | ||
104 | |||
105 | public Scene World | ||
106 | { | ||
107 | get { return m_ScriptEngine.World; } | ||
108 | } | ||
109 | |||
110 | public void llSay(int channelID, string text) | ||
111 | { | ||
112 | m_host.AddScriptLPS(1); | ||
113 | |||
114 | if(text.Length > 1023) | ||
115 | text=text.Substring(0, 1023); | ||
116 | |||
117 | World.SimChat(Helpers.StringToField(text), | ||
118 | ChatTypeEnum.Say, channelID, m_host.AbsolutePosition, m_host.Name, m_host.UUID, false); | ||
119 | |||
120 | IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); | ||
121 | wComm.DeliverMessage(ChatTypeEnum.Say, channelID, m_host.Name, m_host.UUID, text); | ||
122 | } | ||
123 | |||
124 | // Extension commands use this: | ||
125 | public ICommander GetCommander(string name) | ||
126 | { | ||
127 | return World.GetCommander(name); | ||
128 | } | ||
129 | |||
130 | private LLUUID InventorySelf() | ||
131 | { | ||
132 | LLUUID invItemID=new LLUUID(); | ||
133 | |||
134 | foreach (KeyValuePair<LLUUID, TaskInventoryItem> inv in m_host.TaskInventory) | ||
135 | { | ||
136 | if (inv.Value.Type == 10 && inv.Value.ItemID == m_itemID) | ||
137 | { | ||
138 | invItemID=inv.Key; | ||
139 | break; | ||
140 | } | ||
141 | } | ||
142 | |||
143 | return invItemID; | ||
144 | } | ||
145 | |||
146 | private LLUUID InventoryKey(string name, int type) | ||
147 | { | ||
148 | m_host.AddScriptLPS(1); | ||
149 | foreach (KeyValuePair<LLUUID, TaskInventoryItem> inv in m_host.TaskInventory) | ||
150 | { | ||
151 | if (inv.Value.Name == name) | ||
152 | { | ||
153 | if (inv.Value.Type != type) | ||
154 | return LLUUID.Zero; | ||
155 | |||
156 | return inv.Value.AssetID.ToString(); | ||
157 | } | ||
158 | } | ||
159 | return LLUUID.Zero; | ||
160 | } | ||
161 | |||
162 | private LLUUID InventoryKey(string name) | ||
163 | { | ||
164 | m_host.AddScriptLPS(1); | ||
165 | foreach (KeyValuePair<LLUUID, TaskInventoryItem> inv in m_host.TaskInventory) | ||
166 | { | ||
167 | if (inv.Value.Name == name) | ||
168 | { | ||
169 | return inv.Value.AssetID.ToString(); | ||
170 | } | ||
171 | } | ||
172 | return LLUUID.Zero; | ||
173 | } | ||
174 | |||
175 | public void osSetRegionWaterHeight(double height) | ||
176 | { | ||
177 | m_host.AddScriptLPS(1); | ||
178 | //Check to make sure that the script's owner is the estate manager/master | ||
179 | //World.Permissions.GenericEstatePermission( | ||
180 | if (World.ExternalChecks.ExternalChecksCanBeGodLike(m_host.OwnerID)) | ||
181 | { | ||
182 | World.EventManager.TriggerRequestChangeWaterHeight((float)height); | ||
183 | } | ||
184 | } | ||
185 | |||
186 | //These are the implementations of the various ll-functions used by the LSL scripts. | ||
187 | //starting out, we use the System.Math library for trig functions. - ckrinke 8-14-07 | ||
188 | public double llSin(double f) | ||
189 | { | ||
190 | m_host.AddScriptLPS(1); | ||
191 | return (double)Math.Sin(f); | ||
192 | } | ||
193 | |||
194 | public double llCos(double f) | ||
195 | { | ||
196 | m_host.AddScriptLPS(1); | ||
197 | return (double)Math.Cos(f); | ||
198 | } | ||
199 | |||
200 | public double llTan(double f) | ||
201 | { | ||
202 | m_host.AddScriptLPS(1); | ||
203 | return (double)Math.Tan(f); | ||
204 | } | ||
205 | |||
206 | public double llAtan2(double x, double y) | ||
207 | { | ||
208 | m_host.AddScriptLPS(1); | ||
209 | return (double)Math.Atan2(y, x); | ||
210 | } | ||
211 | |||
212 | public double llSqrt(double f) | ||
213 | { | ||
214 | m_host.AddScriptLPS(1); | ||
215 | return (double)Math.Sqrt(f); | ||
216 | } | ||
217 | |||
218 | public double llPow(double fbase, double fexponent) | ||
219 | { | ||
220 | m_host.AddScriptLPS(1); | ||
221 | return (double)Math.Pow(fbase, fexponent); | ||
222 | } | ||
223 | |||
224 | public LSL_Types.LSLInteger llAbs(int i) | ||
225 | { | ||
226 | m_host.AddScriptLPS(1); | ||
227 | return (int)Math.Abs(i); | ||
228 | } | ||
229 | |||
230 | public double llFabs(double f) | ||
231 | { | ||
232 | m_host.AddScriptLPS(1); | ||
233 | return (double)Math.Abs(f); | ||
234 | } | ||
235 | |||
236 | public double llFrand(double mag) | ||
237 | { | ||
238 | m_host.AddScriptLPS(1); | ||
239 | lock (Util.RandomClass) | ||
240 | { | ||
241 | return Util.RandomClass.NextDouble() * mag; | ||
242 | } | ||
243 | } | ||
244 | |||
245 | public LSL_Types.LSLInteger llFloor(double f) | ||
246 | { | ||
247 | m_host.AddScriptLPS(1); | ||
248 | return (int)Math.Floor(f); | ||
249 | } | ||
250 | |||
251 | public LSL_Types.LSLInteger llCeil(double f) | ||
252 | { | ||
253 | m_host.AddScriptLPS(1); | ||
254 | return (int)Math.Ceiling(f); | ||
255 | } | ||
256 | |||
257 | // Xantor 01/May/2008 fixed midpointrounding (2.5 becomes 3.0 instead of 2.0, default = ToEven) | ||
258 | public LSL_Types.LSLInteger llRound(double f) | ||
259 | { | ||
260 | m_host.AddScriptLPS(1); | ||
261 | return (int)Math.Round(f, MidpointRounding.AwayFromZero); | ||
262 | } | ||
263 | |||
264 | //This next group are vector operations involving squaring and square root. ckrinke | ||
265 | public double llVecMag(LSL_Types.Vector3 v) | ||
266 | { | ||
267 | m_host.AddScriptLPS(1); | ||
268 | return LSL_Types.Vector3.Mag(v); | ||
269 | } | ||
270 | |||
271 | public LSL_Types.Vector3 llVecNorm(LSL_Types.Vector3 v) | ||
272 | { | ||
273 | m_host.AddScriptLPS(1); | ||
274 | double mag = LSL_Types.Vector3.Mag(v); | ||
275 | LSL_Types.Vector3 nor = new LSL_Types.Vector3(); | ||
276 | nor.x = v.x / mag; | ||
277 | nor.y = v.y / mag; | ||
278 | nor.z = v.z / mag; | ||
279 | return nor; | ||
280 | } | ||
281 | |||
282 | public double llVecDist(LSL_Types.Vector3 a, LSL_Types.Vector3 b) | ||
283 | { | ||
284 | m_host.AddScriptLPS(1); | ||
285 | double dx = a.x - b.x; | ||
286 | double dy = a.y - b.y; | ||
287 | double dz = a.z - b.z; | ||
288 | return Math.Sqrt(dx * dx + dy * dy + dz * dz); | ||
289 | } | ||
290 | |||
291 | //Now we start getting into quaternions which means sin/cos, matrices and vectors. ckrinke | ||
292 | |||
293 | // Utility function for llRot2Euler | ||
294 | |||
295 | // normalize an angle between 0 - 2*PI (0 and 360 degrees) | ||
296 | private double NormalizeAngle(double angle) | ||
297 | { | ||
298 | angle = angle % (Math.PI * 2); | ||
299 | if (angle < 0) angle = angle + Math.PI * 2; | ||
300 | return angle; | ||
301 | } | ||
302 | |||
303 | |||
304 | // Old implementation of llRot2Euler, now normalized | ||
305 | |||
306 | public LSL_Types.Vector3 llRot2Euler(LSL_Types.Quaternion r) | ||
307 | { | ||
308 | m_host.AddScriptLPS(1); | ||
309 | //This implementation is from http://lslwiki.net/lslwiki/wakka.php?wakka=LibraryRotationFunctions. ckrinke | ||
310 | LSL_Types.Quaternion t = new LSL_Types.Quaternion(r.x * r.x, r.y * r.y, r.z * r.z, r.s * r.s); | ||
311 | double m = (t.x + t.y + t.z + t.s); | ||
312 | if (m == 0) return new LSL_Types.Vector3(); | ||
313 | double n = 2 * (r.y * r.s + r.x * r.z); | ||
314 | double p = m * m - n * n; | ||
315 | if (p > 0) | ||
316 | return new LSL_Types.Vector3(NormalizeAngle(Math.Atan2(2.0 * (r.x * r.s - r.y * r.z), (-t.x - t.y + t.z + t.s))), | ||
317 | NormalizeAngle(Math.Atan2(n, Math.Sqrt(p))), | ||
318 | NormalizeAngle(Math.Atan2(2.0 * (r.z * r.s - r.x * r.y), (t.x - t.y - t.z + t.s)))); | ||
319 | else if (n > 0) | ||
320 | return new LSL_Types.Vector3(0.0, Math.PI / 2, NormalizeAngle(Math.Atan2((r.z * r.s + r.x * r.y), 0.5 - t.x - t.z))); | ||
321 | else | ||
322 | return new LSL_Types.Vector3(0.0, -Math.PI / 2, NormalizeAngle(Math.Atan2((r.z * r.s + r.x * r.y), 0.5 - t.x - t.z))); | ||
323 | } | ||
324 | |||
325 | |||
326 | // Xantor's newer llEuler2Rot() *try the second* inverted quaternions (-x,-y,-z,w) as LL seems to like | ||
327 | // New and improved, now actually works as described. Prim rotates as expected as does llRot2Euler. | ||
328 | |||
329 | /* From wiki: | ||
330 | The Euler angle vector (in radians) is converted to a rotation by doing the rotations around the 3 axes | ||
331 | in Z, Y, X order. So llEuler2Rot(<1.0, 2.0, 3.0> * DEG_TO_RAD) generates a rotation by taking the zero rotation, | ||
332 | a vector pointing along the X axis, first rotating it 3 degrees around the global Z axis, then rotating the resulting | ||
333 | vector 2 degrees around the global Y axis, and finally rotating that 1 degree around the global X axis. | ||
334 | */ | ||
335 | |||
336 | public LSL_Types.Quaternion llEuler2Rot(LSL_Types.Vector3 v) | ||
337 | { | ||
338 | m_host.AddScriptLPS(1); | ||
339 | |||
340 | double x,y,z,s,s_i; | ||
341 | |||
342 | double cosX = Math.Cos(v.x); | ||
343 | double cosY = Math.Cos(v.y); | ||
344 | double cosZ = Math.Cos(v.z); | ||
345 | double sinX = Math.Sin(v.x); | ||
346 | double sinY = Math.Sin(v.y); | ||
347 | double sinZ = Math.Sin(v.z); | ||
348 | |||
349 | s = Math.Sqrt(cosY * cosZ - sinX * sinY * sinZ + cosX * cosZ + cosX * cosY + 1.0f) * 0.5f; | ||
350 | if (Math.Abs(s) < 0.00001) // null rotation | ||
351 | { | ||
352 | x = 0.0f; | ||
353 | y = 1.0f; | ||
354 | z = 0.0f; | ||
355 | } | ||
356 | else | ||
357 | { | ||
358 | s_i = 1.0f / (4.0f * s); | ||
359 | x = - (-sinX * cosY - cosX * sinY * sinZ - sinX * cosZ) * s_i; | ||
360 | y = - (-cosX * sinY * cosZ + sinX * sinZ - sinY) * s_i; | ||
361 | z = - (-cosY * sinZ - sinX * sinY * cosZ - cosX * sinZ) * s_i; | ||
362 | } | ||
363 | return new LSL_Types.Quaternion(x, y, z, s); | ||
364 | } | ||
365 | |||
366 | |||
367 | public LSL_Types.Quaternion llAxes2Rot(LSL_Types.Vector3 fwd, LSL_Types.Vector3 left, LSL_Types.Vector3 up) | ||
368 | { | ||
369 | m_host.AddScriptLPS(1); | ||
370 | NotImplemented("llAxes2Rot"); | ||
371 | return new LSL_Types.Quaternion(); | ||
372 | } | ||
373 | |||
374 | public LSL_Types.Vector3 llRot2Fwd(LSL_Types.Quaternion r) | ||
375 | { | ||
376 | m_host.AddScriptLPS(1); | ||
377 | return (new LSL_Types.Vector3(1,0,0) * r); | ||
378 | } | ||
379 | |||
380 | public LSL_Types.Vector3 llRot2Left(LSL_Types.Quaternion r) | ||
381 | { | ||
382 | m_host.AddScriptLPS(1); | ||
383 | return (new LSL_Types.Vector3(0, 1, 0) * r); | ||
384 | } | ||
385 | |||
386 | public LSL_Types.Vector3 llRot2Up(LSL_Types.Quaternion r) | ||
387 | { | ||
388 | m_host.AddScriptLPS(1); | ||
389 | return (new LSL_Types.Vector3(0, 0, 1) * r); | ||
390 | } | ||
391 | public LSL_Types.Quaternion llRotBetween(LSL_Types.Vector3 a, LSL_Types.Vector3 b) | ||
392 | { | ||
393 | //A and B should both be normalized | ||
394 | m_host.AddScriptLPS(1); | ||
395 | double dotProduct = LSL_Types.Vector3.Dot(a, b); | ||
396 | LSL_Types.Vector3 crossProduct = LSL_Types.Vector3.Cross(a, b); | ||
397 | double magProduct = LSL_Types.Vector3.Mag(a) * LSL_Types.Vector3.Mag(b); | ||
398 | double angle = Math.Acos(dotProduct / magProduct); | ||
399 | LSL_Types.Vector3 axis = LSL_Types.Vector3.Norm(crossProduct); | ||
400 | double s = Math.Sin(angle / 2); | ||
401 | |||
402 | return new LSL_Types.Quaternion(axis.x * s, axis.y * s, axis.z * s, (float)Math.Cos(angle / 2)); | ||
403 | } | ||
404 | public void llWhisper(int channelID, string text) | ||
405 | { | ||
406 | m_host.AddScriptLPS(1); | ||
407 | |||
408 | if(text.Length > 1023) | ||
409 | text=text.Substring(0, 1023); | ||
410 | |||
411 | World.SimChat(Helpers.StringToField(text), | ||
412 | ChatTypeEnum.Whisper, channelID, m_host.AbsolutePosition, m_host.Name, m_host.UUID, false); | ||
413 | |||
414 | IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); | ||
415 | wComm.DeliverMessage(ChatTypeEnum.Whisper, channelID, m_host.Name, m_host.UUID, text); | ||
416 | } | ||
417 | |||
418 | public void llShout(int channelID, string text) | ||
419 | { | ||
420 | m_host.AddScriptLPS(1); | ||
421 | |||
422 | if(text.Length > 1023) | ||
423 | text=text.Substring(0, 1023); | ||
424 | |||
425 | World.SimChat(Helpers.StringToField(text), | ||
426 | ChatTypeEnum.Shout, channelID, m_host.AbsolutePosition, m_host.Name, m_host.UUID, true); | ||
427 | |||
428 | IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); | ||
429 | wComm.DeliverMessage(ChatTypeEnum.Shout, channelID, m_host.Name, m_host.UUID, text); | ||
430 | } | ||
431 | |||
432 | public void llRegionSay(int channelID, string text) | ||
433 | { | ||
434 | if (channelID == 0) | ||
435 | { | ||
436 | LSLError("Cannot use llRegionSay() on channel 0"); | ||
437 | return; | ||
438 | } | ||
439 | |||
440 | |||
441 | if(text.Length > 1023) | ||
442 | text=text.Substring(0, 1023); | ||
443 | |||
444 | m_host.AddScriptLPS(1); | ||
445 | |||
446 | IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); | ||
447 | wComm.DeliverMessage(ChatTypeEnum.Region, channelID, m_host.Name, m_host.UUID, text); | ||
448 | } | ||
449 | |||
450 | public LSL_Types.LSLInteger llListen(int channelID, string name, string ID, string msg) | ||
451 | { | ||
452 | m_host.AddScriptLPS(1); | ||
453 | LLUUID keyID; | ||
454 | LLUUID.TryParse(ID, out keyID); | ||
455 | IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); | ||
456 | return wComm.Listen(m_localID, m_itemID, m_host.UUID, channelID, name, keyID, msg); | ||
457 | } | ||
458 | |||
459 | public void llListenControl(int number, int active) | ||
460 | { | ||
461 | m_host.AddScriptLPS(1); | ||
462 | IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); | ||
463 | wComm.ListenControl(m_itemID, number, active); | ||
464 | } | ||
465 | |||
466 | public void llListenRemove(int number) | ||
467 | { | ||
468 | m_host.AddScriptLPS(1); | ||
469 | IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); | ||
470 | wComm.ListenRemove(m_itemID, number); | ||
471 | } | ||
472 | |||
473 | public void llSensor(string name, string id, int type, double range, double arc) | ||
474 | { | ||
475 | m_host.AddScriptLPS(1); | ||
476 | LLUUID keyID = LLUUID.Zero; | ||
477 | LLUUID.TryParse(id, out keyID); | ||
478 | |||
479 | m_ScriptEngine.m_ASYNCLSLCommandManager.m_SensorRepeat.SenseOnce(m_localID, m_itemID, name, keyID, type, range, arc, m_host); | ||
480 | } | ||
481 | |||
482 | public void llSensorRepeat(string name, string id, int type, double range, double arc, double rate) | ||
483 | { | ||
484 | m_host.AddScriptLPS(1); | ||
485 | LLUUID keyID = LLUUID.Zero; | ||
486 | LLUUID.TryParse(id, out keyID); | ||
487 | |||
488 | m_ScriptEngine.m_ASYNCLSLCommandManager.m_SensorRepeat.SetSenseRepeatEvent(m_localID, m_itemID, name, keyID, type, range, arc, rate, m_host); | ||
489 | } | ||
490 | |||
491 | public void llSensorRemove() | ||
492 | { | ||
493 | m_host.AddScriptLPS(1); | ||
494 | m_ScriptEngine.m_ASYNCLSLCommandManager.m_SensorRepeat.UnSetSenseRepeaterEvents(m_localID, m_itemID); | ||
495 | } | ||
496 | |||
497 | public string resolveName(LLUUID objecUUID) | ||
498 | { | ||
499 | // try avatar username surname | ||
500 | UserProfileData profile = World.CommsManager.UserService.GetUserProfile(objecUUID); | ||
501 | if (profile != null) | ||
502 | { | ||
503 | string avatarname = profile.FirstName + " " + profile.SurName; | ||
504 | return avatarname; | ||
505 | } | ||
506 | // try an scene object | ||
507 | SceneObjectPart SOP = World.GetSceneObjectPart(objecUUID); | ||
508 | if (SOP != null) | ||
509 | { | ||
510 | string objectname = SOP.Name; | ||
511 | return objectname; | ||
512 | } | ||
513 | |||
514 | EntityBase SensedObject; | ||
515 | lock (World.Entities) | ||
516 | { | ||
517 | World.Entities.TryGetValue(objecUUID, out SensedObject); | ||
518 | } | ||
519 | |||
520 | if (SensedObject == null) | ||
521 | return String.Empty; | ||
522 | return SensedObject.Name; | ||
523 | |||
524 | } | ||
525 | |||
526 | public string llDetectedName(int number) | ||
527 | { | ||
528 | m_host.AddScriptLPS(1); | ||
529 | LLUUID sensedUUID = m_ScriptEngine.GetDetectID(m_itemID, number); | ||
530 | if(sensedUUID != null) | ||
531 | return resolveName(sensedUUID); | ||
532 | return String.Empty; | ||
533 | } | ||
534 | |||
535 | public LLUUID uuidDetectedKey(int number) | ||
536 | { | ||
537 | return m_ScriptEngine.GetDetectID(m_itemID, number); | ||
538 | } | ||
539 | |||
540 | public EntityBase entityDetectedKey(int number) | ||
541 | { | ||
542 | LLUUID sensedUUID = m_ScriptEngine.GetDetectID(m_itemID, number); | ||
543 | if(sensedUUID != null) | ||
544 | { | ||
545 | EntityBase SensedObject = null; | ||
546 | lock (World.Entities) | ||
547 | { | ||
548 | World.Entities.TryGetValue(sensedUUID, out SensedObject); | ||
549 | } | ||
550 | return SensedObject; | ||
551 | } | ||
552 | return null; | ||
553 | } | ||
554 | |||
555 | public string llDetectedKey(int number) | ||
556 | { | ||
557 | m_host.AddScriptLPS(1); | ||
558 | LLUUID SensedUUID = uuidDetectedKey(number); | ||
559 | if (SensedUUID == LLUUID.Zero) | ||
560 | return String.Empty; | ||
561 | |||
562 | return SensedUUID.ToString(); | ||
563 | } | ||
564 | |||
565 | public string llDetectedOwner(int number) | ||
566 | { | ||
567 | // returns UUID of owner of object detected | ||
568 | m_host.AddScriptLPS(1); | ||
569 | EntityBase SensedObject = entityDetectedKey(number); | ||
570 | if (SensedObject ==null) | ||
571 | return String.Empty; | ||
572 | LLUUID SensedUUID = uuidDetectedKey(number); | ||
573 | if (World.GetScenePresence(SensedUUID) == null) | ||
574 | { | ||
575 | // sensed object is not an avatar | ||
576 | // so get the owner of the sensed object | ||
577 | SceneObjectPart SOP = World.GetSceneObjectPart(SensedUUID); | ||
578 | if (SOP != null) { return SOP.ObjectOwner.ToString(); } | ||
579 | } | ||
580 | else | ||
581 | { | ||
582 | // sensed object is an avatar, and so must be its own owner | ||
583 | return SensedUUID.ToString(); | ||
584 | } | ||
585 | |||
586 | |||
587 | return String.Empty; | ||
588 | |||
589 | } | ||
590 | |||
591 | public LSL_Types.LSLInteger llDetectedType(int number) | ||
592 | { | ||
593 | m_host.AddScriptLPS(1); | ||
594 | EntityBase SensedObject = entityDetectedKey(number); | ||
595 | if (SensedObject == null) | ||
596 | return 0; | ||
597 | int mask = 0; | ||
598 | |||
599 | LLUUID SensedUUID = uuidDetectedKey(number); | ||
600 | LSL_Types.Vector3 ZeroVector = new LSL_Types.Vector3(0, 0, 0); | ||
601 | |||
602 | if (World.GetScenePresence(SensedUUID) != null) mask |= 0x01; // actor | ||
603 | if (SensedObject.Velocity.Equals(ZeroVector)) | ||
604 | mask |= 0x04; // passive non-moving | ||
605 | else | ||
606 | mask |= 0x02; // active moving | ||
607 | if (SensedObject is IScript) mask |= 0x08; // Scripted. It COULD have one hidden ... | ||
608 | return mask; | ||
609 | |||
610 | } | ||
611 | |||
612 | public LSL_Types.Vector3 llDetectedPos(int number) | ||
613 | { | ||
614 | m_host.AddScriptLPS(1); | ||
615 | EntityBase SensedObject = entityDetectedKey(number); | ||
616 | if (SensedObject == null) | ||
617 | return new LSL_Types.Vector3(0, 0, 0); | ||
618 | |||
619 | return new LSL_Types.Vector3(SensedObject.AbsolutePosition.X,SensedObject.AbsolutePosition.Y,SensedObject.AbsolutePosition.Z); | ||
620 | } | ||
621 | |||
622 | public LSL_Types.Vector3 llDetectedVel(int number) | ||
623 | { | ||
624 | m_host.AddScriptLPS(1); | ||
625 | EntityBase SensedObject = entityDetectedKey(number); | ||
626 | if (SensedObject == null) | ||
627 | return new LSL_Types.Vector3(0, 0, 0); | ||
628 | |||
629 | return new LSL_Types.Vector3(SensedObject.Velocity.X, SensedObject.Velocity.Y, SensedObject.Velocity.Z); | ||
630 | // return new LSL_Types.Vector3(); | ||
631 | } | ||
632 | |||
633 | public LSL_Types.Vector3 llDetectedGrab(int number) | ||
634 | { | ||
635 | m_host.AddScriptLPS(1); | ||
636 | XDetectParams parms = m_ScriptEngine.GetDetectParams(m_itemID, number); | ||
637 | |||
638 | return parms.OffsetPos; | ||
639 | } | ||
640 | |||
641 | public LSL_Types.Quaternion llDetectedRot(int number) | ||
642 | { | ||
643 | m_host.AddScriptLPS(1); | ||
644 | EntityBase SensedObject = entityDetectedKey(number); | ||
645 | if (SensedObject == null) | ||
646 | return new LSL_Types.Quaternion(); | ||
647 | |||
648 | return new LSL_Types.Quaternion(SensedObject.Rotation.x, SensedObject.Rotation.y, SensedObject.Rotation.z, SensedObject.Rotation.w); | ||
649 | } | ||
650 | |||
651 | public LSL_Types.LSLInteger llDetectedGroup(int number) | ||
652 | { | ||
653 | m_host.AddScriptLPS(1); | ||
654 | NotImplemented("llDetectedGroup"); | ||
655 | return 0; | ||
656 | } | ||
657 | |||
658 | public LSL_Types.LSLInteger llDetectedLinkNumber(int number) | ||
659 | { | ||
660 | m_host.AddScriptLPS(1); | ||
661 | NotImplemented("llDetectedLinkNumber"); | ||
662 | return 0; | ||
663 | } | ||
664 | |||
665 | public void llDie() | ||
666 | { | ||
667 | m_host.AddScriptLPS(1); | ||
668 | World.DeleteSceneObject(m_host.ParentGroup); | ||
669 | } | ||
670 | |||
671 | public double llGround(LSL_Types.Vector3 offset) | ||
672 | { | ||
673 | m_host.AddScriptLPS(1); | ||
674 | int x = (int)(m_host.AbsolutePosition.X + offset.x); | ||
675 | int y = (int)(m_host.AbsolutePosition.Y + offset.y); | ||
676 | return World.GetLandHeight(x, y); | ||
677 | } | ||
678 | |||
679 | public double llCloud(LSL_Types.Vector3 offset) | ||
680 | { | ||
681 | m_host.AddScriptLPS(1); | ||
682 | NotImplemented("llCloud"); | ||
683 | return 0; | ||
684 | } | ||
685 | |||
686 | public LSL_Types.Vector3 llWind(LSL_Types.Vector3 offset) | ||
687 | { | ||
688 | m_host.AddScriptLPS(1); | ||
689 | NotImplemented("llWind"); | ||
690 | return new LSL_Types.Vector3(); | ||
691 | } | ||
692 | |||
693 | public void llSetStatus(int status, int value) | ||
694 | { | ||
695 | m_host.AddScriptLPS(1); | ||
696 | |||
697 | int statusrotationaxis = 0; | ||
698 | |||
699 | if ((status & BuiltIn_Commands_BaseClass.STATUS_PHYSICS) == BuiltIn_Commands_BaseClass.STATUS_PHYSICS) | ||
700 | { | ||
701 | if (value == 1) | ||
702 | m_host.ScriptSetPhysicsStatus(true); | ||
703 | else | ||
704 | m_host.ScriptSetPhysicsStatus(false); | ||
705 | |||
706 | } | ||
707 | if ((status & BuiltIn_Commands_BaseClass.STATUS_PHANTOM) == BuiltIn_Commands_BaseClass.STATUS_PHANTOM) | ||
708 | { | ||
709 | if (value == 1) | ||
710 | m_host.ScriptSetPhantomStatus(true); | ||
711 | else | ||
712 | m_host.ScriptSetPhantomStatus(false); | ||
713 | } | ||
714 | if ((status & BuiltIn_Commands_BaseClass.STATUS_CAST_SHADOWS) == BuiltIn_Commands_BaseClass.STATUS_CAST_SHADOWS) | ||
715 | { | ||
716 | m_host.AddFlag(LLObject.ObjectFlags.CastShadows); | ||
717 | } | ||
718 | if ((status & BuiltIn_Commands_BaseClass.STATUS_ROTATE_X) == BuiltIn_Commands_BaseClass.STATUS_ROTATE_X) | ||
719 | { | ||
720 | statusrotationaxis |= BuiltIn_Commands_BaseClass.STATUS_ROTATE_X; | ||
721 | |||
722 | } | ||
723 | if ((status & BuiltIn_Commands_BaseClass.STATUS_ROTATE_Y) == BuiltIn_Commands_BaseClass.STATUS_ROTATE_Y) | ||
724 | { | ||
725 | statusrotationaxis |= BuiltIn_Commands_BaseClass.STATUS_ROTATE_Y; | ||
726 | } | ||
727 | if ((status & BuiltIn_Commands_BaseClass.STATUS_ROTATE_Z) == BuiltIn_Commands_BaseClass.STATUS_ROTATE_Z) | ||
728 | { | ||
729 | statusrotationaxis |= BuiltIn_Commands_BaseClass.STATUS_ROTATE_Z; | ||
730 | } | ||
731 | if ((status & BuiltIn_Commands_BaseClass.STATUS_BLOCK_GRAB) == BuiltIn_Commands_BaseClass.STATUS_BLOCK_GRAB) | ||
732 | { | ||
733 | NotImplemented("llSetStatus - STATUS_BLOCK_GRAB"); | ||
734 | } | ||
735 | if ((status & BuiltIn_Commands_BaseClass.STATUS_DIE_AT_EDGE) == BuiltIn_Commands_BaseClass.STATUS_DIE_AT_EDGE) | ||
736 | { | ||
737 | if (value == 1) | ||
738 | m_host.SetDieAtEdge(true); | ||
739 | else | ||
740 | m_host.SetDieAtEdge(false); | ||
741 | } | ||
742 | if ((status & BuiltIn_Commands_BaseClass.STATUS_RETURN_AT_EDGE) == BuiltIn_Commands_BaseClass.STATUS_RETURN_AT_EDGE) | ||
743 | { | ||
744 | NotImplemented("llSetStatus - STATUS_RETURN_AT_EDGE"); | ||
745 | } | ||
746 | if ((status & BuiltIn_Commands_BaseClass.STATUS_SANDBOX) == BuiltIn_Commands_BaseClass.STATUS_SANDBOX) | ||
747 | { | ||
748 | NotImplemented("llSetStatus - STATUS_SANDBOX"); | ||
749 | } | ||
750 | if (statusrotationaxis != 0) | ||
751 | { | ||
752 | m_host.SetAxisRotation(statusrotationaxis, value); | ||
753 | |||
754 | } | ||
755 | } | ||
756 | |||
757 | public LSL_Types.LSLInteger llGetStatus(int status) | ||
758 | { | ||
759 | m_host.AddScriptLPS(1); | ||
760 | // Console.WriteLine(m_host.UUID.ToString() + " status is " + m_host.GetEffectiveObjectFlags().ToString()); | ||
761 | switch (status) | ||
762 | { | ||
763 | case BuiltIn_Commands_BaseClass.STATUS_PHYSICS: | ||
764 | if ((m_host.GetEffectiveObjectFlags() & (uint)LLObject.ObjectFlags.Physics) == (uint)LLObject.ObjectFlags.Physics) | ||
765 | { | ||
766 | return 1; | ||
767 | } | ||
768 | return 0; | ||
769 | case BuiltIn_Commands_BaseClass.STATUS_PHANTOM: | ||
770 | if ((m_host.GetEffectiveObjectFlags() & (uint)LLObject.ObjectFlags.Phantom) == (uint)LLObject.ObjectFlags.Phantom) | ||
771 | { | ||
772 | return 1; | ||
773 | } | ||
774 | return 0; | ||
775 | case BuiltIn_Commands_BaseClass.STATUS_CAST_SHADOWS: | ||
776 | if ((m_host.GetEffectiveObjectFlags() & (uint)LLObject.ObjectFlags.CastShadows) == (uint)LLObject.ObjectFlags.CastShadows) | ||
777 | { | ||
778 | return 1; | ||
779 | } | ||
780 | return 0; | ||
781 | case BuiltIn_Commands_BaseClass.STATUS_BLOCK_GRAB: | ||
782 | NotImplemented("llGetStatus - STATUS_BLOCK_GRAB"); | ||
783 | return 0; | ||
784 | case BuiltIn_Commands_BaseClass.STATUS_DIE_AT_EDGE: | ||
785 | |||
786 | if (m_host.GetDieAtEdge()) | ||
787 | return 1; | ||
788 | else | ||
789 | return 0; | ||
790 | |||
791 | case BuiltIn_Commands_BaseClass.STATUS_RETURN_AT_EDGE: | ||
792 | NotImplemented("llGetStatus - STATUS_RETURN_AT_EDGE"); | ||
793 | return 0; | ||
794 | case BuiltIn_Commands_BaseClass.STATUS_ROTATE_X: | ||
795 | NotImplemented("llGetStatus - STATUS_ROTATE_X"); | ||
796 | return 0; | ||
797 | case BuiltIn_Commands_BaseClass.STATUS_ROTATE_Y: | ||
798 | NotImplemented("llGetStatus - STATUS_ROTATE_Y"); | ||
799 | return 0; | ||
800 | case BuiltIn_Commands_BaseClass.STATUS_ROTATE_Z: | ||
801 | NotImplemented("llGetStatus - STATUS_ROTATE_Z"); | ||
802 | return 0; | ||
803 | case BuiltIn_Commands_BaseClass.STATUS_SANDBOX: | ||
804 | NotImplemented("llGetStatus - STATUS_SANDBOX"); | ||
805 | return 0; | ||
806 | } | ||
807 | return 0; | ||
808 | } | ||
809 | |||
810 | public void llSetScale(LSL_Types.Vector3 scale) | ||
811 | { | ||
812 | m_host.AddScriptLPS(1); | ||
813 | SetScale(m_host, scale); | ||
814 | } | ||
815 | |||
816 | private void SetScale(SceneObjectPart part, LSL_Types.Vector3 scale) | ||
817 | { | ||
818 | // TODO: this needs to trigger a persistance save as well | ||
819 | LLVector3 tmp = part.Scale; | ||
820 | tmp.X = (float)scale.x; | ||
821 | tmp.Y = (float)scale.y; | ||
822 | tmp.Z = (float)scale.z; | ||
823 | part.Scale = tmp; | ||
824 | part.SendFullUpdateToAllClients(); | ||
825 | } | ||
826 | |||
827 | public LSL_Types.Vector3 llGetScale() | ||
828 | { | ||
829 | m_host.AddScriptLPS(1); | ||
830 | return new LSL_Types.Vector3(m_host.Scale.X, m_host.Scale.Y, m_host.Scale.Z); | ||
831 | } | ||
832 | |||
833 | public void llSetColor(LSL_Types.Vector3 color, int face) | ||
834 | { | ||
835 | m_host.AddScriptLPS(1); | ||
836 | |||
837 | SetColor(m_host, color, face); | ||
838 | } | ||
839 | |||
840 | private void SetColor(SceneObjectPart part, LSL_Types.Vector3 color, int face) | ||
841 | { | ||
842 | LLObject.TextureEntry tex = part.Shape.Textures; | ||
843 | LLColor texcolor; | ||
844 | if (face > -1) | ||
845 | { | ||
846 | texcolor = tex.CreateFace((uint)face).RGBA; | ||
847 | texcolor.R = (float)Math.Abs(color.x - 1); | ||
848 | texcolor.G = (float)Math.Abs(color.y - 1); | ||
849 | texcolor.B = (float)Math.Abs(color.z - 1); | ||
850 | tex.FaceTextures[face].RGBA = texcolor; | ||
851 | part.UpdateTexture(tex); | ||
852 | return; | ||
853 | } | ||
854 | else if (face == -1) | ||
855 | { | ||
856 | for (uint i = 0; i < 32; i++) | ||
857 | { | ||
858 | if (tex.FaceTextures[i] != null) | ||
859 | { | ||
860 | texcolor = tex.FaceTextures[i].RGBA; | ||
861 | texcolor.R = (float)Math.Abs(color.x - 1); | ||
862 | texcolor.G = (float)Math.Abs(color.y - 1); | ||
863 | texcolor.B = (float)Math.Abs(color.z - 1); | ||
864 | tex.FaceTextures[i].RGBA = texcolor; | ||
865 | } | ||
866 | texcolor = tex.DefaultTexture.RGBA; | ||
867 | texcolor.R = (float)Math.Abs(color.x - 1); | ||
868 | texcolor.G = (float)Math.Abs(color.y - 1); | ||
869 | texcolor.B = (float)Math.Abs(color.z - 1); | ||
870 | tex.DefaultTexture.RGBA = texcolor; | ||
871 | } | ||
872 | part.UpdateTexture(tex); | ||
873 | return; | ||
874 | } | ||
875 | } | ||
876 | |||
877 | public double llGetAlpha(int face) | ||
878 | { | ||
879 | m_host.AddScriptLPS(1); | ||
880 | LLObject.TextureEntry tex = m_host.Shape.Textures; | ||
881 | if (face == -1) // TMP: Until we can determine number of sides, ALL_SIDES (-1) will return default color | ||
882 | { | ||
883 | return (double)((tex.DefaultTexture.RGBA.A * 255) / 255); | ||
884 | } | ||
885 | if (face > -1) | ||
886 | { | ||
887 | return (double)((tex.GetFace((uint)face).RGBA.A * 255) / 255); | ||
888 | } | ||
889 | return 0; | ||
890 | } | ||
891 | |||
892 | public void llSetAlpha(double alpha, int face) | ||
893 | { | ||
894 | m_host.AddScriptLPS(1); | ||
895 | |||
896 | SetAlpha(m_host, alpha, face); | ||
897 | } | ||
898 | |||
899 | private void SetAlpha(SceneObjectPart part, double alpha, int face) | ||
900 | { | ||
901 | LLObject.TextureEntry tex = part.Shape.Textures; | ||
902 | LLColor texcolor; | ||
903 | if (face > -1) | ||
904 | { | ||
905 | texcolor = tex.CreateFace((uint)face).RGBA; | ||
906 | texcolor.A = (float)Math.Abs(alpha - 1); | ||
907 | tex.FaceTextures[face].RGBA = texcolor; | ||
908 | part.UpdateTexture(tex); | ||
909 | return; | ||
910 | } | ||
911 | else if (face == -1) | ||
912 | { | ||
913 | for (int i = 0; i < 32; i++) | ||
914 | { | ||
915 | if (tex.FaceTextures[i] != null) | ||
916 | { | ||
917 | texcolor = tex.FaceTextures[i].RGBA; | ||
918 | texcolor.A = (float)Math.Abs(alpha - 1); | ||
919 | tex.FaceTextures[i].RGBA = texcolor; | ||
920 | } | ||
921 | } | ||
922 | texcolor = tex.DefaultTexture.RGBA; | ||
923 | texcolor.A = (float)Math.Abs(alpha - 1); | ||
924 | tex.DefaultTexture.RGBA = texcolor; | ||
925 | part.UpdateTexture(tex); | ||
926 | return; | ||
927 | } | ||
928 | } | ||
929 | |||
930 | public LSL_Types.Vector3 llGetColor(int face) | ||
931 | { | ||
932 | m_host.AddScriptLPS(1); | ||
933 | LLObject.TextureEntry tex = m_host.Shape.Textures; | ||
934 | LLColor texcolor; | ||
935 | LSL_Types.Vector3 rgb; | ||
936 | if (face == -1) // TMP: Until we can determine number of sides, ALL_SIDES (-1) will return default color | ||
937 | { | ||
938 | texcolor = tex.DefaultTexture.RGBA; | ||
939 | rgb.x = (255 - (texcolor.R * 255)) / 255; | ||
940 | rgb.y = (255 - (texcolor.G * 255)) / 255; | ||
941 | rgb.z = (255 - (texcolor.B * 255)) / 255; | ||
942 | return rgb; | ||
943 | } | ||
944 | if (face > -1) | ||
945 | { | ||
946 | texcolor = tex.GetFace((uint)face).RGBA; | ||
947 | rgb.x = (255 - (texcolor.R * 255)) / 255; | ||
948 | rgb.y = (255 - (texcolor.G * 255)) / 255; | ||
949 | rgb.z = (255 - (texcolor.B * 255)) / 255; | ||
950 | return rgb; | ||
951 | } | ||
952 | else | ||
953 | { | ||
954 | return new LSL_Types.Vector3(); | ||
955 | } | ||
956 | } | ||
957 | |||
958 | public void llSetTexture(string texture, int face) | ||
959 | { | ||
960 | m_host.AddScriptLPS(1); | ||
961 | SetTexture(m_host, texture, face); | ||
962 | } | ||
963 | |||
964 | private void SetTexture(SceneObjectPart part, string texture, int face) | ||
965 | { | ||
966 | LLUUID textureID=new LLUUID(); | ||
967 | |||
968 | if (!LLUUID.TryParse(texture, out textureID)) | ||
969 | { | ||
970 | textureID=InventoryKey(texture, (int)AssetType.Texture); | ||
971 | } | ||
972 | |||
973 | if (textureID == LLUUID.Zero) | ||
974 | return; | ||
975 | |||
976 | LLObject.TextureEntry tex = part.Shape.Textures; | ||
977 | |||
978 | if (face > -1) | ||
979 | { | ||
980 | LLObject.TextureEntryFace texface = tex.CreateFace((uint)face); | ||
981 | texface.TextureID = textureID; | ||
982 | tex.FaceTextures[face] = texface; | ||
983 | part.UpdateTexture(tex); | ||
984 | return; | ||
985 | } | ||
986 | else if (face == -1) | ||
987 | { | ||
988 | for (uint i = 0; i < 32; i++) | ||
989 | { | ||
990 | if (tex.FaceTextures[i] != null) | ||
991 | { | ||
992 | tex.FaceTextures[i].TextureID = textureID; | ||
993 | } | ||
994 | } | ||
995 | tex.DefaultTexture.TextureID = textureID; | ||
996 | part.UpdateTexture(tex); | ||
997 | return; | ||
998 | } | ||
999 | } | ||
1000 | |||
1001 | public void llScaleTexture(double u, double v, int face) | ||
1002 | { | ||
1003 | m_host.AddScriptLPS(1); | ||
1004 | |||
1005 | ScaleTexture(m_host, u, v, face); | ||
1006 | } | ||
1007 | |||
1008 | private void ScaleTexture(SceneObjectPart part, double u, double v, int face) | ||
1009 | { | ||
1010 | LLObject.TextureEntry tex = part.Shape.Textures; | ||
1011 | if (face > -1) | ||
1012 | { | ||
1013 | LLObject.TextureEntryFace texface = tex.CreateFace((uint)face); | ||
1014 | texface.RepeatU = (float)u; | ||
1015 | texface.RepeatV = (float)v; | ||
1016 | tex.FaceTextures[face] = texface; | ||
1017 | part.UpdateTexture(tex); | ||
1018 | return; | ||
1019 | } | ||
1020 | if (face == -1) | ||
1021 | { | ||
1022 | for (int i = 0; i < 32; i++) | ||
1023 | { | ||
1024 | if (tex.FaceTextures[i] != null) | ||
1025 | { | ||
1026 | tex.FaceTextures[i].RepeatU = (float)u; | ||
1027 | tex.FaceTextures[i].RepeatV = (float)v; | ||
1028 | } | ||
1029 | } | ||
1030 | tex.DefaultTexture.RepeatU = (float)u; | ||
1031 | tex.DefaultTexture.RepeatV = (float)v; | ||
1032 | part.UpdateTexture(tex); | ||
1033 | return; | ||
1034 | } | ||
1035 | } | ||
1036 | |||
1037 | public void llOffsetTexture(double u, double v, int face) | ||
1038 | { | ||
1039 | m_host.AddScriptLPS(1); | ||
1040 | OffsetTexture(m_host, u, v, face); | ||
1041 | } | ||
1042 | |||
1043 | private void OffsetTexture(SceneObjectPart part, double u, double v, int face) | ||
1044 | { | ||
1045 | LLObject.TextureEntry tex = part.Shape.Textures; | ||
1046 | if (face > -1) | ||
1047 | { | ||
1048 | LLObject.TextureEntryFace texface = tex.CreateFace((uint)face); | ||
1049 | texface.OffsetU = (float)u; | ||
1050 | texface.OffsetV = (float)v; | ||
1051 | tex.FaceTextures[face] = texface; | ||
1052 | part.UpdateTexture(tex); | ||
1053 | return; | ||
1054 | } | ||
1055 | if (face == -1) | ||
1056 | { | ||
1057 | for (int i = 0; i < 32; i++) | ||
1058 | { | ||
1059 | if (tex.FaceTextures[i] != null) | ||
1060 | { | ||
1061 | tex.FaceTextures[i].OffsetU = (float)u; | ||
1062 | tex.FaceTextures[i].OffsetV = (float)v; | ||
1063 | } | ||
1064 | } | ||
1065 | tex.DefaultTexture.OffsetU = (float)u; | ||
1066 | tex.DefaultTexture.OffsetV = (float)v; | ||
1067 | part.UpdateTexture(tex); | ||
1068 | return; | ||
1069 | } | ||
1070 | } | ||
1071 | |||
1072 | public void llRotateTexture(double rotation, int face) | ||
1073 | { | ||
1074 | m_host.AddScriptLPS(1); | ||
1075 | RotateTexture(m_host, rotation, face); | ||
1076 | } | ||
1077 | |||
1078 | private void RotateTexture(SceneObjectPart part, double rotation, int face) | ||
1079 | { | ||
1080 | LLObject.TextureEntry tex = part.Shape.Textures; | ||
1081 | if (face > -1) | ||
1082 | { | ||
1083 | LLObject.TextureEntryFace texface = tex.CreateFace((uint)face); | ||
1084 | texface.Rotation = (float)rotation; | ||
1085 | tex.FaceTextures[face] = texface; | ||
1086 | part.UpdateTexture(tex); | ||
1087 | return; | ||
1088 | } | ||
1089 | if (face == -1) | ||
1090 | { | ||
1091 | for (int i = 0; i < 32; i++) | ||
1092 | { | ||
1093 | if (tex.FaceTextures[i] != null) | ||
1094 | { | ||
1095 | tex.FaceTextures[i].Rotation = (float)rotation; | ||
1096 | } | ||
1097 | } | ||
1098 | tex.DefaultTexture.Rotation = (float)rotation; | ||
1099 | part.UpdateTexture(tex); | ||
1100 | return; | ||
1101 | } | ||
1102 | } | ||
1103 | |||
1104 | public string llGetTexture(int face) | ||
1105 | { | ||
1106 | m_host.AddScriptLPS(1); | ||
1107 | LLObject.TextureEntry tex = m_host.Shape.Textures; | ||
1108 | if (face == -1) | ||
1109 | { | ||
1110 | face = 0; | ||
1111 | } | ||
1112 | if (face > -1) | ||
1113 | { | ||
1114 | LLObject.TextureEntryFace texface; | ||
1115 | texface = tex.GetFace((uint)face); | ||
1116 | return texface.TextureID.ToString(); | ||
1117 | } | ||
1118 | else | ||
1119 | { | ||
1120 | return String.Empty; | ||
1121 | } | ||
1122 | } | ||
1123 | |||
1124 | public void llSetPos(LSL_Types.Vector3 pos) | ||
1125 | { | ||
1126 | m_host.AddScriptLPS(1); | ||
1127 | |||
1128 | SetPos(m_host, pos); | ||
1129 | } | ||
1130 | |||
1131 | private void SetPos(SceneObjectPart part, LSL_Types.Vector3 pos) | ||
1132 | { | ||
1133 | if (part.ParentID != 0) | ||
1134 | { | ||
1135 | part.UpdateOffSet(new LLVector3((float)pos.x, (float)pos.y, (float)pos.z)); | ||
1136 | } | ||
1137 | else | ||
1138 | { | ||
1139 | part.UpdateGroupPosition(new LLVector3((float)pos.x, (float)pos.y, (float)pos.z)); | ||
1140 | } | ||
1141 | } | ||
1142 | |||
1143 | public LSL_Types.Vector3 llGetPos() | ||
1144 | { | ||
1145 | m_host.AddScriptLPS(1); | ||
1146 | return new LSL_Types.Vector3(m_host.AbsolutePosition.X, | ||
1147 | m_host.AbsolutePosition.Y, | ||
1148 | m_host.AbsolutePosition.Z); | ||
1149 | } | ||
1150 | |||
1151 | public LSL_Types.Vector3 llGetLocalPos() | ||
1152 | { | ||
1153 | m_host.AddScriptLPS(1); | ||
1154 | if (m_host.ParentID != 0) | ||
1155 | { | ||
1156 | return new LSL_Types.Vector3(m_host.OffsetPosition.X, | ||
1157 | m_host.OffsetPosition.Y, | ||
1158 | m_host.OffsetPosition.Z); | ||
1159 | } | ||
1160 | else | ||
1161 | { | ||
1162 | return new LSL_Types.Vector3(m_host.AbsolutePosition.X, | ||
1163 | m_host.AbsolutePosition.Y, | ||
1164 | m_host.AbsolutePosition.Z); | ||
1165 | } | ||
1166 | } | ||
1167 | |||
1168 | public void llSetRot(LSL_Types.Quaternion rot) | ||
1169 | { | ||
1170 | m_host.AddScriptLPS(1); | ||
1171 | |||
1172 | SetRot(m_host, rot); | ||
1173 | } | ||
1174 | |||
1175 | private void SetRot(SceneObjectPart part, LSL_Types.Quaternion rot) | ||
1176 | { | ||
1177 | part.UpdateRotation(new LLQuaternion((float)rot.x, (float)rot.y, (float)rot.z, (float)rot.s)); | ||
1178 | // Update rotation does not move the object in the physics scene if it's a linkset. | ||
1179 | part.ParentGroup.AbsolutePosition = part.ParentGroup.AbsolutePosition; | ||
1180 | } | ||
1181 | |||
1182 | public LSL_Types.Quaternion llGetRot() | ||
1183 | { | ||
1184 | m_host.AddScriptLPS(1); | ||
1185 | LLQuaternion q = m_host.RotationOffset; | ||
1186 | return new LSL_Types.Quaternion(q.X, q.Y, q.Z, q.W); | ||
1187 | } | ||
1188 | |||
1189 | public LSL_Types.Quaternion llGetLocalRot() | ||
1190 | { | ||
1191 | m_host.AddScriptLPS(1); | ||
1192 | return new LSL_Types.Quaternion(m_host.RotationOffset.X, m_host.RotationOffset.Y, m_host.RotationOffset.Z, m_host.RotationOffset.W); | ||
1193 | } | ||
1194 | |||
1195 | public void llSetForce(LSL_Types.Vector3 force, int local) | ||
1196 | { | ||
1197 | m_host.AddScriptLPS(1); | ||
1198 | NotImplemented("llSetForce"); | ||
1199 | } | ||
1200 | |||
1201 | public LSL_Types.Vector3 llGetForce() | ||
1202 | { | ||
1203 | m_host.AddScriptLPS(1); | ||
1204 | NotImplemented("llGetForce"); | ||
1205 | return new LSL_Types.Vector3(); | ||
1206 | } | ||
1207 | |||
1208 | public LSL_Types.LSLInteger llTarget(LSL_Types.Vector3 position, double range) | ||
1209 | { | ||
1210 | m_host.AddScriptLPS(1); | ||
1211 | return m_host.registerTargetWaypoint(new LLVector3((float)position.x, (float)position.y, (float)position.z), (float)range); | ||
1212 | |||
1213 | } | ||
1214 | |||
1215 | public void llTargetRemove(int number) | ||
1216 | { | ||
1217 | m_host.AddScriptLPS(1); | ||
1218 | m_host.unregisterTargetWaypoint(number); | ||
1219 | } | ||
1220 | |||
1221 | public LSL_Types.LSLInteger llRotTarget(LSL_Types.Quaternion rot, double error) | ||
1222 | { | ||
1223 | m_host.AddScriptLPS(1); | ||
1224 | NotImplemented("llRotTarget"); | ||
1225 | return 0; | ||
1226 | } | ||
1227 | |||
1228 | public void llRotTargetRemove(int number) | ||
1229 | { | ||
1230 | m_host.AddScriptLPS(1); | ||
1231 | NotImplemented("llRotTargetRemove"); | ||
1232 | } | ||
1233 | |||
1234 | public void llMoveToTarget(LSL_Types.Vector3 target, double tau) | ||
1235 | { | ||
1236 | m_host.AddScriptLPS(1); | ||
1237 | m_host.MoveToTarget(new LLVector3((float)target.x, (float)target.y, (float)target.z), (float)tau); | ||
1238 | } | ||
1239 | |||
1240 | public void llStopMoveToTarget() | ||
1241 | { | ||
1242 | m_host.AddScriptLPS(1); | ||
1243 | m_host.StopMoveToTarget(); | ||
1244 | } | ||
1245 | |||
1246 | public void llApplyImpulse(LSL_Types.Vector3 force, int local) | ||
1247 | { | ||
1248 | m_host.AddScriptLPS(1); | ||
1249 | //No energy force yet | ||
1250 | |||
1251 | if (force.x > 20000) | ||
1252 | force.x = 20000; | ||
1253 | if (force.y > 20000) | ||
1254 | force.y = 20000; | ||
1255 | if (force.z > 20000) | ||
1256 | force.z = 20000; | ||
1257 | |||
1258 | if (local == 1) | ||
1259 | { | ||
1260 | m_host.ApplyImpulse(new LLVector3((float)force.x, (float)force.y, (float)force.z), true); | ||
1261 | } | ||
1262 | else | ||
1263 | { | ||
1264 | |||
1265 | m_host.ApplyImpulse(new LLVector3((float)force.x,(float)force.y,(float)force.z), false); | ||
1266 | } | ||
1267 | } | ||
1268 | |||
1269 | public void llApplyRotationalImpulse(LSL_Types.Vector3 force, int local) | ||
1270 | { | ||
1271 | m_host.AddScriptLPS(1); | ||
1272 | NotImplemented("llApplyRotationalImpulse"); | ||
1273 | } | ||
1274 | |||
1275 | public void llSetTorque(LSL_Types.Vector3 torque, int local) | ||
1276 | { | ||
1277 | m_host.AddScriptLPS(1); | ||
1278 | NotImplemented("llSetTorque"); | ||
1279 | } | ||
1280 | |||
1281 | public LSL_Types.Vector3 llGetTorque() | ||
1282 | { | ||
1283 | m_host.AddScriptLPS(1); | ||
1284 | NotImplemented("llGetTorque"); | ||
1285 | return new LSL_Types.Vector3(); | ||
1286 | } | ||
1287 | |||
1288 | public void llSetForceAndTorque(LSL_Types.Vector3 force, LSL_Types.Vector3 torque, int local) | ||
1289 | { | ||
1290 | m_host.AddScriptLPS(1); | ||
1291 | NotImplemented("llSetForceAndTorque"); | ||
1292 | } | ||
1293 | |||
1294 | public LSL_Types.Vector3 llGetVel() | ||
1295 | { | ||
1296 | m_host.AddScriptLPS(1); | ||
1297 | return new LSL_Types.Vector3(m_host.Velocity.X, m_host.Velocity.Y, m_host.Velocity.Z); | ||
1298 | } | ||
1299 | |||
1300 | public LSL_Types.Vector3 llGetAccel() | ||
1301 | { | ||
1302 | m_host.AddScriptLPS(1); | ||
1303 | return new LSL_Types.Vector3(m_host.Acceleration.X, m_host.Acceleration.Y, m_host.Acceleration.Z); | ||
1304 | } | ||
1305 | |||
1306 | public LSL_Types.Vector3 llGetOmega() | ||
1307 | { | ||
1308 | m_host.AddScriptLPS(1); | ||
1309 | return new LSL_Types.Vector3(m_host.RotationalVelocity.X, m_host.RotationalVelocity.Y, m_host.RotationalVelocity.Z); | ||
1310 | } | ||
1311 | |||
1312 | public double llGetTimeOfDay() | ||
1313 | { | ||
1314 | m_host.AddScriptLPS(1); | ||
1315 | NotImplemented("llGetTimeOfDay"); | ||
1316 | return 0; | ||
1317 | } | ||
1318 | |||
1319 | public double llGetWallclock() | ||
1320 | { | ||
1321 | m_host.AddScriptLPS(1); | ||
1322 | return DateTime.Now.TimeOfDay.TotalSeconds; | ||
1323 | } | ||
1324 | |||
1325 | public double llGetTime() | ||
1326 | { | ||
1327 | m_host.AddScriptLPS(1); | ||
1328 | TimeSpan ScriptTime = DateTime.Now - m_timer; | ||
1329 | return (double)((ScriptTime.TotalMilliseconds / 1000)*World.TimeDilation); | ||
1330 | } | ||
1331 | |||
1332 | public void llResetTime() | ||
1333 | { | ||
1334 | m_host.AddScriptLPS(1); | ||
1335 | m_timer = DateTime.Now; | ||
1336 | } | ||
1337 | |||
1338 | public double llGetAndResetTime() | ||
1339 | { | ||
1340 | m_host.AddScriptLPS(1); | ||
1341 | TimeSpan ScriptTime = DateTime.Now - m_timer; | ||
1342 | m_timer = DateTime.Now; | ||
1343 | return (double)((ScriptTime.TotalMilliseconds / 1000)*World.TimeDilation); | ||
1344 | } | ||
1345 | |||
1346 | public void llSound() | ||
1347 | { | ||
1348 | m_host.AddScriptLPS(1); | ||
1349 | // This function has been deprecated | ||
1350 | // see http://www.lslwiki.net/lslwiki/wakka.php?wakka=llSound | ||
1351 | Deprecated("llSound"); | ||
1352 | } | ||
1353 | |||
1354 | public void llPlaySound(string sound, double volume) | ||
1355 | { | ||
1356 | m_host.AddScriptLPS(1); | ||
1357 | m_host.SendSound(sound, volume, false, 0); | ||
1358 | } | ||
1359 | |||
1360 | public void llLoopSound(string sound, double volume) | ||
1361 | { | ||
1362 | m_host.AddScriptLPS(1); | ||
1363 | m_host.SendSound(sound, volume, false, 1); | ||
1364 | } | ||
1365 | |||
1366 | public void llLoopSoundMaster(string sound, double volume) | ||
1367 | { | ||
1368 | m_host.AddScriptLPS(1); | ||
1369 | NotImplemented("llLoopSoundMaster"); | ||
1370 | } | ||
1371 | |||
1372 | public void llLoopSoundSlave(string sound, double volume) | ||
1373 | { | ||
1374 | m_host.AddScriptLPS(1); | ||
1375 | NotImplemented("llLoopSoundSlave"); | ||
1376 | } | ||
1377 | |||
1378 | public void llPlaySoundSlave(string sound, double volume) | ||
1379 | { | ||
1380 | m_host.AddScriptLPS(1); | ||
1381 | NotImplemented("llPlaySoundSlave"); | ||
1382 | } | ||
1383 | |||
1384 | public void llTriggerSound(string sound, double volume) | ||
1385 | { | ||
1386 | m_host.AddScriptLPS(1); | ||
1387 | m_host.SendSound(sound, volume, true, 0); | ||
1388 | } | ||
1389 | |||
1390 | public void llStopSound() | ||
1391 | { | ||
1392 | m_host.AddScriptLPS(1); | ||
1393 | m_host.SendSound(LLUUID.Zero.ToString(), 1.0, false, 2); | ||
1394 | } | ||
1395 | |||
1396 | public void llPreloadSound(string sound) | ||
1397 | { | ||
1398 | m_host.AddScriptLPS(1); | ||
1399 | m_host.PreloadSound(sound); | ||
1400 | } | ||
1401 | |||
1402 | /// <summary> | ||
1403 | /// Return a portion of the designated string bounded by | ||
1404 | /// inclusive indices (start and end). As usual, the negative | ||
1405 | /// indices, and the tolerance for out-of-bound values, makes | ||
1406 | /// this more complicated than it might otherwise seem. | ||
1407 | /// </summary> | ||
1408 | |||
1409 | public string llGetSubString(string src, int start, int end) | ||
1410 | { | ||
1411 | |||
1412 | m_host.AddScriptLPS(1); | ||
1413 | |||
1414 | // Normalize indices (if negative). | ||
1415 | // After normlaization they may still be | ||
1416 | // negative, but that is now relative to | ||
1417 | // the start, rather than the end, of the | ||
1418 | // sequence. | ||
1419 | |||
1420 | if (start < 0) | ||
1421 | { | ||
1422 | start = src.Length+start; | ||
1423 | } | ||
1424 | if (end < 0) | ||
1425 | { | ||
1426 | end = src.Length+end; | ||
1427 | } | ||
1428 | |||
1429 | // Conventional substring | ||
1430 | if (start <= end) | ||
1431 | { | ||
1432 | // Implies both bounds are out-of-range. | ||
1433 | if (end < 0 || start >= src.Length) | ||
1434 | { | ||
1435 | return String.Empty; | ||
1436 | } | ||
1437 | // If end is positive, then it directly | ||
1438 | // corresponds to the lengt of the substring | ||
1439 | // needed (plus one of course). BUT, it | ||
1440 | // must be within bounds. | ||
1441 | if (end >= src.Length) | ||
1442 | { | ||
1443 | end = src.Length-1; | ||
1444 | } | ||
1445 | |||
1446 | if (start < 0) | ||
1447 | { | ||
1448 | return src.Substring(0,end+1); | ||
1449 | } | ||
1450 | // Both indices are positive | ||
1451 | return src.Substring(start, (end+1) - start); | ||
1452 | } | ||
1453 | |||
1454 | // Inverted substring (end < start) | ||
1455 | else | ||
1456 | { | ||
1457 | // Implies both indices are below the | ||
1458 | // lower bound. In the inverted case, that | ||
1459 | // means the entire string will be returned | ||
1460 | // unchanged. | ||
1461 | if (start < 0) | ||
1462 | { | ||
1463 | return src; | ||
1464 | } | ||
1465 | // If both indices are greater than the upper | ||
1466 | // bound the result may seem initially counter | ||
1467 | // intuitive. | ||
1468 | if (end >= src.Length) | ||
1469 | { | ||
1470 | return src; | ||
1471 | } | ||
1472 | |||
1473 | if (end < 0) | ||
1474 | { | ||
1475 | if (start < src.Length) | ||
1476 | { | ||
1477 | return src.Substring(start); | ||
1478 | } | ||
1479 | else | ||
1480 | { | ||
1481 | return String.Empty; | ||
1482 | } | ||
1483 | } | ||
1484 | else | ||
1485 | { | ||
1486 | if (start < src.Length) | ||
1487 | { | ||
1488 | return src.Substring(0,end+1) + src.Substring(start); | ||
1489 | } | ||
1490 | else | ||
1491 | { | ||
1492 | return src.Substring(0,end+1); | ||
1493 | } | ||
1494 | } | ||
1495 | } | ||
1496 | } | ||
1497 | |||
1498 | /// <summary> | ||
1499 | /// Delete substring removes the specified substring bounded | ||
1500 | /// by the inclusive indices start and end. Indices may be | ||
1501 | /// negative (indicating end-relative) and may be inverted, | ||
1502 | /// i.e. end < start. | ||
1503 | /// </summary> | ||
1504 | |||
1505 | public string llDeleteSubString(string src, int start, int end) | ||
1506 | { | ||
1507 | |||
1508 | m_host.AddScriptLPS(1); | ||
1509 | |||
1510 | // Normalize indices (if negative). | ||
1511 | // After normlaization they may still be | ||
1512 | // negative, but that is now relative to | ||
1513 | // the start, rather than the end, of the | ||
1514 | // sequence. | ||
1515 | if (start < 0) | ||
1516 | { | ||
1517 | start = src.Length+start; | ||
1518 | } | ||
1519 | if (end < 0) | ||
1520 | { | ||
1521 | end = src.Length+end; | ||
1522 | } | ||
1523 | // Conventionally delimited substring | ||
1524 | if (start <= end) | ||
1525 | { | ||
1526 | // If both bounds are outside of the existing | ||
1527 | // string, then return unchanges. | ||
1528 | if (end < 0 || start >= src.Length) | ||
1529 | { | ||
1530 | return src; | ||
1531 | } | ||
1532 | // At least one bound is in-range, so we | ||
1533 | // need to clip the out-of-bound argument. | ||
1534 | if (start < 0) | ||
1535 | { | ||
1536 | start = 0; | ||
1537 | } | ||
1538 | |||
1539 | if (end >= src.Length) | ||
1540 | { | ||
1541 | end = src.Length-1; | ||
1542 | } | ||
1543 | |||
1544 | return src.Remove(start,end-start+1); | ||
1545 | } | ||
1546 | // Inverted substring | ||
1547 | else | ||
1548 | { | ||
1549 | // In this case, out of bounds means that | ||
1550 | // the existing string is part of the cut. | ||
1551 | if (start < 0 || end >= src.Length) | ||
1552 | { | ||
1553 | return String.Empty; | ||
1554 | } | ||
1555 | |||
1556 | if (end > 0) | ||
1557 | { | ||
1558 | if (start < src.Length) | ||
1559 | { | ||
1560 | return src.Remove(start).Remove(0,end+1); | ||
1561 | } | ||
1562 | else | ||
1563 | { | ||
1564 | return src.Remove(0,end+1); | ||
1565 | } | ||
1566 | } | ||
1567 | else | ||
1568 | { | ||
1569 | if (start < src.Length) | ||
1570 | { | ||
1571 | return src.Remove(start); | ||
1572 | } | ||
1573 | else | ||
1574 | { | ||
1575 | return src; | ||
1576 | } | ||
1577 | } | ||
1578 | } | ||
1579 | } | ||
1580 | |||
1581 | /// <summary> | ||
1582 | /// Insert string inserts the specified string identified by src | ||
1583 | /// at the index indicated by index. Index may be negative, in | ||
1584 | /// which case it is end-relative. The index may exceed either | ||
1585 | /// string bound, with the result being a concatenation. | ||
1586 | /// </summary> | ||
1587 | |||
1588 | public string llInsertString(string dest, int index, string src) | ||
1589 | { | ||
1590 | |||
1591 | m_host.AddScriptLPS(1); | ||
1592 | |||
1593 | // Normalize indices (if negative). | ||
1594 | // After normlaization they may still be | ||
1595 | // negative, but that is now relative to | ||
1596 | // the start, rather than the end, of the | ||
1597 | // sequence. | ||
1598 | if (index < 0) | ||
1599 | { | ||
1600 | index = dest.Length+index; | ||
1601 | |||
1602 | // Negative now means it is less than the lower | ||
1603 | // bound of the string. | ||
1604 | |||
1605 | if (index < 0) | ||
1606 | { | ||
1607 | return src+dest; | ||
1608 | } | ||
1609 | |||
1610 | } | ||
1611 | |||
1612 | if (index >= dest.Length) | ||
1613 | { | ||
1614 | return dest+src; | ||
1615 | } | ||
1616 | |||
1617 | // The index is in bounds. | ||
1618 | // In this case the index refers to the index that will | ||
1619 | // be assigned to the first character of the inserted string. | ||
1620 | // So unlike the other string operations, we do not add one | ||
1621 | // to get the correct string length. | ||
1622 | return dest.Substring(0,index)+src+dest.Substring(index); | ||
1623 | |||
1624 | } | ||
1625 | |||
1626 | public string llToUpper(string src) | ||
1627 | { | ||
1628 | m_host.AddScriptLPS(1); | ||
1629 | return src.ToUpper(); | ||
1630 | } | ||
1631 | |||
1632 | public string llToLower(string src) | ||
1633 | { | ||
1634 | m_host.AddScriptLPS(1); | ||
1635 | return src.ToLower(); | ||
1636 | } | ||
1637 | |||
1638 | public LSL_Types.LSLInteger llGiveMoney(string destination, int amount) | ||
1639 | { | ||
1640 | LLUUID invItemID=InventorySelf(); | ||
1641 | if (invItemID == LLUUID.Zero) | ||
1642 | return 0; | ||
1643 | |||
1644 | m_host.AddScriptLPS(1); | ||
1645 | |||
1646 | if (m_host.TaskInventory[invItemID].PermsGranter == LLUUID.Zero) | ||
1647 | return 0; | ||
1648 | |||
1649 | if ((m_host.TaskInventory[invItemID].PermsMask & BuiltIn_Commands_BaseClass.PERMISSION_DEBIT) == 0) | ||
1650 | { | ||
1651 | LSLError("No permissions to give money"); | ||
1652 | return 0; | ||
1653 | } | ||
1654 | |||
1655 | LLUUID toID=new LLUUID(); | ||
1656 | |||
1657 | if (!LLUUID.TryParse(destination, out toID)) | ||
1658 | { | ||
1659 | LSLError("Bad key in llGiveMoney"); | ||
1660 | return 0; | ||
1661 | } | ||
1662 | |||
1663 | IMoneyModule money=World.RequestModuleInterface<IMoneyModule>(); | ||
1664 | |||
1665 | if (money == null) | ||
1666 | { | ||
1667 | NotImplemented("llGiveMoney"); | ||
1668 | return 0; | ||
1669 | } | ||
1670 | |||
1671 | bool result=money.ObjectGiveMoney(m_host.ParentGroup.RootPart.UUID, m_host.ParentGroup.RootPart.OwnerID, toID, amount); | ||
1672 | |||
1673 | if (result) | ||
1674 | return 1; | ||
1675 | |||
1676 | return 0; | ||
1677 | } | ||
1678 | |||
1679 | public void llMakeExplosion() | ||
1680 | { | ||
1681 | m_host.AddScriptLPS(1); | ||
1682 | NotImplemented("llMakeExplosion"); | ||
1683 | } | ||
1684 | |||
1685 | public void llMakeFountain() | ||
1686 | { | ||
1687 | m_host.AddScriptLPS(1); | ||
1688 | NotImplemented("llMakeFountain"); | ||
1689 | } | ||
1690 | |||
1691 | public void llMakeSmoke() | ||
1692 | { | ||
1693 | m_host.AddScriptLPS(1); | ||
1694 | NotImplemented("llMakeSmoke"); | ||
1695 | } | ||
1696 | |||
1697 | public void llMakeFire() | ||
1698 | { | ||
1699 | m_host.AddScriptLPS(1); | ||
1700 | NotImplemented("llMakeFire"); | ||
1701 | } | ||
1702 | |||
1703 | public void llRezObject(string inventory, LSL_Types.Vector3 pos, LSL_Types.Vector3 vel, LSL_Types.Quaternion rot, int param) | ||
1704 | { | ||
1705 | m_host.AddScriptLPS(1); | ||
1706 | //NotImplemented("llRezObject"); | ||
1707 | bool found = false; | ||
1708 | |||
1709 | // Instead of using return;, I'm using continue; because in our TaskInventory implementation | ||
1710 | // it's possible to have two items with the same task inventory name. | ||
1711 | // this is an easter egg of sorts. | ||
1712 | |||
1713 | foreach (KeyValuePair<LLUUID, TaskInventoryItem> inv in m_host.TaskInventory) | ||
1714 | { | ||
1715 | if (inv.Value.Name == inventory) | ||
1716 | { | ||
1717 | // make sure we're an object. | ||
1718 | if (inv.Value.InvType != (int)InventoryType.Object) | ||
1719 | { | ||
1720 | llSay(0, "Unable to create requested object. Object is missing from database."); | ||
1721 | continue; | ||
1722 | } | ||
1723 | |||
1724 | LLVector3 llpos = new LLVector3((float)pos.x, (float)pos.y, (float)pos.z); | ||
1725 | |||
1726 | // test if we're further away then 10m | ||
1727 | if (Util.GetDistanceTo(llpos, m_host.AbsolutePosition) > 10) | ||
1728 | return; // wiki says, if it's further away then 10m, silently fail. | ||
1729 | |||
1730 | LLVector3 llvel = new LLVector3((float)vel.x, (float)vel.y, (float)vel.z); | ||
1731 | |||
1732 | // need the magnitude later | ||
1733 | float velmag = (float)Util.GetMagnitude(llvel); | ||
1734 | |||
1735 | SceneObjectGroup new_group = World.RezObject(inv.Value, llpos, new LLQuaternion((float)rot.x, (float)rot.y, (float)rot.z, (float)rot.s), llvel, param); | ||
1736 | |||
1737 | // If either of these are null, then there was an unknown error. | ||
1738 | if (new_group == null) | ||
1739 | continue; | ||
1740 | if (new_group.RootPart == null) | ||
1741 | continue; | ||
1742 | |||
1743 | // objects rezzed with this method are die_at_edge by default. | ||
1744 | new_group.RootPart.SetDieAtEdge(true); | ||
1745 | |||
1746 | m_ScriptEngine.PostScriptEvent(m_itemID, new XEventParams( | ||
1747 | "object_rez", new Object[] { | ||
1748 | new LSL_Types.LSLString( | ||
1749 | new_group.RootPart.UUID.ToString()) }, | ||
1750 | new XDetectParams[0])); | ||
1751 | |||
1752 | float groupmass = new_group.GetMass(); | ||
1753 | |||
1754 | //Recoil. | ||
1755 | llApplyImpulse(new LSL_Types.Vector3(llvel.X * groupmass, llvel.Y * groupmass, llvel.Z * groupmass), 0); | ||
1756 | found = true; | ||
1757 | //script delay | ||
1758 | System.Threading.Thread.Sleep((int)((groupmass * velmag) / 10)); | ||
1759 | break; | ||
1760 | } | ||
1761 | } | ||
1762 | if (!found) | ||
1763 | llSay(0, "Could not find object " + inventory); | ||
1764 | } | ||
1765 | |||
1766 | public void llLookAt(LSL_Types.Vector3 target, double strength, double damping) | ||
1767 | { | ||
1768 | m_host.AddScriptLPS(1); | ||
1769 | NotImplemented("llLookAt"); | ||
1770 | } | ||
1771 | |||
1772 | public void llStopLookAt() | ||
1773 | { | ||
1774 | m_host.AddScriptLPS(1); | ||
1775 | NotImplemented("llStopLookAt"); | ||
1776 | } | ||
1777 | |||
1778 | public void llSetTimerEvent(double sec) | ||
1779 | { | ||
1780 | m_host.AddScriptLPS(1); | ||
1781 | // Setting timer repeat | ||
1782 | m_ScriptEngine.m_ASYNCLSLCommandManager.m_Timer.SetTimerEvent(m_localID, m_itemID, sec); | ||
1783 | } | ||
1784 | |||
1785 | public void llSleep(double sec) | ||
1786 | { | ||
1787 | m_host.AddScriptLPS(1); | ||
1788 | Thread.Sleep((int)(sec * 1000)); | ||
1789 | } | ||
1790 | |||
1791 | public double llGetMass() | ||
1792 | { | ||
1793 | m_host.AddScriptLPS(1); | ||
1794 | return m_host.GetMass(); | ||
1795 | } | ||
1796 | |||
1797 | public void llCollisionFilter(string name, string id, int accept) | ||
1798 | { | ||
1799 | m_host.AddScriptLPS(1); | ||
1800 | NotImplemented("llCollisionFilter"); | ||
1801 | } | ||
1802 | |||
1803 | public void llTakeControls(int controls, int accept, int pass_on) | ||
1804 | { | ||
1805 | if (!m_host.TaskInventory.ContainsKey(InventorySelf())) | ||
1806 | { | ||
1807 | return; | ||
1808 | } | ||
1809 | |||
1810 | if (m_host.TaskInventory[InventorySelf()].PermsGranter != LLUUID.Zero) | ||
1811 | { | ||
1812 | ScenePresence presence = World.GetScenePresence(m_host.TaskInventory[InventorySelf()].PermsGranter); | ||
1813 | |||
1814 | if (presence != null) | ||
1815 | { | ||
1816 | if ((m_host.TaskInventory[InventorySelf()].PermsMask & BuiltIn_Commands_BaseClass.PERMISSION_TAKE_CONTROLS) != 0) | ||
1817 | { | ||
1818 | presence.RegisterControlEventsToScript(controls, accept, pass_on, m_localID, m_itemID); | ||
1819 | |||
1820 | } | ||
1821 | } | ||
1822 | } | ||
1823 | |||
1824 | m_host.AddScriptLPS(1); | ||
1825 | //NotImplemented("llTakeControls"); | ||
1826 | } | ||
1827 | |||
1828 | public void llReleaseControls() | ||
1829 | { | ||
1830 | m_host.AddScriptLPS(1); | ||
1831 | |||
1832 | if (!m_host.TaskInventory.ContainsKey(InventorySelf())) | ||
1833 | { | ||
1834 | return; | ||
1835 | } | ||
1836 | |||
1837 | if (m_host.TaskInventory[InventorySelf()].PermsGranter != LLUUID.Zero) | ||
1838 | { | ||
1839 | ScenePresence presence = World.GetScenePresence(m_host.TaskInventory[InventorySelf()].PermsGranter); | ||
1840 | |||
1841 | if (presence != null) | ||
1842 | { | ||
1843 | if ((m_host.TaskInventory[InventorySelf()].PermsMask & BuiltIn_Commands_BaseClass.PERMISSION_TAKE_CONTROLS) != 0) | ||
1844 | { | ||
1845 | // Unregister controls from Presence | ||
1846 | presence.UnRegisterControlEventsToScript(m_localID, m_itemID); | ||
1847 | // Remove Take Control permission. | ||
1848 | m_host.TaskInventory[InventorySelf()].PermsMask &= ~BuiltIn_Commands_BaseClass.PERMISSION_TAKE_CONTROLS; | ||
1849 | } | ||
1850 | } | ||
1851 | } | ||
1852 | } | ||
1853 | |||
1854 | public void llAttachToAvatar(int attachment) | ||
1855 | { | ||
1856 | m_host.AddScriptLPS(1); | ||
1857 | NotImplemented("llAttachToAvatar"); | ||
1858 | } | ||
1859 | |||
1860 | public void llDetachFromAvatar() | ||
1861 | { | ||
1862 | m_host.AddScriptLPS(1); | ||
1863 | NotImplemented("llDetachFromAvatar"); | ||
1864 | } | ||
1865 | |||
1866 | public void llTakeCamera() | ||
1867 | { | ||
1868 | m_host.AddScriptLPS(1); | ||
1869 | NotImplemented("llTakeCamera"); | ||
1870 | } | ||
1871 | |||
1872 | public void llReleaseCamera() | ||
1873 | { | ||
1874 | m_host.AddScriptLPS(1); | ||
1875 | NotImplemented("llReleaseCamera"); | ||
1876 | } | ||
1877 | |||
1878 | public string llGetOwner() | ||
1879 | { | ||
1880 | m_host.AddScriptLPS(1); | ||
1881 | |||
1882 | return m_host.ObjectOwner.ToString(); | ||
1883 | } | ||
1884 | |||
1885 | public void llInstantMessage(string user, string message) | ||
1886 | { | ||
1887 | m_host.AddScriptLPS(1); | ||
1888 | |||
1889 | // We may be able to use ClientView.SendInstantMessage here, but we need a client instance. | ||
1890 | // InstantMessageModule.OnInstantMessage searches through a list of scenes for a client matching the toAgent, | ||
1891 | // but I don't think we have a list of scenes available from here. | ||
1892 | // (We also don't want to duplicate the code in OnInstantMessage if we can avoid it.) | ||
1893 | |||
1894 | // user is a UUID | ||
1895 | |||
1896 | // TODO: figure out values for client, fromSession, and imSessionID | ||
1897 | // client.SendInstantMessage(m_host.UUID, fromSession, message, user, imSessionID, m_host.Name, AgentManager.InstantMessageDialog.MessageFromAgent, (uint)Util.UnixTimeSinceEpoch()); | ||
1898 | LLUUID friendTransactionID = LLUUID.Random(); | ||
1899 | |||
1900 | //m_pendingFriendRequests.Add(friendTransactionID, fromAgentID); | ||
1901 | |||
1902 | GridInstantMessage msg = new GridInstantMessage(); | ||
1903 | msg.fromAgentID = new Guid(m_host.UUID.ToString()); // fromAgentID.UUID; | ||
1904 | msg.fromAgentSession = new Guid(friendTransactionID.ToString());// fromAgentSession.UUID; | ||
1905 | msg.toAgentID = new Guid(user); // toAgentID.UUID; | ||
1906 | msg.imSessionID = new Guid(friendTransactionID.ToString()); // This is the item we're mucking with here | ||
1907 | Console.WriteLine("[Scripting IM]: From:" + msg.fromAgentID.ToString() + " To: " + msg.toAgentID.ToString() + " Session:" + msg.imSessionID.ToString() + " Message:" + message); | ||
1908 | Console.WriteLine("[Scripting IM]: Filling Session: " + msg.imSessionID.ToString()); | ||
1909 | msg.timestamp = (uint)Util.UnixTimeSinceEpoch();// timestamp; | ||
1910 | //if (client != null) | ||
1911 | //{ | ||
1912 | msg.fromAgentName = m_host.Name;//client.FirstName + " " + client.LastName;// fromAgentName; | ||
1913 | //} | ||
1914 | //else | ||
1915 | //{ | ||
1916 | // msg.fromAgentName = "(hippos)";// Added for posterity. This means that we can't figure out who sent it | ||
1917 | //} | ||
1918 | msg.message = message; | ||
1919 | msg.dialog = (byte)19; // messgage from script ??? // dialog; | ||
1920 | msg.fromGroup = false;// fromGroup; | ||
1921 | msg.offline = (byte)0; //offline; | ||
1922 | msg.ParentEstateID = 0; //ParentEstateID; | ||
1923 | msg.Position = new sLLVector3();// new sLLVector3(m_host.AbsolutePosition); | ||
1924 | msg.RegionID = World.RegionInfo.RegionID.UUID;//RegionID.UUID; | ||
1925 | msg.binaryBucket = new byte[0];// binaryBucket; | ||
1926 | World.TriggerGridInstantMessage(msg, InstantMessageReceiver.IMModule); | ||
1927 | // NotImplemented("llInstantMessage"); | ||
1928 | } | ||
1929 | |||
1930 | public void llEmail(string address, string subject, string message) | ||
1931 | { | ||
1932 | m_host.AddScriptLPS(1); | ||
1933 | NotImplemented("llEmail"); | ||
1934 | } | ||
1935 | |||
1936 | public void llGetNextEmail(string address, string subject) | ||
1937 | { | ||
1938 | m_host.AddScriptLPS(1); | ||
1939 | NotImplemented("llGetNextEmail"); | ||
1940 | } | ||
1941 | |||
1942 | public string llGetKey() | ||
1943 | { | ||
1944 | m_host.AddScriptLPS(1); | ||
1945 | return m_host.UUID.ToString(); | ||
1946 | } | ||
1947 | |||
1948 | public void llSetBuoyancy(double buoyancy) | ||
1949 | { | ||
1950 | m_host.AddScriptLPS(1); | ||
1951 | if (m_host.ParentGroup != null) | ||
1952 | { | ||
1953 | if (m_host.ParentGroup.RootPart != null) | ||
1954 | { | ||
1955 | m_host.ParentGroup.RootPart.SetBuoyancy((float)buoyancy); | ||
1956 | } | ||
1957 | } | ||
1958 | } | ||
1959 | |||
1960 | |||
1961 | |||
1962 | public void llSetHoverHeight(double height, int water, double tau) | ||
1963 | { | ||
1964 | m_host.AddScriptLPS(1); | ||
1965 | NotImplemented("llSetHoverHeight"); | ||
1966 | } | ||
1967 | |||
1968 | public void llStopHover() | ||
1969 | { | ||
1970 | m_host.AddScriptLPS(1); | ||
1971 | NotImplemented("llStopHover"); | ||
1972 | } | ||
1973 | |||
1974 | public void llMinEventDelay(double delay) | ||
1975 | { | ||
1976 | m_host.AddScriptLPS(1); | ||
1977 | NotImplemented("llMinEventDelay"); | ||
1978 | } | ||
1979 | |||
1980 | public void llSoundPreload() | ||
1981 | { | ||
1982 | m_host.AddScriptLPS(1); | ||
1983 | NotImplemented("llSoundPreload"); | ||
1984 | } | ||
1985 | |||
1986 | public void llRotLookAt(LSL_Types.Quaternion target, double strength, double damping) | ||
1987 | { | ||
1988 | m_host.AddScriptLPS(1); | ||
1989 | NotImplemented("llRotLookAt"); | ||
1990 | } | ||
1991 | |||
1992 | public LSL_Types.LSLInteger llStringLength(string str) | ||
1993 | { | ||
1994 | m_host.AddScriptLPS(1); | ||
1995 | if (str.Length > 0) | ||
1996 | { | ||
1997 | return str.Length; | ||
1998 | } | ||
1999 | else | ||
2000 | { | ||
2001 | return 0; | ||
2002 | } | ||
2003 | } | ||
2004 | |||
2005 | public void llStartAnimation(string anim) | ||
2006 | { | ||
2007 | m_host.AddScriptLPS(1); | ||
2008 | |||
2009 | LLUUID invItemID=InventorySelf(); | ||
2010 | if (invItemID == LLUUID.Zero) | ||
2011 | return; | ||
2012 | |||
2013 | if (m_host.TaskInventory[invItemID].PermsGranter == LLUUID.Zero) | ||
2014 | return; | ||
2015 | |||
2016 | if ((m_host.TaskInventory[invItemID].PermsMask & BuiltIn_Commands_BaseClass.PERMISSION_TRIGGER_ANIMATION) != 0) | ||
2017 | { | ||
2018 | ScenePresence presence = World.GetScenePresence(m_host.TaskInventory[invItemID].PermsGranter); | ||
2019 | |||
2020 | if (presence != null) | ||
2021 | { | ||
2022 | // Do NOT try to parse LLUUID, animations cannot be triggered by ID | ||
2023 | LLUUID animID=InventoryKey(anim, (int)AssetType.Animation); | ||
2024 | if (animID == LLUUID.Zero) | ||
2025 | presence.AddAnimation(anim); | ||
2026 | else | ||
2027 | presence.AddAnimation(animID); | ||
2028 | } | ||
2029 | } | ||
2030 | } | ||
2031 | |||
2032 | public void llStopAnimation(string anim) | ||
2033 | { | ||
2034 | m_host.AddScriptLPS(1); | ||
2035 | |||
2036 | LLUUID invItemID=InventorySelf(); | ||
2037 | if (invItemID == LLUUID.Zero) | ||
2038 | return; | ||
2039 | |||
2040 | if (m_host.TaskInventory[invItemID].PermsGranter == LLUUID.Zero) | ||
2041 | return; | ||
2042 | |||
2043 | if ((m_host.TaskInventory[invItemID].PermsMask & BuiltIn_Commands_BaseClass.PERMISSION_TRIGGER_ANIMATION) != 0) | ||
2044 | { | ||
2045 | LLUUID animID = new LLUUID(); | ||
2046 | |||
2047 | if (!LLUUID.TryParse(anim, out animID)) | ||
2048 | { | ||
2049 | animID=InventoryKey(anim); | ||
2050 | } | ||
2051 | |||
2052 | if (animID == LLUUID.Zero) | ||
2053 | return; | ||
2054 | |||
2055 | ScenePresence presence = World.GetScenePresence(m_host.TaskInventory[invItemID].PermsGranter); | ||
2056 | |||
2057 | if (presence != null) | ||
2058 | { | ||
2059 | if (animID == LLUUID.Zero) | ||
2060 | presence.RemoveAnimation(anim); | ||
2061 | else | ||
2062 | presence.RemoveAnimation(animID); | ||
2063 | } | ||
2064 | } | ||
2065 | } | ||
2066 | |||
2067 | public void llPointAt() | ||
2068 | { | ||
2069 | m_host.AddScriptLPS(1); | ||
2070 | NotImplemented("llPointAt"); | ||
2071 | } | ||
2072 | |||
2073 | public void llStopPointAt() | ||
2074 | { | ||
2075 | m_host.AddScriptLPS(1); | ||
2076 | NotImplemented("llStopPointAt"); | ||
2077 | } | ||
2078 | |||
2079 | public void llTargetOmega(LSL_Types.Vector3 axis, double spinrate, double gain) | ||
2080 | { | ||
2081 | m_host.AddScriptLPS(1); | ||
2082 | m_host.RotationalVelocity = new LLVector3((float)(axis.x * spinrate), (float)(axis.y * spinrate), (float)(axis.z * spinrate)); | ||
2083 | m_host.AngularVelocity = new LLVector3((float)(axis.x * spinrate), (float)(axis.y * spinrate), (float)(axis.z * spinrate)); | ||
2084 | m_host.ScheduleTerseUpdate(); | ||
2085 | m_host.SendTerseUpdateToAllClients(); | ||
2086 | } | ||
2087 | |||
2088 | public LSL_Types.LSLInteger llGetStartParameter() | ||
2089 | { | ||
2090 | m_host.AddScriptLPS(1); | ||
2091 | // NotImplemented("llGetStartParameter"); | ||
2092 | return m_host.ParentGroup.StartParameter; | ||
2093 | } | ||
2094 | |||
2095 | public void llGodLikeRezObject(string inventory, LSL_Types.Vector3 pos) | ||
2096 | { | ||
2097 | m_host.AddScriptLPS(1); | ||
2098 | NotImplemented("llGodLikeRezObject"); | ||
2099 | } | ||
2100 | |||
2101 | public void llRequestPermissions(string agent, int perm) | ||
2102 | { | ||
2103 | LLUUID agentID=new LLUUID(); | ||
2104 | |||
2105 | if (!LLUUID.TryParse(agent, out agentID)) | ||
2106 | return; | ||
2107 | |||
2108 | LLUUID invItemID=InventorySelf(); | ||
2109 | |||
2110 | if (invItemID == LLUUID.Zero) | ||
2111 | return; // Not in a prim? How?? | ||
2112 | |||
2113 | if (agentID == LLUUID.Zero || perm == 0) // Releasing permissions | ||
2114 | { | ||
2115 | m_host.TaskInventory[invItemID].PermsGranter=LLUUID.Zero; | ||
2116 | m_host.TaskInventory[invItemID].PermsMask=0; | ||
2117 | |||
2118 | m_ScriptEngine.PostScriptEvent(m_itemID, new XEventParams( | ||
2119 | "run_time_permissions", new Object[] { | ||
2120 | new LSL_Types.LSLInteger(0) }, | ||
2121 | new XDetectParams[0])); | ||
2122 | |||
2123 | return; | ||
2124 | } | ||
2125 | |||
2126 | m_host.AddScriptLPS(1); | ||
2127 | |||
2128 | if (m_host.ParentGroup.RootPart.m_IsAttachment && agent == m_host.ParentGroup.RootPart.m_attachedAvatar) | ||
2129 | { | ||
2130 | // When attached, certain permissions are implicit if requested from owner | ||
2131 | int implicitPerms = BuiltIn_Commands_BaseClass.PERMISSION_TAKE_CONTROLS | | ||
2132 | BuiltIn_Commands_BaseClass.PERMISSION_TRIGGER_ANIMATION | | ||
2133 | BuiltIn_Commands_BaseClass.PERMISSION_ATTACH; | ||
2134 | |||
2135 | if ((perm & (~implicitPerms)) == 0) // Requested only implicit perms | ||
2136 | { | ||
2137 | m_host.TaskInventory[invItemID].PermsGranter=agentID; | ||
2138 | m_host.TaskInventory[invItemID].PermsMask=perm; | ||
2139 | |||
2140 | m_ScriptEngine.PostScriptEvent(m_itemID, new XEventParams( | ||
2141 | "run_time_permissions", new Object[] { | ||
2142 | new LSL_Types.LSLInteger(perm) }, | ||
2143 | new XDetectParams[0])); | ||
2144 | |||
2145 | return; | ||
2146 | } | ||
2147 | } | ||
2148 | else if (m_host.m_sitTargetAvatar == agentID) // Sitting avatar | ||
2149 | { | ||
2150 | // When agent is sitting, certain permissions are implicit if requested from sitting agent | ||
2151 | int implicitPerms = BuiltIn_Commands_BaseClass.PERMISSION_TRIGGER_ANIMATION | | ||
2152 | BuiltIn_Commands_BaseClass.PERMISSION_TRACK_CAMERA; | ||
2153 | |||
2154 | if ((perm & (~implicitPerms)) == 0) // Requested only implicit perms | ||
2155 | { | ||
2156 | m_host.TaskInventory[invItemID].PermsGranter=agentID; | ||
2157 | m_host.TaskInventory[invItemID].PermsMask=perm; | ||
2158 | |||
2159 | m_ScriptEngine.PostScriptEvent(m_itemID, new XEventParams( | ||
2160 | "run_time_permissions", new Object[] { | ||
2161 | new LSL_Types.LSLInteger(perm) }, | ||
2162 | new XDetectParams[0])); | ||
2163 | |||
2164 | return; | ||
2165 | } | ||
2166 | } | ||
2167 | |||
2168 | ScenePresence presence = World.GetScenePresence(agentID); | ||
2169 | |||
2170 | if (presence != null) | ||
2171 | { | ||
2172 | string ownerName=resolveName(m_host.ParentGroup.RootPart.OwnerID); | ||
2173 | if (ownerName == String.Empty) | ||
2174 | ownerName="(hippos)"; | ||
2175 | |||
2176 | if (!m_waitingForScriptAnswer) | ||
2177 | { | ||
2178 | m_host.TaskInventory[invItemID].PermsGranter=agentID; | ||
2179 | m_host.TaskInventory[invItemID].PermsMask=0; | ||
2180 | presence.ControllingClient.OnScriptAnswer+=handleScriptAnswer; | ||
2181 | m_waitingForScriptAnswer=true; | ||
2182 | } | ||
2183 | |||
2184 | presence.ControllingClient.SendScriptQuestion(m_host.UUID, m_host.ParentGroup.RootPart.Name, ownerName, invItemID, perm); | ||
2185 | return; | ||
2186 | } | ||
2187 | |||
2188 | // Requested agent is not in range, refuse perms | ||
2189 | m_ScriptEngine.PostScriptEvent(m_itemID, new XEventParams( | ||
2190 | "run_time_permissions", new Object[] { | ||
2191 | new LSL_Types.LSLInteger(0) }, | ||
2192 | new XDetectParams[0])); | ||
2193 | } | ||
2194 | |||
2195 | void handleScriptAnswer(IClientAPI client, LLUUID taskID, LLUUID itemID, int answer) | ||
2196 | { | ||
2197 | if (taskID != m_host.UUID) | ||
2198 | return; | ||
2199 | |||
2200 | LLUUID invItemID=InventorySelf(); | ||
2201 | |||
2202 | if (invItemID == LLUUID.Zero) | ||
2203 | return; | ||
2204 | |||
2205 | client.OnScriptAnswer-=handleScriptAnswer; | ||
2206 | m_waitingForScriptAnswer=false; | ||
2207 | |||
2208 | m_host.TaskInventory[invItemID].PermsMask=answer; | ||
2209 | m_ScriptEngine.PostScriptEvent(m_itemID, new XEventParams( | ||
2210 | "run_time_permissions", new Object[] { | ||
2211 | new LSL_Types.LSLInteger(answer) }, | ||
2212 | new XDetectParams[0])); | ||
2213 | } | ||
2214 | |||
2215 | public string llGetPermissionsKey() | ||
2216 | { | ||
2217 | m_host.AddScriptLPS(1); | ||
2218 | |||
2219 | foreach (TaskInventoryItem item in m_host.TaskInventory.Values) | ||
2220 | { | ||
2221 | if (item.Type == 10 && item.ItemID == m_itemID) | ||
2222 | { | ||
2223 | return item.PermsGranter.ToString(); | ||
2224 | } | ||
2225 | } | ||
2226 | |||
2227 | return LLUUID.Zero.ToString(); | ||
2228 | } | ||
2229 | |||
2230 | public LSL_Types.LSLInteger llGetPermissions() | ||
2231 | { | ||
2232 | m_host.AddScriptLPS(1); | ||
2233 | |||
2234 | foreach (TaskInventoryItem item in m_host.TaskInventory.Values) | ||
2235 | { | ||
2236 | if (item.Type == 10 && item.ItemID == m_itemID) | ||
2237 | { | ||
2238 | return item.PermsMask; | ||
2239 | } | ||
2240 | } | ||
2241 | |||
2242 | return 0; | ||
2243 | } | ||
2244 | |||
2245 | public LSL_Types.LSLInteger llGetLinkNumber() | ||
2246 | { | ||
2247 | m_host.AddScriptLPS(1); | ||
2248 | |||
2249 | if (m_host.ParentGroup.Children.Count > 0) | ||
2250 | { | ||
2251 | return m_host.LinkNum + 1; | ||
2252 | } | ||
2253 | else | ||
2254 | { | ||
2255 | return 0; | ||
2256 | } | ||
2257 | } | ||
2258 | |||
2259 | public void llSetLinkColor(int linknumber, LSL_Types.Vector3 color, int face) | ||
2260 | { | ||
2261 | m_host.AddScriptLPS(1); | ||
2262 | SceneObjectPart part = m_host.ParentGroup.GetLinkNumPart(linknumber); | ||
2263 | if (linknumber > -1) | ||
2264 | { | ||
2265 | LLObject.TextureEntry tex = part.Shape.Textures; | ||
2266 | LLColor texcolor; | ||
2267 | if (face > -1) | ||
2268 | { | ||
2269 | texcolor = tex.CreateFace((uint)face).RGBA; | ||
2270 | texcolor.R = (float)Math.Abs(color.x - 1); | ||
2271 | texcolor.G = (float)Math.Abs(color.y - 1); | ||
2272 | texcolor.B = (float)Math.Abs(color.z - 1); | ||
2273 | tex.FaceTextures[face].RGBA = texcolor; | ||
2274 | part.UpdateTexture(tex); | ||
2275 | return; | ||
2276 | } | ||
2277 | else if (face == -1) | ||
2278 | { | ||
2279 | texcolor = tex.DefaultTexture.RGBA; | ||
2280 | texcolor.R = (float)Math.Abs(color.x - 1); | ||
2281 | texcolor.G = (float)Math.Abs(color.y - 1); | ||
2282 | texcolor.B = (float)Math.Abs(color.z - 1); | ||
2283 | tex.DefaultTexture.RGBA = texcolor; | ||
2284 | for (uint i = 0; i < 32; i++) | ||
2285 | { | ||
2286 | if (tex.FaceTextures[i] != null) | ||
2287 | { | ||
2288 | texcolor = tex.FaceTextures[i].RGBA; | ||
2289 | texcolor.R = (float)Math.Abs(color.x - 1); | ||
2290 | texcolor.G = (float)Math.Abs(color.y - 1); | ||
2291 | texcolor.B = (float)Math.Abs(color.z - 1); | ||
2292 | tex.FaceTextures[i].RGBA = texcolor; | ||
2293 | } | ||
2294 | } | ||
2295 | texcolor = tex.DefaultTexture.RGBA; | ||
2296 | texcolor.R = (float)Math.Abs(color.x - 1); | ||
2297 | texcolor.G = (float)Math.Abs(color.y - 1); | ||
2298 | texcolor.B = (float)Math.Abs(color.z - 1); | ||
2299 | tex.DefaultTexture.RGBA = texcolor; | ||
2300 | part.UpdateTexture(tex); | ||
2301 | return; | ||
2302 | } | ||
2303 | return; | ||
2304 | } | ||
2305 | else if (linknumber == -1) | ||
2306 | { | ||
2307 | int num = m_host.ParentGroup.PrimCount; | ||
2308 | for (int w = 0; w < num; w++) | ||
2309 | { | ||
2310 | linknumber = w; | ||
2311 | part = m_host.ParentGroup.GetLinkNumPart(linknumber); | ||
2312 | LLObject.TextureEntry tex = part.Shape.Textures; | ||
2313 | LLColor texcolor; | ||
2314 | if (face > -1) | ||
2315 | { | ||
2316 | texcolor = tex.CreateFace((uint)face).RGBA; | ||
2317 | texcolor.R = (float)Math.Abs(color.x - 1); | ||
2318 | texcolor.G = (float)Math.Abs(color.y - 1); | ||
2319 | texcolor.B = (float)Math.Abs(color.z - 1); | ||
2320 | tex.FaceTextures[face].RGBA = texcolor; | ||
2321 | part.UpdateTexture(tex); | ||
2322 | } | ||
2323 | else if (face == -1) | ||
2324 | { | ||
2325 | texcolor = tex.DefaultTexture.RGBA; | ||
2326 | texcolor.R = (float)Math.Abs(color.x - 1); | ||
2327 | texcolor.G = (float)Math.Abs(color.y - 1); | ||
2328 | texcolor.B = (float)Math.Abs(color.z - 1); | ||
2329 | tex.DefaultTexture.RGBA = texcolor; | ||
2330 | for (uint i = 0; i < 32; i++) | ||
2331 | { | ||
2332 | if (tex.FaceTextures[i] != null) | ||
2333 | { | ||
2334 | texcolor = tex.FaceTextures[i].RGBA; | ||
2335 | texcolor.R = (float)Math.Abs(color.x - 1); | ||
2336 | texcolor.G = (float)Math.Abs(color.y - 1); | ||
2337 | texcolor.B = (float)Math.Abs(color.z - 1); | ||
2338 | tex.FaceTextures[i].RGBA = texcolor; | ||
2339 | } | ||
2340 | } | ||
2341 | texcolor = tex.DefaultTexture.RGBA; | ||
2342 | texcolor.R = (float)Math.Abs(color.x - 1); | ||
2343 | texcolor.G = (float)Math.Abs(color.y - 1); | ||
2344 | texcolor.B = (float)Math.Abs(color.z - 1); | ||
2345 | tex.DefaultTexture.RGBA = texcolor; | ||
2346 | part.UpdateTexture(tex); | ||
2347 | } | ||
2348 | } | ||
2349 | return; | ||
2350 | } | ||
2351 | } | ||
2352 | |||
2353 | public void llCreateLink(string target, int parent) | ||
2354 | { | ||
2355 | m_host.AddScriptLPS(1); | ||
2356 | NotImplemented("llCreateLink"); | ||
2357 | } | ||
2358 | |||
2359 | public void llBreakLink(int linknum) | ||
2360 | { | ||
2361 | m_host.AddScriptLPS(1); | ||
2362 | NotImplemented("llBreakLink"); | ||
2363 | } | ||
2364 | |||
2365 | public void llBreakAllLinks() | ||
2366 | { | ||
2367 | m_host.AddScriptLPS(1); | ||
2368 | NotImplemented("llBreakAllLinks"); | ||
2369 | } | ||
2370 | |||
2371 | public string llGetLinkKey(int linknum) | ||
2372 | { | ||
2373 | m_host.AddScriptLPS(1); | ||
2374 | SceneObjectPart part = m_host.ParentGroup.GetLinkNumPart(linknum); | ||
2375 | if (part != null) | ||
2376 | { | ||
2377 | return part.UUID.ToString(); | ||
2378 | } | ||
2379 | else | ||
2380 | { | ||
2381 | return LLUUID.Zero.ToString(); | ||
2382 | } | ||
2383 | } | ||
2384 | |||
2385 | public string llGetLinkName(int linknum) | ||
2386 | { | ||
2387 | m_host.AddScriptLPS(1); | ||
2388 | SceneObjectPart part = m_host.ParentGroup.GetLinkNumPart(linknum); | ||
2389 | if (part != null) | ||
2390 | { | ||
2391 | return part.Name; | ||
2392 | } | ||
2393 | else | ||
2394 | { | ||
2395 | return LLUUID.Zero.ToString(); | ||
2396 | } | ||
2397 | } | ||
2398 | |||
2399 | public LSL_Types.LSLInteger llGetInventoryNumber(int type) | ||
2400 | { | ||
2401 | m_host.AddScriptLPS(1); | ||
2402 | int count = 0; | ||
2403 | foreach (KeyValuePair<LLUUID, TaskInventoryItem> inv in m_host.TaskInventory) | ||
2404 | { | ||
2405 | if (inv.Value.Type == type || type == -1) | ||
2406 | { | ||
2407 | count = count + 1; | ||
2408 | } | ||
2409 | } | ||
2410 | return count; | ||
2411 | } | ||
2412 | |||
2413 | public string llGetInventoryName(int type, int number) | ||
2414 | { | ||
2415 | m_host.AddScriptLPS(1); | ||
2416 | ArrayList keys = new ArrayList(); | ||
2417 | foreach (KeyValuePair<LLUUID, TaskInventoryItem> inv in m_host.TaskInventory) | ||
2418 | { | ||
2419 | if (inv.Value.Type == type || type == -1) | ||
2420 | { | ||
2421 | keys.Add(inv.Value.Name); | ||
2422 | } | ||
2423 | } | ||
2424 | if (keys.Count == 0) | ||
2425 | { | ||
2426 | return String.Empty; | ||
2427 | } | ||
2428 | keys.Sort(); | ||
2429 | if (keys.Count > number) | ||
2430 | { | ||
2431 | return (string)keys[number]; | ||
2432 | } | ||
2433 | return String.Empty; | ||
2434 | } | ||
2435 | |||
2436 | public void llSetScriptState(string name, int run) | ||
2437 | { | ||
2438 | LLUUID item; | ||
2439 | |||
2440 | m_host.AddScriptLPS(1); | ||
2441 | |||
2442 | // These functions are supposed to be robust, | ||
2443 | // so get the state one step at a time. | ||
2444 | |||
2445 | if ((item = ScriptByName(name)) != LLUUID.Zero) | ||
2446 | { | ||
2447 | m_ScriptEngine.SetScriptState(item, run == 0 ? false : true); | ||
2448 | } | ||
2449 | else | ||
2450 | { | ||
2451 | ShoutError("llSetScriptState: script "+name+" not found"); | ||
2452 | } | ||
2453 | } | ||
2454 | |||
2455 | public double llGetEnergy() | ||
2456 | { | ||
2457 | m_host.AddScriptLPS(1); | ||
2458 | // TODO: figure out real energy value | ||
2459 | return 1.0f; | ||
2460 | } | ||
2461 | |||
2462 | public void llGiveInventory(string destination, string inventory) | ||
2463 | { | ||
2464 | m_host.AddScriptLPS(1); | ||
2465 | NotImplemented("llGiveInventory"); | ||
2466 | } | ||
2467 | |||
2468 | public void llRemoveInventory(string item) | ||
2469 | { | ||
2470 | m_host.AddScriptLPS(1); | ||
2471 | NotImplemented("llRemoveInventory"); | ||
2472 | } | ||
2473 | |||
2474 | public void llSetText(string text, LSL_Types.Vector3 color, double alpha) | ||
2475 | { | ||
2476 | m_host.AddScriptLPS(1); | ||
2477 | Vector3 av3 = new Vector3((float)color.x, (float)color.y, (float)color.z); | ||
2478 | m_host.SetText(text, av3, alpha); | ||
2479 | } | ||
2480 | |||
2481 | public double llWater(LSL_Types.Vector3 offset) | ||
2482 | { | ||
2483 | m_host.AddScriptLPS(1); | ||
2484 | return World.RegionInfo.EstateSettings.waterHeight; | ||
2485 | } | ||
2486 | |||
2487 | public void llPassTouches(int pass) | ||
2488 | { | ||
2489 | m_host.AddScriptLPS(1); | ||
2490 | NotImplemented("llPassTouches"); | ||
2491 | } | ||
2492 | |||
2493 | public string llRequestAgentData(string id, int data) | ||
2494 | { | ||
2495 | m_host.AddScriptLPS(1); | ||
2496 | |||
2497 | UserProfileData userProfile = | ||
2498 | World.CommsManager.UserService.GetUserProfile(id); | ||
2499 | |||
2500 | string reply = String.Empty; | ||
2501 | |||
2502 | switch(data) | ||
2503 | { | ||
2504 | case 1: // DATA_ONLINE (0|1) | ||
2505 | // TODO: implement fetching of this information | ||
2506 | // if(userProfile.CurrentAgent.AgentOnline) | ||
2507 | // reply = "1"; | ||
2508 | // else | ||
2509 | reply = "0"; | ||
2510 | break; | ||
2511 | case 2: // DATA_NAME (First Last) | ||
2512 | reply = userProfile.FirstName+" "+userProfile.SurName; | ||
2513 | break; | ||
2514 | case 3: // DATA_BORN (YYYY-MM-DD) | ||
2515 | DateTime born = new DateTime(1970, 1, 1, 0, 0, 0, 0); | ||
2516 | born = born.AddSeconds(userProfile.Created); | ||
2517 | reply = born.ToString("yyyy-MM-dd"); | ||
2518 | break; | ||
2519 | case 4: // DATA_RATING (0,0,0,0,0,0) | ||
2520 | reply = "0,0,0,0,0,0"; | ||
2521 | break; | ||
2522 | case 8: // DATA_PAYINFO (0|1|2|3) | ||
2523 | reply = "0"; | ||
2524 | break; | ||
2525 | default: | ||
2526 | return LLUUID.Zero.ToString(); // Raise no event | ||
2527 | } | ||
2528 | |||
2529 | LLUUID rq = LLUUID.Random(); | ||
2530 | |||
2531 | LLUUID tid = m_ScriptEngine.m_ASYNCLSLCommandManager. | ||
2532 | m_Dataserver.RegisterRequest(m_localID, | ||
2533 | m_itemID, rq.ToString()); | ||
2534 | |||
2535 | m_ScriptEngine.m_ASYNCLSLCommandManager. | ||
2536 | m_Dataserver.DataserverReply(rq.ToString(), reply); | ||
2537 | |||
2538 | return tid.ToString(); | ||
2539 | } | ||
2540 | |||
2541 | public string llRequestInventoryData(string name) | ||
2542 | { | ||
2543 | m_host.AddScriptLPS(1); | ||
2544 | |||
2545 | foreach (TaskInventoryItem item in m_host.TaskInventory.Values) | ||
2546 | { | ||
2547 | if (item.Type == 3 && item.Name == name) | ||
2548 | { | ||
2549 | LLUUID tid = m_ScriptEngine.m_ASYNCLSLCommandManager. | ||
2550 | m_Dataserver.RegisterRequest(m_localID, | ||
2551 | m_itemID, item.AssetID.ToString()); | ||
2552 | |||
2553 | LLVector3 region = new LLVector3( | ||
2554 | World.RegionInfo.RegionLocX * Constants.RegionSize, | ||
2555 | World.RegionInfo.RegionLocY * Constants.RegionSize, | ||
2556 | 0); | ||
2557 | |||
2558 | World.AssetCache.GetAsset(item.AssetID, | ||
2559 | delegate(LLUUID i, AssetBase a) | ||
2560 | { | ||
2561 | AssetLandmark lm = new AssetLandmark(a); | ||
2562 | |||
2563 | region += lm.Position; | ||
2564 | |||
2565 | string reply = region.ToString(); | ||
2566 | |||
2567 | m_ScriptEngine.m_ASYNCLSLCommandManager. | ||
2568 | m_Dataserver.DataserverReply(i.ToString(), | ||
2569 | reply); | ||
2570 | }, false); | ||
2571 | |||
2572 | return tid.ToString(); | ||
2573 | } | ||
2574 | } | ||
2575 | |||
2576 | return String.Empty; | ||
2577 | } | ||
2578 | |||
2579 | public void llSetDamage(double damage) | ||
2580 | { | ||
2581 | m_host.AddScriptLPS(1); | ||
2582 | NotImplemented("llSetDamage"); | ||
2583 | } | ||
2584 | |||
2585 | public void llTeleportAgentHome(string agent) | ||
2586 | { | ||
2587 | m_host.AddScriptLPS(1); | ||
2588 | NotImplemented("llTeleportAgentHome"); | ||
2589 | } | ||
2590 | |||
2591 | public void llModifyLand(int action, int brush) | ||
2592 | { | ||
2593 | m_host.AddScriptLPS(1); | ||
2594 | World.ExternalChecks.ExternalChecksCanTerraformLand(m_host.OwnerID, new LLVector3(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y, 0)); | ||
2595 | } | ||
2596 | |||
2597 | public void llCollisionSound(string impact_sound, double impact_volume) | ||
2598 | { | ||
2599 | m_host.AddScriptLPS(1); | ||
2600 | NotImplemented("llCollisionSound"); | ||
2601 | } | ||
2602 | |||
2603 | public void llCollisionSprite(string impact_sprite) | ||
2604 | { | ||
2605 | m_host.AddScriptLPS(1); | ||
2606 | NotImplemented("llCollisionSprite"); | ||
2607 | } | ||
2608 | |||
2609 | public string llGetAnimation(string id) | ||
2610 | { | ||
2611 | m_host.AddScriptLPS(1); | ||
2612 | NotImplemented("llGetAnimation"); | ||
2613 | return String.Empty; | ||
2614 | } | ||
2615 | |||
2616 | public void llResetScript() | ||
2617 | { | ||
2618 | m_host.AddScriptLPS(1); | ||
2619 | m_ScriptEngine.ResetScript(m_itemID); | ||
2620 | } | ||
2621 | |||
2622 | public void llMessageLinked(int linknum, int num, string msg, string id) | ||
2623 | { | ||
2624 | |||
2625 | m_host.AddScriptLPS(1); | ||
2626 | |||
2627 | uint partLocalID; | ||
2628 | LLUUID partItemID; | ||
2629 | |||
2630 | switch ((int)linknum) | ||
2631 | { | ||
2632 | |||
2633 | case (int)BuiltIn_Commands_BaseClass.LINK_ROOT: | ||
2634 | |||
2635 | SceneObjectPart part = m_host.ParentGroup.RootPart; | ||
2636 | |||
2637 | foreach (TaskInventoryItem item in part.TaskInventory.Values) | ||
2638 | { | ||
2639 | if (item.Type == 10) | ||
2640 | { | ||
2641 | partLocalID = part.LocalId; | ||
2642 | partItemID = item.ItemID; | ||
2643 | |||
2644 | object[] resobj = new object[] | ||
2645 | { | ||
2646 | new LSL_Types.LSLInteger(m_host.LinkNum + 1), new LSL_Types.LSLInteger(num), new LSL_Types.LSLString(msg), new LSL_Types.LSLString(id) | ||
2647 | }; | ||
2648 | |||
2649 | m_ScriptEngine.PostScriptEvent(partItemID, | ||
2650 | new XEventParams("link_message", | ||
2651 | resobj, new XDetectParams[0])); | ||
2652 | } | ||
2653 | } | ||
2654 | |||
2655 | break; | ||
2656 | |||
2657 | case (int)BuiltIn_Commands_BaseClass.LINK_SET: | ||
2658 | |||
2659 | Console.WriteLine("LINK_SET"); | ||
2660 | |||
2661 | foreach (SceneObjectPart partInst in m_host.ParentGroup.GetParts()) | ||
2662 | { | ||
2663 | |||
2664 | foreach (TaskInventoryItem item in partInst.TaskInventory.Values) | ||
2665 | { | ||
2666 | if (item.Type == 10) | ||
2667 | { | ||
2668 | partLocalID = partInst.LocalId; | ||
2669 | partItemID = item.ItemID; | ||
2670 | Object[] resobj = new object[] | ||
2671 | { | ||
2672 | new LSL_Types.LSLInteger(m_host.LinkNum + 1), new LSL_Types.LSLInteger(num), new LSL_Types.LSLString(msg), new LSL_Types.LSLString(id) | ||
2673 | }; | ||
2674 | |||
2675 | m_ScriptEngine.PostScriptEvent(partItemID, | ||
2676 | new XEventParams("link_message", | ||
2677 | resobj, new XDetectParams[0])); | ||
2678 | } | ||
2679 | } | ||
2680 | } | ||
2681 | |||
2682 | break; | ||
2683 | |||
2684 | case (int)BuiltIn_Commands_BaseClass.LINK_ALL_OTHERS: | ||
2685 | |||
2686 | foreach (SceneObjectPart partInst in m_host.ParentGroup.GetParts()) | ||
2687 | { | ||
2688 | |||
2689 | if (partInst.LocalId != m_host.LocalId) | ||
2690 | { | ||
2691 | |||
2692 | foreach (TaskInventoryItem item in partInst.TaskInventory.Values) | ||
2693 | { | ||
2694 | if (item.Type == 10) | ||
2695 | { | ||
2696 | partLocalID = partInst.LocalId; | ||
2697 | partItemID = item.ItemID; | ||
2698 | Object[] resobj = new object[] | ||
2699 | { | ||
2700 | new LSL_Types.LSLInteger(m_host.LinkNum + 1), new LSL_Types.LSLInteger(num), new LSL_Types.LSLString(msg), new LSL_Types.LSLString(id) | ||
2701 | }; | ||
2702 | |||
2703 | m_ScriptEngine.PostScriptEvent(partItemID, | ||
2704 | new XEventParams("link_message", | ||
2705 | resobj, new XDetectParams[0])); | ||
2706 | } | ||
2707 | } | ||
2708 | |||
2709 | } | ||
2710 | } | ||
2711 | |||
2712 | break; | ||
2713 | |||
2714 | case (int)BuiltIn_Commands_BaseClass.LINK_ALL_CHILDREN: | ||
2715 | |||
2716 | foreach (SceneObjectPart partInst in m_host.ParentGroup.GetParts()) | ||
2717 | { | ||
2718 | |||
2719 | if (partInst.LocalId != m_host.ParentGroup.RootPart.LocalId) | ||
2720 | { | ||
2721 | |||
2722 | foreach (TaskInventoryItem item in partInst.TaskInventory.Values) | ||
2723 | { | ||
2724 | if (item.Type == 10) | ||
2725 | { | ||
2726 | partLocalID = partInst.LocalId; | ||
2727 | partItemID = item.ItemID; | ||
2728 | Object[] resobj = new object[] | ||
2729 | { | ||
2730 | new LSL_Types.LSLInteger(m_host.LinkNum + 1), new LSL_Types.LSLInteger(num), new LSL_Types.LSLString(msg), new LSL_Types.LSLString(id) | ||
2731 | }; | ||
2732 | |||
2733 | m_ScriptEngine.PostScriptEvent(partItemID, | ||
2734 | new XEventParams("link_message", | ||
2735 | resobj, new XDetectParams[0])); | ||
2736 | } | ||
2737 | } | ||
2738 | |||
2739 | } | ||
2740 | } | ||
2741 | |||
2742 | break; | ||
2743 | |||
2744 | case (int)BuiltIn_Commands_BaseClass.LINK_THIS: | ||
2745 | |||
2746 | foreach (TaskInventoryItem item in m_host.TaskInventory.Values) | ||
2747 | { | ||
2748 | if (item.Type == 10) | ||
2749 | { | ||
2750 | partItemID = item.ItemID; | ||
2751 | |||
2752 | object[] resobj = new object[] | ||
2753 | { | ||
2754 | new LSL_Types.LSLInteger(m_host.LinkNum + 1), new LSL_Types.LSLInteger(num), new LSL_Types.LSLString(msg), new LSL_Types.LSLString(id) | ||
2755 | }; | ||
2756 | |||
2757 | m_ScriptEngine.PostScriptEvent(partItemID, | ||
2758 | new XEventParams("link_message", | ||
2759 | resobj, new XDetectParams[0])); | ||
2760 | } | ||
2761 | } | ||
2762 | |||
2763 | break; | ||
2764 | |||
2765 | default: | ||
2766 | |||
2767 | foreach (SceneObjectPart partInst in m_host.ParentGroup.GetParts()) | ||
2768 | { | ||
2769 | |||
2770 | if ((partInst.LinkNum + 1) == linknum) | ||
2771 | { | ||
2772 | |||
2773 | foreach (TaskInventoryItem item in partInst.TaskInventory.Values) | ||
2774 | { | ||
2775 | if (item.Type == 10) | ||
2776 | { | ||
2777 | partLocalID = partInst.LocalId; | ||
2778 | partItemID = item.ItemID; | ||
2779 | Object[] resObjDef = new object[] | ||
2780 | { | ||
2781 | new LSL_Types.LSLInteger(m_host.LinkNum + 1), new LSL_Types.LSLInteger(num), new LSL_Types.LSLString(msg), new LSL_Types.LSLString(id) | ||
2782 | }; | ||
2783 | |||
2784 | m_ScriptEngine.PostScriptEvent(partItemID, | ||
2785 | new XEventParams("link_message", | ||
2786 | resObjDef, new XDetectParams[0])); | ||
2787 | } | ||
2788 | } | ||
2789 | |||
2790 | } | ||
2791 | } | ||
2792 | |||
2793 | break; | ||
2794 | |||
2795 | } | ||
2796 | |||
2797 | } | ||
2798 | |||
2799 | public void llPushObject(string target, LSL_Types.Vector3 impulse, LSL_Types.Vector3 ang_impulse, int local) | ||
2800 | { | ||
2801 | m_host.AddScriptLPS(1); | ||
2802 | NotImplemented("llPushObject"); | ||
2803 | } | ||
2804 | |||
2805 | public void llPassCollisions(int pass) | ||
2806 | { | ||
2807 | m_host.AddScriptLPS(1); | ||
2808 | NotImplemented("llPassCollisions"); | ||
2809 | } | ||
2810 | |||
2811 | public string llGetScriptName() | ||
2812 | { | ||
2813 | |||
2814 | string result = String.Empty; | ||
2815 | |||
2816 | m_host.AddScriptLPS(1); | ||
2817 | |||
2818 | foreach (TaskInventoryItem item in m_host.TaskInventory.Values) | ||
2819 | { | ||
2820 | if (item.Type == 10 && item.ItemID == m_itemID) | ||
2821 | { | ||
2822 | result = item.Name!=null?item.Name:String.Empty; | ||
2823 | break; | ||
2824 | } | ||
2825 | } | ||
2826 | |||
2827 | return result; | ||
2828 | |||
2829 | } | ||
2830 | |||
2831 | public LSL_Types.LSLInteger llGetNumberOfSides() | ||
2832 | { | ||
2833 | m_host.AddScriptLPS(1); | ||
2834 | NotImplemented("llGetNumberOfSides"); | ||
2835 | return 0; | ||
2836 | } | ||
2837 | |||
2838 | |||
2839 | /* The new / changed functions were tested with the following LSL script: | ||
2840 | |||
2841 | default | ||
2842 | { | ||
2843 | state_entry() | ||
2844 | { | ||
2845 | rotation rot = llEuler2Rot(<0,70,0> * DEG_TO_RAD); | ||
2846 | |||
2847 | llOwnerSay("to get here, we rotate over: "+ (string) llRot2Axis(rot)); | ||
2848 | llOwnerSay("and we rotate for: "+ (llRot2Angle(rot) * RAD_TO_DEG)); | ||
2849 | |||
2850 | // convert back and forth between quaternion <-> vector and angle | ||
2851 | |||
2852 | rotation newrot = llAxisAngle2Rot(llRot2Axis(rot),llRot2Angle(rot)); | ||
2853 | |||
2854 | llOwnerSay("Old rotation was: "+(string) rot); | ||
2855 | llOwnerSay("re-converted rotation is: "+(string) newrot); | ||
2856 | |||
2857 | llSetRot(rot); // to check the parameters in the prim | ||
2858 | } | ||
2859 | } | ||
2860 | */ | ||
2861 | |||
2862 | |||
2863 | |||
2864 | // Xantor 29/apr/2008 | ||
2865 | // Returns rotation described by rotating angle radians about axis. | ||
2866 | // q = cos(a/2) + i (x * sin(a/2)) + j (y * sin(a/2)) + k (z * sin(a/2)) | ||
2867 | public LSL_Types.Quaternion llAxisAngle2Rot(LSL_Types.Vector3 axis, double angle) | ||
2868 | { | ||
2869 | m_host.AddScriptLPS(1); | ||
2870 | |||
2871 | double x, y, z, s, t; | ||
2872 | |||
2873 | s = Math.Cos(angle / 2); | ||
2874 | t = Math.Sin(angle / 2); // temp value to avoid 2 more sin() calcs | ||
2875 | x = axis.x * t; | ||
2876 | y = axis.y * t; | ||
2877 | z = axis.z * t; | ||
2878 | |||
2879 | return new LSL_Types.Quaternion(x,y,z,s); | ||
2880 | // NotImplemented("llAxisAngle2Rot"); | ||
2881 | } | ||
2882 | |||
2883 | |||
2884 | // Xantor 29/apr/2008 | ||
2885 | // converts a Quaternion to X,Y,Z axis rotations | ||
2886 | public LSL_Types.Vector3 llRot2Axis(LSL_Types.Quaternion rot) | ||
2887 | { | ||
2888 | m_host.AddScriptLPS(1); | ||
2889 | double x,y,z; | ||
2890 | |||
2891 | if (rot.s > 1) // normalization needed | ||
2892 | { | ||
2893 | double length = Math.Sqrt(rot.x * rot.x + rot.y * rot.y + | ||
2894 | rot.z * rot.z + rot.s * rot.s); | ||
2895 | |||
2896 | rot.x /= length; | ||
2897 | rot.y /= length; | ||
2898 | rot.z /= length; | ||
2899 | rot.s /= length; | ||
2900 | |||
2901 | } | ||
2902 | |||
2903 | double angle = 2 * Math.Acos(rot.s); | ||
2904 | double s = Math.Sqrt(1 - rot.s * rot.s); | ||
2905 | if (s < 0.001) | ||
2906 | { | ||
2907 | x = 1; | ||
2908 | y = z = 0; | ||
2909 | } | ||
2910 | else | ||
2911 | { | ||
2912 | x = rot.x / s; // normalise axis | ||
2913 | y = rot.y / s; | ||
2914 | z = rot.z / s; | ||
2915 | } | ||
2916 | |||
2917 | |||
2918 | return new LSL_Types.Vector3(x,y,z); | ||
2919 | |||
2920 | |||
2921 | // NotImplemented("llRot2Axis"); | ||
2922 | } | ||
2923 | |||
2924 | |||
2925 | // Returns the angle of a quaternion (see llRot2Axis for the axis) | ||
2926 | public double llRot2Angle(LSL_Types.Quaternion rot) | ||
2927 | { | ||
2928 | m_host.AddScriptLPS(1); | ||
2929 | |||
2930 | if (rot.s > 1) // normalization needed | ||
2931 | { | ||
2932 | double length = Math.Sqrt(rot.x * rot.x + rot.y * rot.y + | ||
2933 | rot.z * rot.z + rot.s * rot.s); | ||
2934 | |||
2935 | rot.x /= length; | ||
2936 | rot.y /= length; | ||
2937 | rot.z /= length; | ||
2938 | rot.s /= length; | ||
2939 | |||
2940 | } | ||
2941 | |||
2942 | double angle = 2 * Math.Acos(rot.s); | ||
2943 | |||
2944 | return angle; | ||
2945 | |||
2946 | // NotImplemented("llRot2Angle"); | ||
2947 | } | ||
2948 | |||
2949 | public double llAcos(double val) | ||
2950 | { | ||
2951 | m_host.AddScriptLPS(1); | ||
2952 | return (double)Math.Acos(val); | ||
2953 | } | ||
2954 | |||
2955 | public double llAsin(double val) | ||
2956 | { | ||
2957 | m_host.AddScriptLPS(1); | ||
2958 | return (double)Math.Asin(val); | ||
2959 | } | ||
2960 | |||
2961 | // Xantor 30/apr/2008 | ||
2962 | public double llAngleBetween(LSL_Types.Quaternion a, LSL_Types.Quaternion b) | ||
2963 | { | ||
2964 | m_host.AddScriptLPS(1); | ||
2965 | |||
2966 | return (double) Math.Acos(a.x * b.x + a.y * b.y + a.z * b.z + a.s * b.s) * 2; | ||
2967 | // NotImplemented("llAngleBetween"); | ||
2968 | } | ||
2969 | |||
2970 | public string llGetInventoryKey(string name) | ||
2971 | { | ||
2972 | m_host.AddScriptLPS(1); | ||
2973 | foreach (KeyValuePair<LLUUID, TaskInventoryItem> inv in m_host.TaskInventory) | ||
2974 | { | ||
2975 | if (inv.Value.Name == name) | ||
2976 | { | ||
2977 | if ((inv.Value.OwnerMask & (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify)) == (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify)) | ||
2978 | { | ||
2979 | return inv.Value.AssetID.ToString(); | ||
2980 | } | ||
2981 | else | ||
2982 | { | ||
2983 | return LLUUID.Zero.ToString(); | ||
2984 | } | ||
2985 | } | ||
2986 | } | ||
2987 | return LLUUID.Zero.ToString(); | ||
2988 | } | ||
2989 | |||
2990 | public void llAllowInventoryDrop(int add) | ||
2991 | { | ||
2992 | m_host.AddScriptLPS(1); | ||
2993 | NotImplemented("llAllowInventoryDrop"); | ||
2994 | } | ||
2995 | |||
2996 | public LSL_Types.Vector3 llGetSunDirection() | ||
2997 | { | ||
2998 | m_host.AddScriptLPS(1); | ||
2999 | |||
3000 | LSL_Types.Vector3 SunDoubleVector3; | ||
3001 | LLVector3 SunFloatVector3; | ||
3002 | |||
3003 | // sunPosition estate setting is set in OpenSim.Region.Environment.Modules.SunModule | ||
3004 | // have to convert from LLVector3 (float) to LSL_Types.Vector3 (double) | ||
3005 | SunFloatVector3 = World.RegionInfo.EstateSettings.sunPosition; | ||
3006 | SunDoubleVector3.x = (double)SunFloatVector3.X; | ||
3007 | SunDoubleVector3.y = (double)SunFloatVector3.Y; | ||
3008 | SunDoubleVector3.z = (double)SunFloatVector3.Z; | ||
3009 | |||
3010 | return SunDoubleVector3; | ||
3011 | } | ||
3012 | |||
3013 | public LSL_Types.Vector3 llGetTextureOffset(int face) | ||
3014 | { | ||
3015 | m_host.AddScriptLPS(1); | ||
3016 | LLObject.TextureEntry tex = m_host.Shape.Textures; | ||
3017 | LSL_Types.Vector3 offset; | ||
3018 | if (face == -1) | ||
3019 | { | ||
3020 | face = 0; | ||
3021 | } | ||
3022 | offset.x = tex.GetFace((uint)face).OffsetU; | ||
3023 | offset.y = tex.GetFace((uint)face).OffsetV; | ||
3024 | offset.z = 0.0; | ||
3025 | return offset; | ||
3026 | } | ||
3027 | |||
3028 | public LSL_Types.Vector3 llGetTextureScale(int side) | ||
3029 | { | ||
3030 | m_host.AddScriptLPS(1); | ||
3031 | LLObject.TextureEntry tex = m_host.Shape.Textures; | ||
3032 | LSL_Types.Vector3 scale; | ||
3033 | if (side == -1) | ||
3034 | { | ||
3035 | side = 0; | ||
3036 | } | ||
3037 | scale.x = tex.GetFace((uint)side).RepeatU; | ||
3038 | scale.y = tex.GetFace((uint)side).RepeatV; | ||
3039 | scale.z = 0.0; | ||
3040 | return scale; | ||
3041 | } | ||
3042 | |||
3043 | public double llGetTextureRot(int face) | ||
3044 | { | ||
3045 | m_host.AddScriptLPS(1); | ||
3046 | LLObject.TextureEntry tex = m_host.Shape.Textures; | ||
3047 | if (face == -1) | ||
3048 | { | ||
3049 | face = 0; | ||
3050 | } | ||
3051 | return tex.GetFace((uint)face).Rotation; | ||
3052 | } | ||
3053 | |||
3054 | public LSL_Types.LSLInteger llSubStringIndex(string source, string pattern) | ||
3055 | { | ||
3056 | m_host.AddScriptLPS(1); | ||
3057 | return source.IndexOf(pattern); | ||
3058 | } | ||
3059 | |||
3060 | public string llGetOwnerKey(string id) | ||
3061 | { | ||
3062 | m_host.AddScriptLPS(1); | ||
3063 | LLUUID key = new LLUUID(); | ||
3064 | if (LLUUID.TryParse(id, out key)) | ||
3065 | { | ||
3066 | return World.GetSceneObjectPart(World.Entities[key].LocalId).OwnerID.ToString(); | ||
3067 | } | ||
3068 | else | ||
3069 | { | ||
3070 | return LLUUID.Zero.ToString(); | ||
3071 | } | ||
3072 | } | ||
3073 | |||
3074 | public LSL_Types.Vector3 llGetCenterOfMass() | ||
3075 | { | ||
3076 | m_host.AddScriptLPS(1); | ||
3077 | NotImplemented("llGetCenterOfMass"); | ||
3078 | return new LSL_Types.Vector3(); | ||
3079 | } | ||
3080 | |||
3081 | public LSL_Types.list llListSort(LSL_Types.list src, int stride, int ascending) | ||
3082 | { | ||
3083 | m_host.AddScriptLPS(1); | ||
3084 | return src.Sort(stride, ascending); | ||
3085 | } | ||
3086 | |||
3087 | public LSL_Types.LSLInteger llGetListLength(LSL_Types.list src) | ||
3088 | { | ||
3089 | m_host.AddScriptLPS(1); | ||
3090 | return src.Length; | ||
3091 | } | ||
3092 | |||
3093 | public LSL_Types.LSLInteger llList2Integer(LSL_Types.list src, int index) | ||
3094 | { | ||
3095 | m_host.AddScriptLPS(1); | ||
3096 | if (index < 0) | ||
3097 | { | ||
3098 | index = src.Length + index; | ||
3099 | } | ||
3100 | if (index >= src.Length) | ||
3101 | { | ||
3102 | return 0; | ||
3103 | } | ||
3104 | try | ||
3105 | { | ||
3106 | return Convert.ToInt32(src.Data[index]); | ||
3107 | } | ||
3108 | catch (FormatException) | ||
3109 | { | ||
3110 | return 0; | ||
3111 | } | ||
3112 | } | ||
3113 | |||
3114 | public double osList2Double(LSL_Types.list src, int index) | ||
3115 | { | ||
3116 | m_host.AddScriptLPS(1); | ||
3117 | if (index < 0) | ||
3118 | { | ||
3119 | index = src.Length + index; | ||
3120 | } | ||
3121 | if (index >= src.Length) | ||
3122 | { | ||
3123 | return 0.0; | ||
3124 | } | ||
3125 | return Convert.ToDouble(src.Data[index]); | ||
3126 | } | ||
3127 | |||
3128 | public double llList2Float(LSL_Types.list src, int index) | ||
3129 | { | ||
3130 | m_host.AddScriptLPS(1); | ||
3131 | if (index < 0) | ||
3132 | { | ||
3133 | index = src.Length + index; | ||
3134 | } | ||
3135 | if (index >= src.Length) | ||
3136 | { | ||
3137 | return 0.0; | ||
3138 | } | ||
3139 | try | ||
3140 | { | ||
3141 | return Convert.ToDouble(src.Data[index]); | ||
3142 | } | ||
3143 | catch (FormatException) | ||
3144 | { | ||
3145 | return 0.0; | ||
3146 | } | ||
3147 | } | ||
3148 | |||
3149 | public string llList2String(LSL_Types.list src, int index) | ||
3150 | { | ||
3151 | m_host.AddScriptLPS(1); | ||
3152 | if (index < 0) | ||
3153 | { | ||
3154 | index = src.Length + index; | ||
3155 | } | ||
3156 | if (index >= src.Length) | ||
3157 | { | ||
3158 | return String.Empty; | ||
3159 | } | ||
3160 | return src.Data[index].ToString(); | ||
3161 | } | ||
3162 | |||
3163 | public string llList2Key(LSL_Types.list src, int index) | ||
3164 | { | ||
3165 | m_host.AddScriptLPS(1); | ||
3166 | if (index < 0) | ||
3167 | { | ||
3168 | index = src.Length + index; | ||
3169 | } | ||
3170 | if (index >= src.Length) | ||
3171 | { | ||
3172 | return ""; | ||
3173 | } | ||
3174 | return src.Data[index].ToString(); | ||
3175 | } | ||
3176 | |||
3177 | public LSL_Types.Vector3 llList2Vector(LSL_Types.list src, int index) | ||
3178 | { | ||
3179 | m_host.AddScriptLPS(1); | ||
3180 | if (index < 0) | ||
3181 | { | ||
3182 | index = src.Length + index; | ||
3183 | } | ||
3184 | if (index >= src.Length) | ||
3185 | { | ||
3186 | return new LSL_Types.Vector3(0, 0, 0); | ||
3187 | } | ||
3188 | if (src.Data[index].GetType() == typeof(LSL_Types.Vector3)) | ||
3189 | { | ||
3190 | return (LSL_Types.Vector3)src.Data[index]; | ||
3191 | } | ||
3192 | else | ||
3193 | { | ||
3194 | return new LSL_Types.Vector3(src.Data[index].ToString()); | ||
3195 | } | ||
3196 | } | ||
3197 | |||
3198 | public LSL_Types.Quaternion llList2Rot(LSL_Types.list src, int index) | ||
3199 | { | ||
3200 | m_host.AddScriptLPS(1); | ||
3201 | if (index < 0) | ||
3202 | { | ||
3203 | index = src.Length + index; | ||
3204 | } | ||
3205 | if (index >= src.Length) | ||
3206 | { | ||
3207 | return new LSL_Types.Quaternion(0, 0, 0, 1); | ||
3208 | } | ||
3209 | if (src.Data[index].GetType() == typeof(LSL_Types.Quaternion)) | ||
3210 | { | ||
3211 | return (LSL_Types.Quaternion)src.Data[index]; | ||
3212 | } | ||
3213 | else | ||
3214 | { | ||
3215 | return new LSL_Types.Quaternion(src.Data[index].ToString()); | ||
3216 | } | ||
3217 | } | ||
3218 | |||
3219 | public LSL_Types.list llList2List(LSL_Types.list src, int start, int end) | ||
3220 | { | ||
3221 | m_host.AddScriptLPS(1); | ||
3222 | return src.GetSublist(start, end); | ||
3223 | } | ||
3224 | |||
3225 | public LSL_Types.list llDeleteSubList(LSL_Types.list src, int start, int end) | ||
3226 | { | ||
3227 | return src.DeleteSublist(end, start); | ||
3228 | } | ||
3229 | |||
3230 | public LSL_Types.LSLInteger llGetListEntryType(LSL_Types.list src, int index) | ||
3231 | { | ||
3232 | m_host.AddScriptLPS(1); | ||
3233 | if (index < 0) | ||
3234 | { | ||
3235 | index = src.Length + index; | ||
3236 | } | ||
3237 | if (index >= src.Length) | ||
3238 | { | ||
3239 | return 0; | ||
3240 | } | ||
3241 | |||
3242 | if (src.Data[index] is Int32) | ||
3243 | return 1; | ||
3244 | if (src.Data[index] is Double) | ||
3245 | return 2; | ||
3246 | if (src.Data[index] is String) | ||
3247 | { | ||
3248 | LLUUID tuuid; | ||
3249 | if (LLUUID.TryParse(src.Data[index].ToString(), out tuuid)) | ||
3250 | { | ||
3251 | return 3; | ||
3252 | } | ||
3253 | else | ||
3254 | { | ||
3255 | return 4; | ||
3256 | } | ||
3257 | } | ||
3258 | if (src.Data[index] is LSL_Types.Vector3) | ||
3259 | return 5; | ||
3260 | if (src.Data[index] is LSL_Types.Quaternion) | ||
3261 | return 6; | ||
3262 | if (src.Data[index] is LSL_Types.list) | ||
3263 | return 7; | ||
3264 | return 0; | ||
3265 | |||
3266 | } | ||
3267 | |||
3268 | /// <summary> | ||
3269 | /// Process the supplied list and return the | ||
3270 | /// content of the list formatted as a comma | ||
3271 | /// separated list. There is a space after | ||
3272 | /// each comma. | ||
3273 | /// </summary> | ||
3274 | |||
3275 | public string llList2CSV(LSL_Types.list src) | ||
3276 | { | ||
3277 | |||
3278 | string ret = String.Empty; | ||
3279 | int x = 0; | ||
3280 | |||
3281 | m_host.AddScriptLPS(1); | ||
3282 | |||
3283 | if (src.Data.Length > 0) | ||
3284 | { | ||
3285 | ret = src.Data[x++].ToString(); | ||
3286 | for (; x < src.Data.Length; x++) | ||
3287 | { | ||
3288 | ret += ", "+src.Data[x].ToString(); | ||
3289 | } | ||
3290 | } | ||
3291 | |||
3292 | return ret; | ||
3293 | } | ||
3294 | |||
3295 | /// <summary> | ||
3296 | /// The supplied string is scanned for commas | ||
3297 | /// and converted into a list. Commas are only | ||
3298 | /// effective if they are encountered outside | ||
3299 | /// of '<' '>' delimiters. Any whitespace | ||
3300 | /// before or after an element is trimmed. | ||
3301 | /// </summary> | ||
3302 | |||
3303 | public LSL_Types.list llCSV2List(string src) | ||
3304 | { | ||
3305 | |||
3306 | LSL_Types.list result = new LSL_Types.list(); | ||
3307 | int parens = 0; | ||
3308 | int start = 0; | ||
3309 | int length = 0; | ||
3310 | |||
3311 | m_host.AddScriptLPS(1); | ||
3312 | |||
3313 | for (int i = 0; i < src.Length; i++) | ||
3314 | { | ||
3315 | switch (src[i]) | ||
3316 | { | ||
3317 | case '<' : | ||
3318 | parens++; | ||
3319 | length++; | ||
3320 | break; | ||
3321 | case '>' : | ||
3322 | if (parens > 0) | ||
3323 | parens--; | ||
3324 | length++; | ||
3325 | break; | ||
3326 | case ',' : | ||
3327 | if (parens == 0) | ||
3328 | { | ||
3329 | result.Add(src.Substring(start,length).Trim()); | ||
3330 | start += length+1; | ||
3331 | length = 0; | ||
3332 | } else | ||
3333 | length++; | ||
3334 | break; | ||
3335 | default : | ||
3336 | length++; | ||
3337 | break; | ||
3338 | } | ||
3339 | } | ||
3340 | |||
3341 | result.Add(src.Substring(start,length).Trim()); | ||
3342 | |||
3343 | return result; | ||
3344 | |||
3345 | } | ||
3346 | |||
3347 | /// <summary> | ||
3348 | /// Randomizes the list, be arbitrarily reordering | ||
3349 | /// sublists of stride elements. As the stride approaches | ||
3350 | /// the size of the list, the options become very | ||
3351 | /// limited. | ||
3352 | /// </summary> | ||
3353 | /// <remarks> | ||
3354 | /// This could take a while for very large list | ||
3355 | /// sizes. | ||
3356 | /// </remarks> | ||
3357 | |||
3358 | public LSL_Types.list llListRandomize(LSL_Types.list src, int stride) | ||
3359 | { | ||
3360 | |||
3361 | LSL_Types.list result; | ||
3362 | Random rand = new Random(); | ||
3363 | |||
3364 | int chunkk; | ||
3365 | int[] chunks; | ||
3366 | int index1; | ||
3367 | int index2; | ||
3368 | int tmp; | ||
3369 | |||
3370 | m_host.AddScriptLPS(1); | ||
3371 | |||
3372 | if (stride == 0) | ||
3373 | stride = 1; | ||
3374 | |||
3375 | // Stride MUST be a factor of the list length | ||
3376 | // If not, then return the src list. This also | ||
3377 | // traps those cases where stride > length. | ||
3378 | |||
3379 | if (src.Length != stride && src.Length%stride == 0) | ||
3380 | { | ||
3381 | chunkk = src.Length/stride; | ||
3382 | |||
3383 | chunks = new int[chunkk]; | ||
3384 | |||
3385 | for (int i = 0; i < chunkk; i++) | ||
3386 | chunks[i] = i; | ||
3387 | |||
3388 | for (int i = 0; i < chunkk - 1; i++) | ||
3389 | { | ||
3390 | // randomly select 2 chunks | ||
3391 | index1 = rand.Next(rand.Next(65536)); | ||
3392 | index1 = index1%chunkk; | ||
3393 | index2 = rand.Next(rand.Next(65536)); | ||
3394 | index2 = index2%chunkk; | ||
3395 | |||
3396 | // and swap their relative positions | ||
3397 | tmp = chunks[index1]; | ||
3398 | chunks[index1] = chunks[index2]; | ||
3399 | chunks[index2] = tmp; | ||
3400 | } | ||
3401 | |||
3402 | // Construct the randomized list | ||
3403 | |||
3404 | result = new LSL_Types.list(); | ||
3405 | |||
3406 | for (int i = 0; i < chunkk; i++) | ||
3407 | { | ||
3408 | for (int j = 0; j < stride; j++) | ||
3409 | { | ||
3410 | result.Add(src.Data[chunks[i]*stride+j]); | ||
3411 | } | ||
3412 | } | ||
3413 | } | ||
3414 | else { | ||
3415 | object[] array = new object[src.Length]; | ||
3416 | Array.Copy(src.Data, 0, array, 0, src.Length); | ||
3417 | result = new LSL_Types.list(array); | ||
3418 | } | ||
3419 | |||
3420 | return result; | ||
3421 | |||
3422 | } | ||
3423 | |||
3424 | /// <summary> | ||
3425 | /// Elements in the source list starting with 0 and then | ||
3426 | /// every i+stride. If the stride is negative then the scan | ||
3427 | /// is backwards producing an inverted result. | ||
3428 | /// Only those elements that are also in the specified | ||
3429 | /// range are included in the result. | ||
3430 | /// </summary> | ||
3431 | |||
3432 | public LSL_Types.list llList2ListStrided(LSL_Types.list src, int start, int end, int stride) | ||
3433 | { | ||
3434 | |||
3435 | LSL_Types.list result = new LSL_Types.list(); | ||
3436 | int[] si = new int[2]; | ||
3437 | int[] ei = new int[2]; | ||
3438 | bool twopass = false; | ||
3439 | |||
3440 | m_host.AddScriptLPS(1); | ||
3441 | |||
3442 | // First step is always to deal with negative indices | ||
3443 | |||
3444 | if (start < 0) | ||
3445 | start = src.Length+start; | ||
3446 | if (end < 0) | ||
3447 | end = src.Length+end; | ||
3448 | |||
3449 | // Out of bounds indices are OK, just trim them | ||
3450 | // accordingly | ||
3451 | |||
3452 | if (start > src.Length) | ||
3453 | start = src.Length; | ||
3454 | |||
3455 | if (end > src.Length) | ||
3456 | end = src.Length; | ||
3457 | |||
3458 | // There may be one or two ranges to be considered | ||
3459 | |||
3460 | if (start != end) | ||
3461 | { | ||
3462 | |||
3463 | if (start <= end) | ||
3464 | { | ||
3465 | si[0] = start; | ||
3466 | ei[0] = end; | ||
3467 | } | ||
3468 | else | ||
3469 | { | ||
3470 | si[1] = start; | ||
3471 | ei[1] = src.Length; | ||
3472 | si[0] = 0; | ||
3473 | ei[0] = end; | ||
3474 | twopass = true; | ||
3475 | } | ||
3476 | |||
3477 | // The scan always starts from the beginning of the | ||
3478 | // source list, but members are only selected if they | ||
3479 | // fall within the specified sub-range. The specified | ||
3480 | // range values are inclusive. | ||
3481 | // A negative stride reverses the direction of the | ||
3482 | // scan producing an inverted list as a result. | ||
3483 | |||
3484 | if (stride == 0) | ||
3485 | stride = 1; | ||
3486 | |||
3487 | if (stride > 0) | ||
3488 | { | ||
3489 | for (int i = 0; i < src.Length; i += stride) | ||
3490 | { | ||
3491 | if (i<=ei[0] && i>=si[0]) | ||
3492 | result.Add(src.Data[i]); | ||
3493 | if (twopass && i>=si[1] && i<=ei[1]) | ||
3494 | result.Add(src.Data[i]); | ||
3495 | } | ||
3496 | } | ||
3497 | else if (stride < 0) | ||
3498 | { | ||
3499 | for (int i = src.Length - 1; i >= 0; i += stride) | ||
3500 | { | ||
3501 | if (i <= ei[0] && i >= si[0]) | ||
3502 | result.Add(src.Data[i]); | ||
3503 | if (twopass && i >= si[1] && i <= ei[1]) | ||
3504 | result.Add(src.Data[i]); | ||
3505 | } | ||
3506 | } | ||
3507 | } | ||
3508 | |||
3509 | return result; | ||
3510 | } | ||
3511 | |||
3512 | public LSL_Types.Vector3 llGetRegionCorner() | ||
3513 | { | ||
3514 | m_host.AddScriptLPS(1); | ||
3515 | return new LSL_Types.Vector3(World.RegionInfo.RegionLocX * Constants.RegionSize, World.RegionInfo.RegionLocY * Constants.RegionSize, 0); | ||
3516 | } | ||
3517 | |||
3518 | /// <summary> | ||
3519 | /// Insert the list identified by <src> into the | ||
3520 | /// list designated by <dest> such that the first | ||
3521 | /// new element has the index specified by <index> | ||
3522 | /// </summary> | ||
3523 | |||
3524 | public LSL_Types.list llListInsertList(LSL_Types.list dest, LSL_Types.list src, int index) | ||
3525 | { | ||
3526 | |||
3527 | LSL_Types.list pref = null; | ||
3528 | LSL_Types.list suff = null; | ||
3529 | |||
3530 | m_host.AddScriptLPS(1); | ||
3531 | |||
3532 | if (index < 0) | ||
3533 | { | ||
3534 | index = index+dest.Length; | ||
3535 | if (index < 0) | ||
3536 | { | ||
3537 | index = 0; | ||
3538 | } | ||
3539 | } | ||
3540 | |||
3541 | if (index != 0) | ||
3542 | { | ||
3543 | pref = dest.GetSublist(0,index-1); | ||
3544 | if (index < dest.Length) | ||
3545 | { | ||
3546 | suff = dest.GetSublist(index,-1); | ||
3547 | return pref + src + suff; | ||
3548 | } | ||
3549 | else | ||
3550 | { | ||
3551 | return pref + src; | ||
3552 | } | ||
3553 | } | ||
3554 | else | ||
3555 | { | ||
3556 | if (index < dest.Length) | ||
3557 | { | ||
3558 | suff = dest.GetSublist(index,-1); | ||
3559 | return src + suff; | ||
3560 | } | ||
3561 | else | ||
3562 | { | ||
3563 | return src; | ||
3564 | } | ||
3565 | } | ||
3566 | |||
3567 | } | ||
3568 | |||
3569 | /// <summary> | ||
3570 | /// Returns the index of the first occurrence of test | ||
3571 | /// in src. | ||
3572 | /// </summary> | ||
3573 | |||
3574 | public LSL_Types.LSLInteger llListFindList(LSL_Types.list src, LSL_Types.list test) | ||
3575 | { | ||
3576 | |||
3577 | int index = -1; | ||
3578 | int length = src.Length - test.Length + 1; | ||
3579 | |||
3580 | m_host.AddScriptLPS(1); | ||
3581 | |||
3582 | // If either list is empty, do not match | ||
3583 | |||
3584 | if (src.Length != 0 && test.Length != 0) | ||
3585 | { | ||
3586 | for (int i = 0; i < length; i++) | ||
3587 | { | ||
3588 | if (src.Data[i].Equals(test.Data[0])) | ||
3589 | { | ||
3590 | int j; | ||
3591 | for (j = 1; j < test.Length; j++) | ||
3592 | if (!src.Data[i+j].Equals(test.Data[j])) | ||
3593 | break; | ||
3594 | if (j == test.Length) | ||
3595 | { | ||
3596 | index = i; | ||
3597 | break; | ||
3598 | } | ||
3599 | } | ||
3600 | } | ||
3601 | } | ||
3602 | |||
3603 | return index; | ||
3604 | |||
3605 | } | ||
3606 | |||
3607 | public string llGetObjectName() | ||
3608 | { | ||
3609 | m_host.AddScriptLPS(1); | ||
3610 | return m_host.Name!=null?m_host.Name:String.Empty; | ||
3611 | } | ||
3612 | |||
3613 | public void llSetObjectName(string name) | ||
3614 | { | ||
3615 | m_host.AddScriptLPS(1); | ||
3616 | m_host.Name = name!=null?name:String.Empty; | ||
3617 | } | ||
3618 | |||
3619 | public string llGetDate() | ||
3620 | { | ||
3621 | m_host.AddScriptLPS(1); | ||
3622 | DateTime date = DateTime.Now.ToUniversalTime(); | ||
3623 | string result = date.ToString("yyyy-MM-dd"); | ||
3624 | return result; | ||
3625 | } | ||
3626 | |||
3627 | public LSL_Types.LSLInteger llEdgeOfWorld(LSL_Types.Vector3 pos, LSL_Types.Vector3 dir) | ||
3628 | { | ||
3629 | m_host.AddScriptLPS(1); | ||
3630 | NotImplemented("llEdgeOfWorld"); | ||
3631 | return 0; | ||
3632 | } | ||
3633 | |||
3634 | public LSL_Types.LSLInteger llGetAgentInfo(string id) | ||
3635 | { | ||
3636 | m_host.AddScriptLPS(1); | ||
3637 | NotImplemented("llGetAgentInfo"); | ||
3638 | return 0; | ||
3639 | } | ||
3640 | |||
3641 | public void llAdjustSoundVolume(double volume) | ||
3642 | { | ||
3643 | m_host.AddScriptLPS(1); | ||
3644 | m_host.AdjustSoundGain(volume); | ||
3645 | } | ||
3646 | |||
3647 | public void llSetSoundQueueing(int queue) | ||
3648 | { | ||
3649 | m_host.AddScriptLPS(1); | ||
3650 | NotImplemented("llSetSoundQueueing"); | ||
3651 | } | ||
3652 | |||
3653 | public void llSetSoundRadius(double radius) | ||
3654 | { | ||
3655 | m_host.AddScriptLPS(1); | ||
3656 | NotImplemented("llSetSoundRadius"); | ||
3657 | } | ||
3658 | |||
3659 | public string llKey2Name(string id) | ||
3660 | { | ||
3661 | m_host.AddScriptLPS(1); | ||
3662 | LLUUID key = new LLUUID(); | ||
3663 | if (LLUUID.TryParse(id,out key)) | ||
3664 | { | ||
3665 | ScenePresence presence = World.GetScenePresence(key); | ||
3666 | |||
3667 | if (presence != null) | ||
3668 | { | ||
3669 | return presence.Name; | ||
3670 | } | ||
3671 | |||
3672 | if (World.GetSceneObjectPart(key) != null) | ||
3673 | { | ||
3674 | return World.GetSceneObjectPart(key).Name; | ||
3675 | } | ||
3676 | } | ||
3677 | return String.Empty; | ||
3678 | } | ||
3679 | |||
3680 | |||
3681 | |||
3682 | public void llSetTextureAnim(int mode, int face, int sizex, int sizey, double start, double length, double rate) | ||
3683 | { | ||
3684 | m_host.AddScriptLPS(1); | ||
3685 | Primitive.TextureAnimation pTexAnim = new Primitive.TextureAnimation(); | ||
3686 | pTexAnim.Flags =(uint) mode; | ||
3687 | |||
3688 | //ALL_SIDES | ||
3689 | if (face == -1) | ||
3690 | face = 255; | ||
3691 | |||
3692 | pTexAnim.Face = (uint)face; | ||
3693 | pTexAnim.Length = (float)length; | ||
3694 | pTexAnim.Rate = (float)rate; | ||
3695 | pTexAnim.SizeX = (uint)sizex; | ||
3696 | pTexAnim.SizeY = (uint)sizey; | ||
3697 | pTexAnim.Start = (float)start; | ||
3698 | |||
3699 | m_host.AddTextureAnimation(pTexAnim); | ||
3700 | m_host.SendFullUpdateToAllClients(); | ||
3701 | } | ||
3702 | |||
3703 | public void llTriggerSoundLimited(string sound, double volume, LSL_Types.Vector3 top_north_east, | ||
3704 | LSL_Types.Vector3 bottom_south_west) | ||
3705 | { | ||
3706 | m_host.AddScriptLPS(1); | ||
3707 | NotImplemented("llTriggerSoundLimited"); | ||
3708 | } | ||
3709 | |||
3710 | public void llEjectFromLand(string pest) | ||
3711 | { | ||
3712 | m_host.AddScriptLPS(1); | ||
3713 | NotImplemented("llEjectFromLand"); | ||
3714 | } | ||
3715 | |||
3716 | public LSL_Types.list llParseString2List(string str, LSL_Types.list separators, LSL_Types.list spacers) | ||
3717 | { | ||
3718 | m_host.AddScriptLPS(1); | ||
3719 | LSL_Types.list ret = new LSL_Types.list(); | ||
3720 | object[] delimiters = new object[separators.Length + spacers.Length]; | ||
3721 | separators.Data.CopyTo(delimiters, 0); | ||
3722 | spacers.Data.CopyTo(delimiters, separators.Length); | ||
3723 | bool dfound = false; | ||
3724 | do | ||
3725 | { | ||
3726 | dfound = false; | ||
3727 | int cindex = -1; | ||
3728 | string cdeli = ""; | ||
3729 | for (int i = 0; i < delimiters.Length; i++) | ||
3730 | { | ||
3731 | int index = str.IndexOf(delimiters[i].ToString()); | ||
3732 | bool found = index != -1; | ||
3733 | if (found) | ||
3734 | { | ||
3735 | if ((cindex > index) || (cindex == -1)) | ||
3736 | { | ||
3737 | cindex = index; | ||
3738 | cdeli = (string)delimiters[i]; | ||
3739 | } | ||
3740 | dfound = dfound || found; | ||
3741 | } | ||
3742 | } | ||
3743 | if (cindex != -1) | ||
3744 | { | ||
3745 | if (cindex > 0) | ||
3746 | { | ||
3747 | ret.Add(str.Substring(0, cindex)); | ||
3748 | if (spacers.Contains(cdeli)) | ||
3749 | { | ||
3750 | ret.Add(cdeli); | ||
3751 | } | ||
3752 | } | ||
3753 | if (cindex == 0 && spacers.Contains(cdeli)) | ||
3754 | { | ||
3755 | ret.Add(cdeli); | ||
3756 | } | ||
3757 | str = str.Substring(cindex + cdeli.Length); | ||
3758 | } | ||
3759 | } while (dfound); | ||
3760 | if (str != "") | ||
3761 | { | ||
3762 | ret.Add(str); | ||
3763 | } | ||
3764 | return ret; | ||
3765 | } | ||
3766 | |||
3767 | public LSL_Types.LSLInteger llOverMyLand(string id) | ||
3768 | { | ||
3769 | |||
3770 | m_host.AddScriptLPS(1); | ||
3771 | LLUUID key = new LLUUID(); | ||
3772 | if (LLUUID.TryParse(id,out key)) | ||
3773 | { | ||
3774 | SceneObjectPart obj = new SceneObjectPart(); | ||
3775 | obj = World.GetSceneObjectPart(World.Entities[key].LocalId); | ||
3776 | if (obj.OwnerID == World.GetLandOwner(obj.AbsolutePosition.X, obj.AbsolutePosition.Y)) | ||
3777 | { | ||
3778 | return 1; | ||
3779 | } | ||
3780 | else | ||
3781 | { | ||
3782 | return 0; | ||
3783 | } | ||
3784 | } | ||
3785 | else | ||
3786 | { | ||
3787 | return 0; | ||
3788 | } | ||
3789 | } | ||
3790 | |||
3791 | public string llGetLandOwnerAt(LSL_Types.Vector3 pos) | ||
3792 | { | ||
3793 | m_host.AddScriptLPS(1); | ||
3794 | return World.GetLandOwner((float)pos.x, (float)pos.y).ToString(); | ||
3795 | } | ||
3796 | |||
3797 | public LSL_Types.Vector3 llGetAgentSize(string id) | ||
3798 | { | ||
3799 | m_host.AddScriptLPS(1); | ||
3800 | NotImplemented("llGetAgentSize"); | ||
3801 | return new LSL_Types.Vector3(); | ||
3802 | } | ||
3803 | |||
3804 | public LSL_Types.LSLInteger llSameGroup(string agent) | ||
3805 | { | ||
3806 | m_host.AddScriptLPS(1); | ||
3807 | NotImplemented("llSameGroup"); | ||
3808 | return 0; | ||
3809 | } | ||
3810 | |||
3811 | public void llUnSit(string id) | ||
3812 | { | ||
3813 | m_host.AddScriptLPS(1); | ||
3814 | |||
3815 | LLUUID key = new LLUUID(); | ||
3816 | if (LLUUID.TryParse(id, out key)) | ||
3817 | { | ||
3818 | ScenePresence av = World.GetScenePresence(key); | ||
3819 | |||
3820 | if (av != null) | ||
3821 | { | ||
3822 | if (llAvatarOnSitTarget() == id) | ||
3823 | { | ||
3824 | // if the avatar is sitting on this object, then | ||
3825 | // we can unsit them. We don't want random scripts unsitting random people | ||
3826 | // Lets avoid the popcorn avatar scenario. | ||
3827 | av.StandUp(); | ||
3828 | } | ||
3829 | else | ||
3830 | { | ||
3831 | // If the object owner also owns the parcel | ||
3832 | // or | ||
3833 | // if the land is group owned and the object is group owned by the same group | ||
3834 | // or | ||
3835 | // if the object is owned by a person with estate access. | ||
3836 | |||
3837 | ILandObject parcel = World.LandChannel.GetLandObject(av.AbsolutePosition.X, av.AbsolutePosition.Y); | ||
3838 | if (parcel != null) | ||
3839 | { | ||
3840 | if (m_host.ObjectOwner == parcel.landData.ownerID || | ||
3841 | (m_host.OwnerID == m_host.GroupID && m_host.GroupID == parcel.landData.groupID | ||
3842 | && parcel.landData.isGroupOwned) || World.ExternalChecks.ExternalChecksCanBeGodLike(m_host.OwnerID)) | ||
3843 | { | ||
3844 | av.StandUp(); | ||
3845 | } | ||
3846 | } | ||
3847 | } | ||
3848 | } | ||
3849 | |||
3850 | } | ||
3851 | |||
3852 | } | ||
3853 | |||
3854 | public LSL_Types.Vector3 llGroundSlope(LSL_Types.Vector3 offset) | ||
3855 | { | ||
3856 | m_host.AddScriptLPS(1); | ||
3857 | NotImplemented("llGroundSlope"); | ||
3858 | return new LSL_Types.Vector3(); | ||
3859 | } | ||
3860 | |||
3861 | public LSL_Types.Vector3 llGroundNormal(LSL_Types.Vector3 offset) | ||
3862 | { | ||
3863 | m_host.AddScriptLPS(1); | ||
3864 | NotImplemented("llGroundNormal"); | ||
3865 | return new LSL_Types.Vector3(); | ||
3866 | } | ||
3867 | |||
3868 | public LSL_Types.Vector3 llGroundContour(LSL_Types.Vector3 offset) | ||
3869 | { | ||
3870 | m_host.AddScriptLPS(1); | ||
3871 | NotImplemented("llGroundContour"); | ||
3872 | return new LSL_Types.Vector3(); | ||
3873 | } | ||
3874 | |||
3875 | public LSL_Types.LSLInteger llGetAttached() | ||
3876 | { | ||
3877 | m_host.AddScriptLPS(1); | ||
3878 | NotImplemented("llGetAttached"); | ||
3879 | return 0; | ||
3880 | } | ||
3881 | |||
3882 | public LSL_Types.LSLInteger llGetFreeMemory() | ||
3883 | { | ||
3884 | m_host.AddScriptLPS(1); | ||
3885 | NotImplemented("llGetFreeMemory"); | ||
3886 | return 0; | ||
3887 | } | ||
3888 | |||
3889 | public string llGetRegionName() | ||
3890 | { | ||
3891 | m_host.AddScriptLPS(1); | ||
3892 | return World.RegionInfo.RegionName; | ||
3893 | } | ||
3894 | |||
3895 | public double llGetRegionTimeDilation() | ||
3896 | { | ||
3897 | m_host.AddScriptLPS(1); | ||
3898 | return (double)World.TimeDilation; | ||
3899 | } | ||
3900 | |||
3901 | public double llGetRegionFPS() | ||
3902 | { | ||
3903 | m_host.AddScriptLPS(1); | ||
3904 | //TODO: return actual FPS | ||
3905 | return 10.0f; | ||
3906 | } | ||
3907 | |||
3908 | /* particle system rules should be coming into this routine as doubles, that is | ||
3909 | rule[0] should be an integer from this list and rule[1] should be the arg | ||
3910 | for the same integer. wiki.secondlife.com has most of this mapping, but some | ||
3911 | came from http://www.caligari-designs.com/p4u2 | ||
3912 | |||
3913 | We iterate through the list for 'Count' elements, incrementing by two for each | ||
3914 | iteration and set the members of Primitive.ParticleSystem, one at a time. | ||
3915 | */ | ||
3916 | |||
3917 | public enum PrimitiveRule : int | ||
3918 | { | ||
3919 | PSYS_PART_FLAGS = 0, | ||
3920 | PSYS_PART_START_COLOR = 1, | ||
3921 | PSYS_PART_START_ALPHA = 2, | ||
3922 | PSYS_PART_END_COLOR = 3, | ||
3923 | PSYS_PART_END_ALPHA = 4, | ||
3924 | PSYS_PART_START_SCALE = 5, | ||
3925 | PSYS_PART_END_SCALE = 6, | ||
3926 | PSYS_PART_MAX_AGE = 7, | ||
3927 | PSYS_SRC_ACCEL = 8, | ||
3928 | PSYS_SRC_PATTERN = 9, | ||
3929 | PSYS_SRC_TEXTURE = 12, | ||
3930 | PSYS_SRC_BURST_RATE = 13, | ||
3931 | PSYS_SRC_BURST_PART_COUNT = 15, | ||
3932 | PSYS_SRC_BURST_RADIUS = 16, | ||
3933 | PSYS_SRC_BURST_SPEED_MIN = 17, | ||
3934 | PSYS_SRC_BURST_SPEED_MAX = 18, | ||
3935 | PSYS_SRC_MAX_AGE = 19, | ||
3936 | PSYS_SRC_TARGET_KEY = 20, | ||
3937 | PSYS_SRC_OMEGA = 21, | ||
3938 | PSYS_SRC_ANGLE_BEGIN = 22, | ||
3939 | PSYS_SRC_ANGLE_END = 23 | ||
3940 | } | ||
3941 | |||
3942 | internal Primitive.ParticleSystem.ParticleDataFlags ConvertUINTtoFlags(uint flags) | ||
3943 | { | ||
3944 | Primitive.ParticleSystem.ParticleDataFlags returnval = Primitive.ParticleSystem.ParticleDataFlags.None; | ||
3945 | |||
3946 | return returnval; | ||
3947 | } | ||
3948 | |||
3949 | |||
3950 | public void llParticleSystem(LSL_Types.list rules) | ||
3951 | { | ||
3952 | m_host.AddScriptLPS(1); | ||
3953 | Primitive.ParticleSystem prules = new Primitive.ParticleSystem(); | ||
3954 | LSL_Types.Vector3 tempv = new LSL_Types.Vector3(); | ||
3955 | |||
3956 | float tempf = 0; | ||
3957 | |||
3958 | for (int i = 0; i < rules.Length; i += 2) | ||
3959 | { | ||
3960 | switch ((int)rules.Data[i]) | ||
3961 | { | ||
3962 | case (int)BuiltIn_Commands_BaseClass.PSYS_PART_FLAGS: | ||
3963 | prules.PartDataFlags = (Primitive.ParticleSystem.ParticleDataFlags)((uint)Convert.ToInt32(rules.Data[i + 1].ToString())); | ||
3964 | break; | ||
3965 | |||
3966 | case (int)BuiltIn_Commands_BaseClass.PSYS_PART_START_COLOR: | ||
3967 | tempv = (LSL_Types.Vector3)rules.Data[i + 1]; | ||
3968 | prules.PartStartColor.R = (float)tempv.x; | ||
3969 | prules.PartStartColor.G = (float)tempv.y; | ||
3970 | prules.PartStartColor.B = (float)tempv.z; | ||
3971 | break; | ||
3972 | |||
3973 | case (int)BuiltIn_Commands_BaseClass.PSYS_PART_START_ALPHA: | ||
3974 | tempf = Convert.ToSingle(rules.Data[i + 1].ToString()); | ||
3975 | prules.PartStartColor.A = (float)tempf; | ||
3976 | break; | ||
3977 | |||
3978 | case (int)BuiltIn_Commands_BaseClass.PSYS_PART_END_COLOR: | ||
3979 | tempv = (LSL_Types.Vector3)rules.Data[i + 1]; | ||
3980 | //prules.PartEndColor = new LLColor(tempv.x,tempv.y,tempv.z,1); | ||
3981 | |||
3982 | prules.PartEndColor.R = (float)tempv.x; | ||
3983 | prules.PartEndColor.G = (float)tempv.y; | ||
3984 | prules.PartEndColor.B = (float)tempv.z; | ||
3985 | break; | ||
3986 | |||
3987 | case (int)BuiltIn_Commands_BaseClass.PSYS_PART_END_ALPHA: | ||
3988 | tempf = Convert.ToSingle(rules.Data[i + 1].ToString()); | ||
3989 | prules.PartEndColor.A = (float)tempf; | ||
3990 | break; | ||
3991 | |||
3992 | case (int)BuiltIn_Commands_BaseClass.PSYS_PART_START_SCALE: | ||
3993 | tempv = (LSL_Types.Vector3)rules.Data[i + 1]; | ||
3994 | prules.PartStartScaleX = (float)tempv.x; | ||
3995 | prules.PartStartScaleY = (float)tempv.y; | ||
3996 | break; | ||
3997 | |||
3998 | case (int)BuiltIn_Commands_BaseClass.PSYS_PART_END_SCALE: | ||
3999 | tempv = (LSL_Types.Vector3)rules.Data[i + 1]; | ||
4000 | prules.PartEndScaleX = (float)tempv.x; | ||
4001 | prules.PartEndScaleY = (float)tempv.y; | ||
4002 | break; | ||
4003 | |||
4004 | case (int)BuiltIn_Commands_BaseClass.PSYS_PART_MAX_AGE: | ||
4005 | tempf = Convert.ToSingle(rules.Data[i + 1].ToString()); | ||
4006 | prules.PartMaxAge = (float)tempf; | ||
4007 | break; | ||
4008 | |||
4009 | case (int)BuiltIn_Commands_BaseClass.PSYS_SRC_ACCEL: | ||
4010 | tempv = (LSL_Types.Vector3)rules.Data[i + 1]; | ||
4011 | prules.PartAcceleration.X = (float)tempv.x; | ||
4012 | prules.PartAcceleration.Y = (float)tempv.y; | ||
4013 | prules.PartAcceleration.Z = (float)tempv.z; | ||
4014 | break; | ||
4015 | |||
4016 | case (int)BuiltIn_Commands_BaseClass.PSYS_SRC_PATTERN: | ||
4017 | int tmpi = int.Parse(rules.Data[i + 1].ToString()); | ||
4018 | prules.Pattern = (Primitive.ParticleSystem.SourcePattern)tmpi; | ||
4019 | break; | ||
4020 | |||
4021 | // Xantor 03-May-2008 | ||
4022 | // Wiki: PSYS_SRC_TEXTURE string inventory item name or key of the particle texture | ||
4023 | // "" = default texture. | ||
4024 | case (int)BuiltIn_Commands_BaseClass.PSYS_SRC_TEXTURE: | ||
4025 | LLUUID tkey = LLUUID.Zero; | ||
4026 | |||
4027 | // if we can parse the string as a key, use it. | ||
4028 | if (LLUUID.TryParse(rules.Data[i + 1].ToString(), out tkey)) | ||
4029 | { | ||
4030 | prules.Texture = tkey; | ||
4031 | } | ||
4032 | // else try to locate the name in inventory of object. found returns key, | ||
4033 | // not found returns LLUUID.Zero which will translate to the default particle texture | ||
4034 | else | ||
4035 | { | ||
4036 | prules.Texture = InventoryKey(rules.Data[i+1].ToString()); | ||
4037 | } | ||
4038 | break; | ||
4039 | |||
4040 | case (int)BuiltIn_Commands_BaseClass.PSYS_SRC_BURST_RATE: | ||
4041 | tempf = Convert.ToSingle(rules.Data[i + 1].ToString()); | ||
4042 | prules.BurstRate = (float)tempf; | ||
4043 | break; | ||
4044 | |||
4045 | case (int)BuiltIn_Commands_BaseClass.PSYS_SRC_BURST_PART_COUNT: | ||
4046 | prules.BurstPartCount = (byte)Convert.ToByte(rules.Data[i + 1].ToString()); | ||
4047 | break; | ||
4048 | |||
4049 | case (int)BuiltIn_Commands_BaseClass.PSYS_SRC_BURST_RADIUS: | ||
4050 | tempf = Convert.ToSingle(rules.Data[i + 1].ToString()); | ||
4051 | prules.BurstRadius = (float)tempf; | ||
4052 | break; | ||
4053 | |||
4054 | case (int)BuiltIn_Commands_BaseClass.PSYS_SRC_BURST_SPEED_MIN: | ||
4055 | tempf = Convert.ToSingle(rules.Data[i + 1].ToString()); | ||
4056 | prules.BurstSpeedMin = (float)tempf; | ||
4057 | break; | ||
4058 | |||
4059 | case (int)BuiltIn_Commands_BaseClass.PSYS_SRC_BURST_SPEED_MAX: | ||
4060 | tempf = Convert.ToSingle(rules.Data[i + 1].ToString()); | ||
4061 | prules.BurstSpeedMax = (float)tempf; | ||
4062 | break; | ||
4063 | |||
4064 | case (int)BuiltIn_Commands_BaseClass.PSYS_SRC_MAX_AGE: | ||
4065 | tempf = Convert.ToSingle(rules.Data[i + 1].ToString()); | ||
4066 | prules.MaxAge = (float)tempf; | ||
4067 | break; | ||
4068 | |||
4069 | case (int)BuiltIn_Commands_BaseClass.PSYS_SRC_TARGET_KEY: | ||
4070 | LLUUID key = LLUUID.Zero; | ||
4071 | if (LLUUID.TryParse(rules.Data[i + 1].ToString(), out key)) | ||
4072 | { | ||
4073 | prules.Target = key; | ||
4074 | } | ||
4075 | else | ||
4076 | { | ||
4077 | prules.Target = m_host.UUID; | ||
4078 | } | ||
4079 | break; | ||
4080 | |||
4081 | case (int)BuiltIn_Commands_BaseClass.PSYS_SRC_OMEGA: | ||
4082 | // AL: This is an assumption, since it is the only thing that would match. | ||
4083 | tempv = (LSL_Types.Vector3)rules.Data[i + 1]; | ||
4084 | prules.AngularVelocity.X = (float)tempv.x; | ||
4085 | prules.AngularVelocity.Y = (float)tempv.y; | ||
4086 | prules.AngularVelocity.Z = (float)tempv.z; | ||
4087 | //cast?? prules.MaxAge = (float)rules[i + 1]; | ||
4088 | break; | ||
4089 | |||
4090 | case (int)BuiltIn_Commands_BaseClass.PSYS_SRC_ANGLE_BEGIN: | ||
4091 | tempf = Convert.ToSingle(rules.Data[i + 1].ToString()); | ||
4092 | prules.InnerAngle = (float)tempf; | ||
4093 | break; | ||
4094 | |||
4095 | case (int)BuiltIn_Commands_BaseClass.PSYS_SRC_ANGLE_END: | ||
4096 | tempf = Convert.ToSingle(rules.Data[i + 1].ToString()); | ||
4097 | prules.OuterAngle = (float)tempf; | ||
4098 | break; | ||
4099 | } | ||
4100 | |||
4101 | } | ||
4102 | prules.CRC = 1; | ||
4103 | |||
4104 | m_host.AddNewParticleSystem(prules); | ||
4105 | m_host.SendFullUpdateToAllClients(); | ||
4106 | } | ||
4107 | |||
4108 | public void llGroundRepel(double height, int water, double tau) | ||
4109 | { | ||
4110 | m_host.AddScriptLPS(1); | ||
4111 | NotImplemented("llGroundRepel"); | ||
4112 | } | ||
4113 | |||
4114 | public void llGiveInventoryList(string destination, string category, LSL_Types.list inventory) | ||
4115 | { | ||
4116 | m_host.AddScriptLPS(1); | ||
4117 | NotImplemented("llGiveInventoryList"); | ||
4118 | } | ||
4119 | |||
4120 | public void llSetVehicleType(int type) | ||
4121 | { | ||
4122 | m_host.AddScriptLPS(1); | ||
4123 | NotImplemented("llSetVehicleType"); | ||
4124 | } | ||
4125 | |||
4126 | public void llSetVehicledoubleParam(int param, double value) | ||
4127 | { | ||
4128 | m_host.AddScriptLPS(1); | ||
4129 | NotImplemented("llSetVehicledoubleParam"); | ||
4130 | } | ||
4131 | |||
4132 | public void llSetVehicleFloatParam(int param, float value) | ||
4133 | { | ||
4134 | m_host.AddScriptLPS(1); | ||
4135 | NotImplemented("llSetVehicleFloatParam"); | ||
4136 | } | ||
4137 | |||
4138 | public void llSetVehicleVectorParam(int param, LSL_Types.Vector3 vec) | ||
4139 | { | ||
4140 | m_host.AddScriptLPS(1); | ||
4141 | NotImplemented("llSetVehicleVectorParam"); | ||
4142 | } | ||
4143 | |||
4144 | public void llSetVehicleRotationParam(int param, LSL_Types.Quaternion rot) | ||
4145 | { | ||
4146 | m_host.AddScriptLPS(1); | ||
4147 | NotImplemented("llSetVehicleRotationParam"); | ||
4148 | } | ||
4149 | |||
4150 | public void llSetVehicleFlags(int flags) | ||
4151 | { | ||
4152 | m_host.AddScriptLPS(1); | ||
4153 | NotImplemented("llSetVehicleFlags"); | ||
4154 | } | ||
4155 | |||
4156 | public void llRemoveVehicleFlags(int flags) | ||
4157 | { | ||
4158 | m_host.AddScriptLPS(1); | ||
4159 | NotImplemented("llRemoveVehicleFlags"); | ||
4160 | } | ||
4161 | |||
4162 | public void llSitTarget(LSL_Types.Vector3 offset, LSL_Types.Quaternion rot) | ||
4163 | { | ||
4164 | m_host.AddScriptLPS(1); | ||
4165 | // LSL quaternions can normalize to 0, normal Quaternions can't. | ||
4166 | if (rot.s == 0 && rot.x == 0 && rot.y == 0 && rot.z == 0) | ||
4167 | rot.z = 1; // ZERO_ROTATION = 0,0,0,1 | ||
4168 | |||
4169 | m_host.SetSitTarget(new Vector3((float)offset.x, (float)offset.y, (float)offset.z), new Quaternion((float)rot.s, (float)rot.x, (float)rot.y, (float)rot.z)); | ||
4170 | } | ||
4171 | |||
4172 | public string llAvatarOnSitTarget() | ||
4173 | { | ||
4174 | m_host.AddScriptLPS(1); | ||
4175 | return m_host.GetAvatarOnSitTarget().ToString(); | ||
4176 | //LLUUID AVID = m_host.GetAvatarOnSitTarget(); | ||
4177 | |||
4178 | //if (AVID != LLUUID.Zero) | ||
4179 | // return AVID.ToString(); | ||
4180 | //else | ||
4181 | // return String.Empty; | ||
4182 | } | ||
4183 | |||
4184 | public void llAddToLandPassList(string avatar, double hours) | ||
4185 | { | ||
4186 | m_host.AddScriptLPS(1); | ||
4187 | LLUUID key; | ||
4188 | LandData land = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y).landData; | ||
4189 | if (land.ownerID == m_host.OwnerID) | ||
4190 | { | ||
4191 | ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry(); | ||
4192 | if (LLUUID.TryParse(avatar, out key)) | ||
4193 | { | ||
4194 | entry.AgentID = key; | ||
4195 | entry.Flags = ParcelManager.AccessList.Access; | ||
4196 | entry.Time = DateTime.Now.AddHours(hours); | ||
4197 | land.parcelAccessList.Add(entry); | ||
4198 | } | ||
4199 | } | ||
4200 | } | ||
4201 | |||
4202 | public void llSetTouchText(string text) | ||
4203 | { | ||
4204 | m_host.AddScriptLPS(1); | ||
4205 | m_host.TouchName = text; | ||
4206 | } | ||
4207 | |||
4208 | public void llSetSitText(string text) | ||
4209 | { | ||
4210 | m_host.AddScriptLPS(1); | ||
4211 | m_host.SitName = text; | ||
4212 | } | ||
4213 | |||
4214 | public void llSetCameraEyeOffset(LSL_Types.Vector3 offset) | ||
4215 | { | ||
4216 | m_host.AddScriptLPS(1); | ||
4217 | NotImplemented("llSetCameraEyeOffset"); | ||
4218 | } | ||
4219 | |||
4220 | public void llSetCameraAtOffset(LSL_Types.Vector3 offset) | ||
4221 | { | ||
4222 | m_host.AddScriptLPS(1); | ||
4223 | NotImplemented("llSetCameraAtOffset"); | ||
4224 | } | ||
4225 | |||
4226 | public string llDumpList2String(LSL_Types.list src, string seperator) | ||
4227 | { | ||
4228 | m_host.AddScriptLPS(1); | ||
4229 | if (src.Length == 0) | ||
4230 | { | ||
4231 | return String.Empty; | ||
4232 | } | ||
4233 | string ret = String.Empty; | ||
4234 | foreach (object o in src.Data) | ||
4235 | { | ||
4236 | ret = ret + o.ToString() + seperator; | ||
4237 | } | ||
4238 | ret = ret.Substring(0, ret.Length - seperator.Length); | ||
4239 | return ret; | ||
4240 | } | ||
4241 | |||
4242 | public LSL_Types.LSLInteger llScriptDanger(LSL_Types.Vector3 pos) | ||
4243 | { | ||
4244 | m_host.AddScriptLPS(1); | ||
4245 | bool result = World.scriptDanger(m_host.LocalId, new LLVector3((float)pos.x, (float)pos.y, (float)pos.z)); | ||
4246 | if (result) | ||
4247 | { | ||
4248 | return 1; | ||
4249 | } | ||
4250 | else | ||
4251 | { | ||
4252 | return 0; | ||
4253 | } | ||
4254 | |||
4255 | } | ||
4256 | |||
4257 | public void llDialog(string avatar, string message, LSL_Types.list buttons, int chat_channel) | ||
4258 | { | ||
4259 | m_host.AddScriptLPS(1); | ||
4260 | LLUUID av = new LLUUID(); | ||
4261 | if (!LLUUID.TryParse(avatar,out av)) | ||
4262 | { | ||
4263 | LSLError("First parameter to llDialog needs to be a key"); | ||
4264 | return; | ||
4265 | } | ||
4266 | if (buttons.Length > 12) | ||
4267 | { | ||
4268 | LSLError("No more than 12 buttons can be shown"); | ||
4269 | return; | ||
4270 | } | ||
4271 | string[] buts = new string[buttons.Length]; | ||
4272 | for (int i = 0; i < buttons.Length; i++) | ||
4273 | { | ||
4274 | if (buttons.Data[i].ToString() == String.Empty) | ||
4275 | { | ||
4276 | LSLError("button label cannot be blank"); | ||
4277 | return; | ||
4278 | } | ||
4279 | if (buttons.Data[i].ToString().Length > 24) | ||
4280 | { | ||
4281 | LSLError("button label cannot be longer than 24 characters"); | ||
4282 | return; | ||
4283 | } | ||
4284 | buts[i] = buttons.Data[i].ToString(); | ||
4285 | } | ||
4286 | World.SendDialogToUser(av, m_host.Name, m_host.UUID, m_host.OwnerID, message, new LLUUID("00000000-0000-2222-3333-100000001000"), chat_channel, buts); | ||
4287 | } | ||
4288 | |||
4289 | public void llVolumeDetect(int detect) | ||
4290 | { | ||
4291 | m_host.AddScriptLPS(1); | ||
4292 | NotImplemented("llVolumeDetect"); | ||
4293 | } | ||
4294 | |||
4295 | /// <summary> | ||
4296 | /// Reset the named script. The script must be present | ||
4297 | /// in the same prim. | ||
4298 | /// </summary> | ||
4299 | |||
4300 | public void llResetOtherScript(string name) | ||
4301 | { | ||
4302 | LLUUID item; | ||
4303 | |||
4304 | m_host.AddScriptLPS(1); | ||
4305 | |||
4306 | if ((item = ScriptByName(name)) != LLUUID.Zero) | ||
4307 | m_ScriptEngine.ResetScript(item); | ||
4308 | else | ||
4309 | ShoutError("llResetOtherScript: script "+name+" not found"); | ||
4310 | } | ||
4311 | |||
4312 | public LSL_Types.LSLInteger llGetScriptState(string name) | ||
4313 | { | ||
4314 | LLUUID item; | ||
4315 | |||
4316 | m_host.AddScriptLPS(1); | ||
4317 | |||
4318 | if ((item = ScriptByName(name)) != LLUUID.Zero) | ||
4319 | { | ||
4320 | return m_ScriptEngine.GetScriptState(item) ?1:0; | ||
4321 | } | ||
4322 | |||
4323 | ShoutError("llGetScriptState: script "+name+" not found"); | ||
4324 | |||
4325 | // If we didn't find it, then it's safe to | ||
4326 | // assume it is not running. | ||
4327 | |||
4328 | return 0; | ||
4329 | } | ||
4330 | |||
4331 | public void llRemoteLoadScript() | ||
4332 | { | ||
4333 | m_host.AddScriptLPS(1); | ||
4334 | Deprecated("llRemoteLoadScript"); | ||
4335 | } | ||
4336 | |||
4337 | public void llSetRemoteScriptAccessPin(int pin) | ||
4338 | { | ||
4339 | m_host.AddScriptLPS(1); | ||
4340 | NotImplemented("llSetRemoteScriptAccessPin"); | ||
4341 | } | ||
4342 | |||
4343 | public void llRemoteLoadScriptPin(string target, string name, int pin, int running, int start_param) | ||
4344 | { | ||
4345 | m_host.AddScriptLPS(1); | ||
4346 | NotImplemented("llRemoteLoadScriptPin"); | ||
4347 | } | ||
4348 | |||
4349 | // remote_data(integer type, key channel, key message_id, string sender, integer ival, string sval) | ||
4350 | // Not sure where these constants should live: | ||
4351 | // REMOTE_DATA_CHANNEL = 1 | ||
4352 | // REMOTE_DATA_REQUEST = 2 | ||
4353 | // REMOTE_DATA_REPLY = 3 | ||
4354 | public void llOpenRemoteDataChannel() | ||
4355 | { | ||
4356 | m_host.AddScriptLPS(1); | ||
4357 | IXMLRPC xmlrpcMod = m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>(); | ||
4358 | if (xmlrpcMod.IsEnabled()) | ||
4359 | { | ||
4360 | LLUUID channelID = xmlrpcMod.OpenXMLRPCChannel(m_localID, m_itemID, LLUUID.Zero); | ||
4361 | object[] resobj = new object[] { new LSL_Types.LSLInteger(1), new LSL_Types.LSLString(channelID.ToString()), new LSL_Types.LSLString(LLUUID.Zero.ToString()), new LSL_Types.LSLString(String.Empty), new LSL_Types.LSLInteger(0), new LSL_Types.LSLString(String.Empty) }; | ||
4362 | m_ScriptEngine.PostScriptEvent(m_itemID, new XEventParams( | ||
4363 | "remote_data", resobj, | ||
4364 | new XDetectParams[0])); | ||
4365 | } | ||
4366 | } | ||
4367 | |||
4368 | public string llSendRemoteData(string channel, string dest, int idata, string sdata) | ||
4369 | { | ||
4370 | m_host.AddScriptLPS(1); | ||
4371 | IXMLRPC xmlrpcMod = m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>(); | ||
4372 | return (xmlrpcMod.SendRemoteData(m_localID, m_itemID, channel, dest, idata, sdata)).ToString(); | ||
4373 | } | ||
4374 | |||
4375 | public void llRemoteDataReply(string channel, string message_id, string sdata, int idata) | ||
4376 | { | ||
4377 | m_host.AddScriptLPS(1); | ||
4378 | IXMLRPC xmlrpcMod = m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>(); | ||
4379 | xmlrpcMod.RemoteDataReply(channel, message_id, sdata, idata); | ||
4380 | } | ||
4381 | |||
4382 | public void llCloseRemoteDataChannel(string channel) | ||
4383 | { | ||
4384 | m_host.AddScriptLPS(1); | ||
4385 | IXMLRPC xmlrpcMod = m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>(); | ||
4386 | xmlrpcMod.CloseXMLRPCChannel(channel); | ||
4387 | } | ||
4388 | |||
4389 | public string llMD5String(string src, int nonce) | ||
4390 | { | ||
4391 | m_host.AddScriptLPS(1); | ||
4392 | return Util.Md5Hash(src + ":" + nonce.ToString()); | ||
4393 | } | ||
4394 | |||
4395 | public void llSetPrimitiveParams(LSL_Types.list rules) | ||
4396 | { | ||
4397 | llSetLinkPrimitiveParams(m_host.LinkNum+1, rules); | ||
4398 | } | ||
4399 | |||
4400 | public void llSetLinkPrimitiveParams(int linknumber, LSL_Types.list rules) | ||
4401 | { | ||
4402 | m_host.AddScriptLPS(1); | ||
4403 | |||
4404 | SceneObjectPart part=null; | ||
4405 | |||
4406 | if (m_host.LinkNum+1 != linknumber) | ||
4407 | { | ||
4408 | foreach (SceneObjectPart partInst in m_host.ParentGroup.GetParts()) | ||
4409 | { | ||
4410 | if ((partInst.LinkNum + 1) == linknumber) | ||
4411 | { | ||
4412 | part = partInst; | ||
4413 | break; | ||
4414 | } | ||
4415 | } | ||
4416 | } | ||
4417 | else | ||
4418 | { | ||
4419 | part = m_host; | ||
4420 | } | ||
4421 | |||
4422 | if (part == null) | ||
4423 | return; | ||
4424 | |||
4425 | int idx = 0; | ||
4426 | |||
4427 | while (idx < rules.Length) | ||
4428 | { | ||
4429 | int code = Convert.ToInt32(rules.Data[idx++]); | ||
4430 | |||
4431 | int remain = rules.Length - idx; | ||
4432 | |||
4433 | int face; | ||
4434 | LSL_Types.Vector3 v; | ||
4435 | |||
4436 | switch (code) | ||
4437 | { | ||
4438 | case 6: // PRIM_POSITION | ||
4439 | if (remain < 1) | ||
4440 | return; | ||
4441 | |||
4442 | v=new LSL_Types.Vector3(rules.Data[idx++].ToString()); | ||
4443 | SetPos(part, v); | ||
4444 | |||
4445 | break; | ||
4446 | |||
4447 | case 8: // PRIM_ROTATION | ||
4448 | if (remain < 1) | ||
4449 | return; | ||
4450 | |||
4451 | LSL_Types.Quaternion q = new LSL_Types.Quaternion(rules.Data[idx++].ToString()); | ||
4452 | SetRot(part, q); | ||
4453 | |||
4454 | break; | ||
4455 | |||
4456 | case 17: // PRIM_TEXTURE | ||
4457 | if (remain < 5) | ||
4458 | return; | ||
4459 | |||
4460 | face=Convert.ToInt32(rules.Data[idx++]); | ||
4461 | string tex=rules.Data[idx++].ToString(); | ||
4462 | LSL_Types.Vector3 repeats=new LSL_Types.Vector3(rules.Data[idx++].ToString()); | ||
4463 | LSL_Types.Vector3 offsets=new LSL_Types.Vector3(rules.Data[idx++].ToString()); | ||
4464 | double rotation=Convert.ToDouble(rules.Data[idx++]); | ||
4465 | |||
4466 | SetTexture(part, tex, face); | ||
4467 | ScaleTexture(part, repeats.x, repeats.y, face); | ||
4468 | OffsetTexture(part, offsets.x, offsets.y, face); | ||
4469 | RotateTexture(part, rotation, face); | ||
4470 | |||
4471 | break; | ||
4472 | |||
4473 | case 18: // PRIM_COLOR | ||
4474 | if (remain < 3) | ||
4475 | return; | ||
4476 | |||
4477 | face=Convert.ToInt32(rules.Data[idx++]); | ||
4478 | LSL_Types.Vector3 color=new LSL_Types.Vector3(rules.Data[idx++].ToString()); | ||
4479 | double alpha=Convert.ToDouble(rules.Data[idx++]); | ||
4480 | |||
4481 | SetColor(part, color, face); | ||
4482 | SetAlpha(part, alpha, face); | ||
4483 | |||
4484 | break; | ||
4485 | |||
4486 | case 7: // PRIM_SIZE | ||
4487 | if (remain < 1) | ||
4488 | return; | ||
4489 | |||
4490 | v=new LSL_Types.Vector3(rules.Data[idx++].ToString()); | ||
4491 | SetScale(part, v); | ||
4492 | |||
4493 | break; | ||
4494 | } | ||
4495 | } | ||
4496 | } | ||
4497 | |||
4498 | public string llStringToBase64(string str) | ||
4499 | { | ||
4500 | m_host.AddScriptLPS(1); | ||
4501 | try | ||
4502 | { | ||
4503 | byte[] encData_byte = new byte[str.Length]; | ||
4504 | encData_byte = Encoding.UTF8.GetBytes(str); | ||
4505 | string encodedData = Convert.ToBase64String(encData_byte); | ||
4506 | return encodedData; | ||
4507 | } | ||
4508 | catch (Exception e) | ||
4509 | { | ||
4510 | throw new Exception("Error in base64Encode" + e.Message); | ||
4511 | } | ||
4512 | } | ||
4513 | |||
4514 | public string llBase64ToString(string str) | ||
4515 | { | ||
4516 | m_host.AddScriptLPS(1); | ||
4517 | UTF8Encoding encoder = new UTF8Encoding(); | ||
4518 | Decoder utf8Decode = encoder.GetDecoder(); | ||
4519 | try | ||
4520 | { | ||
4521 | byte[] todecode_byte = Convert.FromBase64String(str); | ||
4522 | int charCount = utf8Decode.GetCharCount(todecode_byte, 0, todecode_byte.Length); | ||
4523 | char[] decoded_char = new char[charCount]; | ||
4524 | utf8Decode.GetChars(todecode_byte, 0, todecode_byte.Length, decoded_char, 0); | ||
4525 | string result = new String(decoded_char); | ||
4526 | return result; | ||
4527 | } | ||
4528 | catch (Exception e) | ||
4529 | { | ||
4530 | throw new Exception("Error in base64Decode" + e.Message); | ||
4531 | } | ||
4532 | } | ||
4533 | |||
4534 | public void llXorBase64Strings() | ||
4535 | { | ||
4536 | m_host.AddScriptLPS(1); | ||
4537 | Deprecated("llXorBase64Strings"); | ||
4538 | } | ||
4539 | |||
4540 | public void llRemoteDataSetRegion() | ||
4541 | { | ||
4542 | m_host.AddScriptLPS(1); | ||
4543 | NotImplemented("llRemoteDataSetRegion"); | ||
4544 | } | ||
4545 | |||
4546 | public double llLog10(double val) | ||
4547 | { | ||
4548 | m_host.AddScriptLPS(1); | ||
4549 | return (double)Math.Log10(val); | ||
4550 | } | ||
4551 | |||
4552 | public double llLog(double val) | ||
4553 | { | ||
4554 | m_host.AddScriptLPS(1); | ||
4555 | return (double)Math.Log(val); | ||
4556 | } | ||
4557 | |||
4558 | public LSL_Types.list llGetAnimationList(string id) | ||
4559 | { | ||
4560 | m_host.AddScriptLPS(1); | ||
4561 | NotImplemented("llGetAnimationList"); | ||
4562 | return new LSL_Types.list(); | ||
4563 | } | ||
4564 | |||
4565 | public void llSetParcelMusicURL(string url) | ||
4566 | { | ||
4567 | m_host.AddScriptLPS(1); | ||
4568 | LLUUID landowner = World.GetLandOwner(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y); | ||
4569 | if (landowner == LLUUID.Zero) | ||
4570 | { | ||
4571 | return; | ||
4572 | } | ||
4573 | if (landowner != m_host.ObjectOwner) | ||
4574 | { | ||
4575 | return; | ||
4576 | } | ||
4577 | World.SetLandMusicURL(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y, url); | ||
4578 | } | ||
4579 | |||
4580 | public void osSetParcelMediaURL(string url) | ||
4581 | { | ||
4582 | m_host.AddScriptLPS(1); | ||
4583 | LLUUID landowner = World.GetLandOwner(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y); | ||
4584 | |||
4585 | if (landowner == LLUUID.Zero) | ||
4586 | { | ||
4587 | return; | ||
4588 | } | ||
4589 | |||
4590 | if (landowner != m_host.ObjectOwner) | ||
4591 | { | ||
4592 | return; | ||
4593 | } | ||
4594 | |||
4595 | World.SetLandMediaURL(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y, url); | ||
4596 | } | ||
4597 | |||
4598 | public LSL_Types.Vector3 llGetRootPosition() | ||
4599 | { | ||
4600 | m_host.AddScriptLPS(1); | ||
4601 | return new LSL_Types.Vector3(m_host.ParentGroup.AbsolutePosition.X, m_host.ParentGroup.AbsolutePosition.Y, m_host.ParentGroup.AbsolutePosition.Z); | ||
4602 | } | ||
4603 | |||
4604 | public LSL_Types.Quaternion llGetRootRotation() | ||
4605 | { | ||
4606 | m_host.AddScriptLPS(1); | ||
4607 | return new LSL_Types.Quaternion(m_host.ParentGroup.GroupRotation.X, m_host.ParentGroup.GroupRotation.Y, m_host.ParentGroup.GroupRotation.Z, m_host.ParentGroup.GroupRotation.W); | ||
4608 | } | ||
4609 | |||
4610 | public string llGetObjectDesc() | ||
4611 | { | ||
4612 | return m_host.Description!=null?m_host.Description:String.Empty; | ||
4613 | } | ||
4614 | |||
4615 | public void llSetObjectDesc(string desc) | ||
4616 | { | ||
4617 | m_host.AddScriptLPS(1); | ||
4618 | m_host.Description = desc!=null?desc:String.Empty; | ||
4619 | } | ||
4620 | |||
4621 | public string llGetCreator() | ||
4622 | { | ||
4623 | m_host.AddScriptLPS(1); | ||
4624 | return m_host.ObjectCreator.ToString(); | ||
4625 | } | ||
4626 | |||
4627 | public string llGetTimestamp() | ||
4628 | { | ||
4629 | m_host.AddScriptLPS(1); | ||
4630 | return DateTime.Now.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss.fffffffZ"); | ||
4631 | } | ||
4632 | |||
4633 | public void llSetLinkAlpha(int linknumber, double alpha, int face) | ||
4634 | { | ||
4635 | m_host.AddScriptLPS(1); | ||
4636 | SceneObjectPart part = m_host.ParentGroup.GetLinkNumPart(linknumber); | ||
4637 | if (linknumber > -1) | ||
4638 | { | ||
4639 | LLObject.TextureEntry tex = part.Shape.Textures; | ||
4640 | LLColor texcolor; | ||
4641 | if (face > -1) | ||
4642 | { | ||
4643 | texcolor = tex.CreateFace((uint)face).RGBA; | ||
4644 | texcolor.A = (float)Math.Abs(alpha - 1); | ||
4645 | tex.FaceTextures[face].RGBA = texcolor; | ||
4646 | part.UpdateTexture(tex); | ||
4647 | return; | ||
4648 | } | ||
4649 | else if (face == -1) | ||
4650 | { | ||
4651 | texcolor = tex.DefaultTexture.RGBA; | ||
4652 | texcolor.A = (float)Math.Abs(alpha - 1); | ||
4653 | tex.DefaultTexture.RGBA = texcolor; | ||
4654 | for (uint i = 0; i < 32; i++) | ||
4655 | { | ||
4656 | if (tex.FaceTextures[i] != null) | ||
4657 | { | ||
4658 | texcolor = tex.FaceTextures[i].RGBA; | ||
4659 | texcolor.A = (float)Math.Abs(alpha - 1); | ||
4660 | tex.FaceTextures[i].RGBA = texcolor; | ||
4661 | } | ||
4662 | } | ||
4663 | texcolor = tex.DefaultTexture.RGBA; | ||
4664 | texcolor.A = (float)Math.Abs(alpha - 1); | ||
4665 | tex.DefaultTexture.RGBA = texcolor; | ||
4666 | part.UpdateTexture(tex); | ||
4667 | return; | ||
4668 | } | ||
4669 | return; | ||
4670 | } | ||
4671 | else if (linknumber == -1) | ||
4672 | { | ||
4673 | int num = m_host.ParentGroup.PrimCount; | ||
4674 | for (int w = 0; w < num; w++) | ||
4675 | { | ||
4676 | linknumber = w; | ||
4677 | part = m_host.ParentGroup.GetLinkNumPart(linknumber); | ||
4678 | LLObject.TextureEntry tex = part.Shape.Textures; | ||
4679 | LLColor texcolor; | ||
4680 | if (face > -1) | ||
4681 | { | ||
4682 | texcolor = tex.CreateFace((uint)face).RGBA; | ||
4683 | texcolor.A = (float)Math.Abs(alpha - 1); | ||
4684 | tex.FaceTextures[face].RGBA = texcolor; | ||
4685 | part.UpdateTexture(tex); | ||
4686 | } | ||
4687 | else if (face == -1) | ||
4688 | { | ||
4689 | texcolor = tex.DefaultTexture.RGBA; | ||
4690 | texcolor.A = (float)Math.Abs(alpha - 1); | ||
4691 | tex.DefaultTexture.RGBA = texcolor; | ||
4692 | for (uint i = 0; i < 32; i++) | ||
4693 | { | ||
4694 | if (tex.FaceTextures[i] != null) | ||
4695 | { | ||
4696 | texcolor = tex.FaceTextures[i].RGBA; | ||
4697 | texcolor.A = (float)Math.Abs(alpha - 1); | ||
4698 | tex.FaceTextures[i].RGBA = texcolor; | ||
4699 | } | ||
4700 | } | ||
4701 | texcolor = tex.DefaultTexture.RGBA; | ||
4702 | texcolor.A = (float)Math.Abs(alpha - 1); | ||
4703 | tex.DefaultTexture.RGBA = texcolor; | ||
4704 | part.UpdateTexture(tex); | ||
4705 | } | ||
4706 | } | ||
4707 | return; | ||
4708 | } | ||
4709 | } | ||
4710 | |||
4711 | public LSL_Types.LSLInteger llGetNumberOfPrims() | ||
4712 | { | ||
4713 | m_host.AddScriptLPS(1); | ||
4714 | return m_host.ParentGroup.PrimCount; | ||
4715 | } | ||
4716 | |||
4717 | public LSL_Types.list llGetBoundingBox(string obj) | ||
4718 | { | ||
4719 | m_host.AddScriptLPS(1); | ||
4720 | NotImplemented("llGetBoundingBox"); | ||
4721 | return new LSL_Types.list(); | ||
4722 | } | ||
4723 | |||
4724 | public LSL_Types.Vector3 llGetGeometricCenter() | ||
4725 | { | ||
4726 | return new LSL_Types.Vector3(m_host.GetGeometricCenter().X, m_host.GetGeometricCenter().Y, m_host.GetGeometricCenter().Z); | ||
4727 | } | ||
4728 | |||
4729 | public LSL_Types.list llGetPrimitiveParams(LSL_Types.list rules) | ||
4730 | { | ||
4731 | m_host.AddScriptLPS(1); | ||
4732 | |||
4733 | LSL_Types.list res = new LSL_Types.list(); | ||
4734 | int idx=0; | ||
4735 | while (idx < rules.Length) | ||
4736 | { | ||
4737 | int code=Convert.ToInt32(rules.Data[idx++]); | ||
4738 | int remain=rules.Length-idx; | ||
4739 | |||
4740 | switch (code) | ||
4741 | { | ||
4742 | case 2: // PRIM_MATERIAL | ||
4743 | res.Add(new LSL_Types.LSLInteger(m_host.Material)); | ||
4744 | break; | ||
4745 | |||
4746 | case 3: // PRIM_PHYSICS | ||
4747 | if ((m_host.GetEffectiveObjectFlags() & (uint)LLObject.ObjectFlags.Physics) != 0) | ||
4748 | res.Add(new LSL_Types.LSLInteger(1)); | ||
4749 | else | ||
4750 | res.Add(new LSL_Types.LSLInteger(0)); | ||
4751 | break; | ||
4752 | |||
4753 | case 4: // PRIM_TEMP_ON_REZ | ||
4754 | if ((m_host.GetEffectiveObjectFlags() & (uint)LLObject.ObjectFlags.TemporaryOnRez) != 0) | ||
4755 | res.Add(new LSL_Types.LSLInteger(1)); | ||
4756 | else | ||
4757 | res.Add(new LSL_Types.LSLInteger(0)); | ||
4758 | break; | ||
4759 | |||
4760 | case 5: // PRIM_PHANTOM | ||
4761 | if ((m_host.GetEffectiveObjectFlags() & (uint)LLObject.ObjectFlags.Phantom) != 0) | ||
4762 | res.Add(new LSL_Types.LSLInteger(1)); | ||
4763 | else | ||
4764 | res.Add(new LSL_Types.LSLInteger(0)); | ||
4765 | break; | ||
4766 | |||
4767 | case 6: // PRIM_POSITION | ||
4768 | res.Add(new LSL_Types.Vector3(m_host.AbsolutePosition.X, | ||
4769 | m_host.AbsolutePosition.Y, | ||
4770 | m_host.AbsolutePosition.Z)); | ||
4771 | break; | ||
4772 | |||
4773 | case 7: // PRIM_SIZE | ||
4774 | res.Add(new LSL_Types.Vector3(m_host.Scale.X, | ||
4775 | m_host.Scale.Y, | ||
4776 | m_host.Scale.Z)); | ||
4777 | break; | ||
4778 | |||
4779 | case 8: // PRIM_ROTATION | ||
4780 | res.Add(new LSL_Types.Quaternion(m_host.RotationOffset.X, | ||
4781 | m_host.RotationOffset.Y, | ||
4782 | m_host.RotationOffset.Z, | ||
4783 | m_host.RotationOffset.W)); | ||
4784 | break; | ||
4785 | |||
4786 | case 9: // PRIM_TYPE | ||
4787 | // TODO-------------- | ||
4788 | res.Add(new LSL_Types.LSLInteger(0)); | ||
4789 | break; | ||
4790 | |||
4791 | case 17: // PRIM_TEXTURE | ||
4792 | if (remain < 1) | ||
4793 | return res; | ||
4794 | |||
4795 | int face=Convert.ToInt32(rules.Data[idx++]); | ||
4796 | if (face == -1) | ||
4797 | face = 0; | ||
4798 | |||
4799 | LLObject.TextureEntry tex = m_host.Shape.Textures; | ||
4800 | LLObject.TextureEntryFace texface = tex.GetFace((uint)face); | ||
4801 | |||
4802 | res.Add(new LSL_Types.LSLString(texface.TextureID.ToString())); | ||
4803 | res.Add(new LSL_Types.Vector3(texface.RepeatU, | ||
4804 | texface.RepeatV, | ||
4805 | 0)); | ||
4806 | res.Add(new LSL_Types.Vector3(texface.OffsetU, | ||
4807 | texface.OffsetV, | ||
4808 | 0)); | ||
4809 | res.Add(new LSL_Types.LSLFloat(texface.Rotation)); | ||
4810 | break; | ||
4811 | |||
4812 | case 18: // PRIM_COLOR | ||
4813 | if (remain < 1) | ||
4814 | return res; | ||
4815 | |||
4816 | face=Convert.ToInt32(rules.Data[idx++]); | ||
4817 | |||
4818 | tex = m_host.Shape.Textures; | ||
4819 | LLColor texcolor; | ||
4820 | if (face == -1) // TMP: Until we can determine number of sides, ALL_SIDES (-1) will return default color | ||
4821 | texcolor = tex.DefaultTexture.RGBA; | ||
4822 | else | ||
4823 | texcolor = tex.GetFace((uint)face).RGBA; | ||
4824 | res.Add(new LSL_Types.Vector3((255 - (texcolor.R * 255)) / 255, | ||
4825 | (255 - (texcolor.G * 255)) / 255, | ||
4826 | (255 - (texcolor.B * 255)) / 255)); | ||
4827 | res.Add(new LSL_Types.LSLFloat((texcolor.A * 255) / 255)); | ||
4828 | break; | ||
4829 | |||
4830 | case 19: // PRIM_BUMP_SHINY | ||
4831 | // TODO-------------- | ||
4832 | if (remain < 1) | ||
4833 | return res; | ||
4834 | |||
4835 | face=Convert.ToInt32(rules.Data[idx++]); | ||
4836 | |||
4837 | res.Add(new LSL_Types.LSLInteger(0)); | ||
4838 | res.Add(new LSL_Types.LSLInteger(0)); | ||
4839 | break; | ||
4840 | |||
4841 | case 20: // PRIM_FULLBRIGHT | ||
4842 | // TODO-------------- | ||
4843 | if (remain < 1) | ||
4844 | return res; | ||
4845 | |||
4846 | face=Convert.ToInt32(rules.Data[idx++]); | ||
4847 | |||
4848 | res.Add(new LSL_Types.LSLInteger(0)); | ||
4849 | break; | ||
4850 | |||
4851 | case 21: // PRIM_FLEXIBLE | ||
4852 | PrimitiveBaseShape shape = m_host.Shape; | ||
4853 | |||
4854 | if (shape.FlexiEntry) | ||
4855 | res.Add(new LSL_Types.LSLInteger(1)); // active | ||
4856 | else | ||
4857 | res.Add(new LSL_Types.LSLInteger(0)); | ||
4858 | res.Add(new LSL_Types.LSLInteger(shape.FlexiSoftness));// softness | ||
4859 | res.Add(new LSL_Types.LSLFloat(shape.FlexiGravity)); // gravity | ||
4860 | res.Add(new LSL_Types.LSLFloat(shape.FlexiDrag)); // friction | ||
4861 | res.Add(new LSL_Types.LSLFloat(shape.FlexiWind)); // wind | ||
4862 | res.Add(new LSL_Types.LSLFloat(shape.FlexiTension)); // tension | ||
4863 | res.Add(new LSL_Types.Vector3(shape.FlexiForceX, // force | ||
4864 | shape.FlexiForceY, | ||
4865 | shape.FlexiForceZ)); | ||
4866 | break; | ||
4867 | |||
4868 | case 22: // PRIM_TEXGEN | ||
4869 | // TODO-------------- | ||
4870 | // (PRIM_TEXGEN_DEFAULT, PRIM_TEXGEN_PLANAR) | ||
4871 | if (remain < 1) | ||
4872 | return res; | ||
4873 | |||
4874 | face=Convert.ToInt32(rules.Data[idx++]); | ||
4875 | |||
4876 | res.Add(new LSL_Types.LSLInteger(0)); | ||
4877 | break; | ||
4878 | |||
4879 | case 23: // PRIM_POINT_LIGHT: | ||
4880 | shape = m_host.Shape; | ||
4881 | |||
4882 | if (shape.LightEntry) | ||
4883 | res.Add(new LSL_Types.LSLInteger(1)); // active | ||
4884 | else | ||
4885 | res.Add(new LSL_Types.LSLInteger(0)); | ||
4886 | res.Add(new LSL_Types.Vector3(shape.LightColorR, // color | ||
4887 | shape.LightColorG, | ||
4888 | shape.LightColorB)); | ||
4889 | res.Add(new LSL_Types.LSLFloat(shape.LightIntensity)); // intensity | ||
4890 | res.Add(new LSL_Types.LSLFloat(shape.LightRadius)); // radius | ||
4891 | res.Add(new LSL_Types.LSLFloat(shape.LightFalloff)); // falloff | ||
4892 | break; | ||
4893 | |||
4894 | case 24: // PRIM_GLOW | ||
4895 | // TODO-------------- | ||
4896 | if (remain < 1) | ||
4897 | return res; | ||
4898 | |||
4899 | face=Convert.ToInt32(rules.Data[idx++]); | ||
4900 | |||
4901 | res.Add(new LSL_Types.LSLFloat(0)); | ||
4902 | break; | ||
4903 | } | ||
4904 | } | ||
4905 | return res; | ||
4906 | } | ||
4907 | |||
4908 | // <remarks> | ||
4909 | // <para> | ||
4910 | // The .NET definition of base 64 is: | ||
4911 | // <list> | ||
4912 | // <item> | ||
4913 | // Significant: A-Z a-z 0-9 + - | ||
4914 | // </item> | ||
4915 | // <item> | ||
4916 | // Whitespace: \t \n \r ' ' | ||
4917 | // </item> | ||
4918 | // <item> | ||
4919 | // Valueless: = | ||
4920 | // </item> | ||
4921 | // <item> | ||
4922 | // End-of-string: \0 or '==' | ||
4923 | // </item> | ||
4924 | // </list> | ||
4925 | // </para> | ||
4926 | // <para> | ||
4927 | // Each point in a base-64 string represents | ||
4928 | // a 6 bit value. A 32-bit integer can be | ||
4929 | // represented using 6 characters (with some | ||
4930 | // redundancy). | ||
4931 | // </para> | ||
4932 | // <para> | ||
4933 | // LSL requires a base64 string to be 8 | ||
4934 | // characters in length. LSL also uses '/' | ||
4935 | // rather than '-' (MIME compliant). | ||
4936 | // </para> | ||
4937 | // <para> | ||
4938 | // RFC 1341 used as a reference (as specified | ||
4939 | // by the SecondLife Wiki). | ||
4940 | // </para> | ||
4941 | // <para> | ||
4942 | // SL do not record any kind of exception for | ||
4943 | // these functions, so the string to integer | ||
4944 | // conversion returns '0' if an invalid | ||
4945 | // character is encountered during conversion. | ||
4946 | // </para> | ||
4947 | // <para> | ||
4948 | // References | ||
4949 | // <list> | ||
4950 | // <item> | ||
4951 | // http://lslwiki.net/lslwiki/wakka.php?wakka=Base64 | ||
4952 | // </item> | ||
4953 | // <item> | ||
4954 | // </item> | ||
4955 | // </list> | ||
4956 | // </para> | ||
4957 | // </remarks> | ||
4958 | |||
4959 | // <summary> | ||
4960 | // Table for converting 6-bit integers into | ||
4961 | // base-64 characters | ||
4962 | // </summary> | ||
4963 | |||
4964 | private static readonly char[] i2ctable = | ||
4965 | { | ||
4966 | 'A','B','C','D','E','F','G','H', | ||
4967 | 'I','J','K','L','M','N','O','P', | ||
4968 | 'Q','R','S','T','U','V','W','X', | ||
4969 | 'Y','Z', | ||
4970 | 'a','b','c','d','e','f','g','h', | ||
4971 | 'i','j','k','l','m','n','o','p', | ||
4972 | 'q','r','s','t','u','v','w','x', | ||
4973 | 'y','z', | ||
4974 | '0','1','2','3','4','5','6','7', | ||
4975 | '8','9', | ||
4976 | '+','/' | ||
4977 | }; | ||
4978 | |||
4979 | // <summary> | ||
4980 | // Table for converting base-64 characters | ||
4981 | // into 6-bit integers. | ||
4982 | // </summary> | ||
4983 | |||
4984 | private static readonly int[] c2itable = | ||
4985 | { | ||
4986 | -1,-1,-1,-1,-1,-1,-1,-1, // 0x | ||
4987 | -1,-1,-1,-1,-1,-1,-1,-1, | ||
4988 | -1,-1,-1,-1,-1,-1,-1,-1, // 1x | ||
4989 | -1,-1,-1,-1,-1,-1,-1,-1, | ||
4990 | -1,-1,-1,-1,-1,-1,-1,-1, // 2x | ||
4991 | -1,-1,-1,63,-1,-1,-1,64, | ||
4992 | 53,54,55,56,57,58,59,60, // 3x | ||
4993 | 61,62,-1,-1,-1,0,-1,-1, | ||
4994 | -1,1,2,3,4,5,6,7, // 4x | ||
4995 | 8,9,10,11,12,13,14,15, | ||
4996 | 16,17,18,19,20,21,22,23, // 5x | ||
4997 | 24,25,26,-1,-1,-1,-1,-1, | ||
4998 | -1,27,28,29,30,31,32,33, // 6x | ||
4999 | 34,35,36,37,38,39,40,41, | ||
5000 | 42,43,44,45,46,47,48,49, // 7x | ||
5001 | 50,51,52,-1,-1,-1,-1,-1, | ||
5002 | -1,-1,-1,-1,-1,-1,-1,-1, // 8x | ||
5003 | -1,-1,-1,-1,-1,-1,-1,-1, | ||
5004 | -1,-1,-1,-1,-1,-1,-1,-1, // 9x | ||
5005 | -1,-1,-1,-1,-1,-1,-1,-1, | ||
5006 | -1,-1,-1,-1,-1,-1,-1,-1, // Ax | ||
5007 | -1,-1,-1,-1,-1,-1,-1,-1, | ||
5008 | -1,-1,-1,-1,-1,-1,-1,-1, // Bx | ||
5009 | -1,-1,-1,-1,-1,-1,-1,-1, | ||
5010 | -1,-1,-1,-1,-1,-1,-1,-1, // Cx | ||
5011 | -1,-1,-1,-1,-1,-1,-1,-1, | ||
5012 | -1,-1,-1,-1,-1,-1,-1,-1, // Dx | ||
5013 | -1,-1,-1,-1,-1,-1,-1,-1, | ||
5014 | -1,-1,-1,-1,-1,-1,-1,-1, // Ex | ||
5015 | -1,-1,-1,-1,-1,-1,-1,-1, | ||
5016 | -1,-1,-1,-1,-1,-1,-1,-1, // Fx | ||
5017 | -1,-1,-1,-1,-1,-1,-1,-1 | ||
5018 | }; | ||
5019 | |||
5020 | // <summary> | ||
5021 | // Converts a 32-bit integer into a Base64 | ||
5022 | // character string. Base64 character strings | ||
5023 | // are always 8 characters long. All iinteger | ||
5024 | // values are acceptable. | ||
5025 | // </summary> | ||
5026 | // <param name="number"> | ||
5027 | // 32-bit integer to be converted. | ||
5028 | // </param> | ||
5029 | // <returns> | ||
5030 | // 8 character string. The 1st six characters | ||
5031 | // contain the encoded number, the last two | ||
5032 | // characters are padded with "=". | ||
5033 | // </returns> | ||
5034 | |||
5035 | public string llIntegerToBase64(int number) | ||
5036 | { | ||
5037 | // uninitialized string | ||
5038 | |||
5039 | char[] imdt = new char[8]; | ||
5040 | |||
5041 | m_host.AddScriptLPS(1); | ||
5042 | |||
5043 | // Manually unroll the loop | ||
5044 | |||
5045 | imdt[7] = '='; | ||
5046 | imdt[6] = '='; | ||
5047 | imdt[5] = i2ctable[number<<4 & 0x3F]; | ||
5048 | imdt[4] = i2ctable[number>>2 & 0x3F]; | ||
5049 | imdt[3] = i2ctable[number>>8 & 0x3F]; | ||
5050 | imdt[2] = i2ctable[number>>14 & 0x3F]; | ||
5051 | imdt[1] = i2ctable[number>>20 & 0x3F]; | ||
5052 | imdt[0] = i2ctable[number>>26 & 0x3F]; | ||
5053 | |||
5054 | return new string(imdt); | ||
5055 | } | ||
5056 | |||
5057 | // <summary> | ||
5058 | // Converts an eight character base-64 string | ||
5059 | // into a 32-bit integer. | ||
5060 | // </summary> | ||
5061 | // <param name="str"> | ||
5062 | // 8 characters string to be converted. Other | ||
5063 | // length strings return zero. | ||
5064 | // </param> | ||
5065 | // <returns> | ||
5066 | // Returns an integer representing the | ||
5067 | // encoded value providedint he 1st 6 | ||
5068 | // characters of the string. | ||
5069 | // </returns> | ||
5070 | // <remarks> | ||
5071 | // This is coded to behave like LSL's | ||
5072 | // implementation (I think), based upon the | ||
5073 | // information available at the Wiki. | ||
5074 | // If more than 8 characters are supplied, | ||
5075 | // zero is returned. | ||
5076 | // If a NULL string is supplied, zero will | ||
5077 | // be returned. | ||
5078 | // If fewer than 6 characters are supplied, then | ||
5079 | // the answer will reflect a partial | ||
5080 | // accumulation. | ||
5081 | // <para> | ||
5082 | // The 6-bit segments are | ||
5083 | // extracted left-to-right in big-endian mode, | ||
5084 | // which means that segment 6 only contains the | ||
5085 | // two low-order bits of the 32 bit integer as | ||
5086 | // its high order 2 bits. A short string therefore | ||
5087 | // means loss of low-order information. E.g. | ||
5088 | // | ||
5089 | // |<---------------------- 32-bit integer ----------------------->|<-Pad->| | ||
5090 | // |<--Byte 0----->|<--Byte 1----->|<--Byte 2----->|<--Byte 3----->|<-Pad->| | ||
5091 | // |3|3|2|2|2|2|2|2|2|2|2|2|1|1|1|1|1|1|1|1|1|1| | | | | | | | | | |P|P|P|P| | ||
5092 | // |1|0|9|8|7|6|5|4|3|2|1|0|9|8|7|6|5|4|3|2|1|0|9|8|7|6|5|4|3|2|1|0|P|P|P|P| | ||
5093 | // | str[0] | str[1] | str[2] | str[3] | str[4] | str[6] | | ||
5094 | // | ||
5095 | // </para> | ||
5096 | // </remarks> | ||
5097 | |||
5098 | public LSL_Types.LSLInteger llBase64ToInteger(string str) | ||
5099 | { | ||
5100 | int number = 0; | ||
5101 | int digit; | ||
5102 | |||
5103 | m_host.AddScriptLPS(1); | ||
5104 | |||
5105 | // Require a well-fromed base64 string | ||
5106 | |||
5107 | if (str.Length > 8) | ||
5108 | return 0; | ||
5109 | |||
5110 | // The loop is unrolled in the interests | ||
5111 | // of performance and simple necessity. | ||
5112 | // | ||
5113 | // MUST find 6 digits to be well formed | ||
5114 | // -1 == invalid | ||
5115 | // 0 == padding | ||
5116 | |||
5117 | if ((digit=c2itable[str[0]])<=0) | ||
5118 | { | ||
5119 | return digit<0?(int)0:number; | ||
5120 | } | ||
5121 | number += --digit<<26; | ||
5122 | |||
5123 | if ((digit=c2itable[str[1]])<=0) | ||
5124 | { | ||
5125 | return digit<0?(int)0:number; | ||
5126 | } | ||
5127 | number += --digit<<20; | ||
5128 | |||
5129 | if ((digit=c2itable[str[2]])<=0) | ||
5130 | { | ||
5131 | return digit<0?(int)0:number; | ||
5132 | } | ||
5133 | number += --digit<<14; | ||
5134 | |||
5135 | if ((digit=c2itable[str[3]])<=0) | ||
5136 | { | ||
5137 | return digit<0?(int)0:number; | ||
5138 | } | ||
5139 | number += --digit<<8; | ||
5140 | |||
5141 | if ((digit=c2itable[str[4]])<=0) | ||
5142 | { | ||
5143 | return digit<0?(int)0:number; | ||
5144 | } | ||
5145 | number += --digit<<2; | ||
5146 | |||
5147 | if ((digit=c2itable[str[5]])<=0) | ||
5148 | { | ||
5149 | return digit<0?(int)0:number; | ||
5150 | } | ||
5151 | number += --digit>>4; | ||
5152 | |||
5153 | // ignore trailing padding | ||
5154 | |||
5155 | return number; | ||
5156 | } | ||
5157 | |||
5158 | public double llGetGMTclock() | ||
5159 | { | ||
5160 | m_host.AddScriptLPS(1); | ||
5161 | return DateTime.UtcNow.TimeOfDay.TotalSeconds; | ||
5162 | } | ||
5163 | |||
5164 | public string llGetSimulatorHostname() | ||
5165 | { | ||
5166 | m_host.AddScriptLPS(1); | ||
5167 | return System.Environment.MachineName; | ||
5168 | } | ||
5169 | |||
5170 | public void llSetLocalRot(LSL_Types.Quaternion rot) | ||
5171 | { | ||
5172 | m_host.AddScriptLPS(1); | ||
5173 | m_host.RotationOffset = new LLQuaternion((float)rot.x, (float)rot.y, (float)rot.z, (float)rot.s); | ||
5174 | } | ||
5175 | |||
5176 | // <summary> | ||
5177 | // Scan the string supplied in 'src' and | ||
5178 | // tokenize it based upon two sets of | ||
5179 | // tokenizers provided in two lists, | ||
5180 | // separators and spacers. | ||
5181 | // </summary> | ||
5182 | // | ||
5183 | // <remarks> | ||
5184 | // Separators demarcate tokens and are | ||
5185 | // elided as they are encountered. Spacers | ||
5186 | // also demarcate tokens, but are themselves | ||
5187 | // retained as tokens. | ||
5188 | // | ||
5189 | // Both separators and spacers may be arbitrarily | ||
5190 | // long strings. i.e. ":::". | ||
5191 | // | ||
5192 | // The function returns an ordered list | ||
5193 | // representing the tokens found in the supplied | ||
5194 | // sources string. If two successive tokenizers | ||
5195 | // are encountered, then a NULL entry is added | ||
5196 | // to the list. | ||
5197 | // | ||
5198 | // It is a precondition that the source and | ||
5199 | // toekizer lisst are non-null. If they are null, | ||
5200 | // then a null pointer exception will be thrown | ||
5201 | // while their lengths are being determined. | ||
5202 | // | ||
5203 | // A small amount of working memoryis required | ||
5204 | // of approximately 8*#tokenizers. | ||
5205 | // | ||
5206 | // There are many ways in which this function | ||
5207 | // can be implemented, this implementation is | ||
5208 | // fairly naive and assumes that when the | ||
5209 | // function is invooked with a short source | ||
5210 | // string and/or short lists of tokenizers, then | ||
5211 | // performance will not be an issue. | ||
5212 | // | ||
5213 | // In order to minimize the perofrmance | ||
5214 | // effects of long strings, or large numbers | ||
5215 | // of tokeizers, the function skips as far as | ||
5216 | // possible whenever a toekenizer is found, | ||
5217 | // and eliminates redundant tokenizers as soon | ||
5218 | // as is possible. | ||
5219 | // | ||
5220 | // The implementation tries to avoid any copying | ||
5221 | // of arrays or other objects. | ||
5222 | // </remarks> | ||
5223 | |||
5224 | public LSL_Types.list llParseStringKeepNulls(string src, LSL_Types.list separators, LSL_Types.list spacers) | ||
5225 | { | ||
5226 | int beginning = 0; | ||
5227 | int srclen = src.Length; | ||
5228 | int seplen = separators.Length; | ||
5229 | object[] separray = separators.Data; | ||
5230 | int spclen = spacers.Length; | ||
5231 | object[] spcarray = spacers.Data; | ||
5232 | int mlen = seplen+spclen; | ||
5233 | |||
5234 | int[] offset = new int[mlen+1]; | ||
5235 | bool[] active = new bool[mlen]; | ||
5236 | |||
5237 | int best; | ||
5238 | int j; | ||
5239 | |||
5240 | // Initial capacity reduces resize cost | ||
5241 | |||
5242 | LSL_Types.list tokens = new LSL_Types.list(); | ||
5243 | |||
5244 | m_host.AddScriptLPS(1); | ||
5245 | |||
5246 | // All entries are initially valid | ||
5247 | |||
5248 | for (int i = 0; i < mlen; i++) | ||
5249 | active[i] = true; | ||
5250 | |||
5251 | offset[mlen] = srclen; | ||
5252 | |||
5253 | while (beginning < srclen) | ||
5254 | { | ||
5255 | |||
5256 | best = mlen; // as bad as it gets | ||
5257 | |||
5258 | // Scan for separators | ||
5259 | |||
5260 | for (j = 0; j < seplen; j++) | ||
5261 | { | ||
5262 | if (active[j]) | ||
5263 | { | ||
5264 | // scan all of the markers | ||
5265 | if ((offset[j] = src.IndexOf((string)separray[j],beginning)) == -1) | ||
5266 | { | ||
5267 | // not present at all | ||
5268 | active[j] = false; | ||
5269 | } | ||
5270 | else | ||
5271 | { | ||
5272 | // present and correct | ||
5273 | if (offset[j] < offset[best]) | ||
5274 | { | ||
5275 | // closest so far | ||
5276 | best = j; | ||
5277 | if (offset[best] == beginning) | ||
5278 | break; | ||
5279 | } | ||
5280 | } | ||
5281 | } | ||
5282 | } | ||
5283 | |||
5284 | // Scan for spacers | ||
5285 | |||
5286 | if (offset[best] != beginning) | ||
5287 | { | ||
5288 | for (j = seplen; (j < mlen) && (offset[best] > beginning); j++) | ||
5289 | { | ||
5290 | if (active[j]) | ||
5291 | { | ||
5292 | // scan all of the markers | ||
5293 | if ((offset[j] = src.IndexOf((string)spcarray[j-seplen],beginning)) == -1) | ||
5294 | { | ||
5295 | // not present at all | ||
5296 | active[j] = false; | ||
5297 | } else | ||
5298 | { | ||
5299 | // present and correct | ||
5300 | if (offset[j] < offset[best]) | ||
5301 | { | ||
5302 | // closest so far | ||
5303 | best = j; | ||
5304 | } | ||
5305 | } | ||
5306 | } | ||
5307 | } | ||
5308 | } | ||
5309 | |||
5310 | // This is the normal exit from the scanning loop | ||
5311 | |||
5312 | if (best == mlen) | ||
5313 | { | ||
5314 | // no markers were found on this pass | ||
5315 | // so we're pretty much done | ||
5316 | tokens.Add(src.Substring(beginning, srclen-beginning)); | ||
5317 | break; | ||
5318 | } | ||
5319 | |||
5320 | // Otherwise we just add the newly delimited token | ||
5321 | // and recalculate where the search should continue. | ||
5322 | |||
5323 | tokens.Add(src.Substring(beginning,offset[best]-beginning)); | ||
5324 | |||
5325 | if (best<seplen) | ||
5326 | { | ||
5327 | beginning = offset[best]+((string)separray[best]).Length; | ||
5328 | } else | ||
5329 | { | ||
5330 | beginning = offset[best]+((string)spcarray[best-seplen]).Length; | ||
5331 | tokens.Add(spcarray[best-seplen]); | ||
5332 | } | ||
5333 | |||
5334 | } | ||
5335 | |||
5336 | // This an awkward an not very intuitive boundary case. If the | ||
5337 | // last substring is a tokenizer, then there is an implied trailing | ||
5338 | // null list entry. Hopefully the single comparison will not be too | ||
5339 | // arduous. Alternatively the 'break' could be replced with a return | ||
5340 | // but that's shabby programming. | ||
5341 | |||
5342 | if (beginning == srclen) | ||
5343 | { | ||
5344 | if (srclen != 0) | ||
5345 | tokens.Add(""); | ||
5346 | } | ||
5347 | |||
5348 | return tokens; | ||
5349 | } | ||
5350 | |||
5351 | public void llRezAtRoot(string inventory, LSL_Types.Vector3 position, LSL_Types.Vector3 velocity, | ||
5352 | LSL_Types.Quaternion rot, int param) | ||
5353 | { | ||
5354 | m_host.AddScriptLPS(1); | ||
5355 | NotImplemented("llRezAtRoot"); | ||
5356 | } | ||
5357 | |||
5358 | public LSL_Types.LSLInteger llGetObjectPermMask(int mask) | ||
5359 | { | ||
5360 | m_host.AddScriptLPS(1); | ||
5361 | |||
5362 | int permmask = 0; | ||
5363 | |||
5364 | if (mask == BuiltIn_Commands_BaseClass.MASK_BASE)//0 | ||
5365 | { | ||
5366 | permmask = (int)m_host.BaseMask; | ||
5367 | } | ||
5368 | |||
5369 | else if (mask == BuiltIn_Commands_BaseClass.MASK_OWNER)//1 | ||
5370 | { | ||
5371 | permmask = (int)m_host.OwnerMask; | ||
5372 | } | ||
5373 | |||
5374 | else if (mask == BuiltIn_Commands_BaseClass.MASK_GROUP)//2 | ||
5375 | { | ||
5376 | permmask = (int)m_host.GroupMask; | ||
5377 | } | ||
5378 | |||
5379 | else if (mask == BuiltIn_Commands_BaseClass.MASK_EVERYONE)//3 | ||
5380 | { | ||
5381 | permmask = (int)m_host.EveryoneMask; | ||
5382 | } | ||
5383 | |||
5384 | else if (mask == BuiltIn_Commands_BaseClass.MASK_NEXT)//4 | ||
5385 | { | ||
5386 | permmask = (int)m_host.NextOwnerMask; | ||
5387 | } | ||
5388 | |||
5389 | return permmask; | ||
5390 | } | ||
5391 | |||
5392 | public void llSetObjectPermMask(int mask, int value) | ||
5393 | { | ||
5394 | m_host.AddScriptLPS(1); | ||
5395 | |||
5396 | if (mask == BuiltIn_Commands_BaseClass.MASK_BASE)//0 | ||
5397 | { | ||
5398 | m_host.BaseMask = (uint)value; | ||
5399 | } | ||
5400 | |||
5401 | else if (mask == BuiltIn_Commands_BaseClass.MASK_OWNER)//1 | ||
5402 | { | ||
5403 | m_host.OwnerMask = (uint)value; | ||
5404 | } | ||
5405 | |||
5406 | else if (mask == BuiltIn_Commands_BaseClass.MASK_GROUP)//2 | ||
5407 | { | ||
5408 | m_host.GroupMask = (uint)value; | ||
5409 | } | ||
5410 | |||
5411 | else if (mask == BuiltIn_Commands_BaseClass.MASK_EVERYONE)//3 | ||
5412 | { | ||
5413 | m_host.EveryoneMask = (uint)value; | ||
5414 | } | ||
5415 | |||
5416 | else if (mask == BuiltIn_Commands_BaseClass.MASK_NEXT)//4 | ||
5417 | { | ||
5418 | m_host.NextOwnerMask = (uint)value; | ||
5419 | } | ||
5420 | } | ||
5421 | |||
5422 | public LSL_Types.LSLInteger llGetInventoryPermMask(string item, int mask) | ||
5423 | { | ||
5424 | m_host.AddScriptLPS(1); | ||
5425 | foreach (KeyValuePair<LLUUID, TaskInventoryItem> inv in m_host.TaskInventory) | ||
5426 | { | ||
5427 | if (inv.Value.Name == item) | ||
5428 | { | ||
5429 | switch (mask) | ||
5430 | { | ||
5431 | case 0: | ||
5432 | return (int)inv.Value.BaseMask; | ||
5433 | case 1: | ||
5434 | return (int)inv.Value.OwnerMask; | ||
5435 | case 2: | ||
5436 | return (int)inv.Value.GroupMask; | ||
5437 | case 3: | ||
5438 | return (int)inv.Value.EveryoneMask; | ||
5439 | case 4: | ||
5440 | return (int)inv.Value.NextOwnerMask; | ||
5441 | } | ||
5442 | } | ||
5443 | } | ||
5444 | return -1; | ||
5445 | } | ||
5446 | |||
5447 | public void llSetInventoryPermMask(string item, int mask, int value) | ||
5448 | { | ||
5449 | m_host.AddScriptLPS(1); | ||
5450 | NotImplemented("llSetInventoryPermMask"); | ||
5451 | } | ||
5452 | |||
5453 | public string llGetInventoryCreator(string item) | ||
5454 | { | ||
5455 | m_host.AddScriptLPS(1); | ||
5456 | foreach (KeyValuePair<LLUUID, TaskInventoryItem> inv in m_host.TaskInventory) | ||
5457 | { | ||
5458 | if (inv.Value.Name == item) | ||
5459 | { | ||
5460 | return inv.Value.CreatorID.ToString(); | ||
5461 | } | ||
5462 | } | ||
5463 | llSay(0, "No item name '" + item + "'"); | ||
5464 | return String.Empty; | ||
5465 | } | ||
5466 | |||
5467 | public void llOwnerSay(string msg) | ||
5468 | { | ||
5469 | m_host.AddScriptLPS(1); | ||
5470 | |||
5471 | World.SimChatBroadcast(Helpers.StringToField(msg), ChatTypeEnum.Owner, 0, m_host.AbsolutePosition, m_host.Name, m_host.UUID, false); | ||
5472 | // IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); | ||
5473 | // wComm.DeliverMessage(ChatTypeEnum.Owner, 0, m_host.Name, m_host.UUID, msg); | ||
5474 | } | ||
5475 | |||
5476 | public string llRequestSimulatorData(string simulator, int data) | ||
5477 | { | ||
5478 | try | ||
5479 | { | ||
5480 | m_host.AddScriptLPS(1); | ||
5481 | |||
5482 | string reply = String.Empty; | ||
5483 | |||
5484 | RegionInfo info = m_ScriptEngine.World.RequestClosestRegion(simulator); | ||
5485 | |||
5486 | switch(data) | ||
5487 | { | ||
5488 | case 5: // DATA_SIM_POS | ||
5489 | if(info == null) | ||
5490 | return LLUUID.Zero.ToString(); | ||
5491 | reply = new LSL_Types.Vector3( | ||
5492 | info.RegionLocX * Constants.RegionSize, | ||
5493 | info.RegionLocY * Constants.RegionSize, | ||
5494 | 0).ToString(); | ||
5495 | break; | ||
5496 | case 6: // DATA_SIM_STATUS | ||
5497 | if(info != null) | ||
5498 | reply = "up"; // Duh! | ||
5499 | else | ||
5500 | reply = "unknown"; | ||
5501 | break; | ||
5502 | case 7: // DATA_SIM_RATING | ||
5503 | if(info == null) | ||
5504 | return LLUUID.Zero.ToString(); | ||
5505 | int access = (int)info.EstateSettings.simAccess; | ||
5506 | if(access == 21) | ||
5507 | reply = "MATURE"; | ||
5508 | else if(access == 13) | ||
5509 | reply = "MATURE"; | ||
5510 | else | ||
5511 | reply = "UNKNOWN"; | ||
5512 | break; | ||
5513 | default: | ||
5514 | return LLUUID.Zero.ToString(); // Raise no event | ||
5515 | } | ||
5516 | LLUUID rq = LLUUID.Random(); | ||
5517 | |||
5518 | LLUUID tid = m_ScriptEngine.m_ASYNCLSLCommandManager. | ||
5519 | m_Dataserver.RegisterRequest(m_localID, | ||
5520 | m_itemID, rq.ToString()); | ||
5521 | |||
5522 | m_ScriptEngine.m_ASYNCLSLCommandManager. | ||
5523 | m_Dataserver.DataserverReply(rq.ToString(), reply); | ||
5524 | |||
5525 | return tid.ToString(); | ||
5526 | } | ||
5527 | catch(Exception e) | ||
5528 | { | ||
5529 | Console.WriteLine(e.ToString()); | ||
5530 | return LLUUID.Zero.ToString(); | ||
5531 | } | ||
5532 | } | ||
5533 | |||
5534 | public void llForceMouselook(int mouselook) | ||
5535 | { | ||
5536 | m_host.AddScriptLPS(1); | ||
5537 | NotImplemented("llForceMouselook"); | ||
5538 | } | ||
5539 | |||
5540 | public double llGetObjectMass(string id) | ||
5541 | { | ||
5542 | m_host.AddScriptLPS(1); | ||
5543 | LLUUID key = new LLUUID(); | ||
5544 | if (LLUUID.TryParse(id,out key)) | ||
5545 | { | ||
5546 | return (double)World.GetSceneObjectPart(World.Entities[key].LocalId).GetMass(); | ||
5547 | } | ||
5548 | return 0; | ||
5549 | } | ||
5550 | |||
5551 | /// <summary> | ||
5552 | /// illListReplaceList removes the sub-list defined by the inclusive indices | ||
5553 | /// start and end and inserts the src list in its place. The inclusive | ||
5554 | /// nature of the indices means that at least one element must be deleted | ||
5555 | /// if the indices are within the bounds of the existing list. I.e. 2,2 | ||
5556 | /// will remove the element at index 2 and replace it with the source | ||
5557 | /// list. Both indices may be negative, with the usual interpretation. An | ||
5558 | /// interesting case is where end is lower than start. As these indices | ||
5559 | /// bound the list to be removed, then 0->end, and start->lim are removed | ||
5560 | /// and the source list is added as a suffix. | ||
5561 | /// </summary> | ||
5562 | |||
5563 | public LSL_Types.list llListReplaceList(LSL_Types.list dest, LSL_Types.list src, int start, int end) | ||
5564 | { | ||
5565 | |||
5566 | LSL_Types.list pref = null; | ||
5567 | |||
5568 | m_host.AddScriptLPS(1); | ||
5569 | |||
5570 | // Note that although we have normalized, both | ||
5571 | // indices could still be negative. | ||
5572 | if (start < 0) | ||
5573 | { | ||
5574 | start = start+dest.Length; | ||
5575 | } | ||
5576 | |||
5577 | if (end < 0) | ||
5578 | { | ||
5579 | end = end+dest.Length; | ||
5580 | } | ||
5581 | // The comventional case, remove a sequence starting with | ||
5582 | // start and ending with end. And then insert the source | ||
5583 | // list. | ||
5584 | if (start <= end) | ||
5585 | { | ||
5586 | // If greater than zero, then there is going to be a | ||
5587 | // surviving prefix. Otherwise the inclusive nature | ||
5588 | // of the indices mean that we're going to add the | ||
5589 | // source list as a prefix. | ||
5590 | if (start > 0) | ||
5591 | { | ||
5592 | pref = dest.GetSublist(0,start-1); | ||
5593 | // Only add a suffix if there is something | ||
5594 | // beyond the end index (it's inclusive too). | ||
5595 | if (end+1 < dest.Length) | ||
5596 | { | ||
5597 | return pref + src + dest.GetSublist(end+1,-1); | ||
5598 | } | ||
5599 | else | ||
5600 | { | ||
5601 | return pref + src; | ||
5602 | } | ||
5603 | } | ||
5604 | // If start is less than or equal to zero, then | ||
5605 | // the new list is simply a prefix. We still need to | ||
5606 | // figure out any necessary surgery to the destination | ||
5607 | // based upon end. Note that if end exceeds the upper | ||
5608 | // bound in this case, the entire destination list | ||
5609 | // is removed. | ||
5610 | else | ||
5611 | { | ||
5612 | if (end+1 < dest.Length) | ||
5613 | { | ||
5614 | return src + dest.GetSublist(end+1,-1); | ||
5615 | } | ||
5616 | else | ||
5617 | { | ||
5618 | return src; | ||
5619 | } | ||
5620 | } | ||
5621 | } | ||
5622 | // Finally, if start > end, we strip away a prefix and | ||
5623 | // a suffix, to leave the list that sits <between> ens | ||
5624 | // and start, and then tag on the src list. AT least | ||
5625 | // that's my interpretation. We can get sublist to do | ||
5626 | // this for us. Note that one, or both of the indices | ||
5627 | // might have been negative. | ||
5628 | else | ||
5629 | { | ||
5630 | return dest.GetSublist(end+1,start-1)+src; | ||
5631 | } | ||
5632 | } | ||
5633 | |||
5634 | public void llLoadURL(string avatar_id, string message, string url) | ||
5635 | { | ||
5636 | m_host.AddScriptLPS(1); | ||
5637 | LLUUID avatarId = new LLUUID(avatar_id); | ||
5638 | m_ScriptEngine.World.SendUrlToUser(avatarId, m_host.Name, m_host.UUID, m_host.ObjectOwner, false, message, | ||
5639 | url); | ||
5640 | } | ||
5641 | |||
5642 | public void llParcelMediaCommandList(LSL_Types.list commandList) | ||
5643 | { | ||
5644 | m_host.AddScriptLPS(1); | ||
5645 | NotImplemented("llParcelMediaCommandList"); | ||
5646 | } | ||
5647 | |||
5648 | public void llParcelMediaQuery() | ||
5649 | { | ||
5650 | m_host.AddScriptLPS(1); | ||
5651 | NotImplemented("llParcelMediaQuery"); | ||
5652 | } | ||
5653 | |||
5654 | public LSL_Types.LSLInteger llModPow(int a, int b, int c) | ||
5655 | { | ||
5656 | m_host.AddScriptLPS(1); | ||
5657 | Int64 tmp = 0; | ||
5658 | Math.DivRem(Convert.ToInt64(Math.Pow(a, b)), c, out tmp); | ||
5659 | return Convert.ToInt32(tmp); | ||
5660 | } | ||
5661 | |||
5662 | public LSL_Types.LSLInteger llGetInventoryType(string name) | ||
5663 | { | ||
5664 | m_host.AddScriptLPS(1); | ||
5665 | foreach (KeyValuePair<LLUUID, TaskInventoryItem> inv in m_host.TaskInventory) | ||
5666 | { | ||
5667 | if (inv.Value.Name == name) | ||
5668 | { | ||
5669 | return inv.Value.InvType; | ||
5670 | } | ||
5671 | } | ||
5672 | return -1; | ||
5673 | } | ||
5674 | |||
5675 | public void llSetPayPrice(int price, LSL_Types.list quick_pay_buttons) | ||
5676 | { | ||
5677 | m_host.AddScriptLPS(1); | ||
5678 | |||
5679 | if (quick_pay_buttons.Data.Length != 4) | ||
5680 | { | ||
5681 | LSLError("List must have 4 elements"); | ||
5682 | return; | ||
5683 | } | ||
5684 | m_host.ParentGroup.RootPart.PayPrice[0]=price; | ||
5685 | m_host.ParentGroup.RootPart.PayPrice[1]=(int)quick_pay_buttons.Data[0]; | ||
5686 | m_host.ParentGroup.RootPart.PayPrice[2]=(int)quick_pay_buttons.Data[1]; | ||
5687 | m_host.ParentGroup.RootPart.PayPrice[3]=(int)quick_pay_buttons.Data[2]; | ||
5688 | m_host.ParentGroup.RootPart.PayPrice[4]=(int)quick_pay_buttons.Data[3]; | ||
5689 | } | ||
5690 | |||
5691 | public LSL_Types.Vector3 llGetCameraPos() | ||
5692 | { | ||
5693 | m_host.AddScriptLPS(1); | ||
5694 | NotImplemented("llGetCameraPos"); | ||
5695 | return new LSL_Types.Vector3(); | ||
5696 | } | ||
5697 | |||
5698 | public LSL_Types.Quaternion llGetCameraRot() | ||
5699 | { | ||
5700 | m_host.AddScriptLPS(1); | ||
5701 | NotImplemented("llGetCameraRot"); | ||
5702 | return new LSL_Types.Quaternion(); | ||
5703 | } | ||
5704 | |||
5705 | public void llSetPrimURL() | ||
5706 | { | ||
5707 | m_host.AddScriptLPS(1); | ||
5708 | NotImplemented("llSetPrimURL"); | ||
5709 | } | ||
5710 | |||
5711 | public void llRefreshPrimURL() | ||
5712 | { | ||
5713 | m_host.AddScriptLPS(1); | ||
5714 | NotImplemented("llRefreshPrimURL"); | ||
5715 | } | ||
5716 | |||
5717 | public string llEscapeURL(string url) | ||
5718 | { | ||
5719 | m_host.AddScriptLPS(1); | ||
5720 | try | ||
5721 | { | ||
5722 | return Uri.EscapeUriString(url); | ||
5723 | } | ||
5724 | catch (Exception ex) | ||
5725 | { | ||
5726 | return "llEscapeURL: " + ex.ToString(); | ||
5727 | } | ||
5728 | } | ||
5729 | |||
5730 | public string llUnescapeURL(string url) | ||
5731 | { | ||
5732 | m_host.AddScriptLPS(1); | ||
5733 | try | ||
5734 | { | ||
5735 | return Uri.UnescapeDataString(url); | ||
5736 | } | ||
5737 | catch (Exception ex) | ||
5738 | { | ||
5739 | return "llUnescapeURL: " + ex.ToString(); | ||
5740 | } | ||
5741 | } | ||
5742 | |||
5743 | public void llMapDestination(string simname, LSL_Types.Vector3 pos, LSL_Types.Vector3 look_at) | ||
5744 | { | ||
5745 | m_host.AddScriptLPS(1); | ||
5746 | NotImplemented("llMapDestination"); | ||
5747 | } | ||
5748 | |||
5749 | public void llAddToLandBanList(string avatar, double hours) | ||
5750 | { | ||
5751 | m_host.AddScriptLPS(1); | ||
5752 | LLUUID key; | ||
5753 | LandData land = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y).landData; | ||
5754 | if (land.ownerID == m_host.OwnerID) | ||
5755 | { | ||
5756 | ParcelManager.ParcelAccessEntry entry = new ParcelManager.ParcelAccessEntry(); | ||
5757 | if (LLUUID.TryParse(avatar, out key)) | ||
5758 | { | ||
5759 | entry.AgentID = key; | ||
5760 | entry.Flags = ParcelManager.AccessList.Ban; | ||
5761 | entry.Time = DateTime.Now.AddHours(hours); | ||
5762 | land.parcelAccessList.Add(entry); | ||
5763 | } | ||
5764 | } | ||
5765 | } | ||
5766 | |||
5767 | public void llRemoveFromLandPassList(string avatar) | ||
5768 | { | ||
5769 | m_host.AddScriptLPS(1); | ||
5770 | LLUUID key; | ||
5771 | LandData land = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y).landData; | ||
5772 | if (land.ownerID == m_host.OwnerID) | ||
5773 | { | ||
5774 | if (LLUUID.TryParse(avatar, out key)) | ||
5775 | { | ||
5776 | foreach (ParcelManager.ParcelAccessEntry entry in land.parcelAccessList) | ||
5777 | { | ||
5778 | if (entry.AgentID == key && entry.Flags == ParcelManager.AccessList.Access) | ||
5779 | { | ||
5780 | land.parcelAccessList.Remove(entry); | ||
5781 | break; | ||
5782 | } | ||
5783 | } | ||
5784 | } | ||
5785 | } | ||
5786 | } | ||
5787 | |||
5788 | public void llRemoveFromLandBanList(string avatar) | ||
5789 | { | ||
5790 | m_host.AddScriptLPS(1); | ||
5791 | LLUUID key; | ||
5792 | LandData land = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y).landData; | ||
5793 | if (land.ownerID == m_host.OwnerID) | ||
5794 | { | ||
5795 | if (LLUUID.TryParse(avatar, out key)) | ||
5796 | { | ||
5797 | foreach (ParcelManager.ParcelAccessEntry entry in land.parcelAccessList) | ||
5798 | { | ||
5799 | if (entry.AgentID == key && entry.Flags == ParcelManager.AccessList.Ban) | ||
5800 | { | ||
5801 | land.parcelAccessList.Remove(entry); | ||
5802 | break; | ||
5803 | } | ||
5804 | } | ||
5805 | } | ||
5806 | } | ||
5807 | } | ||
5808 | |||
5809 | public void llSetCameraParams(LSL_Types.list rules) | ||
5810 | { | ||
5811 | m_host.AddScriptLPS(1); | ||
5812 | NotImplemented("llSetCameraParams"); | ||
5813 | } | ||
5814 | |||
5815 | public void llClearCameraParams() | ||
5816 | { | ||
5817 | m_host.AddScriptLPS(1); | ||
5818 | NotImplemented("llClearCameraParams"); | ||
5819 | } | ||
5820 | |||
5821 | public double llListStatistics(int operation, LSL_Types.list src) | ||
5822 | { | ||
5823 | m_host.AddScriptLPS(1); | ||
5824 | LSL_Types.list nums = LSL_Types.list.ToDoubleList(src); | ||
5825 | switch (operation) | ||
5826 | { | ||
5827 | case BuiltIn_Commands_BaseClass.LIST_STAT_RANGE: | ||
5828 | return nums.Range(); | ||
5829 | case BuiltIn_Commands_BaseClass.LIST_STAT_MIN: | ||
5830 | return nums.Min(); | ||
5831 | case BuiltIn_Commands_BaseClass.LIST_STAT_MAX: | ||
5832 | return nums.Max(); | ||
5833 | case BuiltIn_Commands_BaseClass.LIST_STAT_MEAN: | ||
5834 | return nums.Mean(); | ||
5835 | case BuiltIn_Commands_BaseClass.LIST_STAT_MEDIAN: | ||
5836 | return nums.Median(); | ||
5837 | case BuiltIn_Commands_BaseClass.LIST_STAT_NUM_COUNT: | ||
5838 | return nums.NumericLength(); | ||
5839 | case BuiltIn_Commands_BaseClass.LIST_STAT_STD_DEV: | ||
5840 | return nums.StdDev(); | ||
5841 | case BuiltIn_Commands_BaseClass.LIST_STAT_SUM: | ||
5842 | return nums.Sum(); | ||
5843 | case BuiltIn_Commands_BaseClass.LIST_STAT_SUM_SQUARES: | ||
5844 | return nums.SumSqrs(); | ||
5845 | case BuiltIn_Commands_BaseClass.LIST_STAT_GEOMETRIC_MEAN: | ||
5846 | return nums.GeometricMean(); | ||
5847 | case BuiltIn_Commands_BaseClass.LIST_STAT_HARMONIC_MEAN: | ||
5848 | return nums.HarmonicMean(); | ||
5849 | default: | ||
5850 | return 0.0; | ||
5851 | } | ||
5852 | } | ||
5853 | |||
5854 | public LSL_Types.LSLInteger llGetUnixTime() | ||
5855 | { | ||
5856 | m_host.AddScriptLPS(1); | ||
5857 | return Util.UnixTimeSinceEpoch(); | ||
5858 | } | ||
5859 | |||
5860 | public LSL_Types.LSLInteger llGetParcelFlags(LSL_Types.Vector3 pos) | ||
5861 | { | ||
5862 | m_host.AddScriptLPS(1); | ||
5863 | return (int)World.LandChannel.GetLandObject((float)pos.x, (float)pos.y).landData.landFlags; | ||
5864 | } | ||
5865 | |||
5866 | public LSL_Types.LSLInteger llGetRegionFlags() | ||
5867 | { | ||
5868 | m_host.AddScriptLPS(1); | ||
5869 | return (int)World.RegionInfo.EstateSettings.regionFlags; | ||
5870 | } | ||
5871 | |||
5872 | public string llXorBase64StringsCorrect(string str1, string str2) | ||
5873 | { | ||
5874 | m_host.AddScriptLPS(1); | ||
5875 | string ret = String.Empty; | ||
5876 | string src1 = llBase64ToString(str1); | ||
5877 | string src2 = llBase64ToString(str2); | ||
5878 | int c = 0; | ||
5879 | for (int i = 0; i < src1.Length; i++) | ||
5880 | { | ||
5881 | ret += src1[i] ^ src2[c]; | ||
5882 | |||
5883 | c++; | ||
5884 | if (c > src2.Length) | ||
5885 | c = 0; | ||
5886 | } | ||
5887 | return llStringToBase64(ret); | ||
5888 | } | ||
5889 | |||
5890 | public string llHTTPRequest(string url, LSL_Types.list parameters, string body) | ||
5891 | { | ||
5892 | // Partial implementation: support for parameter flags needed | ||
5893 | // see http://wiki.secondlife.com/wiki/LlHTTPRequest | ||
5894 | // parameter flags support are implemented in ScriptsHttpRequests.cs | ||
5895 | // in StartHttpRequest | ||
5896 | |||
5897 | m_host.AddScriptLPS(1); | ||
5898 | IHttpRequests httpScriptMod = | ||
5899 | m_ScriptEngine.World.RequestModuleInterface<IHttpRequests>(); | ||
5900 | List<string> param = new List<string>(); | ||
5901 | foreach (object o in parameters.Data) | ||
5902 | { | ||
5903 | param.Add(o.ToString()); | ||
5904 | } | ||
5905 | LLUUID reqID = httpScriptMod. | ||
5906 | StartHttpRequest(m_localID, m_itemID, url, param, body); | ||
5907 | |||
5908 | if (reqID != LLUUID.Zero) | ||
5909 | return reqID.ToString(); | ||
5910 | else | ||
5911 | return null; | ||
5912 | } | ||
5913 | |||
5914 | public void llResetLandBanList() | ||
5915 | { | ||
5916 | m_host.AddScriptLPS(1); | ||
5917 | LandData land = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y).landData; | ||
5918 | if (land.ownerID == m_host.OwnerID) | ||
5919 | { | ||
5920 | foreach (ParcelManager.ParcelAccessEntry entry in land.parcelAccessList) | ||
5921 | { | ||
5922 | if (entry.Flags == ParcelManager.AccessList.Ban) | ||
5923 | { | ||
5924 | land.parcelAccessList.Remove(entry); | ||
5925 | } | ||
5926 | } | ||
5927 | } | ||
5928 | } | ||
5929 | |||
5930 | public void llResetLandPassList() | ||
5931 | { | ||
5932 | m_host.AddScriptLPS(1); | ||
5933 | LandData land = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y).landData; | ||
5934 | if (land.ownerID == m_host.OwnerID) | ||
5935 | { | ||
5936 | foreach (ParcelManager.ParcelAccessEntry entry in land.parcelAccessList) | ||
5937 | { | ||
5938 | if (entry.Flags == ParcelManager.AccessList.Access) | ||
5939 | { | ||
5940 | land.parcelAccessList.Remove(entry); | ||
5941 | } | ||
5942 | } | ||
5943 | } | ||
5944 | } | ||
5945 | |||
5946 | public LSL_Types.LSLInteger llGetParcelPrimCount(LSL_Types.Vector3 pos, int category, int sim_wide) | ||
5947 | { | ||
5948 | m_host.AddScriptLPS(1); | ||
5949 | |||
5950 | LandData land = World.GetLandData((float)pos.x, (float)pos.y); | ||
5951 | |||
5952 | if (land == null) | ||
5953 | { | ||
5954 | return 0; | ||
5955 | } | ||
5956 | |||
5957 | else | ||
5958 | { | ||
5959 | if (sim_wide == 1) | ||
5960 | { | ||
5961 | if (category == 0) | ||
5962 | { | ||
5963 | return land.simwidePrims; | ||
5964 | } | ||
5965 | |||
5966 | else | ||
5967 | { | ||
5968 | //public int simwideArea = 0; | ||
5969 | return 0; | ||
5970 | } | ||
5971 | } | ||
5972 | |||
5973 | else | ||
5974 | { | ||
5975 | if (category == 0)//Total Prims | ||
5976 | { | ||
5977 | return 0;//land. | ||
5978 | } | ||
5979 | |||
5980 | else if (category == 1)//Owner Prims | ||
5981 | { | ||
5982 | return land.ownerPrims; | ||
5983 | } | ||
5984 | |||
5985 | else if (category == 2)//Group Prims | ||
5986 | { | ||
5987 | return land.groupPrims; | ||
5988 | } | ||
5989 | |||
5990 | else if (category == 3)//Other Prims | ||
5991 | { | ||
5992 | return land.otherPrims; | ||
5993 | } | ||
5994 | |||
5995 | else if (category == 4)//Selected | ||
5996 | { | ||
5997 | return land.selectedPrims; | ||
5998 | } | ||
5999 | |||
6000 | else if (category == 5)//Temp | ||
6001 | { | ||
6002 | return 0;//land. | ||
6003 | } | ||
6004 | } | ||
6005 | } | ||
6006 | return 0; | ||
6007 | } | ||
6008 | |||
6009 | public LSL_Types.list llGetParcelPrimOwners(LSL_Types.Vector3 pos) | ||
6010 | { | ||
6011 | m_host.AddScriptLPS(1); | ||
6012 | LandObject land = (LandObject)World.LandChannel.GetLandObject((float)pos.x, (float)pos.y); | ||
6013 | LSL_Types.list ret = new LSL_Types.list(); | ||
6014 | if (land != null) | ||
6015 | { | ||
6016 | foreach (KeyValuePair<LLUUID, int> d in land.getLandObjectOwners()) | ||
6017 | { | ||
6018 | ret.Add(d.Key.ToString()); | ||
6019 | ret.Add(d.Value); | ||
6020 | } | ||
6021 | } | ||
6022 | return ret; | ||
6023 | } | ||
6024 | |||
6025 | public LSL_Types.LSLInteger llGetObjectPrimCount(string object_id) | ||
6026 | { | ||
6027 | m_host.AddScriptLPS(1); | ||
6028 | SceneObjectPart part = World.GetSceneObjectPart(new LLUUID(object_id)); | ||
6029 | if (part == null) | ||
6030 | { | ||
6031 | return 0; | ||
6032 | } | ||
6033 | else | ||
6034 | { | ||
6035 | return part.ParentGroup.Children.Count; | ||
6036 | } | ||
6037 | } | ||
6038 | |||
6039 | public LSL_Types.LSLInteger llGetParcelMaxPrims(LSL_Types.Vector3 pos, int sim_wide) | ||
6040 | { | ||
6041 | m_host.AddScriptLPS(1); | ||
6042 | // Alondria: This currently just is utilizing the normal grid's 0.22 prims/m2 calculation | ||
6043 | // Which probably will be irrelevent in OpenSim.... | ||
6044 | LandData land = World.GetLandData((float)pos.x, (float)pos.y); | ||
6045 | |||
6046 | float bonusfactor = World.RegionInfo.EstateSettings.objectBonusFactor; | ||
6047 | |||
6048 | if (land == null) | ||
6049 | { | ||
6050 | return 0; | ||
6051 | } | ||
6052 | |||
6053 | if (sim_wide == 1) | ||
6054 | { | ||
6055 | decimal v = land.simwideArea * (decimal)(0.22) * (decimal)bonusfactor; | ||
6056 | |||
6057 | return (int)v; | ||
6058 | } | ||
6059 | |||
6060 | else | ||
6061 | { | ||
6062 | decimal v = land.area * (decimal)(0.22) * (decimal)bonusfactor; | ||
6063 | |||
6064 | return (int)v; | ||
6065 | } | ||
6066 | |||
6067 | } | ||
6068 | |||
6069 | public LSL_Types.list llGetParcelDetails(LSL_Types.Vector3 pos, LSL_Types.list param) | ||
6070 | { | ||
6071 | m_host.AddScriptLPS(1); | ||
6072 | LandData land = World.GetLandData((float)pos.x, (float)pos.y); | ||
6073 | if (land == null) | ||
6074 | { | ||
6075 | return new LSL_Types.list(0); | ||
6076 | } | ||
6077 | LSL_Types.list ret = new LSL_Types.list(); | ||
6078 | foreach (object o in param.Data) | ||
6079 | { | ||
6080 | switch (o.ToString()) | ||
6081 | { | ||
6082 | case "0": | ||
6083 | ret = ret + new LSL_Types.list(land.landName); | ||
6084 | break; | ||
6085 | case "1": | ||
6086 | ret = ret + new LSL_Types.list(land.landDesc); | ||
6087 | break; | ||
6088 | case "2": | ||
6089 | ret = ret + new LSL_Types.list(land.ownerID.ToString()); | ||
6090 | break; | ||
6091 | case "3": | ||
6092 | ret = ret + new LSL_Types.list(land.groupID.ToString()); | ||
6093 | break; | ||
6094 | case "4": | ||
6095 | ret = ret + new LSL_Types.list(land.area); | ||
6096 | break; | ||
6097 | default: | ||
6098 | ret = ret + new LSL_Types.list(0); | ||
6099 | break; | ||
6100 | } | ||
6101 | } | ||
6102 | return ret; | ||
6103 | } | ||
6104 | |||
6105 | public void llSetLinkTexture(int linknumber, string texture, int face) | ||
6106 | { | ||
6107 | m_host.AddScriptLPS(1); | ||
6108 | NotImplemented("llSetLinkTexture"); | ||
6109 | } | ||
6110 | |||
6111 | public string llStringTrim(string src, int type) | ||
6112 | { | ||
6113 | m_host.AddScriptLPS(1); | ||
6114 | if (type == (int)BuiltIn_Commands_BaseClass.STRING_TRIM_HEAD) { return src.TrimStart(); } | ||
6115 | if (type == (int)BuiltIn_Commands_BaseClass.STRING_TRIM_TAIL) { return src.TrimEnd(); } | ||
6116 | if (type == (int)BuiltIn_Commands_BaseClass.STRING_TRIM) { return src.Trim(); } | ||
6117 | return src; | ||
6118 | } | ||
6119 | |||
6120 | public LSL_Types.list llGetObjectDetails(string id, LSL_Types.list args) | ||
6121 | { | ||
6122 | m_host.AddScriptLPS(1); | ||
6123 | LSL_Types.list ret = new LSL_Types.list(); | ||
6124 | LLUUID key = new LLUUID(); | ||
6125 | if (LLUUID.TryParse(id, out key)) | ||
6126 | { | ||
6127 | ScenePresence av = World.GetScenePresence(key); | ||
6128 | |||
6129 | if (av != null) | ||
6130 | { | ||
6131 | foreach (object o in args.Data) | ||
6132 | { | ||
6133 | switch (o.ToString()) | ||
6134 | { | ||
6135 | case "1": | ||
6136 | ret.Add(av.Firstname + " " + av.Lastname); | ||
6137 | break; | ||
6138 | case "2": | ||
6139 | ret.Add(""); | ||
6140 | break; | ||
6141 | case "3": | ||
6142 | ret.Add(new LSL_Types.Vector3((double)av.AbsolutePosition.X, (double)av.AbsolutePosition.Y, (double)av.AbsolutePosition.Z)); | ||
6143 | break; | ||
6144 | case "4": | ||
6145 | ret.Add(new LSL_Types.Quaternion((double)av.Rotation.x, (double)av.Rotation.y, (double)av.Rotation.z, (double)av.Rotation.w)); | ||
6146 | break; | ||
6147 | case "5": | ||
6148 | ret.Add(new LSL_Types.Vector3(av.Velocity.X,av.Velocity.Y,av.Velocity.Z)); | ||
6149 | break; | ||
6150 | case "6": | ||
6151 | ret.Add(id); | ||
6152 | break; | ||
6153 | case "7": | ||
6154 | ret.Add(LLUUID.Zero.ToString()); | ||
6155 | break; | ||
6156 | case "8": | ||
6157 | ret.Add(LLUUID.Zero.ToString()); | ||
6158 | break; | ||
6159 | } | ||
6160 | } | ||
6161 | return ret; | ||
6162 | } | ||
6163 | SceneObjectPart obj = World.GetSceneObjectPart(key); | ||
6164 | if (obj != null) | ||
6165 | { | ||
6166 | foreach (object o in args.Data) | ||
6167 | { | ||
6168 | switch (o.ToString()) | ||
6169 | { | ||
6170 | case "1": | ||
6171 | ret.Add(obj.Name); | ||
6172 | break; | ||
6173 | case "2": | ||
6174 | ret.Add(obj.Description); | ||
6175 | break; | ||
6176 | case "3": | ||
6177 | ret.Add(new LSL_Types.Vector3(obj.AbsolutePosition.X,obj.AbsolutePosition.Y,obj.AbsolutePosition.Z)); | ||
6178 | break; | ||
6179 | case "4": | ||
6180 | ret.Add(new LSL_Types.Quaternion(obj.RotationOffset.X, obj.RotationOffset.Y, obj.RotationOffset.Z, obj.RotationOffset.W)); | ||
6181 | break; | ||
6182 | case "5": | ||
6183 | ret.Add(new LSL_Types.Vector3(obj.Velocity.X, obj.Velocity.Y, obj.Velocity.Z)); | ||
6184 | break; | ||
6185 | case "6": | ||
6186 | ret.Add(obj.OwnerID.ToString()); | ||
6187 | break; | ||
6188 | case "7": | ||
6189 | ret.Add(obj.GroupID.ToString()); | ||
6190 | break; | ||
6191 | case "8": | ||
6192 | ret.Add(obj.CreatorID.ToString()); | ||
6193 | break; | ||
6194 | } | ||
6195 | } | ||
6196 | return ret; | ||
6197 | } | ||
6198 | } | ||
6199 | return new LSL_Types.list(); | ||
6200 | } | ||
6201 | |||
6202 | |||
6203 | internal LLUUID ScriptByName(string name) | ||
6204 | { | ||
6205 | foreach (TaskInventoryItem item in m_host.TaskInventory.Values) | ||
6206 | { | ||
6207 | if (item.Type == 10 && item.Name == name) | ||
6208 | return item.ItemID; | ||
6209 | } | ||
6210 | return LLUUID.Zero; | ||
6211 | } | ||
6212 | |||
6213 | internal void ShoutError(string msg) | ||
6214 | { | ||
6215 | llShout(BuiltIn_Commands_BaseClass.DEBUG_CHANNEL, msg); | ||
6216 | } | ||
6217 | |||
6218 | |||
6219 | |||
6220 | internal void NotImplemented(string command) | ||
6221 | { | ||
6222 | if (throwErrorOnNotImplemented) | ||
6223 | throw new NotImplementedException("Command not implemented: " + command); | ||
6224 | } | ||
6225 | |||
6226 | internal void Deprecated(string command) | ||
6227 | { | ||
6228 | throw new Exception("Command deprecated: " + command); | ||
6229 | } | ||
6230 | |||
6231 | internal void LSLError(string msg) | ||
6232 | { | ||
6233 | throw new Exception("LSL Runtime Error: " + msg); | ||
6234 | } | ||
6235 | |||
6236 | public delegate void AssetRequestCallback(LLUUID assetID, AssetBase asset); | ||
6237 | private void WithNotecard(LLUUID assetID, AssetRequestCallback cb) | ||
6238 | { | ||
6239 | World.AssetCache.GetAsset(assetID, delegate(LLUUID i, AssetBase a) { cb(i, a); }, false); | ||
6240 | } | ||
6241 | |||
6242 | public string llGetNumberOfNotecardLines(string name) | ||
6243 | { | ||
6244 | m_host.AddScriptLPS(1); | ||
6245 | |||
6246 | foreach (TaskInventoryItem item in m_host.TaskInventory.Values) | ||
6247 | { | ||
6248 | if (item.Type == 7 && item.Name == name) | ||
6249 | { | ||
6250 | LLUUID tid = m_ScriptEngine.m_ASYNCLSLCommandManager. | ||
6251 | m_Dataserver.RegisterRequest(m_localID, | ||
6252 | m_itemID, item.AssetID.ToString()); | ||
6253 | if(NotecardCache.IsCached(item.AssetID)) | ||
6254 | { | ||
6255 | m_ScriptEngine.m_ASYNCLSLCommandManager. | ||
6256 | m_Dataserver.DataserverReply(item.AssetID.ToString(), | ||
6257 | NotecardCache.GetLines(item.AssetID).ToString()); | ||
6258 | return tid.ToString(); | ||
6259 | } | ||
6260 | WithNotecard(item.AssetID, delegate (LLUUID id, AssetBase a) | ||
6261 | { | ||
6262 | System.Text.ASCIIEncoding enc = | ||
6263 | new System.Text.ASCIIEncoding(); | ||
6264 | string data = enc.GetString(a.Data); | ||
6265 | Console.WriteLine(data); | ||
6266 | NotecardCache.Cache(id, data); | ||
6267 | m_ScriptEngine.m_ASYNCLSLCommandManager. | ||
6268 | m_Dataserver.DataserverReply(id.ToString(), | ||
6269 | NotecardCache.GetLines(id).ToString()); | ||
6270 | }); | ||
6271 | |||
6272 | return tid.ToString(); | ||
6273 | } | ||
6274 | } | ||
6275 | return LLUUID.Zero.ToString(); | ||
6276 | } | ||
6277 | |||
6278 | public string llGetNotecardLine(string name, int line) | ||
6279 | { | ||
6280 | m_host.AddScriptLPS(1); | ||
6281 | |||
6282 | foreach (TaskInventoryItem item in m_host.TaskInventory.Values) | ||
6283 | { | ||
6284 | if (item.Type == 7 && item.Name == name) | ||
6285 | { | ||
6286 | LLUUID tid = m_ScriptEngine.m_ASYNCLSLCommandManager. | ||
6287 | m_Dataserver.RegisterRequest(m_localID, | ||
6288 | m_itemID, item.AssetID.ToString()); | ||
6289 | if(NotecardCache.IsCached(item.AssetID)) | ||
6290 | { | ||
6291 | m_ScriptEngine.m_ASYNCLSLCommandManager. | ||
6292 | m_Dataserver.DataserverReply(item.AssetID.ToString(), | ||
6293 | NotecardCache.GetLine(item.AssetID, line)); | ||
6294 | return tid.ToString(); | ||
6295 | } | ||
6296 | WithNotecard(item.AssetID, delegate (LLUUID id, AssetBase a) | ||
6297 | { | ||
6298 | System.Text.ASCIIEncoding enc = | ||
6299 | new System.Text.ASCIIEncoding(); | ||
6300 | string data = enc.GetString(a.Data); | ||
6301 | Console.WriteLine(data); | ||
6302 | NotecardCache.Cache(id, data); | ||
6303 | m_ScriptEngine.m_ASYNCLSLCommandManager. | ||
6304 | m_Dataserver.DataserverReply(id.ToString(), | ||
6305 | NotecardCache.GetLine(id, line)); | ||
6306 | }); | ||
6307 | |||
6308 | return tid.ToString(); | ||
6309 | } | ||
6310 | } | ||
6311 | |||
6312 | return String.Empty; | ||
6313 | } | ||
6314 | |||
6315 | } | ||
6316 | |||
6317 | public class NotecardCache | ||
6318 | { | ||
6319 | private class Notecard | ||
6320 | { | ||
6321 | public string[] text; | ||
6322 | public DateTime lastRef; | ||
6323 | } | ||
6324 | |||
6325 | private static Dictionary<LLUUID, Notecard> m_Notecards = | ||
6326 | new Dictionary<LLUUID, Notecard>(); | ||
6327 | |||
6328 | public static void Cache(LLUUID assetID, string text) | ||
6329 | { | ||
6330 | CacheCheck(); | ||
6331 | |||
6332 | lock(m_Notecards) | ||
6333 | { | ||
6334 | if(m_Notecards.ContainsKey(assetID)) | ||
6335 | return; | ||
6336 | |||
6337 | Notecard nc = new Notecard(); | ||
6338 | nc.lastRef=DateTime.Now; | ||
6339 | nc.text = ParseText(text.Replace("\r", "").Split('\n')); | ||
6340 | m_Notecards[assetID] = nc; | ||
6341 | } | ||
6342 | } | ||
6343 | |||
6344 | private static string[] ParseText(string[] input) | ||
6345 | { | ||
6346 | int idx=0; | ||
6347 | int level=0; | ||
6348 | List<string> output = new List<string>(); | ||
6349 | string[] words; | ||
6350 | |||
6351 | while(idx < input.Length) | ||
6352 | { | ||
6353 | if(input[idx] == "{") | ||
6354 | { | ||
6355 | level++; | ||
6356 | idx++; | ||
6357 | continue; | ||
6358 | } | ||
6359 | if(input[idx]== "}") | ||
6360 | { | ||
6361 | level--; | ||
6362 | idx++; | ||
6363 | continue; | ||
6364 | } | ||
6365 | |||
6366 | switch(level) | ||
6367 | { | ||
6368 | case 0: | ||
6369 | words = input[idx].Split(' '); // Linden text ver | ||
6370 | int version = int.Parse(words[3]); | ||
6371 | if(version != 2) | ||
6372 | return new String[0]; | ||
6373 | break; | ||
6374 | case 1: | ||
6375 | words = input[idx].Split(' '); | ||
6376 | if(words[0] == "LLEmbeddedItems") | ||
6377 | break; | ||
6378 | if(words[0] == "Text") | ||
6379 | { | ||
6380 | int len = int.Parse(words[2]); | ||
6381 | idx++; | ||
6382 | |||
6383 | int count=-1; | ||
6384 | |||
6385 | while(count < len) | ||
6386 | { | ||
6387 | int l = input[idx].Length; | ||
6388 | string ln = input[idx]; | ||
6389 | |||
6390 | int need = len-count-1; | ||
6391 | if(ln.Length > need) | ||
6392 | ln=ln.Substring(0, need); | ||
6393 | |||
6394 | output.Add(ln); | ||
6395 | count+=ln.Length+1; | ||
6396 | idx++; | ||
6397 | } | ||
6398 | |||
6399 | return output.ToArray(); | ||
6400 | } | ||
6401 | break; | ||
6402 | case 2: | ||
6403 | words = input[idx].Split(' '); // count | ||
6404 | if(words[0] == "count") | ||
6405 | { | ||
6406 | int c = int.Parse(words[1]); | ||
6407 | if(c > 0) | ||
6408 | return new String[0]; | ||
6409 | break; | ||
6410 | } | ||
6411 | break; | ||
6412 | } | ||
6413 | idx++; | ||
6414 | } | ||
6415 | return output.ToArray(); | ||
6416 | } | ||
6417 | |||
6418 | public static bool IsCached(LLUUID assetID) | ||
6419 | { | ||
6420 | lock(m_Notecards) | ||
6421 | { | ||
6422 | return m_Notecards.ContainsKey(assetID); | ||
6423 | } | ||
6424 | } | ||
6425 | |||
6426 | public static int GetLines(LLUUID assetID) | ||
6427 | { | ||
6428 | if(!IsCached(assetID)) | ||
6429 | return -1; | ||
6430 | |||
6431 | lock(m_Notecards) | ||
6432 | { | ||
6433 | m_Notecards[assetID].lastRef = DateTime.Now; | ||
6434 | return m_Notecards[assetID].text.Length; | ||
6435 | } | ||
6436 | } | ||
6437 | |||
6438 | public static string GetLine(LLUUID assetID, int line) | ||
6439 | { | ||
6440 | if(line < 0) | ||
6441 | return ""; | ||
6442 | |||
6443 | string data; | ||
6444 | |||
6445 | if(!IsCached(assetID)) | ||
6446 | return ""; | ||
6447 | |||
6448 | lock(m_Notecards) | ||
6449 | { | ||
6450 | m_Notecards[assetID].lastRef = DateTime.Now; | ||
6451 | |||
6452 | if(line >= m_Notecards[assetID].text.Length) | ||
6453 | return "\n\n\n"; | ||
6454 | |||
6455 | data=m_Notecards[assetID].text[line]; | ||
6456 | if(data.Length > 255) | ||
6457 | data = data.Substring(0, 255); | ||
6458 | |||
6459 | return data; | ||
6460 | } | ||
6461 | } | ||
6462 | |||
6463 | public static void CacheCheck() | ||
6464 | { | ||
6465 | foreach (LLUUID key in new List<LLUUID>(m_Notecards.Keys)) | ||
6466 | { | ||
6467 | Notecard nc = m_Notecards[key]; | ||
6468 | if(nc.lastRef.AddSeconds(30) < DateTime.Now) | ||
6469 | m_Notecards.Remove(key); | ||
6470 | } | ||
6471 | } | ||
6472 | |||
6473 | } | ||
6474 | } | ||
diff --git a/OpenSim/Region/ScriptEngine/XEngine/OSSL_ScriptCommands.cs b/OpenSim/Region/ScriptEngine/XEngine/OSSL_ScriptCommands.cs new file mode 100644 index 0000000..bc4e8ba --- /dev/null +++ b/OpenSim/Region/ScriptEngine/XEngine/OSSL_ScriptCommands.cs | |||
@@ -0,0 +1,553 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSim Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | using System; | ||
28 | using Axiom.Math; | ||
29 | using libsecondlife; | ||
30 | using Nini.Config; | ||
31 | using OpenSim.Framework.Console; | ||
32 | using OpenSim.Region.Environment.Interfaces; | ||
33 | using OpenSim.Region.Environment.Scenes; | ||
34 | using OpenSim.Region.ScriptEngine.XEngine.Script; | ||
35 | |||
36 | namespace OpenSim.Region.ScriptEngine.XEngine | ||
37 | { | ||
38 | [Serializable] | ||
39 | public class OSSL_ScriptCommands : MarshalByRefObject, IOSSL_ScriptCommands | ||
40 | { | ||
41 | internal XEngine m_ScriptEngine; | ||
42 | internal XScriptInstance m_Instance; | ||
43 | internal SceneObjectPart m_host; | ||
44 | internal uint m_localID; | ||
45 | internal LLUUID m_itemID; | ||
46 | |||
47 | public OSSL_ScriptCommands(XEngine scriptEngine, | ||
48 | XScriptInstance instance, SceneObjectPart host, | ||
49 | uint localID, LLUUID itemID) | ||
50 | { | ||
51 | m_ScriptEngine = scriptEngine; | ||
52 | m_Instance = instance; | ||
53 | m_host = host; | ||
54 | m_localID = localID; | ||
55 | m_itemID = itemID; | ||
56 | } | ||
57 | |||
58 | |||
59 | // | ||
60 | // OpenSim functions | ||
61 | // | ||
62 | |||
63 | public int osTerrainSetHeight(int x, int y, double val) | ||
64 | { | ||
65 | if (!m_ScriptEngine.ScriptConfigSource.GetBoolean("AllowOSFunctions", false)) | ||
66 | { | ||
67 | OSSLError("osTerrainSetHeight: permission denied"); | ||
68 | return 0; | ||
69 | } | ||
70 | |||
71 | m_host.AddScriptLPS(1); | ||
72 | if (x > 255 || x < 0 || y > 255 || y < 0) | ||
73 | OSSLError("osTerrainSetHeight: Coordinate out of bounds"); | ||
74 | |||
75 | if (World.ExternalChecks.ExternalChecksCanTerraformLand(m_host.OwnerID, new LLVector3(x, y, 0))) | ||
76 | { | ||
77 | World.Heightmap[x, y] = val; | ||
78 | return 1; | ||
79 | } | ||
80 | else | ||
81 | { | ||
82 | return 0; | ||
83 | } | ||
84 | } | ||
85 | |||
86 | public double osTerrainGetHeight(int x, int y) | ||
87 | { | ||
88 | if (!m_ScriptEngine.ScriptConfigSource.GetBoolean("AllowOSFunctions", false)) | ||
89 | { | ||
90 | OSSLError("osTerrainGetHeight: permission denied"); | ||
91 | return 0.0; | ||
92 | } | ||
93 | |||
94 | m_host.AddScriptLPS(1); | ||
95 | if (x > 255 || x < 0 || y > 255 || y < 0) | ||
96 | OSSLError("osTerrainGetHeight: Coordinate out of bounds"); | ||
97 | |||
98 | return World.Heightmap[x, y]; | ||
99 | } | ||
100 | |||
101 | public int osRegionRestart(double seconds) | ||
102 | { | ||
103 | if (!m_ScriptEngine.ScriptConfigSource.GetBoolean("AllowOSFunctions", false)) | ||
104 | { | ||
105 | OSSLError("osRegionRestart: permission denied"); | ||
106 | return 0; | ||
107 | } | ||
108 | |||
109 | m_host.AddScriptLPS(1); | ||
110 | if (World.ExternalChecks.ExternalChecksCanIssueEstateCommand(m_host.OwnerID)) | ||
111 | { | ||
112 | World.Restart((float)seconds); | ||
113 | return 1; | ||
114 | } | ||
115 | else | ||
116 | { | ||
117 | return 0; | ||
118 | } | ||
119 | } | ||
120 | |||
121 | public void osRegionNotice(string msg) | ||
122 | { | ||
123 | if (!m_ScriptEngine.ScriptConfigSource.GetBoolean("AllowOSFunctions", false)) | ||
124 | { | ||
125 | OSSLError("osRegionNotice: permission denied"); | ||
126 | return; | ||
127 | } | ||
128 | |||
129 | m_host.AddScriptLPS(1); | ||
130 | World.SendGeneralAlert(msg); | ||
131 | } | ||
132 | |||
133 | public void osSetRot(LLUUID target, Quaternion rotation) | ||
134 | { | ||
135 | if (!m_ScriptEngine.ScriptConfigSource.GetBoolean("AllowOSFunctions", false)) | ||
136 | { | ||
137 | OSSLError("osSetRot: permission denied"); | ||
138 | return; | ||
139 | } | ||
140 | |||
141 | m_host.AddScriptLPS(1); | ||
142 | if (World.Entities.ContainsKey(target)) | ||
143 | { | ||
144 | World.Entities[target].Rotation = rotation; | ||
145 | } | ||
146 | else | ||
147 | { | ||
148 | OSSLError("osSetRot: Invalid target"); | ||
149 | } | ||
150 | } | ||
151 | |||
152 | public string osSetDynamicTextureURL(string dynamicID, string contentType, string url, string extraParams, | ||
153 | int timer) | ||
154 | { | ||
155 | if (!m_ScriptEngine.ScriptConfigSource.GetBoolean("AllowOSFunctions", false)) | ||
156 | { | ||
157 | OSSLError("osSetDynamicTextureURL: permission denied"); | ||
158 | return String.Empty; | ||
159 | } | ||
160 | |||
161 | m_host.AddScriptLPS(1); | ||
162 | if (dynamicID == String.Empty) | ||
163 | { | ||
164 | IDynamicTextureManager textureManager = World.RequestModuleInterface<IDynamicTextureManager>(); | ||
165 | LLUUID createdTexture = | ||
166 | textureManager.AddDynamicTextureURL(World.RegionInfo.RegionID, m_host.UUID, contentType, url, | ||
167 | extraParams, timer); | ||
168 | return createdTexture.ToString(); | ||
169 | } | ||
170 | else | ||
171 | { | ||
172 | //TODO update existing dynamic textures | ||
173 | } | ||
174 | |||
175 | return LLUUID.Zero.ToString(); | ||
176 | } | ||
177 | |||
178 | public string osSetDynamicTextureURLBlend(string dynamicID, string contentType, string url, string extraParams, | ||
179 | int timer, int alpha) | ||
180 | { | ||
181 | if (!m_ScriptEngine.ScriptConfigSource.GetBoolean("AllowOSFunctions", false)) | ||
182 | { | ||
183 | OSSLError("osSetDynamicTextureURLBlend: permission denied"); | ||
184 | return String.Empty; | ||
185 | } | ||
186 | |||
187 | m_host.AddScriptLPS(1); | ||
188 | if (dynamicID == String.Empty) | ||
189 | { | ||
190 | IDynamicTextureManager textureManager = World.RequestModuleInterface<IDynamicTextureManager>(); | ||
191 | LLUUID createdTexture = | ||
192 | textureManager.AddDynamicTextureURL(World.RegionInfo.RegionID, m_host.UUID, contentType, url, | ||
193 | extraParams, timer, true, (byte) alpha); | ||
194 | return createdTexture.ToString(); | ||
195 | } | ||
196 | else | ||
197 | { | ||
198 | //TODO update existing dynamic textures | ||
199 | } | ||
200 | |||
201 | return LLUUID.Zero.ToString(); | ||
202 | } | ||
203 | |||
204 | public string osSetDynamicTextureData(string dynamicID, string contentType, string data, string extraParams, | ||
205 | int timer) | ||
206 | { | ||
207 | if (!m_ScriptEngine.ScriptConfigSource.GetBoolean("AllowOSFunctions", false)) | ||
208 | { | ||
209 | OSSLError("osSetDynamicTextureData: permission denied"); | ||
210 | return String.Empty; | ||
211 | } | ||
212 | |||
213 | m_host.AddScriptLPS(1); | ||
214 | if (dynamicID == String.Empty) | ||
215 | { | ||
216 | IDynamicTextureManager textureManager = World.RequestModuleInterface<IDynamicTextureManager>(); | ||
217 | if (textureManager != null) | ||
218 | { | ||
219 | LLUUID createdTexture = | ||
220 | textureManager.AddDynamicTextureData(World.RegionInfo.RegionID, m_host.UUID, contentType, data, | ||
221 | extraParams, timer); | ||
222 | return createdTexture.ToString(); | ||
223 | } | ||
224 | } | ||
225 | else | ||
226 | { | ||
227 | //TODO update existing dynamic textures | ||
228 | } | ||
229 | |||
230 | return LLUUID.Zero.ToString(); | ||
231 | } | ||
232 | |||
233 | public string osSetDynamicTextureDataBlend(string dynamicID, string contentType, string data, string extraParams, | ||
234 | int timer, int alpha) | ||
235 | { | ||
236 | if (!m_ScriptEngine.ScriptConfigSource.GetBoolean("AllowOSFunctions", false)) | ||
237 | { | ||
238 | OSSLError("osSetDynamicTextureDataBlend: permission denied"); | ||
239 | return String.Empty; | ||
240 | } | ||
241 | |||
242 | m_host.AddScriptLPS(1); | ||
243 | if (dynamicID == String.Empty) | ||
244 | { | ||
245 | IDynamicTextureManager textureManager = World.RequestModuleInterface<IDynamicTextureManager>(); | ||
246 | if (textureManager != null) | ||
247 | { | ||
248 | LLUUID createdTexture = | ||
249 | textureManager.AddDynamicTextureData(World.RegionInfo.RegionID, m_host.UUID, contentType, data, | ||
250 | extraParams, timer, true, (byte) alpha); | ||
251 | return createdTexture.ToString(); | ||
252 | } | ||
253 | } | ||
254 | else | ||
255 | { | ||
256 | //TODO update existing dynamic textures | ||
257 | } | ||
258 | |||
259 | return LLUUID.Zero.ToString(); | ||
260 | } | ||
261 | |||
262 | public bool osConsoleCommand(string command) | ||
263 | { | ||
264 | m_host.AddScriptLPS(1); | ||
265 | if (m_ScriptEngine.ScriptConfigSource.GetBoolean("AllowosConsoleCommand", false)) | ||
266 | { | ||
267 | if (World.ExternalChecks.ExternalChecksCanRunConsoleCommand(m_host.OwnerID)) | ||
268 | { | ||
269 | MainConsole.Instance.RunCommand(command); | ||
270 | return true; | ||
271 | } | ||
272 | return false; | ||
273 | } | ||
274 | return false; | ||
275 | } | ||
276 | public void osSetPrimFloatOnWater(int floatYN) | ||
277 | { | ||
278 | if (!m_ScriptEngine.ScriptConfigSource.GetBoolean("AllowOSFunctions", false)) | ||
279 | { | ||
280 | OSSLError("osSetPrimFloatOnWater: permission denied"); | ||
281 | return; | ||
282 | } | ||
283 | |||
284 | m_host.AddScriptLPS(1); | ||
285 | if (m_host.ParentGroup != null) | ||
286 | { | ||
287 | if (m_host.ParentGroup.RootPart != null) | ||
288 | { | ||
289 | m_host.ParentGroup.RootPart.SetFloatOnWater(floatYN); | ||
290 | } | ||
291 | } | ||
292 | } | ||
293 | |||
294 | // Adam's super super custom animation functions | ||
295 | public void osAvatarPlayAnimation(string avatar, string animation) | ||
296 | { | ||
297 | if (!m_ScriptEngine.ScriptConfigSource.GetBoolean("AllowOSFunctions", false)) | ||
298 | { | ||
299 | OSSLError("osAvatarPlayAnimation: permission denied"); | ||
300 | return; | ||
301 | } | ||
302 | |||
303 | m_host.AddScriptLPS(1); | ||
304 | if (World.Entities.ContainsKey(avatar) && World.Entities[avatar] is ScenePresence) | ||
305 | { | ||
306 | ScenePresence target = (ScenePresence)World.Entities[avatar]; | ||
307 | target.AddAnimation(avatar); | ||
308 | } | ||
309 | } | ||
310 | |||
311 | public void osAvatarStopAnimation(string avatar, string animation) | ||
312 | { | ||
313 | if (!m_ScriptEngine.ScriptConfigSource.GetBoolean("AllowOSFunctions", false)) | ||
314 | { | ||
315 | OSSLError("osAvatarStopAnimation: permission denied"); | ||
316 | return; | ||
317 | } | ||
318 | |||
319 | m_host.AddScriptLPS(1); | ||
320 | if (World.Entities.ContainsKey(avatar) && World.Entities[avatar] is ScenePresence) | ||
321 | { | ||
322 | ScenePresence target = (ScenePresence)World.Entities[avatar]; | ||
323 | target.RemoveAnimation(animation); | ||
324 | } | ||
325 | } | ||
326 | |||
327 | //Texture draw functions | ||
328 | public string osMovePen(string drawList, int x, int y) | ||
329 | { | ||
330 | if (!m_ScriptEngine.ScriptConfigSource.GetBoolean("AllowOSFunctions", false)) | ||
331 | { | ||
332 | OSSLError("osMovePen: permission denied"); | ||
333 | return String.Empty; | ||
334 | } | ||
335 | |||
336 | m_host.AddScriptLPS(1); | ||
337 | drawList += "MoveTo " + x + "," + y + ";"; | ||
338 | return drawList; | ||
339 | } | ||
340 | |||
341 | public string osDrawLine(string drawList, int startX, int startY, int endX, int endY) | ||
342 | { | ||
343 | if (!m_ScriptEngine.ScriptConfigSource.GetBoolean("AllowOSFunctions", false)) | ||
344 | { | ||
345 | OSSLError("osDrawLine: permission denied"); | ||
346 | return String.Empty; | ||
347 | } | ||
348 | |||
349 | m_host.AddScriptLPS(1); | ||
350 | drawList += "MoveTo "+ startX+","+ startY +"; LineTo "+endX +","+endY +"; "; | ||
351 | return drawList; | ||
352 | } | ||
353 | |||
354 | public string osDrawLine(string drawList, int endX, int endY) | ||
355 | { | ||
356 | if (!m_ScriptEngine.ScriptConfigSource.GetBoolean("AllowOSFunctions", false)) | ||
357 | { | ||
358 | OSSLError("osDrawLine: permission denied"); | ||
359 | return String.Empty; | ||
360 | } | ||
361 | |||
362 | m_host.AddScriptLPS(1); | ||
363 | drawList += "LineTo " + endX + "," + endY + "; "; | ||
364 | return drawList; | ||
365 | } | ||
366 | |||
367 | public string osDrawText(string drawList, string text) | ||
368 | { | ||
369 | if (!m_ScriptEngine.ScriptConfigSource.GetBoolean("AllowOSFunctions", false)) | ||
370 | { | ||
371 | OSSLError("osDrawText: permission denied"); | ||
372 | return String.Empty; | ||
373 | } | ||
374 | |||
375 | m_host.AddScriptLPS(1); | ||
376 | drawList += "Text " + text + "; "; | ||
377 | return drawList; | ||
378 | } | ||
379 | |||
380 | public string osDrawEllipse(string drawList, int width, int height) | ||
381 | { | ||
382 | if (!m_ScriptEngine.ScriptConfigSource.GetBoolean("AllowOSFunctions", false)) | ||
383 | { | ||
384 | OSSLError("osDrawEllipse: permission denied"); | ||
385 | return String.Empty; | ||
386 | } | ||
387 | |||
388 | m_host.AddScriptLPS(1); | ||
389 | drawList += "Ellipse " + width + "," + height + "; "; | ||
390 | return drawList; | ||
391 | } | ||
392 | |||
393 | public string osDrawRectangle(string drawList, int width, int height) | ||
394 | { | ||
395 | if (!m_ScriptEngine.ScriptConfigSource.GetBoolean("AllowOSFunctions", false)) | ||
396 | { | ||
397 | OSSLError("osDrawRectangle: permission denied"); | ||
398 | return String.Empty; | ||
399 | } | ||
400 | |||
401 | m_host.AddScriptLPS(1); | ||
402 | drawList += "Rectangle " + width + "," + height + "; "; | ||
403 | return drawList; | ||
404 | } | ||
405 | |||
406 | public string osDrawFilledRectangle(string drawList, int width, int height) | ||
407 | { | ||
408 | if (!m_ScriptEngine.ScriptConfigSource.GetBoolean("AllowOSFunctions", false)) | ||
409 | { | ||
410 | OSSLError("osDrawFilledRectangle: permission denied"); | ||
411 | return String.Empty; | ||
412 | } | ||
413 | |||
414 | m_host.AddScriptLPS(1); | ||
415 | drawList += "FillRectangle " + width + "," + height + "; "; | ||
416 | return drawList; | ||
417 | } | ||
418 | |||
419 | public string osSetFontSize(string drawList, int fontSize) | ||
420 | { | ||
421 | if (!m_ScriptEngine.ScriptConfigSource.GetBoolean("AllowOSFunctions", false)) | ||
422 | { | ||
423 | OSSLError("osSetFontSize: permission denied"); | ||
424 | return String.Empty; | ||
425 | } | ||
426 | |||
427 | m_host.AddScriptLPS(1); | ||
428 | drawList += "FontSize "+ fontSize +"; "; | ||
429 | return drawList; | ||
430 | } | ||
431 | |||
432 | public string osSetPenSize(string drawList, int penSize) | ||
433 | { | ||
434 | if (!m_ScriptEngine.ScriptConfigSource.GetBoolean("AllowOSFunctions", false)) | ||
435 | { | ||
436 | OSSLError("osSetPenSize: permission denied"); | ||
437 | return String.Empty; | ||
438 | } | ||
439 | |||
440 | m_host.AddScriptLPS(1); | ||
441 | drawList += "PenSize " + penSize + "; "; | ||
442 | return drawList; | ||
443 | } | ||
444 | |||
445 | public string osSetPenColour(string drawList, string colour) | ||
446 | { | ||
447 | if (!m_ScriptEngine.ScriptConfigSource.GetBoolean("AllowOSFunctions", false)) | ||
448 | { | ||
449 | OSSLError("osSetPenColour: permission denied"); | ||
450 | return String.Empty; | ||
451 | } | ||
452 | |||
453 | m_host.AddScriptLPS(1); | ||
454 | drawList += "PenColour " + colour + "; "; | ||
455 | return drawList; | ||
456 | } | ||
457 | |||
458 | public string osDrawImage(string drawList, int width, int height, string imageUrl) | ||
459 | { | ||
460 | if (!m_ScriptEngine.ScriptConfigSource.GetBoolean("AllowOSFunctions", false)) | ||
461 | { | ||
462 | OSSLError("osDrawImage: permission denied"); | ||
463 | return String.Empty; | ||
464 | } | ||
465 | |||
466 | m_host.AddScriptLPS(1); | ||
467 | drawList +="Image " +width + "," + height+ ","+ imageUrl +"; " ; | ||
468 | return drawList; | ||
469 | } | ||
470 | |||
471 | public void osSetStateEvents(int events) | ||
472 | { | ||
473 | if (!m_ScriptEngine.ScriptConfigSource.GetBoolean("AllowOSFunctions", false)) | ||
474 | { | ||
475 | OSSLError("osSetStateEvents: permission denied"); | ||
476 | return; | ||
477 | } | ||
478 | |||
479 | m_host.SetScriptEvents(m_itemID, events); | ||
480 | } | ||
481 | |||
482 | public void osSetRegionWaterHeight(double height) | ||
483 | { | ||
484 | if (!m_ScriptEngine.ScriptConfigSource.GetBoolean("AllowOSFunctions", false)) | ||
485 | { | ||
486 | OSSLError("osSetRegionWaterHeight: permission denied"); | ||
487 | return; | ||
488 | } | ||
489 | |||
490 | m_host.AddScriptLPS(1); | ||
491 | //Check to make sure that the script's owner is the estate manager/master | ||
492 | //World.Permissions.GenericEstatePermission( | ||
493 | if (World.ExternalChecks.ExternalChecksCanBeGodLike(m_host.OwnerID)) | ||
494 | { | ||
495 | World.EventManager.TriggerRequestChangeWaterHeight((float)height); | ||
496 | } | ||
497 | } | ||
498 | |||
499 | public double osList2Double(LSL_Types.list src, int index) | ||
500 | { | ||
501 | if (!m_ScriptEngine.ScriptConfigSource.GetBoolean("AllowOSFunctions", false)) | ||
502 | { | ||
503 | OSSLError("osList2Double: permission denied"); | ||
504 | return 0.0; | ||
505 | } | ||
506 | |||
507 | m_host.AddScriptLPS(1); | ||
508 | if (index < 0) | ||
509 | { | ||
510 | index = src.Length + index; | ||
511 | } | ||
512 | if (index >= src.Length) | ||
513 | { | ||
514 | return 0.0; | ||
515 | } | ||
516 | return Convert.ToDouble(src.Data[index]); | ||
517 | } | ||
518 | |||
519 | public void osSetParcelMediaURL(string url) | ||
520 | { | ||
521 | if (!m_ScriptEngine.ScriptConfigSource.GetBoolean("AllowOSFunctions", false)) | ||
522 | { | ||
523 | OSSLError("osSetParcelMediaURL: permission denied"); | ||
524 | return; | ||
525 | } | ||
526 | |||
527 | m_host.AddScriptLPS(1); | ||
528 | LLUUID landowner = World.GetLandOwner(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y); | ||
529 | |||
530 | if (landowner == LLUUID.Zero) | ||
531 | { | ||
532 | return; | ||
533 | } | ||
534 | |||
535 | if (landowner != m_host.ObjectOwner) | ||
536 | { | ||
537 | return; | ||
538 | } | ||
539 | |||
540 | World.SetLandMediaURL(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y, url); | ||
541 | } | ||
542 | |||
543 | public Scene World | ||
544 | { | ||
545 | get { return m_ScriptEngine.World; } | ||
546 | } | ||
547 | |||
548 | internal void OSSLError(string msg) | ||
549 | { | ||
550 | throw new Exception("OSSL Runtime Error: " + msg); | ||
551 | } | ||
552 | } | ||
553 | } | ||
diff --git a/OpenSim/Region/ScriptEngine/XEngine/Script/AssemblyResolver.cs b/OpenSim/Region/ScriptEngine/XEngine/Script/AssemblyResolver.cs new file mode 100644 index 0000000..8107788 --- /dev/null +++ b/OpenSim/Region/ScriptEngine/XEngine/Script/AssemblyResolver.cs | |||
@@ -0,0 +1,65 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSim Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.IO; | ||
30 | using System.Reflection; | ||
31 | |||
32 | namespace OpenSim.Region.ScriptEngine.XEngine.Script | ||
33 | { | ||
34 | [Serializable] | ||
35 | public class AssemblyResolver | ||
36 | { | ||
37 | public static Assembly OnAssemblyResolve(object sender, | ||
38 | ResolveEventArgs args) | ||
39 | { | ||
40 | if(!(sender is System.AppDomain)) | ||
41 | return null; | ||
42 | |||
43 | AppDomain myDomain = (AppDomain)sender; | ||
44 | string dirName = myDomain.FriendlyName; | ||
45 | |||
46 | string[] pathList=new string[] {"bin", "ScriptEngines", | ||
47 | Path.Combine("ScriptEngines", dirName)}; | ||
48 | |||
49 | string assemblyName = args.Name; | ||
50 | if(assemblyName.IndexOf(",") != -1) | ||
51 | assemblyName=args.Name.Substring(0, args.Name.IndexOf(",")); | ||
52 | |||
53 | foreach (string s in pathList) | ||
54 | { | ||
55 | string path=Path.Combine(Directory.GetCurrentDirectory(), | ||
56 | Path.Combine(s, assemblyName))+".dll"; | ||
57 | |||
58 | if(File.Exists(path)) | ||
59 | return Assembly.LoadFrom(path); | ||
60 | } | ||
61 | |||
62 | return null; | ||
63 | } | ||
64 | } | ||
65 | } | ||
diff --git a/OpenSim/Region/ScriptEngine/XEngine/Script/BuiltIn_Commands_BaseClass.cs b/OpenSim/Region/ScriptEngine/XEngine/Script/BuiltIn_Commands_BaseClass.cs new file mode 100644 index 0000000..bae8192 --- /dev/null +++ b/OpenSim/Region/ScriptEngine/XEngine/Script/BuiltIn_Commands_BaseClass.cs | |||
@@ -0,0 +1,2393 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSim Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.Runtime.Remoting.Lifetime; | ||
30 | using System.Threading; | ||
31 | using System.Reflection; | ||
32 | using System.Collections; | ||
33 | using System.Collections.Generic; | ||
34 | using OpenSim.Region.Environment.Interfaces; | ||
35 | using integer = OpenSim.Region.ScriptEngine.XEngine.Script.LSL_Types.LSLInteger; | ||
36 | using key = System.String; | ||
37 | using vector = OpenSim.Region.ScriptEngine.XEngine.Script.LSL_Types.Vector3; | ||
38 | using rotation = OpenSim.Region.ScriptEngine.XEngine.Script.LSL_Types.Quaternion; | ||
39 | |||
40 | namespace OpenSim.Region.ScriptEngine.XEngine.Script | ||
41 | { | ||
42 | public class BuiltIn_Commands_BaseClass : MarshalByRefObject, IOSSL_ScriptCommands, ILSL_ScriptCommands, IScript | ||
43 | { | ||
44 | //private static readonly log4net.ILog m_log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); | ||
45 | |||
46 | // Object never expires | ||
47 | public override Object InitializeLifetimeService() | ||
48 | { | ||
49 | //Console.WriteLine("LSL_BaseClass: InitializeLifetimeService()"); | ||
50 | // return null; | ||
51 | ILease lease = (ILease)base.InitializeLifetimeService(); | ||
52 | |||
53 | if (lease.CurrentState == LeaseState.Initial) | ||
54 | { | ||
55 | lease.InitialLeaseTime = TimeSpan.Zero; // TimeSpan.FromMinutes(1); | ||
56 | //lease.SponsorshipTimeout = TimeSpan.FromMinutes(2); | ||
57 | //lease.RenewOnCallTime = TimeSpan.FromSeconds(2); | ||
58 | } | ||
59 | return lease; | ||
60 | } | ||
61 | |||
62 | public ILSL_ScriptCommands m_LSL_Functions; | ||
63 | public IOSSL_ScriptCommands m_OSSL_Functions; | ||
64 | |||
65 | public BuiltIn_Commands_BaseClass() | ||
66 | { | ||
67 | } | ||
68 | |||
69 | public Type Start(ILSL_ScriptCommands LSL_Functions, IOSSL_ScriptCommands OSSL_Functions) | ||
70 | { | ||
71 | m_LSL_Functions = LSL_Functions; | ||
72 | m_OSSL_Functions = OSSL_Functions; | ||
73 | m_InitialValues=GetVars(); | ||
74 | return GetType(); | ||
75 | } | ||
76 | |||
77 | private Dictionary<string, object> m_InitialValues = | ||
78 | new Dictionary<string, object>(); | ||
79 | private Dictionary<string, FieldInfo> m_Fields = | ||
80 | new Dictionary<string, FieldInfo>(); | ||
81 | |||
82 | public Dictionary<string, object> GetVars() | ||
83 | { | ||
84 | m_Fields.Clear(); | ||
85 | |||
86 | Dictionary<string, object> vars = new Dictionary<string, object>(); | ||
87 | |||
88 | Type t = GetType(); | ||
89 | |||
90 | FieldInfo[] fields = t.GetFields(BindingFlags.NonPublic | | ||
91 | BindingFlags.Public | | ||
92 | BindingFlags.Instance | | ||
93 | BindingFlags.DeclaredOnly); | ||
94 | |||
95 | foreach (FieldInfo field in fields) | ||
96 | { | ||
97 | m_Fields[field.Name]=field; | ||
98 | |||
99 | vars[field.Name]=field.GetValue(this); | ||
100 | } | ||
101 | |||
102 | return vars; | ||
103 | } | ||
104 | |||
105 | public void SetVars(Dictionary<string, object> vars) | ||
106 | { | ||
107 | foreach (KeyValuePair<string, object> var in vars) | ||
108 | { | ||
109 | if(m_Fields.ContainsKey(var.Key)) | ||
110 | { | ||
111 | m_Fields[var.Key].SetValue(this, var.Value); | ||
112 | } | ||
113 | } | ||
114 | } | ||
115 | |||
116 | public void ResetVars() | ||
117 | { | ||
118 | SetVars(m_InitialValues); | ||
119 | } | ||
120 | |||
121 | public string State | ||
122 | { | ||
123 | get { return m_LSL_Functions.State; } | ||
124 | set { m_LSL_Functions.State = value; } | ||
125 | } | ||
126 | |||
127 | public void state(string newState) | ||
128 | { | ||
129 | m_LSL_Functions.state(newState); | ||
130 | } | ||
131 | |||
132 | public void llSay(int channelID, string text) | ||
133 | { | ||
134 | m_LSL_Functions.llSay(channelID, text); | ||
135 | } | ||
136 | |||
137 | // | ||
138 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs | ||
139 | // | ||
140 | // They are only forwarders to LSL_BuiltIn_Commands.cs | ||
141 | // | ||
142 | |||
143 | public ICommander GetCommander(string name) | ||
144 | { | ||
145 | return m_LSL_Functions.GetCommander(name); | ||
146 | } | ||
147 | |||
148 | public double llSin(double f) | ||
149 | { | ||
150 | return m_LSL_Functions.llSin(f); | ||
151 | } | ||
152 | public double llCos(double f) | ||
153 | { | ||
154 | return m_LSL_Functions.llCos(f); | ||
155 | } | ||
156 | |||
157 | public double llTan(double f) | ||
158 | { | ||
159 | return m_LSL_Functions.llTan(f); | ||
160 | } | ||
161 | |||
162 | public double llAtan2(double x, double y) | ||
163 | { | ||
164 | return m_LSL_Functions.llAtan2(x, y); | ||
165 | } | ||
166 | |||
167 | public double llSqrt(double f) | ||
168 | { | ||
169 | return m_LSL_Functions.llSqrt(f); | ||
170 | } | ||
171 | |||
172 | public double llPow(double fbase, double fexponent) | ||
173 | { | ||
174 | return m_LSL_Functions.llPow(fbase, fexponent); | ||
175 | } | ||
176 | |||
177 | public LSL_Types.LSLInteger llAbs(int i) | ||
178 | { | ||
179 | return m_LSL_Functions.llAbs(i); | ||
180 | } | ||
181 | |||
182 | public double llFabs(double f) | ||
183 | { | ||
184 | return m_LSL_Functions.llFabs(f); | ||
185 | } | ||
186 | |||
187 | public double llFrand(double mag) | ||
188 | { | ||
189 | return m_LSL_Functions.llFrand(mag); | ||
190 | } | ||
191 | |||
192 | public LSL_Types.LSLInteger llFloor(double f) | ||
193 | { | ||
194 | return m_LSL_Functions.llFloor(f); | ||
195 | } | ||
196 | |||
197 | public LSL_Types.LSLInteger llCeil(double f) | ||
198 | { | ||
199 | return m_LSL_Functions.llCeil(f); | ||
200 | } | ||
201 | |||
202 | public LSL_Types.LSLInteger llRound(double f) | ||
203 | { | ||
204 | return m_LSL_Functions.llRound(f); | ||
205 | } | ||
206 | |||
207 | public double llVecMag(vector v) | ||
208 | { | ||
209 | return m_LSL_Functions.llVecMag(v); | ||
210 | } | ||
211 | |||
212 | public vector llVecNorm(vector v) | ||
213 | { | ||
214 | return m_LSL_Functions.llVecNorm(v); | ||
215 | } | ||
216 | |||
217 | public double llVecDist(vector a, vector b) | ||
218 | { | ||
219 | return m_LSL_Functions.llVecDist(a, b); | ||
220 | } | ||
221 | |||
222 | public vector llRot2Euler(rotation r) | ||
223 | { | ||
224 | return m_LSL_Functions.llRot2Euler(r); | ||
225 | } | ||
226 | |||
227 | public rotation llEuler2Rot(vector v) | ||
228 | { | ||
229 | return m_LSL_Functions.llEuler2Rot(v); | ||
230 | } | ||
231 | |||
232 | public rotation llAxes2Rot(vector fwd, vector left, vector up) | ||
233 | { | ||
234 | return m_LSL_Functions.llAxes2Rot(fwd, left, up); | ||
235 | } | ||
236 | |||
237 | public vector llRot2Fwd(rotation r) | ||
238 | { | ||
239 | return m_LSL_Functions.llRot2Fwd(r); | ||
240 | } | ||
241 | |||
242 | public vector llRot2Left(rotation r) | ||
243 | { | ||
244 | return m_LSL_Functions.llRot2Left(r); | ||
245 | } | ||
246 | |||
247 | public vector llRot2Up(rotation r) | ||
248 | { | ||
249 | return m_LSL_Functions.llRot2Up(r); | ||
250 | } | ||
251 | |||
252 | public rotation llRotBetween(vector start, vector end) | ||
253 | { | ||
254 | return m_LSL_Functions.llRotBetween(start, end); | ||
255 | } | ||
256 | |||
257 | public void llWhisper(int channelID, string text) | ||
258 | { | ||
259 | m_LSL_Functions.llWhisper(channelID, text); | ||
260 | } | ||
261 | |||
262 | // | ||
263 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs | ||
264 | // | ||
265 | public void llShout(int channelID, string text) | ||
266 | { | ||
267 | m_LSL_Functions.llShout(channelID, text); | ||
268 | } | ||
269 | |||
270 | public void llRegionSay(int channelID, string text) | ||
271 | { | ||
272 | m_LSL_Functions.llRegionSay(channelID, text); | ||
273 | } | ||
274 | |||
275 | public LSL_Types.LSLInteger llListen(int channelID, string name, string ID, string msg) | ||
276 | { | ||
277 | return m_LSL_Functions.llListen(channelID, name, ID, msg); | ||
278 | } | ||
279 | |||
280 | public void llListenControl(int number, int active) | ||
281 | { | ||
282 | m_LSL_Functions.llListenControl(number, active); | ||
283 | } | ||
284 | |||
285 | public void llListenRemove(int number) | ||
286 | { | ||
287 | m_LSL_Functions.llListenRemove(number); | ||
288 | } | ||
289 | |||
290 | public void llSensor(string name, string id, int type, double range, double arc) | ||
291 | { | ||
292 | m_LSL_Functions.llSensor(name, id, type, range, arc); | ||
293 | } | ||
294 | |||
295 | public void llSensorRepeat(string name, string id, int type, double range, double arc, double rate) | ||
296 | { | ||
297 | m_LSL_Functions.llSensorRepeat(name, id, type, range, arc, rate); | ||
298 | } | ||
299 | |||
300 | public void llSensorRemove() | ||
301 | { | ||
302 | m_LSL_Functions.llSensorRemove(); | ||
303 | } | ||
304 | |||
305 | public string llDetectedName(int number) | ||
306 | { | ||
307 | return m_LSL_Functions.llDetectedName(number); | ||
308 | } | ||
309 | |||
310 | public string llDetectedKey(int number) | ||
311 | { | ||
312 | return m_LSL_Functions.llDetectedKey(number); | ||
313 | } | ||
314 | |||
315 | public string llDetectedOwner(int number) | ||
316 | { | ||
317 | return m_LSL_Functions.llDetectedOwner(number); | ||
318 | } | ||
319 | |||
320 | public LSL_Types.LSLInteger llDetectedType(int number) | ||
321 | { | ||
322 | return m_LSL_Functions.llDetectedType(number); | ||
323 | } | ||
324 | |||
325 | public vector llDetectedPos(int number) | ||
326 | { | ||
327 | return m_LSL_Functions.llDetectedPos(number); | ||
328 | } | ||
329 | |||
330 | public vector llDetectedVel(int number) | ||
331 | { | ||
332 | return m_LSL_Functions.llDetectedVel(number); | ||
333 | } | ||
334 | |||
335 | public vector llDetectedGrab(int number) | ||
336 | { | ||
337 | return m_LSL_Functions.llDetectedGrab(number); | ||
338 | } | ||
339 | |||
340 | public rotation llDetectedRot(int number) | ||
341 | { | ||
342 | return m_LSL_Functions.llDetectedRot(number); | ||
343 | } | ||
344 | |||
345 | public LSL_Types.LSLInteger llDetectedGroup(int number) | ||
346 | { | ||
347 | return m_LSL_Functions.llDetectedGroup(number); | ||
348 | } | ||
349 | |||
350 | public LSL_Types.LSLInteger llDetectedLinkNumber(int number) | ||
351 | { | ||
352 | return m_LSL_Functions.llDetectedLinkNumber(number); | ||
353 | } | ||
354 | |||
355 | // | ||
356 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs | ||
357 | // | ||
358 | public void llDie() | ||
359 | { | ||
360 | m_LSL_Functions.llDie(); | ||
361 | } | ||
362 | |||
363 | public double llGround(vector offset) | ||
364 | { | ||
365 | return m_LSL_Functions.llGround(offset); | ||
366 | } | ||
367 | |||
368 | public double llCloud(vector offset) | ||
369 | { | ||
370 | return m_LSL_Functions.llCloud(offset); | ||
371 | } | ||
372 | |||
373 | public vector llWind(vector offset) | ||
374 | { | ||
375 | return m_LSL_Functions.llWind(offset); | ||
376 | } | ||
377 | |||
378 | public void llSetStatus(int status, int value) | ||
379 | { | ||
380 | m_LSL_Functions.llSetStatus(status, value); | ||
381 | } | ||
382 | |||
383 | public LSL_Types.LSLInteger llGetStatus(int status) | ||
384 | { | ||
385 | return m_LSL_Functions.llGetStatus(status); | ||
386 | } | ||
387 | |||
388 | public void llSetScale(vector scale) | ||
389 | { | ||
390 | m_LSL_Functions.llSetScale(scale); | ||
391 | } | ||
392 | |||
393 | public vector llGetScale() | ||
394 | { | ||
395 | return m_LSL_Functions.llGetScale(); | ||
396 | } | ||
397 | |||
398 | public void llSetColor(vector color, int face) | ||
399 | { | ||
400 | m_LSL_Functions.llSetColor(color, face); | ||
401 | } | ||
402 | |||
403 | public double llGetAlpha(int face) | ||
404 | { | ||
405 | return m_LSL_Functions.llGetAlpha(face); | ||
406 | } | ||
407 | |||
408 | public void llSetAlpha(double alpha, int face) | ||
409 | { | ||
410 | m_LSL_Functions.llSetAlpha(alpha, face); | ||
411 | } | ||
412 | |||
413 | public vector llGetColor(int face) | ||
414 | { | ||
415 | return m_LSL_Functions.llGetColor(face); | ||
416 | } | ||
417 | |||
418 | public void llSetTexture(string texture, int face) | ||
419 | { | ||
420 | m_LSL_Functions.llSetTexture(texture, face); | ||
421 | } | ||
422 | |||
423 | public void llScaleTexture(double u, double v, int face) | ||
424 | { | ||
425 | m_LSL_Functions.llScaleTexture(u, v, face); | ||
426 | } | ||
427 | |||
428 | public void llOffsetTexture(double u, double v, int face) | ||
429 | { | ||
430 | m_LSL_Functions.llOffsetTexture(u, v, face); | ||
431 | } | ||
432 | |||
433 | public void llRotateTexture(double rotation, int face) | ||
434 | { | ||
435 | m_LSL_Functions.llRotateTexture(rotation, face); | ||
436 | } | ||
437 | |||
438 | public string llGetTexture(int face) | ||
439 | { | ||
440 | return m_LSL_Functions.llGetTexture(face); | ||
441 | } | ||
442 | |||
443 | // | ||
444 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs | ||
445 | // | ||
446 | public void llSetPos(vector pos) | ||
447 | { | ||
448 | m_LSL_Functions.llSetPos(pos); | ||
449 | } | ||
450 | |||
451 | public vector llGetPos() | ||
452 | { | ||
453 | return m_LSL_Functions.llGetPos(); | ||
454 | } | ||
455 | |||
456 | public vector llGetLocalPos() | ||
457 | { | ||
458 | return m_LSL_Functions.llGetLocalPos(); | ||
459 | } | ||
460 | |||
461 | public void llSetRot(rotation rot) | ||
462 | { | ||
463 | m_LSL_Functions.llSetRot(rot); | ||
464 | } | ||
465 | |||
466 | public rotation llGetRot() | ||
467 | { | ||
468 | return m_LSL_Functions.llGetRot(); | ||
469 | } | ||
470 | |||
471 | public rotation llGetLocalRot() | ||
472 | { | ||
473 | return m_LSL_Functions.llGetLocalRot(); | ||
474 | } | ||
475 | |||
476 | public void llSetForce(vector force, int local) | ||
477 | { | ||
478 | m_LSL_Functions.llSetForce(force, local); | ||
479 | } | ||
480 | |||
481 | public vector llGetForce() | ||
482 | { | ||
483 | return m_LSL_Functions.llGetForce(); | ||
484 | } | ||
485 | |||
486 | public LSL_Types.LSLInteger llTarget(vector position, double range) | ||
487 | { | ||
488 | return m_LSL_Functions.llTarget(position, range); | ||
489 | } | ||
490 | |||
491 | public void llTargetRemove(int number) | ||
492 | { | ||
493 | m_LSL_Functions.llTargetRemove(number); | ||
494 | } | ||
495 | |||
496 | public LSL_Types.LSLInteger llRotTarget(rotation rot, double error) | ||
497 | { | ||
498 | return m_LSL_Functions.llRotTarget(rot, error); | ||
499 | } | ||
500 | |||
501 | public void llRotTargetRemove(int number) | ||
502 | { | ||
503 | m_LSL_Functions.llRotTargetRemove(number); | ||
504 | } | ||
505 | |||
506 | public void llMoveToTarget(vector target, double tau) | ||
507 | { | ||
508 | m_LSL_Functions.llMoveToTarget(target, tau); | ||
509 | } | ||
510 | |||
511 | public void llStopMoveToTarget() | ||
512 | { | ||
513 | m_LSL_Functions.llStopMoveToTarget(); | ||
514 | } | ||
515 | |||
516 | public void llApplyImpulse(vector force, int local) | ||
517 | { | ||
518 | m_LSL_Functions.llApplyImpulse(force, local); | ||
519 | } | ||
520 | |||
521 | // | ||
522 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs | ||
523 | // | ||
524 | public void llApplyRotationalImpulse(vector force, int local) | ||
525 | { | ||
526 | m_LSL_Functions.llApplyRotationalImpulse(force, local); | ||
527 | } | ||
528 | |||
529 | public void llSetTorque(vector torque, int local) | ||
530 | { | ||
531 | m_LSL_Functions.llSetTorque(torque, local); | ||
532 | } | ||
533 | |||
534 | public vector llGetTorque() | ||
535 | { | ||
536 | return m_LSL_Functions.llGetTorque(); | ||
537 | } | ||
538 | |||
539 | public void llSetForceAndTorque(vector force, vector torque, int local) | ||
540 | { | ||
541 | m_LSL_Functions.llSetForceAndTorque(force, torque, local); | ||
542 | } | ||
543 | |||
544 | public vector llGetVel() | ||
545 | { | ||
546 | return m_LSL_Functions.llGetVel(); | ||
547 | } | ||
548 | |||
549 | public vector llGetAccel() | ||
550 | { | ||
551 | return m_LSL_Functions.llGetAccel(); | ||
552 | } | ||
553 | |||
554 | public vector llGetOmega() | ||
555 | { | ||
556 | return m_LSL_Functions.llGetOmega(); | ||
557 | } | ||
558 | |||
559 | public double llGetTimeOfDay() | ||
560 | { | ||
561 | return m_LSL_Functions.llGetTimeOfDay(); | ||
562 | } | ||
563 | |||
564 | public double llGetWallclock() | ||
565 | { | ||
566 | return m_LSL_Functions.llGetWallclock(); | ||
567 | } | ||
568 | |||
569 | public double llGetTime() | ||
570 | { | ||
571 | return m_LSL_Functions.llGetTime(); | ||
572 | } | ||
573 | |||
574 | public void llResetTime() | ||
575 | { | ||
576 | m_LSL_Functions.llResetTime(); | ||
577 | } | ||
578 | |||
579 | public double llGetAndResetTime() | ||
580 | { | ||
581 | return m_LSL_Functions.llGetAndResetTime(); | ||
582 | } | ||
583 | |||
584 | public void llSound() | ||
585 | { | ||
586 | m_LSL_Functions.llSound(); | ||
587 | } | ||
588 | |||
589 | public void llPlaySound(string sound, double volume) | ||
590 | { | ||
591 | m_LSL_Functions.llPlaySound(sound, volume); | ||
592 | } | ||
593 | |||
594 | public void llLoopSound(string sound, double volume) | ||
595 | { | ||
596 | m_LSL_Functions.llLoopSound(sound, volume); | ||
597 | } | ||
598 | |||
599 | public void llLoopSoundMaster(string sound, double volume) | ||
600 | { | ||
601 | m_LSL_Functions.llLoopSoundMaster(sound, volume); | ||
602 | } | ||
603 | |||
604 | public void llLoopSoundSlave(string sound, double volume) | ||
605 | { | ||
606 | m_LSL_Functions.llLoopSoundSlave(sound, volume); | ||
607 | } | ||
608 | |||
609 | public void llPlaySoundSlave(string sound, double volume) | ||
610 | { | ||
611 | m_LSL_Functions.llPlaySoundSlave(sound, volume); | ||
612 | } | ||
613 | |||
614 | // | ||
615 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs | ||
616 | // | ||
617 | public void llTriggerSound(string sound, double volume) | ||
618 | { | ||
619 | m_LSL_Functions.llTriggerSound(sound, volume); | ||
620 | } | ||
621 | |||
622 | public void llStopSound() | ||
623 | { | ||
624 | m_LSL_Functions.llStopSound(); | ||
625 | } | ||
626 | |||
627 | public void llPreloadSound(string sound) | ||
628 | { | ||
629 | m_LSL_Functions.llPreloadSound(sound); | ||
630 | } | ||
631 | |||
632 | public string llGetSubString(string src, int start, int end) | ||
633 | { | ||
634 | return m_LSL_Functions.llGetSubString(src, start, end); | ||
635 | } | ||
636 | |||
637 | public string llDeleteSubString(string src, int start, int end) | ||
638 | { | ||
639 | return m_LSL_Functions.llDeleteSubString(src, start, end); | ||
640 | } | ||
641 | |||
642 | public string llInsertString(string dst, int position, string src) | ||
643 | { | ||
644 | return m_LSL_Functions.llInsertString(dst, position, src); | ||
645 | } | ||
646 | |||
647 | public string llToUpper(string source) | ||
648 | { | ||
649 | return m_LSL_Functions.llToUpper(source); | ||
650 | } | ||
651 | |||
652 | public string llToLower(string source) | ||
653 | { | ||
654 | return m_LSL_Functions.llToLower(source); | ||
655 | } | ||
656 | |||
657 | public LSL_Types.LSLInteger llGiveMoney(string destination, int amount) | ||
658 | { | ||
659 | return m_LSL_Functions.llGiveMoney(destination, amount); | ||
660 | } | ||
661 | |||
662 | public void llMakeExplosion() | ||
663 | { | ||
664 | m_LSL_Functions.llMakeExplosion(); | ||
665 | } | ||
666 | |||
667 | public void llMakeFountain() | ||
668 | { | ||
669 | m_LSL_Functions.llMakeFountain(); | ||
670 | } | ||
671 | |||
672 | public void llMakeSmoke() | ||
673 | { | ||
674 | m_LSL_Functions.llMakeSmoke(); | ||
675 | } | ||
676 | |||
677 | public void llMakeFire() | ||
678 | { | ||
679 | m_LSL_Functions.llMakeFire(); | ||
680 | } | ||
681 | |||
682 | public void llRezObject(string inventory, vector pos, vector vel, rotation rot, int param) | ||
683 | { | ||
684 | m_LSL_Functions.llRezObject(inventory, pos, vel, rot, param); | ||
685 | } | ||
686 | |||
687 | public void llLookAt(vector target, double strength, double damping) | ||
688 | { | ||
689 | m_LSL_Functions.llLookAt(target, strength, damping); | ||
690 | } | ||
691 | |||
692 | public void llStopLookAt() | ||
693 | { | ||
694 | m_LSL_Functions.llStopLookAt(); | ||
695 | } | ||
696 | |||
697 | public void llSetTimerEvent(double sec) | ||
698 | { | ||
699 | m_LSL_Functions.llSetTimerEvent(sec); | ||
700 | } | ||
701 | |||
702 | public void llSleep(double sec) | ||
703 | { | ||
704 | m_LSL_Functions.llSleep(sec); | ||
705 | } | ||
706 | |||
707 | // | ||
708 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs | ||
709 | // | ||
710 | public double llGetMass() | ||
711 | { | ||
712 | return m_LSL_Functions.llGetMass(); | ||
713 | } | ||
714 | |||
715 | public void llCollisionFilter(string name, string id, int accept) | ||
716 | { | ||
717 | m_LSL_Functions.llCollisionFilter(name, id, accept); | ||
718 | } | ||
719 | |||
720 | public void llTakeControls(int controls, int accept, int pass_on) | ||
721 | { | ||
722 | m_LSL_Functions.llTakeControls(controls, accept, pass_on); | ||
723 | } | ||
724 | |||
725 | public void llReleaseControls() | ||
726 | { | ||
727 | m_LSL_Functions.llReleaseControls(); | ||
728 | } | ||
729 | |||
730 | public void llAttachToAvatar(int attachment) | ||
731 | { | ||
732 | m_LSL_Functions.llAttachToAvatar(attachment); | ||
733 | } | ||
734 | |||
735 | public void llDetachFromAvatar() | ||
736 | { | ||
737 | m_LSL_Functions.llDetachFromAvatar(); | ||
738 | } | ||
739 | |||
740 | public void llTakeCamera() | ||
741 | { | ||
742 | m_LSL_Functions.llTakeCamera(); | ||
743 | } | ||
744 | |||
745 | public void llReleaseCamera() | ||
746 | { | ||
747 | m_LSL_Functions.llReleaseCamera(); | ||
748 | } | ||
749 | |||
750 | public string llGetOwner() | ||
751 | { | ||
752 | return m_LSL_Functions.llGetOwner(); | ||
753 | } | ||
754 | |||
755 | public void llInstantMessage(string user, string message) | ||
756 | { | ||
757 | m_LSL_Functions.llInstantMessage(user, message); | ||
758 | } | ||
759 | |||
760 | public void llEmail(string address, string subject, string message) | ||
761 | { | ||
762 | m_LSL_Functions.llEmail(address, subject, message); | ||
763 | } | ||
764 | |||
765 | public void llGetNextEmail(string address, string subject) | ||
766 | { | ||
767 | m_LSL_Functions.llGetNextEmail(address, subject); | ||
768 | } | ||
769 | |||
770 | public string llGetKey() | ||
771 | { | ||
772 | return m_LSL_Functions.llGetKey(); | ||
773 | } | ||
774 | |||
775 | public void llSetBuoyancy(double buoyancy) | ||
776 | { | ||
777 | m_LSL_Functions.llSetBuoyancy(buoyancy); | ||
778 | } | ||
779 | |||
780 | public void llSetHoverHeight(double height, int water, double tau) | ||
781 | { | ||
782 | m_LSL_Functions.llSetHoverHeight(height, water, tau); | ||
783 | } | ||
784 | |||
785 | public void llStopHover() | ||
786 | { | ||
787 | m_LSL_Functions.llStopHover(); | ||
788 | } | ||
789 | |||
790 | public void llMinEventDelay(double delay) | ||
791 | { | ||
792 | m_LSL_Functions.llMinEventDelay(delay); | ||
793 | } | ||
794 | |||
795 | public void llSoundPreload() | ||
796 | { | ||
797 | m_LSL_Functions.llSoundPreload(); | ||
798 | } | ||
799 | |||
800 | public void llRotLookAt(rotation target, double strength, double damping) | ||
801 | { | ||
802 | m_LSL_Functions.llRotLookAt(target, strength, damping); | ||
803 | } | ||
804 | |||
805 | // | ||
806 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs | ||
807 | // | ||
808 | public LSL_Types.LSLInteger llStringLength(string str) | ||
809 | { | ||
810 | return m_LSL_Functions.llStringLength(str); | ||
811 | } | ||
812 | |||
813 | public void llStartAnimation(string anim) | ||
814 | { | ||
815 | m_LSL_Functions.llStartAnimation(anim); | ||
816 | } | ||
817 | |||
818 | public void llStopAnimation(string anim) | ||
819 | { | ||
820 | m_LSL_Functions.llStopAnimation(anim); | ||
821 | } | ||
822 | |||
823 | public void llPointAt() | ||
824 | { | ||
825 | m_LSL_Functions.llPointAt(); | ||
826 | } | ||
827 | |||
828 | public void llStopPointAt() | ||
829 | { | ||
830 | m_LSL_Functions.llStopPointAt(); | ||
831 | } | ||
832 | |||
833 | public void llTargetOmega(vector axis, double spinrate, double gain) | ||
834 | { | ||
835 | m_LSL_Functions.llTargetOmega(axis, spinrate, gain); | ||
836 | } | ||
837 | |||
838 | public LSL_Types.LSLInteger llGetStartParameter() | ||
839 | { | ||
840 | return m_LSL_Functions.llGetStartParameter(); | ||
841 | } | ||
842 | |||
843 | public void llGodLikeRezObject(string inventory, vector pos) | ||
844 | { | ||
845 | m_LSL_Functions.llGodLikeRezObject(inventory, pos); | ||
846 | } | ||
847 | |||
848 | public void llRequestPermissions(string agent, int perm) | ||
849 | { | ||
850 | m_LSL_Functions.llRequestPermissions(agent, perm); | ||
851 | } | ||
852 | |||
853 | public string llGetPermissionsKey() | ||
854 | { | ||
855 | return m_LSL_Functions.llGetPermissionsKey(); | ||
856 | } | ||
857 | |||
858 | public LSL_Types.LSLInteger llGetPermissions() | ||
859 | { | ||
860 | return m_LSL_Functions.llGetPermissions(); | ||
861 | } | ||
862 | |||
863 | public LSL_Types.LSLInteger llGetLinkNumber() | ||
864 | { | ||
865 | return m_LSL_Functions.llGetLinkNumber(); | ||
866 | } | ||
867 | |||
868 | public void llSetLinkColor(int linknumber, vector color, int face) | ||
869 | { | ||
870 | m_LSL_Functions.llSetLinkColor(linknumber, color, face); | ||
871 | } | ||
872 | |||
873 | public void llCreateLink(string target, int parent) | ||
874 | { | ||
875 | m_LSL_Functions.llCreateLink(target, parent); | ||
876 | } | ||
877 | |||
878 | public void llBreakLink(int linknum) | ||
879 | { | ||
880 | m_LSL_Functions.llBreakLink(linknum); | ||
881 | } | ||
882 | |||
883 | public void llBreakAllLinks() | ||
884 | { | ||
885 | m_LSL_Functions.llBreakAllLinks(); | ||
886 | } | ||
887 | |||
888 | public string llGetLinkKey(int linknum) | ||
889 | { | ||
890 | return m_LSL_Functions.llGetLinkKey(linknum); | ||
891 | } | ||
892 | |||
893 | public string llGetLinkName(int linknum) | ||
894 | { | ||
895 | return m_LSL_Functions.llGetLinkName(linknum); | ||
896 | } | ||
897 | |||
898 | public LSL_Types.LSLInteger llGetInventoryNumber(int type) | ||
899 | { | ||
900 | return m_LSL_Functions.llGetInventoryNumber(type); | ||
901 | } | ||
902 | |||
903 | public string llGetInventoryName(int type, int number) | ||
904 | { | ||
905 | return m_LSL_Functions.llGetInventoryName(type, number); | ||
906 | } | ||
907 | |||
908 | // | ||
909 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs | ||
910 | // | ||
911 | public void llSetScriptState(string name, int run) | ||
912 | { | ||
913 | m_LSL_Functions.llSetScriptState(name, run); | ||
914 | } | ||
915 | |||
916 | public double llGetEnergy() | ||
917 | { | ||
918 | return m_LSL_Functions.llGetEnergy(); | ||
919 | } | ||
920 | |||
921 | public void llGiveInventory(string destination, string inventory) | ||
922 | { | ||
923 | m_LSL_Functions.llGiveInventory(destination, inventory); | ||
924 | } | ||
925 | |||
926 | public void llRemoveInventory(string item) | ||
927 | { | ||
928 | m_LSL_Functions.llRemoveInventory(item); | ||
929 | } | ||
930 | |||
931 | public void llSetText(string text, vector color, double alpha) | ||
932 | { | ||
933 | m_LSL_Functions.llSetText(text, color, alpha); | ||
934 | } | ||
935 | |||
936 | public double llWater(vector offset) | ||
937 | { | ||
938 | return m_LSL_Functions.llWater(offset); | ||
939 | } | ||
940 | |||
941 | public void llPassTouches(int pass) | ||
942 | { | ||
943 | m_LSL_Functions.llPassTouches(pass); | ||
944 | } | ||
945 | |||
946 | public string llRequestAgentData(string id, int data) | ||
947 | { | ||
948 | return m_LSL_Functions.llRequestAgentData(id, data); | ||
949 | } | ||
950 | |||
951 | public string llRequestInventoryData(string name) | ||
952 | { | ||
953 | return m_LSL_Functions.llRequestInventoryData(name); | ||
954 | } | ||
955 | |||
956 | public void llSetDamage(double damage) | ||
957 | { | ||
958 | m_LSL_Functions.llSetDamage(damage); | ||
959 | } | ||
960 | |||
961 | public void llTeleportAgentHome(string agent) | ||
962 | { | ||
963 | m_LSL_Functions.llTeleportAgentHome(agent); | ||
964 | } | ||
965 | |||
966 | public void llModifyLand(int action, int brush) | ||
967 | { | ||
968 | m_LSL_Functions.llModifyLand(action, brush); | ||
969 | } | ||
970 | |||
971 | public void llCollisionSound(string impact_sound, double impact_volume) | ||
972 | { | ||
973 | m_LSL_Functions.llCollisionSound(impact_sound, impact_volume); | ||
974 | } | ||
975 | |||
976 | public void llCollisionSprite(string impact_sprite) | ||
977 | { | ||
978 | m_LSL_Functions.llCollisionSprite(impact_sprite); | ||
979 | } | ||
980 | |||
981 | public string llGetAnimation(string id) | ||
982 | { | ||
983 | return m_LSL_Functions.llGetAnimation(id); | ||
984 | } | ||
985 | |||
986 | public void llResetScript() | ||
987 | { | ||
988 | m_LSL_Functions.llResetScript(); | ||
989 | } | ||
990 | |||
991 | public void llMessageLinked(int linknum, int num, string str, string id) | ||
992 | { | ||
993 | m_LSL_Functions.llMessageLinked(linknum, num, str, id); | ||
994 | } | ||
995 | |||
996 | public void llPushObject(string target, vector impulse, vector ang_impulse, int local) | ||
997 | { | ||
998 | m_LSL_Functions.llPushObject(target, impulse, ang_impulse, local); | ||
999 | } | ||
1000 | |||
1001 | public void llPassCollisions(int pass) | ||
1002 | { | ||
1003 | m_LSL_Functions.llPassCollisions(pass); | ||
1004 | } | ||
1005 | |||
1006 | public string llGetScriptName() | ||
1007 | { | ||
1008 | return m_LSL_Functions.llGetScriptName(); | ||
1009 | } | ||
1010 | |||
1011 | public LSL_Types.LSLInteger llGetNumberOfSides() | ||
1012 | { | ||
1013 | return m_LSL_Functions.llGetNumberOfSides(); | ||
1014 | } | ||
1015 | |||
1016 | // | ||
1017 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs | ||
1018 | // | ||
1019 | public rotation llAxisAngle2Rot(vector axis, double angle) | ||
1020 | { | ||
1021 | return m_LSL_Functions.llAxisAngle2Rot(axis, angle); | ||
1022 | } | ||
1023 | |||
1024 | public vector llRot2Axis(rotation rot) | ||
1025 | { | ||
1026 | return m_LSL_Functions.llRot2Axis(rot); | ||
1027 | } | ||
1028 | |||
1029 | public double llRot2Angle(rotation rot) | ||
1030 | { | ||
1031 | return m_LSL_Functions.llRot2Angle(rot); | ||
1032 | } | ||
1033 | |||
1034 | public double llAcos(double val) | ||
1035 | { | ||
1036 | return m_LSL_Functions.llAcos(val); | ||
1037 | } | ||
1038 | |||
1039 | public double llAsin(double val) | ||
1040 | { | ||
1041 | return m_LSL_Functions.llAsin(val); | ||
1042 | } | ||
1043 | |||
1044 | public double llAngleBetween(rotation a, rotation b) | ||
1045 | { | ||
1046 | return m_LSL_Functions.llAngleBetween(a, b); | ||
1047 | } | ||
1048 | |||
1049 | public string llGetInventoryKey(string name) | ||
1050 | { | ||
1051 | return m_LSL_Functions.llGetInventoryKey(name); | ||
1052 | } | ||
1053 | |||
1054 | public void llAllowInventoryDrop(int add) | ||
1055 | { | ||
1056 | m_LSL_Functions.llAllowInventoryDrop(add); | ||
1057 | } | ||
1058 | |||
1059 | public vector llGetSunDirection() | ||
1060 | { | ||
1061 | return m_LSL_Functions.llGetSunDirection(); | ||
1062 | } | ||
1063 | |||
1064 | public vector llGetTextureOffset(int face) | ||
1065 | { | ||
1066 | return m_LSL_Functions.llGetTextureOffset(face); | ||
1067 | } | ||
1068 | |||
1069 | public vector llGetTextureScale(int side) | ||
1070 | { | ||
1071 | return m_LSL_Functions.llGetTextureScale(side); | ||
1072 | } | ||
1073 | |||
1074 | public double llGetTextureRot(int side) | ||
1075 | { | ||
1076 | return m_LSL_Functions.llGetTextureRot(side); | ||
1077 | } | ||
1078 | |||
1079 | public LSL_Types.LSLInteger llSubStringIndex(string source, string pattern) | ||
1080 | { | ||
1081 | return m_LSL_Functions.llSubStringIndex(source, pattern); | ||
1082 | } | ||
1083 | |||
1084 | public string llGetOwnerKey(string id) | ||
1085 | { | ||
1086 | return m_LSL_Functions.llGetOwnerKey(id); | ||
1087 | } | ||
1088 | |||
1089 | public vector llGetCenterOfMass() | ||
1090 | { | ||
1091 | return m_LSL_Functions.llGetCenterOfMass(); | ||
1092 | } | ||
1093 | |||
1094 | public LSL_Types.list llListSort(LSL_Types.list src, int stride, int ascending) | ||
1095 | { | ||
1096 | return m_LSL_Functions.llListSort(src, stride, ascending); | ||
1097 | } | ||
1098 | |||
1099 | public LSL_Types.LSLInteger llGetListLength(LSL_Types.list src) | ||
1100 | { | ||
1101 | return m_LSL_Functions.llGetListLength(src); | ||
1102 | } | ||
1103 | |||
1104 | // | ||
1105 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs | ||
1106 | // | ||
1107 | public LSL_Types.LSLInteger llList2Integer(LSL_Types.list src, int index) | ||
1108 | { | ||
1109 | return m_LSL_Functions.llList2Integer(src, index); | ||
1110 | } | ||
1111 | |||
1112 | public string llList2String(LSL_Types.list src, int index) | ||
1113 | { | ||
1114 | return m_LSL_Functions.llList2String(src, index); | ||
1115 | } | ||
1116 | |||
1117 | public string llList2Key(LSL_Types.list src, int index) | ||
1118 | { | ||
1119 | return m_LSL_Functions.llList2Key(src, index); | ||
1120 | } | ||
1121 | |||
1122 | public vector llList2Vector(LSL_Types.list src, int index) | ||
1123 | { | ||
1124 | return m_LSL_Functions.llList2Vector(src, index); | ||
1125 | } | ||
1126 | |||
1127 | public rotation llList2Rot(LSL_Types.list src, int index) | ||
1128 | { | ||
1129 | return m_LSL_Functions.llList2Rot(src, index); | ||
1130 | } | ||
1131 | |||
1132 | public LSL_Types.list llList2List(LSL_Types.list src, int start, int end) | ||
1133 | { | ||
1134 | return m_LSL_Functions.llList2List(src, start, end); | ||
1135 | } | ||
1136 | |||
1137 | public LSL_Types.list llDeleteSubList(LSL_Types.list src, int start, int end) | ||
1138 | { | ||
1139 | return m_LSL_Functions.llDeleteSubList(src, start, end); | ||
1140 | } | ||
1141 | |||
1142 | public LSL_Types.LSLInteger llGetListEntryType(LSL_Types.list src, int index) | ||
1143 | { | ||
1144 | return m_LSL_Functions.llGetListEntryType(src, index); | ||
1145 | } | ||
1146 | |||
1147 | public string llList2CSV(LSL_Types.list src) | ||
1148 | { | ||
1149 | return m_LSL_Functions.llList2CSV(src); | ||
1150 | } | ||
1151 | |||
1152 | public LSL_Types.list llCSV2List(string src) | ||
1153 | { | ||
1154 | return m_LSL_Functions.llCSV2List(src); | ||
1155 | } | ||
1156 | |||
1157 | public LSL_Types.list llListRandomize(LSL_Types.list src, int stride) | ||
1158 | { | ||
1159 | return m_LSL_Functions.llListRandomize(src, stride); | ||
1160 | } | ||
1161 | |||
1162 | public LSL_Types.list llList2ListStrided(LSL_Types.list src, int start, int end, int stride) | ||
1163 | { | ||
1164 | return m_LSL_Functions.llList2ListStrided(src, start, end, stride); | ||
1165 | } | ||
1166 | |||
1167 | public vector llGetRegionCorner() | ||
1168 | { | ||
1169 | return m_LSL_Functions.llGetRegionCorner(); | ||
1170 | } | ||
1171 | |||
1172 | public LSL_Types.list llListInsertList(LSL_Types.list dest, LSL_Types.list src, int start) | ||
1173 | { | ||
1174 | return m_LSL_Functions.llListInsertList(dest, src, start); | ||
1175 | } | ||
1176 | |||
1177 | public LSL_Types.LSLInteger llListFindList(LSL_Types.list src, LSL_Types.list test) | ||
1178 | { | ||
1179 | return m_LSL_Functions.llListFindList(src, test); | ||
1180 | } | ||
1181 | |||
1182 | public string llGetObjectName() | ||
1183 | { | ||
1184 | return m_LSL_Functions.llGetObjectName(); | ||
1185 | } | ||
1186 | |||
1187 | public void llSetObjectName(string name) | ||
1188 | { | ||
1189 | m_LSL_Functions.llSetObjectName(name); | ||
1190 | } | ||
1191 | |||
1192 | public string llGetDate() | ||
1193 | { | ||
1194 | return m_LSL_Functions.llGetDate(); | ||
1195 | } | ||
1196 | |||
1197 | public LSL_Types.LSLInteger llEdgeOfWorld(vector pos, vector dir) | ||
1198 | { | ||
1199 | return m_LSL_Functions.llEdgeOfWorld(pos, dir); | ||
1200 | } | ||
1201 | |||
1202 | public LSL_Types.LSLInteger llGetAgentInfo(string id) | ||
1203 | { | ||
1204 | return m_LSL_Functions.llGetAgentInfo(id); | ||
1205 | } | ||
1206 | |||
1207 | // | ||
1208 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs | ||
1209 | // | ||
1210 | public void llAdjustSoundVolume(double volume) | ||
1211 | { | ||
1212 | m_LSL_Functions.llAdjustSoundVolume(volume); | ||
1213 | } | ||
1214 | |||
1215 | public void llSetSoundQueueing(int queue) | ||
1216 | { | ||
1217 | m_LSL_Functions.llSetSoundQueueing(queue); | ||
1218 | } | ||
1219 | |||
1220 | public void llSetSoundRadius(double radius) | ||
1221 | { | ||
1222 | m_LSL_Functions.llSetSoundRadius(radius); | ||
1223 | } | ||
1224 | |||
1225 | public string llKey2Name(string id) | ||
1226 | { | ||
1227 | return m_LSL_Functions.llKey2Name(id); | ||
1228 | } | ||
1229 | |||
1230 | public void llSetTextureAnim(int mode, int face, int sizex, int sizey, double start, double length, double rate) | ||
1231 | { | ||
1232 | m_LSL_Functions.llSetTextureAnim(mode, face, sizex, sizey, start, length, rate); | ||
1233 | } | ||
1234 | |||
1235 | public void llTriggerSoundLimited(string sound, double volume, vector top_north_east, vector bottom_south_west) | ||
1236 | { | ||
1237 | m_LSL_Functions.llTriggerSoundLimited(sound, volume, top_north_east, bottom_south_west); | ||
1238 | } | ||
1239 | |||
1240 | public void llEjectFromLand(string pest) | ||
1241 | { | ||
1242 | m_LSL_Functions.llEjectFromLand(pest); | ||
1243 | } | ||
1244 | |||
1245 | public LSL_Types.list llParseString2List(string str, LSL_Types.list separators, LSL_Types.list spacers) | ||
1246 | { | ||
1247 | return m_LSL_Functions.llParseString2List(str,separators,spacers); | ||
1248 | } | ||
1249 | |||
1250 | public LSL_Types.LSLInteger llOverMyLand(string id) | ||
1251 | { | ||
1252 | return m_LSL_Functions.llOverMyLand(id); | ||
1253 | } | ||
1254 | |||
1255 | public string llGetLandOwnerAt(vector pos) | ||
1256 | { | ||
1257 | return m_LSL_Functions.llGetLandOwnerAt(pos); | ||
1258 | } | ||
1259 | |||
1260 | public string llGetNotecardLine(string name, int line) | ||
1261 | { | ||
1262 | return m_LSL_Functions.llGetNotecardLine(name, line); | ||
1263 | } | ||
1264 | |||
1265 | public vector llGetAgentSize(string id) | ||
1266 | { | ||
1267 | return m_LSL_Functions.llGetAgentSize(id); | ||
1268 | } | ||
1269 | |||
1270 | public LSL_Types.LSLInteger llSameGroup(string agent) | ||
1271 | { | ||
1272 | return m_LSL_Functions.llSameGroup(agent); | ||
1273 | } | ||
1274 | |||
1275 | public void llUnSit(string id) | ||
1276 | { | ||
1277 | m_LSL_Functions.llUnSit(id); | ||
1278 | } | ||
1279 | |||
1280 | public vector llGroundSlope(vector offset) | ||
1281 | { | ||
1282 | return m_LSL_Functions.llGroundSlope(offset); | ||
1283 | } | ||
1284 | |||
1285 | public vector llGroundNormal(vector offset) | ||
1286 | { | ||
1287 | return m_LSL_Functions.llGroundNormal(offset); | ||
1288 | } | ||
1289 | |||
1290 | public vector llGroundContour(vector offset) | ||
1291 | { | ||
1292 | return m_LSL_Functions.llGroundContour(offset); | ||
1293 | } | ||
1294 | |||
1295 | public LSL_Types.LSLInteger llGetAttached() | ||
1296 | { | ||
1297 | return m_LSL_Functions.llGetAttached(); | ||
1298 | } | ||
1299 | |||
1300 | public LSL_Types.LSLInteger llGetFreeMemory() | ||
1301 | { | ||
1302 | return m_LSL_Functions.llGetFreeMemory(); | ||
1303 | } | ||
1304 | |||
1305 | public string llGetRegionName() | ||
1306 | { | ||
1307 | return m_LSL_Functions.llGetRegionName(); | ||
1308 | } | ||
1309 | |||
1310 | public double llGetRegionTimeDilation() | ||
1311 | { | ||
1312 | return m_LSL_Functions.llGetRegionTimeDilation(); | ||
1313 | } | ||
1314 | |||
1315 | public double llGetRegionFPS() | ||
1316 | { | ||
1317 | return m_LSL_Functions.llGetRegionFPS(); | ||
1318 | } | ||
1319 | |||
1320 | // | ||
1321 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs | ||
1322 | // | ||
1323 | public void llParticleSystem(LSL_Types.list rules) | ||
1324 | { | ||
1325 | m_LSL_Functions.llParticleSystem(rules); | ||
1326 | } | ||
1327 | |||
1328 | public void llGroundRepel(double height, int water, double tau) | ||
1329 | { | ||
1330 | m_LSL_Functions.llGroundRepel(height, water, tau); | ||
1331 | } | ||
1332 | |||
1333 | public void llGiveInventoryList(string destination, string category, LSL_Types.list inventory) | ||
1334 | { | ||
1335 | m_LSL_Functions.llGiveInventoryList(destination, category, inventory); | ||
1336 | } | ||
1337 | |||
1338 | public void llSetVehicleType(int type) | ||
1339 | { | ||
1340 | m_LSL_Functions.llSetVehicleType(type); | ||
1341 | } | ||
1342 | |||
1343 | public void llSetVehicledoubleParam(int param, double value) | ||
1344 | { | ||
1345 | m_LSL_Functions.llSetVehicledoubleParam(param, value); | ||
1346 | } | ||
1347 | |||
1348 | public void llSetVehicleFloatParam(int param, float value) | ||
1349 | { | ||
1350 | m_LSL_Functions.llSetVehicleFloatParam(param, value); | ||
1351 | } | ||
1352 | |||
1353 | public void llSetVehicleVectorParam(int param, vector vec) | ||
1354 | { | ||
1355 | m_LSL_Functions.llSetVehicleVectorParam(param, vec); | ||
1356 | } | ||
1357 | |||
1358 | public void llSetVehicleRotationParam(int param, rotation rot) | ||
1359 | { | ||
1360 | m_LSL_Functions.llSetVehicleRotationParam(param, rot); | ||
1361 | } | ||
1362 | |||
1363 | public void llSetVehicleFlags(int flags) | ||
1364 | { | ||
1365 | m_LSL_Functions.llSetVehicleFlags(flags); | ||
1366 | } | ||
1367 | |||
1368 | public void llRemoveVehicleFlags(int flags) | ||
1369 | { | ||
1370 | m_LSL_Functions.llRemoveVehicleFlags(flags); | ||
1371 | } | ||
1372 | |||
1373 | public void llSitTarget(vector offset, rotation rot) | ||
1374 | { | ||
1375 | m_LSL_Functions.llSitTarget(offset, rot); | ||
1376 | } | ||
1377 | |||
1378 | public string llAvatarOnSitTarget() | ||
1379 | { | ||
1380 | return m_LSL_Functions.llAvatarOnSitTarget(); | ||
1381 | } | ||
1382 | |||
1383 | public void llAddToLandPassList(string avatar, double hours) | ||
1384 | { | ||
1385 | m_LSL_Functions.llAddToLandPassList(avatar, hours); | ||
1386 | } | ||
1387 | |||
1388 | public void llSetTouchText(string text) | ||
1389 | { | ||
1390 | m_LSL_Functions.llSetTouchText(text); | ||
1391 | } | ||
1392 | |||
1393 | public void llSetSitText(string text) | ||
1394 | { | ||
1395 | m_LSL_Functions.llSetSitText(text); | ||
1396 | } | ||
1397 | |||
1398 | public void llSetCameraEyeOffset(vector offset) | ||
1399 | { | ||
1400 | m_LSL_Functions.llSetCameraEyeOffset(offset); | ||
1401 | } | ||
1402 | |||
1403 | public void llSetCameraAtOffset(vector offset) | ||
1404 | { | ||
1405 | m_LSL_Functions.llSetCameraAtOffset(offset); | ||
1406 | } | ||
1407 | |||
1408 | public string llDumpList2String(LSL_Types.list src, string seperator) | ||
1409 | { | ||
1410 | return m_LSL_Functions.llDumpList2String(src, seperator); | ||
1411 | } | ||
1412 | |||
1413 | public LSL_Types.LSLInteger llScriptDanger(vector pos) | ||
1414 | { | ||
1415 | return m_LSL_Functions.llScriptDanger(pos); | ||
1416 | } | ||
1417 | |||
1418 | public void llDialog(string avatar, string message, LSL_Types.list buttons, int chat_channel) | ||
1419 | { | ||
1420 | m_LSL_Functions.llDialog(avatar, message, buttons, chat_channel); | ||
1421 | } | ||
1422 | |||
1423 | public void llVolumeDetect(int detect) | ||
1424 | { | ||
1425 | m_LSL_Functions.llVolumeDetect(detect); | ||
1426 | } | ||
1427 | |||
1428 | public void llResetOtherScript(string name) | ||
1429 | { | ||
1430 | m_LSL_Functions.llResetOtherScript(name); | ||
1431 | } | ||
1432 | |||
1433 | public LSL_Types.LSLInteger llGetScriptState(string name) | ||
1434 | { | ||
1435 | return m_LSL_Functions.llGetScriptState(name); | ||
1436 | } | ||
1437 | |||
1438 | public void llRemoteLoadScript() | ||
1439 | { | ||
1440 | m_LSL_Functions.llRemoteLoadScript(); | ||
1441 | } | ||
1442 | |||
1443 | public void llSetRemoteScriptAccessPin(int pin) | ||
1444 | { | ||
1445 | m_LSL_Functions.llSetRemoteScriptAccessPin(pin); | ||
1446 | } | ||
1447 | |||
1448 | public void llRemoteLoadScriptPin(string target, string name, int pin, int running, int start_param) | ||
1449 | { | ||
1450 | m_LSL_Functions.llRemoteLoadScriptPin(target, name, pin, running, start_param); | ||
1451 | } | ||
1452 | |||
1453 | // | ||
1454 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs | ||
1455 | // | ||
1456 | public void llOpenRemoteDataChannel() | ||
1457 | { | ||
1458 | m_LSL_Functions.llOpenRemoteDataChannel(); | ||
1459 | } | ||
1460 | |||
1461 | public string llSendRemoteData(string channel, string dest, int idata, string sdata) | ||
1462 | { | ||
1463 | return m_LSL_Functions.llSendRemoteData(channel, dest, idata, sdata); | ||
1464 | } | ||
1465 | |||
1466 | public void llRemoteDataReply(string channel, string message_id, string sdata, int idata) | ||
1467 | { | ||
1468 | m_LSL_Functions.llRemoteDataReply(channel, message_id, sdata, idata); | ||
1469 | } | ||
1470 | |||
1471 | public void llCloseRemoteDataChannel(string channel) | ||
1472 | { | ||
1473 | m_LSL_Functions.llCloseRemoteDataChannel(channel); | ||
1474 | } | ||
1475 | |||
1476 | public string llMD5String(string src, int nonce) | ||
1477 | { | ||
1478 | return m_LSL_Functions.llMD5String(src, nonce); | ||
1479 | } | ||
1480 | |||
1481 | public void llSetPrimitiveParams(LSL_Types.list rules) | ||
1482 | { | ||
1483 | m_LSL_Functions.llSetPrimitiveParams(rules); | ||
1484 | } | ||
1485 | |||
1486 | public void llSetLinkPrimitiveParams(int linknumber, LSL_Types.list rules) | ||
1487 | { | ||
1488 | m_LSL_Functions.llSetLinkPrimitiveParams(linknumber, rules); | ||
1489 | } | ||
1490 | public string llStringToBase64(string str) | ||
1491 | { | ||
1492 | return m_LSL_Functions.llStringToBase64(str); | ||
1493 | } | ||
1494 | |||
1495 | public string llBase64ToString(string str) | ||
1496 | { | ||
1497 | return m_LSL_Functions.llBase64ToString(str); | ||
1498 | } | ||
1499 | |||
1500 | public void llXorBase64Strings() | ||
1501 | { | ||
1502 | m_LSL_Functions.llXorBase64Strings(); | ||
1503 | } | ||
1504 | |||
1505 | public void llRemoteDataSetRegion() | ||
1506 | { | ||
1507 | m_LSL_Functions.llRemoteDataSetRegion(); | ||
1508 | } | ||
1509 | |||
1510 | public double llLog10(double val) | ||
1511 | { | ||
1512 | return m_LSL_Functions.llLog10(val); | ||
1513 | } | ||
1514 | |||
1515 | public double llLog(double val) | ||
1516 | { | ||
1517 | return m_LSL_Functions.llLog(val); | ||
1518 | } | ||
1519 | |||
1520 | public LSL_Types.list llGetAnimationList(string id) | ||
1521 | { | ||
1522 | return m_LSL_Functions.llGetAnimationList(id); | ||
1523 | } | ||
1524 | |||
1525 | public void llSetParcelMusicURL(string url) | ||
1526 | { | ||
1527 | m_LSL_Functions.llSetParcelMusicURL(url); | ||
1528 | } | ||
1529 | |||
1530 | public vector llGetRootPosition() | ||
1531 | { | ||
1532 | return m_LSL_Functions.llGetRootPosition(); | ||
1533 | } | ||
1534 | |||
1535 | public rotation llGetRootRotation() | ||
1536 | { | ||
1537 | return m_LSL_Functions.llGetRootRotation(); | ||
1538 | } | ||
1539 | |||
1540 | public string llGetObjectDesc() | ||
1541 | { | ||
1542 | return m_LSL_Functions.llGetObjectDesc(); | ||
1543 | } | ||
1544 | |||
1545 | public void llSetObjectDesc(string desc) | ||
1546 | { | ||
1547 | m_LSL_Functions.llSetObjectDesc(desc); | ||
1548 | } | ||
1549 | |||
1550 | public string llGetCreator() | ||
1551 | { | ||
1552 | return m_LSL_Functions.llGetCreator(); | ||
1553 | } | ||
1554 | |||
1555 | public string llGetTimestamp() | ||
1556 | { | ||
1557 | return m_LSL_Functions.llGetTimestamp(); | ||
1558 | } | ||
1559 | |||
1560 | public void llSetLinkAlpha(int linknumber, double alpha, int face) | ||
1561 | { | ||
1562 | m_LSL_Functions.llSetLinkAlpha(linknumber, alpha, face); | ||
1563 | } | ||
1564 | |||
1565 | public LSL_Types.LSLInteger llGetNumberOfPrims() | ||
1566 | { | ||
1567 | return m_LSL_Functions.llGetNumberOfPrims(); | ||
1568 | } | ||
1569 | |||
1570 | public string llGetNumberOfNotecardLines(string name) | ||
1571 | { | ||
1572 | return m_LSL_Functions.llGetNumberOfNotecardLines(name); | ||
1573 | } | ||
1574 | |||
1575 | public LSL_Types.list llGetBoundingBox(string obj) | ||
1576 | { | ||
1577 | return m_LSL_Functions.llGetBoundingBox(obj); | ||
1578 | } | ||
1579 | |||
1580 | public vector llGetGeometricCenter() | ||
1581 | { | ||
1582 | return m_LSL_Functions.llGetGeometricCenter(); | ||
1583 | } | ||
1584 | |||
1585 | public LSL_Types.list llGetPrimitiveParams(LSL_Types.list rules) | ||
1586 | { | ||
1587 | return m_LSL_Functions.llGetPrimitiveParams(rules); | ||
1588 | } | ||
1589 | |||
1590 | // | ||
1591 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs | ||
1592 | // | ||
1593 | public string llIntegerToBase64(int number) | ||
1594 | { | ||
1595 | return m_LSL_Functions.llIntegerToBase64(number); | ||
1596 | } | ||
1597 | |||
1598 | public LSL_Types.LSLInteger llBase64ToInteger(string str) | ||
1599 | { | ||
1600 | return m_LSL_Functions.llBase64ToInteger(str); | ||
1601 | } | ||
1602 | |||
1603 | public double llGetGMTclock() | ||
1604 | { | ||
1605 | return m_LSL_Functions.llGetGMTclock(); | ||
1606 | } | ||
1607 | |||
1608 | public string llGetSimulatorHostname() | ||
1609 | { | ||
1610 | return m_LSL_Functions.llGetSimulatorHostname(); | ||
1611 | } | ||
1612 | |||
1613 | public void llSetLocalRot(rotation rot) | ||
1614 | { | ||
1615 | m_LSL_Functions.llSetLocalRot(rot); | ||
1616 | } | ||
1617 | |||
1618 | public LSL_Types.list llParseStringKeepNulls(string src, LSL_Types.list seperators, LSL_Types.list spacers) | ||
1619 | { | ||
1620 | return m_LSL_Functions.llParseStringKeepNulls(src, seperators, spacers); | ||
1621 | } | ||
1622 | |||
1623 | public void llRezAtRoot(string inventory, vector position, vector velocity, rotation rot, int param) | ||
1624 | { | ||
1625 | m_LSL_Functions.llRezAtRoot(inventory, position, velocity, rot, param); | ||
1626 | } | ||
1627 | |||
1628 | public LSL_Types.LSLInteger llGetObjectPermMask(int mask) | ||
1629 | { | ||
1630 | return m_LSL_Functions.llGetObjectPermMask(mask); | ||
1631 | } | ||
1632 | |||
1633 | public void llSetObjectPermMask(int mask, int value) | ||
1634 | { | ||
1635 | m_LSL_Functions.llSetObjectPermMask(mask, value); | ||
1636 | } | ||
1637 | |||
1638 | public LSL_Types.LSLInteger llGetInventoryPermMask(string item, int mask) | ||
1639 | { | ||
1640 | return m_LSL_Functions.llGetInventoryPermMask(item, mask); | ||
1641 | } | ||
1642 | |||
1643 | public void llSetInventoryPermMask(string item, int mask, int value) | ||
1644 | { | ||
1645 | m_LSL_Functions.llSetInventoryPermMask(item, mask, value); | ||
1646 | } | ||
1647 | |||
1648 | public string llGetInventoryCreator(string item) | ||
1649 | { | ||
1650 | return m_LSL_Functions.llGetInventoryCreator(item); | ||
1651 | } | ||
1652 | |||
1653 | public void llOwnerSay(string msg) | ||
1654 | { | ||
1655 | m_LSL_Functions.llOwnerSay(msg); | ||
1656 | } | ||
1657 | |||
1658 | public string llRequestSimulatorData(string simulator, int data) | ||
1659 | { | ||
1660 | return m_LSL_Functions.llRequestSimulatorData(simulator, data); | ||
1661 | } | ||
1662 | |||
1663 | public void llForceMouselook(int mouselook) | ||
1664 | { | ||
1665 | m_LSL_Functions.llForceMouselook(mouselook); | ||
1666 | } | ||
1667 | |||
1668 | public double llGetObjectMass(string id) | ||
1669 | { | ||
1670 | return m_LSL_Functions.llGetObjectMass(id); | ||
1671 | } | ||
1672 | |||
1673 | public LSL_Types.list llListReplaceList(LSL_Types.list dest, LSL_Types.list src, int start, int end) | ||
1674 | { | ||
1675 | return m_LSL_Functions.llListReplaceList(dest, src, start, end); | ||
1676 | } | ||
1677 | |||
1678 | public void llLoadURL(string avatar_id, string message, string url) | ||
1679 | { | ||
1680 | m_LSL_Functions.llLoadURL(avatar_id, message, url); | ||
1681 | } | ||
1682 | |||
1683 | public void llParcelMediaCommandList(LSL_Types.list commandList) | ||
1684 | { | ||
1685 | m_LSL_Functions.llParcelMediaCommandList(commandList); | ||
1686 | } | ||
1687 | |||
1688 | public void llParcelMediaQuery() | ||
1689 | { | ||
1690 | m_LSL_Functions.llParcelMediaQuery(); | ||
1691 | } | ||
1692 | |||
1693 | public LSL_Types.LSLInteger llModPow(int a, int b, int c) | ||
1694 | { | ||
1695 | return m_LSL_Functions.llModPow(a, b, c); | ||
1696 | } | ||
1697 | |||
1698 | // | ||
1699 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs | ||
1700 | // | ||
1701 | public LSL_Types.LSLInteger llGetInventoryType(string name) | ||
1702 | { | ||
1703 | return m_LSL_Functions.llGetInventoryType(name); | ||
1704 | } | ||
1705 | |||
1706 | public void llSetPayPrice(int price, LSL_Types.list quick_pay_buttons) | ||
1707 | { | ||
1708 | m_LSL_Functions.llSetPayPrice(price, quick_pay_buttons); | ||
1709 | } | ||
1710 | |||
1711 | public vector llGetCameraPos() | ||
1712 | { | ||
1713 | return m_LSL_Functions.llGetCameraPos(); | ||
1714 | } | ||
1715 | |||
1716 | public rotation llGetCameraRot() | ||
1717 | { | ||
1718 | return m_LSL_Functions.llGetCameraRot(); | ||
1719 | } | ||
1720 | |||
1721 | public void llSetPrimURL() | ||
1722 | { | ||
1723 | m_LSL_Functions.llSetPrimURL(); | ||
1724 | } | ||
1725 | |||
1726 | public void llRefreshPrimURL() | ||
1727 | { | ||
1728 | m_LSL_Functions.llRefreshPrimURL(); | ||
1729 | } | ||
1730 | |||
1731 | public string llEscapeURL(string url) | ||
1732 | { | ||
1733 | return m_LSL_Functions.llEscapeURL(url); | ||
1734 | } | ||
1735 | |||
1736 | public string llUnescapeURL(string url) | ||
1737 | { | ||
1738 | return m_LSL_Functions.llUnescapeURL(url); | ||
1739 | } | ||
1740 | |||
1741 | public void llMapDestination(string simname, vector pos, vector look_at) | ||
1742 | { | ||
1743 | m_LSL_Functions.llMapDestination(simname, pos, look_at); | ||
1744 | } | ||
1745 | |||
1746 | public void llAddToLandBanList(string avatar, double hours) | ||
1747 | { | ||
1748 | m_LSL_Functions.llAddToLandBanList(avatar, hours); | ||
1749 | } | ||
1750 | |||
1751 | public void llRemoveFromLandPassList(string avatar) | ||
1752 | { | ||
1753 | m_LSL_Functions.llRemoveFromLandPassList(avatar); | ||
1754 | } | ||
1755 | |||
1756 | public void llRemoveFromLandBanList(string avatar) | ||
1757 | { | ||
1758 | m_LSL_Functions.llRemoveFromLandBanList(avatar); | ||
1759 | } | ||
1760 | |||
1761 | public void llSetCameraParams(LSL_Types.list rules) | ||
1762 | { | ||
1763 | m_LSL_Functions.llSetCameraParams(rules); | ||
1764 | } | ||
1765 | |||
1766 | public void llClearCameraParams() | ||
1767 | { | ||
1768 | m_LSL_Functions.llClearCameraParams(); | ||
1769 | } | ||
1770 | |||
1771 | public double llListStatistics(int operation, LSL_Types.list src) | ||
1772 | { | ||
1773 | return m_LSL_Functions.llListStatistics(operation, src); | ||
1774 | } | ||
1775 | |||
1776 | public LSL_Types.LSLInteger llGetUnixTime() | ||
1777 | { | ||
1778 | return m_LSL_Functions.llGetUnixTime(); | ||
1779 | } | ||
1780 | |||
1781 | public LSL_Types.LSLInteger llGetParcelFlags(vector pos) | ||
1782 | { | ||
1783 | return m_LSL_Functions.llGetParcelFlags(pos); | ||
1784 | } | ||
1785 | |||
1786 | public LSL_Types.LSLInteger llGetRegionFlags() | ||
1787 | { | ||
1788 | return m_LSL_Functions.llGetRegionFlags(); | ||
1789 | } | ||
1790 | |||
1791 | public string llXorBase64StringsCorrect(string str1, string str2) | ||
1792 | { | ||
1793 | return m_LSL_Functions.llXorBase64StringsCorrect(str1, str2); | ||
1794 | } | ||
1795 | |||
1796 | public string llHTTPRequest(string url, LSL_Types.list parameters, string body) | ||
1797 | { | ||
1798 | return m_LSL_Functions.llHTTPRequest(url, parameters, body); | ||
1799 | } | ||
1800 | |||
1801 | public void llResetLandBanList() | ||
1802 | { | ||
1803 | m_LSL_Functions.llResetLandBanList(); | ||
1804 | } | ||
1805 | |||
1806 | public void llResetLandPassList() | ||
1807 | { | ||
1808 | m_LSL_Functions.llResetLandPassList(); | ||
1809 | } | ||
1810 | |||
1811 | public LSL_Types.LSLInteger llGetParcelPrimCount(vector pos, int category, int sim_wide) | ||
1812 | { | ||
1813 | return m_LSL_Functions.llGetParcelPrimCount(pos, category, sim_wide); | ||
1814 | } | ||
1815 | |||
1816 | public LSL_Types.list llGetParcelPrimOwners(vector pos) | ||
1817 | { | ||
1818 | return m_LSL_Functions.llGetParcelPrimOwners(pos); | ||
1819 | } | ||
1820 | |||
1821 | public LSL_Types.LSLInteger llGetObjectPrimCount(string object_id) | ||
1822 | { | ||
1823 | return m_LSL_Functions.llGetObjectPrimCount(object_id); | ||
1824 | } | ||
1825 | |||
1826 | // | ||
1827 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs | ||
1828 | // | ||
1829 | public LSL_Types.LSLInteger llGetParcelMaxPrims(vector pos, int sim_wide) | ||
1830 | { | ||
1831 | return m_LSL_Functions.llGetParcelMaxPrims(pos, sim_wide); | ||
1832 | } | ||
1833 | |||
1834 | public LSL_Types.list llGetParcelDetails(vector pos, LSL_Types.list param) | ||
1835 | { | ||
1836 | return m_LSL_Functions.llGetParcelDetails(pos, param); | ||
1837 | } | ||
1838 | |||
1839 | public void llSetLinkTexture(int linknumber, string texture, int face) | ||
1840 | { | ||
1841 | m_LSL_Functions.llSetLinkTexture(linknumber, texture, face); | ||
1842 | } | ||
1843 | |||
1844 | public string llStringTrim(string src, int type) | ||
1845 | { | ||
1846 | return m_LSL_Functions.llStringTrim(src, type); | ||
1847 | } | ||
1848 | |||
1849 | public LSL_Types.list llGetObjectDetails(string id, LSL_Types.list args) | ||
1850 | { | ||
1851 | return m_LSL_Functions.llGetObjectDetails(id, args); | ||
1852 | } | ||
1853 | |||
1854 | public double llList2Float(LSL_Types.list src, int index) | ||
1855 | { | ||
1856 | return m_LSL_Functions.llList2Float(src, index); | ||
1857 | } | ||
1858 | |||
1859 | // LSL CONSTANTS | ||
1860 | public const int TRUE = 1; | ||
1861 | public const int FALSE = 0; | ||
1862 | |||
1863 | public const int STATUS_PHYSICS = 1; | ||
1864 | public const int STATUS_ROTATE_X = 2; | ||
1865 | public const int STATUS_ROTATE_Y = 4; | ||
1866 | public const int STATUS_ROTATE_Z = 8; | ||
1867 | public const int STATUS_PHANTOM = 16; | ||
1868 | public const int STATUS_SANDBOX = 32; | ||
1869 | public const int STATUS_BLOCK_GRAB = 64; | ||
1870 | public const int STATUS_DIE_AT_EDGE = 128; | ||
1871 | public const int STATUS_RETURN_AT_EDGE = 256; | ||
1872 | public const int STATUS_CAST_SHADOWS = 512; | ||
1873 | |||
1874 | public const int AGENT = 1; | ||
1875 | public const int ACTIVE = 2; | ||
1876 | public const int PASSIVE = 4; | ||
1877 | public const int SCRIPTED = 8; | ||
1878 | |||
1879 | public const int CONTROL_FWD = 1; | ||
1880 | public const int CONTROL_BACK = 2; | ||
1881 | public const int CONTROL_LEFT = 4; | ||
1882 | public const int CONTROL_RIGHT = 8; | ||
1883 | public const int CONTROL_UP = 16; | ||
1884 | public const int CONTROL_DOWN = 32; | ||
1885 | public const int CONTROL_ROT_LEFT = 256; | ||
1886 | public const int CONTROL_ROT_RIGHT = 512; | ||
1887 | public const int CONTROL_LBUTTON = 268435456; | ||
1888 | public const int CONTROL_ML_LBUTTON = 1073741824; | ||
1889 | |||
1890 | //Permissions | ||
1891 | public const int PERMISSION_DEBIT = 2; | ||
1892 | public const int PERMISSION_TAKE_CONTROLS = 4; | ||
1893 | public const int PERMISSION_REMAP_CONTROLS = 8; | ||
1894 | public const int PERMISSION_TRIGGER_ANIMATION = 16; | ||
1895 | public const int PERMISSION_ATTACH = 32; | ||
1896 | public const int PERMISSION_RELEASE_OWNERSHIP = 64; | ||
1897 | public const int PERMISSION_CHANGE_LINKS = 128; | ||
1898 | public const int PERMISSION_CHANGE_JOINTS = 256; | ||
1899 | public const int PERMISSION_CHANGE_PERMISSIONS = 512; | ||
1900 | public const int PERMISSION_TRACK_CAMERA = 1024; | ||
1901 | |||
1902 | public const int AGENT_FLYING = 1; | ||
1903 | public const int AGENT_ATTACHMENTS = 2; | ||
1904 | public const int AGENT_SCRIPTED = 4; | ||
1905 | public const int AGENT_MOUSELOOK = 8; | ||
1906 | public const int AGENT_SITTING = 16; | ||
1907 | public const int AGENT_ON_OBJECT = 32; | ||
1908 | public const int AGENT_AWAY = 64; | ||
1909 | public const int AGENT_WALKING = 128; | ||
1910 | public const int AGENT_IN_AIR = 256; | ||
1911 | public const int AGENT_TYPING = 512; | ||
1912 | public const int AGENT_CROUCHING = 1024; | ||
1913 | public const int AGENT_BUSY = 2048; | ||
1914 | public const int AGENT_ALWAYS_RUN = 4096; | ||
1915 | |||
1916 | //Particle Systems | ||
1917 | public const int PSYS_PART_INTERP_COLOR_MASK = 1; | ||
1918 | public const int PSYS_PART_INTERP_SCALE_MASK = 2; | ||
1919 | public const int PSYS_PART_BOUNCE_MASK = 4; | ||
1920 | public const int PSYS_PART_WIND_MASK = 8; | ||
1921 | public const int PSYS_PART_FOLLOW_SRC_MASK = 16; | ||
1922 | public const int PSYS_PART_FOLLOW_VELOCITY_MASK = 32; | ||
1923 | public const int PSYS_PART_TARGET_POS_MASK = 64; | ||
1924 | public const int PSYS_PART_TARGET_LINEAR_MASK = 128; | ||
1925 | public const int PSYS_PART_EMISSIVE_MASK = 256; | ||
1926 | public const int PSYS_PART_FLAGS = 0; | ||
1927 | public const int PSYS_PART_START_COLOR = 1; | ||
1928 | public const int PSYS_PART_START_ALPHA = 2; | ||
1929 | public const int PSYS_PART_END_COLOR = 3; | ||
1930 | public const int PSYS_PART_END_ALPHA = 4; | ||
1931 | public const int PSYS_PART_START_SCALE = 5; | ||
1932 | public const int PSYS_PART_END_SCALE = 6; | ||
1933 | public const int PSYS_PART_MAX_AGE = 7; | ||
1934 | public const int PSYS_SRC_ACCEL = 8; | ||
1935 | public const int PSYS_SRC_PATTERN = 9; | ||
1936 | public const int PSYS_SRC_INNERANGLE = 10; | ||
1937 | public const int PSYS_SRC_OUTERANGLE = 11; | ||
1938 | public const int PSYS_SRC_TEXTURE = 12; | ||
1939 | public const int PSYS_SRC_BURST_RATE = 13; | ||
1940 | public const int PSYS_SRC_BURST_PART_COUNT = 15; | ||
1941 | public const int PSYS_SRC_BURST_RADIUS = 16; | ||
1942 | public const int PSYS_SRC_BURST_SPEED_MIN = 17; | ||
1943 | public const int PSYS_SRC_BURST_SPEED_MAX = 18; | ||
1944 | public const int PSYS_SRC_MAX_AGE = 19; | ||
1945 | public const int PSYS_SRC_TARGET_KEY = 20; | ||
1946 | public const int PSYS_SRC_OMEGA = 21; | ||
1947 | public const int PSYS_SRC_ANGLE_BEGIN = 22; | ||
1948 | public const int PSYS_SRC_ANGLE_END = 23; | ||
1949 | public const int PSYS_SRC_PATTERN_DROP = 1; | ||
1950 | public const int PSYS_SRC_PATTERN_EXPLODE = 2; | ||
1951 | public const int PSYS_SRC_PATTERN_ANGLE = 4; | ||
1952 | public const int PSYS_SRC_PATTERN_ANGLE_CONE = 8; | ||
1953 | public const int PSYS_SRC_PATTERN_ANGLE_CONE_EMPTY = 16; | ||
1954 | |||
1955 | public const int VEHICLE_TYPE_NONE = 0; | ||
1956 | public const int VEHICLE_TYPE_SLED = 1; | ||
1957 | public const int VEHICLE_TYPE_CAR = 2; | ||
1958 | public const int VEHICLE_TYPE_BOAT = 3; | ||
1959 | public const int VEHICLE_TYPE_AIRPLANE = 4; | ||
1960 | public const int VEHICLE_TYPE_BALLOON = 5; | ||
1961 | public const int VEHICLE_LINEAR_FRICTION_TIMESCALE = 16; | ||
1962 | public const int VEHICLE_ANGULAR_FRICTION_TIMESCALE = 17; | ||
1963 | public const int VEHICLE_LINEAR_MOTOR_DIRECTION = 18; | ||
1964 | public const int VEHICLE_LINEAR_MOTOR_OFFSET = 20; | ||
1965 | public const int VEHICLE_ANGULAR_MOTOR_DIRECTION = 19; | ||
1966 | public const int VEHICLE_HOVER_HEIGHT = 24; | ||
1967 | public const int VEHICLE_HOVER_EFFICIENCY = 25; | ||
1968 | public const int VEHICLE_HOVER_TIMESCALE = 26; | ||
1969 | public const int VEHICLE_BUOYANCY = 27; | ||
1970 | public const int VEHICLE_LINEAR_DEFLECTION_EFFICIENCY = 28; | ||
1971 | public const int VEHICLE_LINEAR_DEFLECTION_TIMESCALE = 29; | ||
1972 | public const int VEHICLE_LINEAR_MOTOR_TIMESCALE = 30; | ||
1973 | public const int VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE = 31; | ||
1974 | public const int VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY = 32; | ||
1975 | public const int VEHICLE_ANGULAR_DEFLECTION_TIMESCALE = 33; | ||
1976 | public const int VEHICLE_ANGULAR_MOTOR_TIMESCALE = 34; | ||
1977 | public const int VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE = 35; | ||
1978 | public const int VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY = 36; | ||
1979 | public const int VEHICLE_VERTICAL_ATTRACTION_TIMESCALE = 37; | ||
1980 | public const int VEHICLE_BANKING_EFFICIENCY = 38; | ||
1981 | public const int VEHICLE_BANKING_MIX = 39; | ||
1982 | public const int VEHICLE_BANKING_TIMESCALE = 40; | ||
1983 | public const int VEHICLE_REFERENCE_FRAME = 44; | ||
1984 | public const int VEHICLE_FLAG_NO_DEFLECTION_UP = 1; | ||
1985 | public const int VEHICLE_FLAG_LIMIT_ROLL_ONLY = 2; | ||
1986 | public const int VEHICLE_FLAG_HOVER_WATER_ONLY = 4; | ||
1987 | public const int VEHICLE_FLAG_HOVER_TERRAIN_ONLY = 8; | ||
1988 | public const int VEHICLE_FLAG_HOVER_GLOBAL_HEIGHT = 16; | ||
1989 | public const int VEHICLE_FLAG_HOVER_UP_ONLY = 32; | ||
1990 | public const int VEHICLE_FLAG_LIMIT_MOTOR_UP = 64; | ||
1991 | public const int VEHICLE_FLAG_MOUSELOOK_STEER = 128; | ||
1992 | public const int VEHICLE_FLAG_MOUSELOOK_BANK = 256; | ||
1993 | public const int VEHICLE_FLAG_CAMERA_DECOUPLED = 512; | ||
1994 | |||
1995 | public const int INVENTORY_ALL = -1; | ||
1996 | public const int INVENTORY_NONE = -1; | ||
1997 | public const int INVENTORY_TEXTURE = 0; | ||
1998 | public const int INVENTORY_SOUND = 1; | ||
1999 | public const int INVENTORY_LANDMARK = 3; | ||
2000 | public const int INVENTORY_CLOTHING = 5; | ||
2001 | public const int INVENTORY_OBJECT = 6; | ||
2002 | public const int INVENTORY_NOTECARD = 7; | ||
2003 | public const int INVENTORY_SCRIPT = 10; | ||
2004 | public const int INVENTORY_BODYPART = 13; | ||
2005 | public const int INVENTORY_ANIMATION = 20; | ||
2006 | public const int INVENTORY_GESTURE = 21; | ||
2007 | |||
2008 | public const int ATTACH_CHEST = 1; | ||
2009 | public const int ATTACH_HEAD = 2; | ||
2010 | public const int ATTACH_LSHOULDER = 3; | ||
2011 | public const int ATTACH_RSHOULDER = 4; | ||
2012 | public const int ATTACH_LHAND = 5; | ||
2013 | public const int ATTACH_RHAND = 6; | ||
2014 | public const int ATTACH_LFOOT = 7; | ||
2015 | public const int ATTACH_RFOOT = 8; | ||
2016 | public const int ATTACH_BACK = 9; | ||
2017 | public const int ATTACH_PELVIS = 10; | ||
2018 | public const int ATTACH_MOUTH = 11; | ||
2019 | public const int ATTACH_CHIN = 12; | ||
2020 | public const int ATTACH_LEAR = 13; | ||
2021 | public const int ATTACH_REAR = 14; | ||
2022 | public const int ATTACH_LEYE = 15; | ||
2023 | public const int ATTACH_REYE = 16; | ||
2024 | public const int ATTACH_NOSE = 17; | ||
2025 | public const int ATTACH_RUARM = 18; | ||
2026 | public const int ATTACH_RLARM = 19; | ||
2027 | public const int ATTACH_LUARM = 20; | ||
2028 | public const int ATTACH_LLARM = 21; | ||
2029 | public const int ATTACH_RHIP = 22; | ||
2030 | public const int ATTACH_RULEG = 23; | ||
2031 | public const int ATTACH_RLLEG = 24; | ||
2032 | public const int ATTACH_LHIP = 25; | ||
2033 | public const int ATTACH_LULEG = 26; | ||
2034 | public const int ATTACH_LLLEG = 27; | ||
2035 | public const int ATTACH_BELLY = 28; | ||
2036 | public const int ATTACH_RPEC = 29; | ||
2037 | public const int ATTACH_LPEC = 30; | ||
2038 | |||
2039 | public const int LAND_LEVEL = 0; | ||
2040 | public const int LAND_RAISE = 1; | ||
2041 | public const int LAND_LOWER = 2; | ||
2042 | public const int LAND_SMOOTH = 3; | ||
2043 | public const int LAND_NOISE = 4; | ||
2044 | public const int LAND_REVERT = 5; | ||
2045 | public const int LAND_SMALL_BRUSH = 1; | ||
2046 | public const int LAND_MEDIUM_BRUSH = 2; | ||
2047 | public const int LAND_LARGE_BRUSH = 3; | ||
2048 | |||
2049 | //Agent Dataserver | ||
2050 | public const int DATA_ONLINE = 1; | ||
2051 | public const int DATA_NAME = 2; | ||
2052 | public const int DATA_BORN = 3; | ||
2053 | public const int DATA_RATING = 4; | ||
2054 | public const int DATA_SIM_POS = 5; | ||
2055 | public const int DATA_SIM_STATUS = 6; | ||
2056 | public const int DATA_SIM_RATING = 7; | ||
2057 | public const int DATA_PAYINFO = 8; | ||
2058 | |||
2059 | public const int ANIM_ON = 1; | ||
2060 | public const int LOOP = 2; | ||
2061 | public const int REVERSE = 4; | ||
2062 | public const int PING_PONG = 8; | ||
2063 | public const int SMOOTH = 16; | ||
2064 | public const int ROTATE = 32; | ||
2065 | public const int SCALE = 64; | ||
2066 | public const int ALL_SIDES = -1; | ||
2067 | public const int LINK_SET = -1; | ||
2068 | public const int LINK_ROOT = 1; | ||
2069 | public const int LINK_ALL_OTHERS = -2; | ||
2070 | public const int LINK_ALL_CHILDREN = -3; | ||
2071 | public const int LINK_THIS = -4; | ||
2072 | public const int CHANGED_INVENTORY = 1; | ||
2073 | public const int CHANGED_COLOR = 2; | ||
2074 | public const int CHANGED_SHAPE = 4; | ||
2075 | public const int CHANGED_SCALE = 8; | ||
2076 | public const int CHANGED_TEXTURE = 16; | ||
2077 | public const int CHANGED_LINK = 32; | ||
2078 | public const int CHANGED_ALLOWED_DROP = 64; | ||
2079 | public const int CHANGED_OWNER = 128; | ||
2080 | public const int TYPE_INVALID = 0; | ||
2081 | public const int TYPE_INTEGER = 1; | ||
2082 | public const int TYPE_double = 2; | ||
2083 | public const int TYPE_STRING = 3; | ||
2084 | public const int TYPE_KEY = 4; | ||
2085 | public const int TYPE_VECTOR = 5; | ||
2086 | public const int TYPE_ROTATION = 6; | ||
2087 | |||
2088 | //XML RPC Remote Data Channel | ||
2089 | public const int REMOTE_DATA_CHANNEL = 1; | ||
2090 | public const int REMOTE_DATA_REQUEST = 2; | ||
2091 | public const int REMOTE_DATA_REPLY = 3; | ||
2092 | |||
2093 | //llHTTPRequest | ||
2094 | public const int HTTP_METHOD = 0; | ||
2095 | public const int HTTP_MIMETYPE = 1; | ||
2096 | public const int HTTP_BODY_MAXLENGTH = 2; | ||
2097 | public const int HTTP_VERIFY_CERT = 3; | ||
2098 | |||
2099 | public const int PRIM_MATERIAL = 2; | ||
2100 | public const int PRIM_PHYSICS = 3; | ||
2101 | public const int PRIM_TEMP_ON_REZ = 4; | ||
2102 | public const int PRIM_PHANTOM = 5; | ||
2103 | public const int PRIM_POSITION = 6; | ||
2104 | public const int PRIM_SIZE = 7; | ||
2105 | public const int PRIM_ROTATION = 8; | ||
2106 | public const int PRIM_TYPE = 9; | ||
2107 | public const int PRIM_TEXTURE = 17; | ||
2108 | public const int PRIM_COLOR = 18; | ||
2109 | public const int PRIM_BUMP_SHINY = 19; | ||
2110 | public const int PRIM_FULLBRIGHT = 20; | ||
2111 | public const int PRIM_FLEXIBLE = 21; | ||
2112 | public const int PRIM_TEXGEN = 22; | ||
2113 | public const int PRIM_CAST_SHADOWS = 24; // Not implemented, here for completeness sake | ||
2114 | public const int PRIM_POINT_LIGHT = 23; // Huh? | ||
2115 | public const int PRIM_TEXGEN_DEFAULT = 0; | ||
2116 | public const int PRIM_TEXGEN_PLANAR = 1; | ||
2117 | |||
2118 | public const int PRIM_TYPE_BOX = 0; | ||
2119 | public const int PRIM_TYPE_CYLINDER = 1; | ||
2120 | public const int PRIM_TYPE_PRISM = 2; | ||
2121 | public const int PRIM_TYPE_SPHERE = 3; | ||
2122 | public const int PRIM_TYPE_TORUS = 4; | ||
2123 | public const int PRIM_TYPE_TUBE = 5; | ||
2124 | public const int PRIM_TYPE_RING = 6; | ||
2125 | public const int PRIM_TYPE_SCULPT = 7; | ||
2126 | |||
2127 | public const int PRIM_HOLE_DEFAULT = 0; | ||
2128 | public const int PRIM_HOLE_CIRCLE = 16; | ||
2129 | public const int PRIM_HOLE_SQUARE = 32; | ||
2130 | public const int PRIM_HOLE_TRIANGLE = 48; | ||
2131 | |||
2132 | public const int PRIM_MATERIAL_STONE = 0; | ||
2133 | public const int PRIM_MATERIAL_METAL = 1; | ||
2134 | public const int PRIM_MATERIAL_GLASS = 2; | ||
2135 | public const int PRIM_MATERIAL_WOOD = 3; | ||
2136 | public const int PRIM_MATERIAL_FLESH = 4; | ||
2137 | public const int PRIM_MATERIAL_PLASTIC = 5; | ||
2138 | public const int PRIM_MATERIAL_RUBBER = 6; | ||
2139 | public const int PRIM_MATERIAL_LIGHT = 7; | ||
2140 | |||
2141 | public const int PRIM_SHINY_NONE = 0; | ||
2142 | public const int PRIM_SHINY_LOW = 1; | ||
2143 | public const int PRIM_SHINY_MEDIUM = 2; | ||
2144 | public const int PRIM_SHINY_HIGH = 3; | ||
2145 | public const int PRIM_BUMP_NONE = 0; | ||
2146 | public const int PRIM_BUMP_BRIGHT = 1; | ||
2147 | public const int PRIM_BUMP_DARK = 2; | ||
2148 | public const int PRIM_BUMP_WOOD = 3; | ||
2149 | public const int PRIM_BUMP_BARK = 4; | ||
2150 | public const int PRIM_BUMP_BRICKS = 5; | ||
2151 | public const int PRIM_BUMP_CHECKER = 6; | ||
2152 | public const int PRIM_BUMP_CONCRETE = 7; | ||
2153 | public const int PRIM_BUMP_TILE = 8; | ||
2154 | public const int PRIM_BUMP_STONE = 9; | ||
2155 | public const int PRIM_BUMP_DISKS = 10; | ||
2156 | public const int PRIM_BUMP_GRAVEL = 11; | ||
2157 | public const int PRIM_BUMP_BLOBS = 12; | ||
2158 | public const int PRIM_BUMP_SIDING = 13; | ||
2159 | public const int PRIM_BUMP_LARGETILE = 14; | ||
2160 | public const int PRIM_BUMP_STUCCO = 15; | ||
2161 | public const int PRIM_BUMP_SUCTION = 16; | ||
2162 | public const int PRIM_BUMP_WEAVE = 17; | ||
2163 | |||
2164 | public const int PRIM_SCULPT_TYPE_SPHERE = 1; | ||
2165 | public const int PRIM_SCULPT_TYPE_TORUS = 2; | ||
2166 | public const int PRIM_SCULPT_TYPE_PLANE = 3; | ||
2167 | public const int PRIM_SCULPT_TYPE_CYLINDER = 4; | ||
2168 | |||
2169 | public const int MASK_BASE = 0; | ||
2170 | public const int MASK_OWNER = 1; | ||
2171 | public const int MASK_GROUP = 2; | ||
2172 | public const int MASK_EVERYONE = 3; | ||
2173 | public const int MASK_NEXT = 4; | ||
2174 | |||
2175 | public const int PERM_TRANSFER = 8192; | ||
2176 | public const int PERM_MODIFY = 16384; | ||
2177 | public const int PERM_COPY = 32768; | ||
2178 | public const int PERM_MOVE = 524288; | ||
2179 | public const int PERM_ALL = 2147483647; | ||
2180 | |||
2181 | public const int PARCEL_MEDIA_COMMAND_STOP = 0; | ||
2182 | public const int PARCEL_MEDIA_COMMAND_PAUSE = 1; | ||
2183 | public const int PARCEL_MEDIA_COMMAND_PLAY = 2; | ||
2184 | public const int PARCEL_MEDIA_COMMAND_LOOP = 3; | ||
2185 | public const int PARCEL_MEDIA_COMMAND_TEXTURE = 4; | ||
2186 | public const int PARCEL_MEDIA_COMMAND_URL = 5; | ||
2187 | public const int PARCEL_MEDIA_COMMAND_TIME = 6; | ||
2188 | public const int PARCEL_MEDIA_COMMAND_AGENT = 7; | ||
2189 | public const int PARCEL_MEDIA_COMMAND_UNLOAD = 8; | ||
2190 | public const int PARCEL_MEDIA_COMMAND_AUTO_ALIGN = 9; | ||
2191 | |||
2192 | public const int PAY_HIDE = -1; | ||
2193 | public const int PAY_DEFAULT = -2; | ||
2194 | |||
2195 | public const string NULL_KEY = "00000000-0000-0000-0000-000000000000"; | ||
2196 | public const string EOF = "\n\n\n"; | ||
2197 | public const double PI = 3.14159274f; | ||
2198 | public const double TWO_PI = 6.28318548f; | ||
2199 | public const double PI_BY_TWO = 1.57079637f; | ||
2200 | public const double DEG_TO_RAD = 0.01745329238f; | ||
2201 | public const double RAD_TO_DEG = 57.29578f; | ||
2202 | public const double SQRT2 = 1.414213538f; | ||
2203 | public const int STRING_TRIM_HEAD = 1; | ||
2204 | public const int STRING_TRIM_TAIL = 2; | ||
2205 | public const int STRING_TRIM = 3; | ||
2206 | public const int LIST_STAT_RANGE = 0; | ||
2207 | public const int LIST_STAT_MIN = 1; | ||
2208 | public const int LIST_STAT_MAX = 2; | ||
2209 | public const int LIST_STAT_MEAN = 3; | ||
2210 | public const int LIST_STAT_MEDIAN = 4; | ||
2211 | public const int LIST_STAT_STD_DEV = 5; | ||
2212 | public const int LIST_STAT_SUM = 6; | ||
2213 | public const int LIST_STAT_SUM_SQUARES = 7; | ||
2214 | public const int LIST_STAT_NUM_COUNT = 8; | ||
2215 | public const int LIST_STAT_GEOMETRIC_MEAN = 9; | ||
2216 | public const int LIST_STAT_HARMONIC_MEAN = 100; | ||
2217 | |||
2218 | //ParcelPrim Categories | ||
2219 | public const int PARCEL_COUNT_TOTAL = 0; | ||
2220 | public const int PARCEL_COUNT_OWNER = 1; | ||
2221 | public const int PARCEL_COUNT_GROUP = 2; | ||
2222 | public const int PARCEL_COUNT_OTHER = 3; | ||
2223 | public const int PARCEL_COUNT_SELECTED = 4; | ||
2224 | public const int PARCEL_COUNT_TEMP = 5; | ||
2225 | |||
2226 | public const int DEBUG_CHANNEL = 0x7FFFFFFF; | ||
2227 | public const int PUBLIC_CHANNEL = 0x00000000; | ||
2228 | |||
2229 | public const int OBJECT_NAME = 1; | ||
2230 | public const int OBJECT_DESC = 2; | ||
2231 | public const int OBJECT_POS = 3; | ||
2232 | public const int OBJECT_ROT = 4; | ||
2233 | public const int OBJECT_VELOCITY = 5; | ||
2234 | public const int OBJECT_OWNER = 6; | ||
2235 | public const int OBJECT_GROUP = 7; | ||
2236 | public const int OBJECT_CREATOR = 8; | ||
2237 | |||
2238 | // Can not be public const? | ||
2239 | public vector ZERO_VECTOR = new vector(0.0, 0.0, 0.0); | ||
2240 | public rotation ZERO_ROTATION = new rotation(0.0, 0, 0.0, 1.0); | ||
2241 | |||
2242 | |||
2243 | // | ||
2244 | // OSSL | ||
2245 | // | ||
2246 | // FIXME: Refactor so we don't need to pull the script engine | ||
2247 | // into the app domain | ||
2248 | // | ||
2249 | |||
2250 | public void osSetRegionWaterHeight(double height) | ||
2251 | { | ||
2252 | m_OSSL_Functions.osSetRegionWaterHeight(height); | ||
2253 | } | ||
2254 | |||
2255 | public double osList2Double(LSL_Types.list src, int index) | ||
2256 | { | ||
2257 | return m_OSSL_Functions.osList2Double(src, index); | ||
2258 | } | ||
2259 | |||
2260 | public string osSetDynamicTextureURL(string dynamicID, string contentType, string url, string extraParams, | ||
2261 | int timer) | ||
2262 | { | ||
2263 | return m_OSSL_Functions.osSetDynamicTextureURL(dynamicID, contentType, url, extraParams, timer); | ||
2264 | } | ||
2265 | |||
2266 | public string osSetDynamicTextureData(string dynamicID, string contentType, string data, string extraParams, | ||
2267 | int timer) | ||
2268 | { | ||
2269 | return m_OSSL_Functions.osSetDynamicTextureData(dynamicID, contentType, data, extraParams, timer); | ||
2270 | } | ||
2271 | |||
2272 | public string osSetDynamicTextureURLBlend(string dynamicID, string contentType, string url, string extraParams, | ||
2273 | int timer, int alpha) | ||
2274 | { | ||
2275 | return m_OSSL_Functions.osSetDynamicTextureURLBlend(dynamicID, contentType, url, extraParams, timer, alpha); | ||
2276 | } | ||
2277 | |||
2278 | public string osSetDynamicTextureDataBlend(string dynamicID, string contentType, string data, string extraParams, | ||
2279 | int timer, int alpha) | ||
2280 | { | ||
2281 | return m_OSSL_Functions.osSetDynamicTextureDataBlend(dynamicID, contentType, data, extraParams, timer, alpha); | ||
2282 | } | ||
2283 | |||
2284 | public double osTerrainGetHeight(int x, int y) | ||
2285 | { | ||
2286 | return m_OSSL_Functions.osTerrainGetHeight(x, y); | ||
2287 | } | ||
2288 | |||
2289 | public int osTerrainSetHeight(int x, int y, double val) | ||
2290 | { | ||
2291 | return m_OSSL_Functions.osTerrainSetHeight(x, y, val); | ||
2292 | } | ||
2293 | |||
2294 | public int osRegionRestart(double seconds) | ||
2295 | { | ||
2296 | return m_OSSL_Functions.osRegionRestart(seconds); | ||
2297 | } | ||
2298 | |||
2299 | public void osRegionNotice(string msg) | ||
2300 | { | ||
2301 | m_OSSL_Functions.osRegionNotice(msg); | ||
2302 | } | ||
2303 | |||
2304 | public bool osConsoleCommand(string Command) | ||
2305 | { | ||
2306 | return m_OSSL_Functions.osConsoleCommand(Command); | ||
2307 | } | ||
2308 | |||
2309 | public void osSetParcelMediaURL(string url) | ||
2310 | { | ||
2311 | m_OSSL_Functions.osSetParcelMediaURL(url); | ||
2312 | } | ||
2313 | |||
2314 | public void osSetPrimFloatOnWater(int floatYN) | ||
2315 | { | ||
2316 | m_OSSL_Functions.osSetPrimFloatOnWater(floatYN); | ||
2317 | } | ||
2318 | |||
2319 | // Animation Functions | ||
2320 | |||
2321 | public void osAvatarPlayAnimation(string avatar, string animation) | ||
2322 | { | ||
2323 | m_OSSL_Functions.osAvatarPlayAnimation(avatar, animation); | ||
2324 | } | ||
2325 | |||
2326 | public void osAvatarStopAnimation(string avatar, string animation) | ||
2327 | { | ||
2328 | m_OSSL_Functions.osAvatarStopAnimation(avatar, animation); | ||
2329 | } | ||
2330 | |||
2331 | |||
2332 | //Texture Draw functions | ||
2333 | |||
2334 | public string osMovePen(string drawList, int x, int y) | ||
2335 | { | ||
2336 | return m_OSSL_Functions.osMovePen(drawList, x, y); | ||
2337 | } | ||
2338 | |||
2339 | public string osDrawLine(string drawList, int startX, int startY, int endX, int endY) | ||
2340 | { | ||
2341 | return m_OSSL_Functions.osDrawLine(drawList, startX, startY, endX, endY); | ||
2342 | } | ||
2343 | |||
2344 | public string osDrawLine(string drawList, int endX, int endY) | ||
2345 | { | ||
2346 | return m_OSSL_Functions.osDrawLine(drawList, endX, endY); | ||
2347 | } | ||
2348 | |||
2349 | public string osDrawText(string drawList, string text) | ||
2350 | { | ||
2351 | return m_OSSL_Functions.osDrawText(drawList, text); | ||
2352 | } | ||
2353 | |||
2354 | public string osDrawEllipse(string drawList, int width, int height) | ||
2355 | { | ||
2356 | return m_OSSL_Functions.osDrawEllipse(drawList, width, height); | ||
2357 | } | ||
2358 | |||
2359 | public string osDrawRectangle(string drawList, int width, int height) | ||
2360 | { | ||
2361 | return m_OSSL_Functions.osDrawRectangle(drawList, width, height); | ||
2362 | } | ||
2363 | |||
2364 | public string osDrawFilledRectangle(string drawList, int width, int height) | ||
2365 | { | ||
2366 | return m_OSSL_Functions.osDrawFilledRectangle(drawList, width, height); | ||
2367 | } | ||
2368 | |||
2369 | public string osSetFontSize(string drawList, int fontSize) | ||
2370 | { | ||
2371 | return m_OSSL_Functions.osSetFontSize(drawList, fontSize); | ||
2372 | } | ||
2373 | |||
2374 | public string osSetPenSize(string drawList, int penSize) | ||
2375 | { | ||
2376 | return m_OSSL_Functions.osSetPenSize(drawList, penSize); | ||
2377 | } | ||
2378 | |||
2379 | public string osSetPenColour(string drawList, string colour) | ||
2380 | { | ||
2381 | return m_OSSL_Functions.osSetPenColour(drawList, colour); | ||
2382 | } | ||
2383 | |||
2384 | public string osDrawImage(string drawList, int width, int height, string imageUrl) | ||
2385 | { | ||
2386 | return m_OSSL_Functions.osDrawImage(drawList, width, height, imageUrl); | ||
2387 | } | ||
2388 | public void osSetStateEvents(int events) | ||
2389 | { | ||
2390 | m_OSSL_Functions.osSetStateEvents(events); | ||
2391 | } | ||
2392 | } | ||
2393 | } | ||
diff --git a/OpenSim/Region/ScriptEngine/XEngine/Script/ILSL_ScriptCommands.cs b/OpenSim/Region/ScriptEngine/XEngine/Script/ILSL_ScriptCommands.cs new file mode 100644 index 0000000..9e8965c --- /dev/null +++ b/OpenSim/Region/ScriptEngine/XEngine/Script/ILSL_ScriptCommands.cs | |||
@@ -0,0 +1,653 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSim Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using OpenSim.Region.Environment.Interfaces; | ||
29 | |||
30 | namespace OpenSim.Region.ScriptEngine.XEngine.Script | ||
31 | { | ||
32 | public interface ILSL_ScriptCommands | ||
33 | { | ||
34 | // Interface used for loading and executing scripts | ||
35 | |||
36 | string State { get; set ; } | ||
37 | |||
38 | void state(string newState); | ||
39 | |||
40 | ICommander GetCommander(string name); | ||
41 | |||
42 | void llSay(int channelID, string text); | ||
43 | double llSin(double f); | ||
44 | double llCos(double f); | ||
45 | double llTan(double f); | ||
46 | double llAtan2(double x, double y); | ||
47 | double llSqrt(double f); | ||
48 | double llPow(double fbase, double fexponent); | ||
49 | LSL_Types.LSLInteger llAbs(int i); | ||
50 | double llFabs(double f); | ||
51 | double llFrand(double mag); | ||
52 | LSL_Types.LSLInteger llFloor(double f); | ||
53 | LSL_Types.LSLInteger llCeil(double f); | ||
54 | LSL_Types.LSLInteger llRound(double f); | ||
55 | double llVecMag(LSL_Types.Vector3 v); | ||
56 | LSL_Types.Vector3 llVecNorm(LSL_Types.Vector3 v); | ||
57 | double llVecDist(LSL_Types.Vector3 a, LSL_Types.Vector3 b); | ||
58 | LSL_Types.Vector3 llRot2Euler(LSL_Types.Quaternion r); | ||
59 | LSL_Types.Quaternion llEuler2Rot(LSL_Types.Vector3 v); | ||
60 | LSL_Types.Quaternion llAxes2Rot(LSL_Types.Vector3 fwd, LSL_Types.Vector3 left, LSL_Types.Vector3 up); | ||
61 | LSL_Types.Vector3 llRot2Fwd(LSL_Types.Quaternion r); | ||
62 | LSL_Types.Vector3 llRot2Left(LSL_Types.Quaternion r); | ||
63 | LSL_Types.Vector3 llRot2Up(LSL_Types.Quaternion r); | ||
64 | LSL_Types.Quaternion llRotBetween(LSL_Types.Vector3 start, LSL_Types.Vector3 end); | ||
65 | void llWhisper(int channelID, string text); | ||
66 | //void llSay(int channelID, string text); | ||
67 | void llShout(int channelID, string text); | ||
68 | void llRegionSay(int channelID, string text); | ||
69 | LSL_Types.LSLInteger llListen(int channelID, string name, string ID, string msg); | ||
70 | void llListenControl(int number, int active); | ||
71 | void llListenRemove(int number); | ||
72 | void llSensor(string name, string id, int type, double range, double arc); | ||
73 | void llSensorRepeat(string name, string id, int type, double range, double arc, double rate); | ||
74 | void llSensorRemove(); | ||
75 | string llDetectedName(int number); | ||
76 | string llDetectedKey(int number); | ||
77 | string llDetectedOwner(int number); | ||
78 | LSL_Types.LSLInteger llDetectedType(int number); | ||
79 | LSL_Types.Vector3 llDetectedPos(int number); | ||
80 | LSL_Types.Vector3 llDetectedVel(int number); | ||
81 | LSL_Types.Vector3 llDetectedGrab(int number); | ||
82 | LSL_Types.Quaternion llDetectedRot(int number); | ||
83 | LSL_Types.LSLInteger llDetectedGroup(int number); | ||
84 | LSL_Types.LSLInteger llDetectedLinkNumber(int number); | ||
85 | void llDie(); | ||
86 | double llGround(LSL_Types.Vector3 offset); | ||
87 | double llCloud(LSL_Types.Vector3 offset); | ||
88 | LSL_Types.Vector3 llWind(LSL_Types.Vector3 offset); | ||
89 | void llSetStatus(int status, int value); | ||
90 | LSL_Types.LSLInteger llGetStatus(int status); | ||
91 | void llSetScale(LSL_Types.Vector3 scale); | ||
92 | LSL_Types.Vector3 llGetScale(); | ||
93 | void llSetColor(LSL_Types.Vector3 color, int face); | ||
94 | double llGetAlpha(int face); | ||
95 | void llSetAlpha(double alpha, int face); | ||
96 | LSL_Types.Vector3 llGetColor(int face); | ||
97 | void llSetTexture(string texture, int face); | ||
98 | void llScaleTexture(double u, double v, int face); | ||
99 | void llOffsetTexture(double u, double v, int face); | ||
100 | void llRotateTexture(double rotation, int face); | ||
101 | string llGetTexture(int face); | ||
102 | void llSetPos(LSL_Types.Vector3 pos); | ||
103 | |||
104 | //wiki: vector llGetPos() | ||
105 | LSL_Types.Vector3 llGetPos(); | ||
106 | //wiki: vector llGetLocalPos() | ||
107 | LSL_Types.Vector3 llGetLocalPos(); | ||
108 | //wiki: llSetRot(rotation rot) | ||
109 | void llSetRot(LSL_Types.Quaternion rot); | ||
110 | //wiki: rotation llGetRot() | ||
111 | LSL_Types.Quaternion llGetRot(); | ||
112 | //wiki: rotation llGetLocalRot() | ||
113 | LSL_Types.Quaternion llGetLocalRot(); | ||
114 | //wiki: llSetForce(vector force, integer local) | ||
115 | void llSetForce(LSL_Types.Vector3 force, int local); | ||
116 | //wiki: vector llGetForce() | ||
117 | LSL_Types.Vector3 llGetForce(); | ||
118 | //wiki: integer llTarget(vector position, double range) | ||
119 | LSL_Types.LSLInteger llTarget(LSL_Types.Vector3 position, double range); | ||
120 | //wiki: llTargetRemove(integer number) | ||
121 | void llTargetRemove(int number); | ||
122 | //wiki: integer llRotTarget(rotation rot, double error) | ||
123 | LSL_Types.LSLInteger llRotTarget(LSL_Types.Quaternion rot, double error); | ||
124 | //wiki: integer llRotTargetRemove(integer number) | ||
125 | void llRotTargetRemove(int number); | ||
126 | //wiki: llMoveToTarget(vector target, double tau) | ||
127 | void llMoveToTarget(LSL_Types.Vector3 target, double tau); | ||
128 | //wiki: llStopMoveToTarget() | ||
129 | void llStopMoveToTarget(); | ||
130 | //wiki: llApplyImpulse(vector force, integer local) | ||
131 | void llApplyImpulse(LSL_Types.Vector3 force, int local); | ||
132 | //wiki: llapplyRotationalImpulse(vector force, integer local) | ||
133 | void llApplyRotationalImpulse(LSL_Types.Vector3 force, int local); | ||
134 | //wiki: llSetTorque(vector torque, integer local) | ||
135 | void llSetTorque(LSL_Types.Vector3 torque, int local); | ||
136 | //wiki: vector llGetTorque() | ||
137 | LSL_Types.Vector3 llGetTorque(); | ||
138 | //wiki: llSeForceAndTorque(vector force, vector torque, integer local) | ||
139 | void llSetForceAndTorque(LSL_Types.Vector3 force, LSL_Types.Vector3 torque, int local); | ||
140 | //wiki: vector llGetVel() | ||
141 | LSL_Types.Vector3 llGetVel(); | ||
142 | //wiki: vector llGetAccel() | ||
143 | LSL_Types.Vector3 llGetAccel(); | ||
144 | //wiki: vector llGetOmega() | ||
145 | LSL_Types.Vector3 llGetOmega(); | ||
146 | //wiki: double llGetTimeOfDay() | ||
147 | double llGetTimeOfDay(); | ||
148 | //wiki: double llGetWallclock() | ||
149 | double llGetWallclock(); | ||
150 | //wiki: double llGetTime() | ||
151 | double llGetTime(); | ||
152 | //wiki: llResetTime() | ||
153 | void llResetTime(); | ||
154 | //wiki: double llGetAndResetTime() | ||
155 | double llGetAndResetTime(); | ||
156 | //wiki (deprecated) llSound(string sound, double volume, integer queue, integer loop) | ||
157 | void llSound(); | ||
158 | //wiki: llPlaySound(string sound, double volume) | ||
159 | void llPlaySound(string sound, double volume); | ||
160 | //wiki: llLoopSound(string sound, double volume) | ||
161 | void llLoopSound(string sound, double volume); | ||
162 | //wiki: llLoopSoundMaster(string sound, double volume) | ||
163 | void llLoopSoundMaster(string sound, double volume); | ||
164 | //wiki: llLoopSoundSlave(string sound, double volume) | ||
165 | void llLoopSoundSlave(string sound, double volume); | ||
166 | //wiki llPlaySoundSlave(string sound, double volume) | ||
167 | void llPlaySoundSlave(string sound, double volume); | ||
168 | //wiki: llTriggerSound(string sound, double volume) | ||
169 | void llTriggerSound(string sound, double volume); | ||
170 | //wiki: llStopSound() | ||
171 | void llStopSound(); | ||
172 | //wiki: llPreloadSound(string sound) | ||
173 | void llPreloadSound(string sound); | ||
174 | //wiki: string llGetSubString(string src, integer start, integer end) | ||
175 | string llGetSubString(string src, int start, int end); | ||
176 | //wiki: string llDeleteSubString(string src, integer start, integer end) | ||
177 | string llDeleteSubString(string src, int start, int end); | ||
178 | //wiki string llInsertString(string dst, integer position, string src) | ||
179 | string llInsertString(string dst, int position, string src); | ||
180 | //wiki: string llToUpper(string source) | ||
181 | string llToUpper(string source); | ||
182 | //wiki: string llToLower(string source) | ||
183 | string llToLower(string source); | ||
184 | //wiki: integer llGiveMoney(key destination, integer amount) | ||
185 | LSL_Types.LSLInteger llGiveMoney(string destination, int amount); | ||
186 | //wiki: (deprecated) | ||
187 | void llMakeExplosion(); | ||
188 | //wiki: (deprecated) | ||
189 | void llMakeFountain(); | ||
190 | //wiki: (deprecated) | ||
191 | void llMakeSmoke(); | ||
192 | //wiki: (deprecated) | ||
193 | void llMakeFire(); | ||
194 | //wiki: llRezObject(string inventory, vector pos, vector rel, rotation rot, integer param) | ||
195 | void llRezObject(string inventory, LSL_Types.Vector3 pos, LSL_Types.Vector3 vel, LSL_Types.Quaternion rot, int param); | ||
196 | //wiki: llLookAt(vector target, double strength, double damping) | ||
197 | void llLookAt(LSL_Types.Vector3 target, double strength, double damping); | ||
198 | //wiki: llStopLookAt() | ||
199 | void llStopLookAt(); | ||
200 | //wiki: llSetTimerEvent(double sec) | ||
201 | void llSetTimerEvent(double sec); | ||
202 | //wiki: llSleep(double sec) | ||
203 | void llSleep(double sec); | ||
204 | //wiki: double llGetMass() | ||
205 | double llGetMass(); | ||
206 | //wiki: llCollisionFilter(string name, key id, integer accept) | ||
207 | void llCollisionFilter(string name, string id, int accept); | ||
208 | //wiki: llTakeControls(integer controls, integer accept, integer pass_on) | ||
209 | void llTakeControls(int controls, int accept, int pass_on); | ||
210 | //wiki: llReleaseControls() | ||
211 | void llReleaseControls(); | ||
212 | //wiki: llAttachToAvatar(integer attachment) | ||
213 | void llAttachToAvatar(int attachment); | ||
214 | //wiki: llDetachFromAvatar() | ||
215 | void llDetachFromAvatar(); | ||
216 | //wiki: (deprecated) llTakeCamera() | ||
217 | void llTakeCamera(); | ||
218 | //wiki: (deprecated) llReleaseCamera() | ||
219 | void llReleaseCamera(); | ||
220 | //wiki: key llGetOwner() | ||
221 | string llGetOwner(); | ||
222 | //wiki: llInstantMessage(key user, string message) | ||
223 | void llInstantMessage(string user, string message); | ||
224 | //wiki: llEmail(string address, string subject, string message) | ||
225 | void llEmail(string address, string subject, string message); | ||
226 | //wiki: llGetNextEmail(string address, string subject) | ||
227 | void llGetNextEmail(string address, string subject); | ||
228 | //wiki: key llGetKey() | ||
229 | string llGetKey(); | ||
230 | //wiki: llSetBuoyancy(double buoyancy) | ||
231 | void llSetBuoyancy(double buoyancy); | ||
232 | //wiki: llSetHoverHeight(double height, integer water, double tau) | ||
233 | void llSetHoverHeight(double height, int water, double tau); | ||
234 | //wiki: llStopHover | ||
235 | void llStopHover(); | ||
236 | //wiki: llMinEventDelay(double delay) | ||
237 | void llMinEventDelay(double delay); | ||
238 | //wiki: (deprecated) llSoundPreload() | ||
239 | void llSoundPreload(); | ||
240 | //wiki: llRotLookAt(rotation target, double strength, double damping) | ||
241 | void llRotLookAt(LSL_Types.Quaternion target, double strength, double damping); | ||
242 | //wiki: integer llStringLength(string str) | ||
243 | LSL_Types.LSLInteger llStringLength(string str); | ||
244 | //wiki: llStartAnimation(string anim) | ||
245 | void llStartAnimation(string anim); | ||
246 | //wiki: llStopAnimation(string anim) | ||
247 | void llStopAnimation(string anim); | ||
248 | //wiki: (deprecated) llPointAt | ||
249 | void llPointAt(); | ||
250 | //wiki: (deprecated) llStopPointAt | ||
251 | void llStopPointAt(); | ||
252 | //wiki: llTargetOmega(vector axis, double spinrate, double gain) | ||
253 | void llTargetOmega(LSL_Types.Vector3 axis, double spinrate, double gain); | ||
254 | //wiki: integer llGetStartParameter() | ||
255 | LSL_Types.LSLInteger llGetStartParameter(); | ||
256 | //wiki: llGodLikeRezObject(key inventory, vector pos) | ||
257 | void llGodLikeRezObject(string inventory, LSL_Types.Vector3 pos); | ||
258 | //wiki: llRequestPermissions(key agent, integer perm) | ||
259 | void llRequestPermissions(string agent, int perm); | ||
260 | //wiki: key llGetPermissionsKey() | ||
261 | string llGetPermissionsKey(); | ||
262 | //wiki: integer llGetPermissions() | ||
263 | LSL_Types.LSLInteger llGetPermissions(); | ||
264 | //wiki integer llGetLinkNumber() | ||
265 | LSL_Types.LSLInteger llGetLinkNumber(); | ||
266 | //wiki: llSetLinkColor(integer linknumber, vector color, integer face) | ||
267 | void llSetLinkColor(int linknumber, LSL_Types.Vector3 color, int face); | ||
268 | //wiki: llCreateLink(key target, integer parent) | ||
269 | void llCreateLink(string target, int parent); | ||
270 | //wiki: llBreakLink(integer linknum) | ||
271 | void llBreakLink(int linknum); | ||
272 | //wiki: llBreakAllLinks() | ||
273 | void llBreakAllLinks(); | ||
274 | //wiki: key llGetLinkKey(integer linknum) | ||
275 | string llGetLinkKey(int linknum); | ||
276 | //wiki: llGetLinkName(integer linknum) | ||
277 | string llGetLinkName(int linknum); | ||
278 | //wiki: integer llGetInventoryNumber(integer type) | ||
279 | LSL_Types.LSLInteger llGetInventoryNumber(int type); | ||
280 | //wiki: string llGetInventoryName(integer type, integer number) | ||
281 | string llGetInventoryName(int type, int number); | ||
282 | //wiki: llSetScriptState(string name, integer run) | ||
283 | void llSetScriptState(string name, int run); | ||
284 | //wiki: double llGetEnergy() | ||
285 | double llGetEnergy(); | ||
286 | //wiki: llGiveInventory(key destination, string inventory) | ||
287 | void llGiveInventory(string destination, string inventory); | ||
288 | //wiki: llRemoveInventory(string item) | ||
289 | void llRemoveInventory(string item); | ||
290 | //wiki: llSetText(string text, vector color, double alpha) | ||
291 | void llSetText(string text, LSL_Types.Vector3 color, double alpha); | ||
292 | //wiki: double llWater(vector offset) | ||
293 | double llWater(LSL_Types.Vector3 offset); | ||
294 | //wiki: llPassTouches(integer pass) | ||
295 | void llPassTouches(int pass); | ||
296 | //wiki: key llRequestAgentData(key id, integer data) | ||
297 | string llRequestAgentData(string id, int data); | ||
298 | //wiki: key llRequestInventoryData(string name) | ||
299 | string llRequestInventoryData(string name); | ||
300 | //wiki: llSetDamage(double damage) | ||
301 | void llSetDamage(double damage); | ||
302 | //wiki: llTeleportAgentHome(key agent) | ||
303 | void llTeleportAgentHome(string agent); | ||
304 | //wiki: llModifyLand(integer action, integer brush) | ||
305 | void llModifyLand(int action, int brush); | ||
306 | //wiki: llCollisionSound(string impact_sound, double impact_volume) | ||
307 | void llCollisionSound(string impact_sound, double impact_volume); | ||
308 | //wiki: llCollisionSprite(string impact_sprite) | ||
309 | void llCollisionSprite(string impact_sprite); | ||
310 | //wiki: string llGetAnimation(key id) | ||
311 | string llGetAnimation(string id); | ||
312 | //wiki: llResetScript() | ||
313 | void llResetScript(); | ||
314 | //wiki: llMessageLinked(integer linknum, integer num, string str, key id) | ||
315 | void llMessageLinked(int linknum, int num, string str, string id); | ||
316 | //wiki: llPushObject(key target, vector impulse, vector ang_impulse, integer local) | ||
317 | void llPushObject(string target, LSL_Types.Vector3 impulse, LSL_Types.Vector3 ang_impulse, int local); | ||
318 | //wiki: llPassCollisions(integer pass) | ||
319 | void llPassCollisions(int pass); | ||
320 | //wiki: string llGetScriptName() | ||
321 | string llGetScriptName(); | ||
322 | //wiki: integer llGetNumberOfSides() | ||
323 | LSL_Types.LSLInteger llGetNumberOfSides(); | ||
324 | //wiki: rotation llAxisAngle2Rot(vector axis, double angle) | ||
325 | LSL_Types.Quaternion llAxisAngle2Rot(LSL_Types.Vector3 axis, double angle); | ||
326 | //wiki: vector llRot2Axis(rotation rot) | ||
327 | LSL_Types.Vector3 llRot2Axis(LSL_Types.Quaternion rot); | ||
328 | //wiki: double llRot2Angle(rotation rot); | ||
329 | double llRot2Angle(LSL_Types.Quaternion rot); | ||
330 | //wiki: double llAcos(double val) | ||
331 | double llAcos(double val); | ||
332 | //wiki: double llAsin(double val) | ||
333 | double llAsin(double val); | ||
334 | //wiki: double llAngleBetween(rotation a, rotation b) | ||
335 | double llAngleBetween(LSL_Types.Quaternion a, LSL_Types.Quaternion b); | ||
336 | //wiki: string llGetInventoryKey(string name) | ||
337 | string llGetInventoryKey(string name); | ||
338 | //wiki: llAllowInventoryDrop(integer add) | ||
339 | void llAllowInventoryDrop(int add); | ||
340 | //wiki: vector llGetSunDirection() | ||
341 | LSL_Types.Vector3 llGetSunDirection(); | ||
342 | //wiki: vector llGetTextureOffset(integer face) | ||
343 | LSL_Types.Vector3 llGetTextureOffset(int face); | ||
344 | //wiki: vector llGetTextureScale(integer side) | ||
345 | LSL_Types.Vector3 llGetTextureScale(int side); | ||
346 | //wiki: double llGetTextureRot(integer side) | ||
347 | double llGetTextureRot(int side); | ||
348 | //wiki: integer llSubStringIndex(string source, string pattern) | ||
349 | LSL_Types.LSLInteger llSubStringIndex(string source, string pattern); | ||
350 | //wiki: key llGetOwnerKey(key id) | ||
351 | string llGetOwnerKey(string id); | ||
352 | //wiki: vector llGetCenterOfMass() | ||
353 | LSL_Types.Vector3 llGetCenterOfMass(); | ||
354 | //wiki: list llListSort(list src, integer stride, integer ascending) | ||
355 | LSL_Types.list llListSort(LSL_Types.list src, int stride, int ascending); | ||
356 | //integer llGetListLength(list src) | ||
357 | LSL_Types.LSLInteger llGetListLength(LSL_Types.list src); | ||
358 | //wiki: integer llList2Integer(list src, integer index) | ||
359 | LSL_Types.LSLInteger llList2Integer(LSL_Types.list src, int index); | ||
360 | //wiki: double llList2double(list src, integer index) | ||
361 | double llList2Float(LSL_Types.list src, int index); | ||
362 | //wiki: string llList2String(list src, integer index) | ||
363 | string llList2String(LSL_Types.list src, int index); | ||
364 | //wiki: key llList2Key(list src, integer index) | ||
365 | string llList2Key(LSL_Types.list src, int index); | ||
366 | //wiki: vector llList2Vector(list src, integer index) | ||
367 | LSL_Types.Vector3 llList2Vector(LSL_Types.list src, int index); | ||
368 | //wiki rotation llList2Rot(list src, integer index) | ||
369 | LSL_Types.Quaternion llList2Rot(LSL_Types.list src, int index); | ||
370 | //wiki: list llList2List(list src, integer start, integer end) | ||
371 | LSL_Types.list llList2List(LSL_Types.list src, int start, int end); | ||
372 | //wiki: llDeleteSubList(list src, integer start, integer end) | ||
373 | LSL_Types.list llDeleteSubList(LSL_Types.list src, int start, int end); | ||
374 | //wiki: integer llGetListEntryType(list src, integer index) | ||
375 | LSL_Types.LSLInteger llGetListEntryType(LSL_Types.list src, int index); | ||
376 | //wiki: string llList2CSV(list src) | ||
377 | string llList2CSV(LSL_Types.list src); | ||
378 | //wiki: list llCSV2List(string src) | ||
379 | LSL_Types.list llCSV2List(string src); | ||
380 | //wiki: list llListRandomize(list src, integer stride) | ||
381 | LSL_Types.list llListRandomize(LSL_Types.list src, int stride); | ||
382 | //wiki: list llList2ListStrided(list src, integer start, integer end, integer stride) | ||
383 | LSL_Types.list llList2ListStrided(LSL_Types.list src, int start, int end, int stride); | ||
384 | //wiki: vector llGetRegionCorner() | ||
385 | LSL_Types.Vector3 llGetRegionCorner(); | ||
386 | //wiki: list llListInsertList(list dest, list src, integer start) | ||
387 | LSL_Types.list llListInsertList(LSL_Types.list dest, LSL_Types.list src, int start); | ||
388 | //wiki: integer llListFindList(list src, list test) | ||
389 | LSL_Types.LSLInteger llListFindList(LSL_Types.list src, LSL_Types.list test); | ||
390 | //wiki: string llGetObjectName() | ||
391 | string llGetObjectName(); | ||
392 | //wiki: llSetObjectName(string name) | ||
393 | void llSetObjectName(string name); | ||
394 | //wiki: string llGetDate() | ||
395 | string llGetDate(); | ||
396 | //wiki: integer llEdgeOfWorld(vector pos, vector dir) | ||
397 | LSL_Types.LSLInteger llEdgeOfWorld(LSL_Types.Vector3 pos, LSL_Types.Vector3 dir); | ||
398 | //wiki: integer llGetAgentInfo(key id) | ||
399 | LSL_Types.LSLInteger llGetAgentInfo(string id); | ||
400 | //wiki: llAdjustSoundVolume(double volume) | ||
401 | void llAdjustSoundVolume(double volume); | ||
402 | //wiki: llSetSoundQueueing(integer queue) | ||
403 | void llSetSoundQueueing(int queue); | ||
404 | //wiki: llSetSoundRadius(double radius) | ||
405 | void llSetSoundRadius(double radius); | ||
406 | //wiki: string llKey2Name(key id) | ||
407 | string llKey2Name(string id); | ||
408 | //wiki: llSetTextureAnim(integer mode, integer face, integer sizex, integer sizey, double start, double length, double rate) | ||
409 | void llSetTextureAnim(int mode, int face, int sizex, int sizey, double start, double length, double rate); | ||
410 | //wiki: llTriggerSoundLimited(string sound, double volume, vector top_north_east, vector bottom_south_west) | ||
411 | void llTriggerSoundLimited(string sound, double volume, LSL_Types.Vector3 top_north_east, | ||
412 | LSL_Types.Vector3 bottom_south_west); | ||
413 | |||
414 | //wiki: llEjectFromLand(key pest) | ||
415 | void llEjectFromLand(string pest); | ||
416 | LSL_Types.list llParseString2List(string str, LSL_Types.list separators, LSL_Types.list spacers); | ||
417 | //wiki: integer llOverMyLand(key id) | ||
418 | LSL_Types.LSLInteger llOverMyLand(string id); | ||
419 | //wiki: key llGetLandOwnerAt(vector pos) | ||
420 | string llGetLandOwnerAt(LSL_Types.Vector3 pos); | ||
421 | //wiki: key llGetNotecardLine(string name, integer line) | ||
422 | string llGetNotecardLine(string name, int line); | ||
423 | //wiki: vector llGetAgentSize(key id) | ||
424 | LSL_Types.Vector3 llGetAgentSize(string id); | ||
425 | //wiki: integer llSameGroup(key agent) | ||
426 | LSL_Types.LSLInteger llSameGroup(string agent); | ||
427 | //wiki: llUnSit(key id) | ||
428 | void llUnSit(string id); | ||
429 | //wiki: vector llGroundSlope(vector offset) | ||
430 | LSL_Types.Vector3 llGroundSlope(LSL_Types.Vector3 offset); | ||
431 | //wiki: vector llGroundNormal(vector offset) | ||
432 | LSL_Types.Vector3 llGroundNormal(LSL_Types.Vector3 offset); | ||
433 | //wiki: vector llGroundContour(vector offset) | ||
434 | LSL_Types.Vector3 llGroundContour(LSL_Types.Vector3 offset); | ||
435 | //wiki: integer llGetAttached() | ||
436 | LSL_Types.LSLInteger llGetAttached(); | ||
437 | //wiki: integer llGetFreeMemory() | ||
438 | LSL_Types.LSLInteger llGetFreeMemory(); | ||
439 | //wiki: string llGetRegionName() | ||
440 | string llGetRegionName(); | ||
441 | //wiki: double llGetRegionTimeDilation() | ||
442 | double llGetRegionTimeDilation(); | ||
443 | //wiki: double llGetRegionFPS() | ||
444 | double llGetRegionFPS(); | ||
445 | //wiki: llParticleSystem(List<Object> rules | ||
446 | void llParticleSystem(LSL_Types.list rules); | ||
447 | //wiki: llGroundRepel(double height, integer water, double tau) | ||
448 | void llGroundRepel(double height, int water, double tau); | ||
449 | //wiki: llGiveInventoryList(string destination, string category, LSL_Types.list inventory) | ||
450 | void llGiveInventoryList(string destination, string category, LSL_Types.list inventory); | ||
451 | //wiki: llSetVehicleType(integer type) | ||
452 | void llSetVehicleType(int type); | ||
453 | //wiki: llSetVehicledoubleParam(integer param, double value) | ||
454 | void llSetVehicledoubleParam(int param, double value); | ||
455 | // wiki: llSetVehicleFloatParam(integer param, float value) | ||
456 | void llSetVehicleFloatParam(int param, float value); | ||
457 | //wiki: llSetVehicleVectorParam(integer param, vector vec) | ||
458 | void llSetVehicleVectorParam(int param, LSL_Types.Vector3 vec); | ||
459 | //wiki: llSetVehicleRotationParam(integer param, rotation rot) | ||
460 | void llSetVehicleRotationParam(int param, LSL_Types.Quaternion rot); | ||
461 | //wiki: llSetVehicleFlags(integer flags) | ||
462 | void llSetVehicleFlags(int flags); | ||
463 | //wiki: llRemoveVehicleFlags(integer flags) | ||
464 | void llRemoveVehicleFlags(int flags); | ||
465 | //wiki: llSitTarget(vector offset, rotation rot) | ||
466 | void llSitTarget(LSL_Types.Vector3 offset, LSL_Types.Quaternion rot); | ||
467 | //wiki key llAvatarOnSitTarget() | ||
468 | string llAvatarOnSitTarget(); | ||
469 | //wiki: llAddToLandPassList(key avatar, double hours) | ||
470 | void llAddToLandPassList(string avatar, double hours); | ||
471 | //wiki: llSetTouchText(string text) | ||
472 | void llSetTouchText(string text); | ||
473 | //wiki: llSetSitText(string text) | ||
474 | void llSetSitText(string text); | ||
475 | //wiki: llSetCameraEyeOffset(vector offset) | ||
476 | void llSetCameraEyeOffset(LSL_Types.Vector3 offset); | ||
477 | //wiki: llSeteCameraAtOffset(vector offset) | ||
478 | void llSetCameraAtOffset(LSL_Types.Vector3 offset); | ||
479 | // | ||
480 | string llDumpList2String(LSL_Types.list src, string seperator); | ||
481 | //wiki: integer llScriptDanger(vector pos) | ||
482 | LSL_Types.LSLInteger llScriptDanger(LSL_Types.Vector3 pos); | ||
483 | //wiki: llDialog(key avatar, string message, list buttons, integer chat_channel) | ||
484 | void llDialog(string avatar, string message, LSL_Types.list buttons, int chat_channel); | ||
485 | //wiki: llVolumeDetect(integer detect) | ||
486 | void llVolumeDetect(int detect); | ||
487 | //wiki: llResetOtherScript(string name) | ||
488 | void llResetOtherScript(string name); | ||
489 | //wiki: integer llGetScriptState(string name) | ||
490 | LSL_Types.LSLInteger llGetScriptState(string name); | ||
491 | //wiki: (deprecated) | ||
492 | void llRemoteLoadScript(); | ||
493 | //wiki: llSetRemoteScriptAccessPin(integer pin) | ||
494 | void llSetRemoteScriptAccessPin(int pin); | ||
495 | //wiki: llRemoteLoadScriptPin(key target, string name, integer pin, integer running, integer start_param) | ||
496 | void llRemoteLoadScriptPin(string target, string name, int pin, int running, int start_param); | ||
497 | //wiki: llOpenRemoteDataChannel() | ||
498 | void llOpenRemoteDataChannel(); | ||
499 | //wiki: key llSendRemoteData(key channel, string dest, integer idata, string sdata) | ||
500 | string llSendRemoteData(string channel, string dest, int idata, string sdata); | ||
501 | //wiki: llRemoteDataReply(key channel, key message_id, string sdata, integer idata) | ||
502 | void llRemoteDataReply(string channel, string message_id, string sdata, int idata); | ||
503 | //wiki: llCloseRemoteDataChannel(key channel) | ||
504 | void llCloseRemoteDataChannel(string channel); | ||
505 | //wiki: string llMD5String(string src, integer nonce) | ||
506 | string llMD5String(string src, int nonce); | ||
507 | //wiki: llSetPrimitiveParams(list rules) | ||
508 | void llSetPrimitiveParams(LSL_Types.list rules); | ||
509 | //wiki: llSetLinkPrimitiveParams(integer linknumber, list rules) | ||
510 | void llSetLinkPrimitiveParams(int linknumber, LSL_Types.list rules); | ||
511 | //wiki: string llStringToBase64(string str) | ||
512 | string llStringToBase64(string str); | ||
513 | //wiki: string llBase64ToString(string str) | ||
514 | string llBase64ToString(string str); | ||
515 | //wiki: (deprecated) | ||
516 | void llXorBase64Strings(); | ||
517 | //wiki: llRemoteDataSetRegion() | ||
518 | void llRemoteDataSetRegion(); | ||
519 | //wiki: double llLog10(double val) | ||
520 | double llLog10(double val); | ||
521 | //wiki: double llLog(double val) | ||
522 | double llLog(double val); | ||
523 | //wiki: list llGetAnimationList(key id) | ||
524 | LSL_Types.list llGetAnimationList(string id); | ||
525 | //wiki: llSetParcelMusicURL(string url) | ||
526 | void llSetParcelMusicURL(string url); | ||
527 | //wiki: vector llGetRootPosition() | ||
528 | LSL_Types.Vector3 llGetRootPosition(); | ||
529 | //wiki: rotation llGetRootRotation() | ||
530 | LSL_Types.Quaternion llGetRootRotation(); | ||
531 | //wiki: string llGetObjectDesc() | ||
532 | string llGetObjectDesc(); | ||
533 | //wiki: llSetObjectDesc(string desc) | ||
534 | void llSetObjectDesc(string desc); | ||
535 | //wiki: key llGetCreator() | ||
536 | string llGetCreator(); | ||
537 | //wiki: string llGetTimestamp() | ||
538 | string llGetTimestamp(); | ||
539 | //wiki: llSetLinkAlpha(integer linknumber, double alpha, integer face) | ||
540 | void llSetLinkAlpha(int linknumber, double alpha, int face); | ||
541 | //wiki: integer llGetNumberOfPrims() | ||
542 | LSL_Types.LSLInteger llGetNumberOfPrims(); | ||
543 | //wiki: key llGetNumberOfNotecardLines(string name) | ||
544 | string llGetNumberOfNotecardLines(string name); | ||
545 | //wiki: list llGetBoundingBox(key object) | ||
546 | LSL_Types.list llGetBoundingBox(string obj); | ||
547 | //wiki: vector llGetGeometricCenter() | ||
548 | LSL_Types.Vector3 llGetGeometricCenter(); | ||
549 | //wiki: list llGetPrimitiveParams(list rules) | ||
550 | LSL_Types.list llGetPrimitiveParams(LSL_Types.list rules); | ||
551 | //wiki: string llIntegerToBase64(integer number) | ||
552 | string llIntegerToBase64(int number); | ||
553 | //wiki integer llBase64ToInteger(string str) | ||
554 | LSL_Types.LSLInteger llBase64ToInteger(string str); | ||
555 | //wiki: double llGetGMTclock() | ||
556 | double llGetGMTclock(); | ||
557 | //wiki: string llGetSimulatorHostname() | ||
558 | string llGetSimulatorHostname(); | ||
559 | //llSetLocalRot(rotation rot) | ||
560 | void llSetLocalRot(LSL_Types.Quaternion rot); | ||
561 | //wiki: list llParseStringKeepNulls(string src, list separators, list spacers) | ||
562 | LSL_Types.list llParseStringKeepNulls(string src, LSL_Types.list seperators, LSL_Types.list spacers); | ||
563 | //wiki: llRezAtRoot(string inventory, vector position, vector velocity, rotation rot, integer param) | ||
564 | void llRezAtRoot(string inventory, LSL_Types.Vector3 position, LSL_Types.Vector3 velocity, | ||
565 | LSL_Types.Quaternion rot, int param); | ||
566 | |||
567 | //wiki: integer llGetObjectPermMask(integer mask) | ||
568 | LSL_Types.LSLInteger llGetObjectPermMask(int mask); | ||
569 | //wiki: llSetObjectPermMask(integer mask, integer value) | ||
570 | void llSetObjectPermMask(int mask, int value); | ||
571 | //wiki integer llGetInventoryPermMask(string item, integer mask) | ||
572 | LSL_Types.LSLInteger llGetInventoryPermMask(string item, int mask); | ||
573 | //wiki: llSetInventoryPermMask(string item, integer mask, integer value) | ||
574 | void llSetInventoryPermMask(string item, int mask, int value); | ||
575 | //wiki: key llGetInventoryCreator(string item) | ||
576 | string llGetInventoryCreator(string item); | ||
577 | //wiki: llOwnerSay(string msg) | ||
578 | void llOwnerSay(string msg); | ||
579 | //wiki: key llRequestSimulatorData(string simulator, integer data) | ||
580 | string llRequestSimulatorData(string simulator, int data); | ||
581 | //wiki: llForceMouselook(integer mouselook) | ||
582 | void llForceMouselook(int mouselook); | ||
583 | //wiki: double llGetObjectMass(key id) | ||
584 | double llGetObjectMass(string id); | ||
585 | LSL_Types.list llListReplaceList(LSL_Types.list dest, LSL_Types.list src, int start, int end); | ||
586 | //wiki: llLoadURL(key avatar_id, string message, string url) | ||
587 | void llLoadURL(string avatar_id, string message, string url); | ||
588 | //wiki: llParcelMediaCommandList(list commandList) | ||
589 | void llParcelMediaCommandList(LSL_Types.list commandList); | ||
590 | void llParcelMediaQuery(); | ||
591 | //wiki integer llModPow(integer a, integer b, integer c) | ||
592 | LSL_Types.LSLInteger llModPow(int a, int b, int c); | ||
593 | //wiki: integer llGetInventoryType(string name) | ||
594 | LSL_Types.LSLInteger llGetInventoryType(string name); | ||
595 | //wiki: llSetPayPrice(integer price, list quick_pay_buttons) | ||
596 | void llSetPayPrice(int price, LSL_Types.list quick_pay_buttons); | ||
597 | //wiki: vector llGetCameraPos() | ||
598 | LSL_Types.Vector3 llGetCameraPos(); | ||
599 | //wiki rotation llGetCameraRot() | ||
600 | LSL_Types.Quaternion llGetCameraRot(); | ||
601 | //wiki: (deprecated) | ||
602 | void llSetPrimURL(); | ||
603 | //wiki: (deprecated) | ||
604 | void llRefreshPrimURL(); | ||
605 | //wiki: string llEscapeURL(string url) | ||
606 | string llEscapeURL(string url); | ||
607 | //wiki: string llUnescapeURL(string url) | ||
608 | string llUnescapeURL(string url); | ||
609 | //wiki: llMapDestination(string simname, vector pos, vector look_at) | ||
610 | void llMapDestination(string simname, LSL_Types.Vector3 pos, LSL_Types.Vector3 look_at); | ||
611 | //wiki: llAddToLandBanList(key avatar, double hours) | ||
612 | void llAddToLandBanList(string avatar, double hours); | ||
613 | //wiki: llRemoveFromLandPassList(key avatar) | ||
614 | void llRemoveFromLandPassList(string avatar); | ||
615 | //wiki: llRemoveFromLandBanList(key avatar) | ||
616 | void llRemoveFromLandBanList(string avatar); | ||
617 | //wiki: llSetCameraParams(list rules) | ||
618 | void llSetCameraParams(LSL_Types.list rules); | ||
619 | //wiki: llClearCameraParams() | ||
620 | void llClearCameraParams(); | ||
621 | //wiki: double llListStatistics(integer operation, list src) | ||
622 | double llListStatistics(int operation, LSL_Types.list src); | ||
623 | //wiki: integer llGetUnixTime() | ||
624 | LSL_Types.LSLInteger llGetUnixTime(); | ||
625 | //wiki: integer llGetParcelFlags(vector pos) | ||
626 | LSL_Types.LSLInteger llGetParcelFlags(LSL_Types.Vector3 pos); | ||
627 | //wiki: integer llGetRegionFlags() | ||
628 | LSL_Types.LSLInteger llGetRegionFlags(); | ||
629 | //wiki: string llXorBase64StringsCorrect(string str1, string str2) | ||
630 | string llXorBase64StringsCorrect(string str1, string str2); | ||
631 | string llHTTPRequest(string url, LSL_Types.list parameters, string body); | ||
632 | //wiki: llResetLandBanList() | ||
633 | void llResetLandBanList(); | ||
634 | //wiki: llResetLandPassList() | ||
635 | void llResetLandPassList(); | ||
636 | //wiki: integer llGetParcelPrimCount(vector pos, integer category, integer sim_wide) | ||
637 | LSL_Types.LSLInteger llGetParcelPrimCount(LSL_Types.Vector3 pos, int category, int sim_wide); | ||
638 | //wiki: list llGetParcelPrimOwners(vector pos) | ||
639 | LSL_Types.list llGetParcelPrimOwners(LSL_Types.Vector3 pos); | ||
640 | //wiki: integer llGetObjectPrimCount(key object_id) | ||
641 | LSL_Types.LSLInteger llGetObjectPrimCount(string object_id); | ||
642 | //wiki: integer llGetParcelMaxPrims(vector pos, integer sim_wide) | ||
643 | LSL_Types.LSLInteger llGetParcelMaxPrims(LSL_Types.Vector3 pos, int sim_wide); | ||
644 | //wiki: llGetParcelDetails(vector pos, list params) | ||
645 | LSL_Types.list llGetParcelDetails(LSL_Types.Vector3 pos, LSL_Types.list param); | ||
646 | //wiki: llSetLinkTexture(integer linknumber, string texture, integer face) | ||
647 | void llSetLinkTexture(int linknumber, string texture, int face); | ||
648 | //wiki: string llStringTrim(string src, int type) | ||
649 | string llStringTrim(string src, int type); | ||
650 | //wiki: LSL_Types.list llGetObjectDetails(string id, LSL_Types.list args) | ||
651 | LSL_Types.list llGetObjectDetails(string id, LSL_Types.list args); | ||
652 | } | ||
653 | } | ||
diff --git a/OpenSim/Region/ScriptEngine/XEngine/Script/IOSSL_ScriptCommands.cs b/OpenSim/Region/ScriptEngine/XEngine/Script/IOSSL_ScriptCommands.cs new file mode 100644 index 0000000..82d4673 --- /dev/null +++ b/OpenSim/Region/ScriptEngine/XEngine/Script/IOSSL_ScriptCommands.cs | |||
@@ -0,0 +1,68 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSim Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | namespace OpenSim.Region.ScriptEngine.XEngine.Script | ||
29 | { | ||
30 | public interface IOSSL_ScriptCommands | ||
31 | { | ||
32 | //OpenSim functions | ||
33 | string osSetDynamicTextureURL(string dynamicID, string contentType, string url, string extraParams, int timer); | ||
34 | string osSetDynamicTextureURLBlend(string dynamicID, string contentType, string url, string extraParams, | ||
35 | int timer, int alpha); | ||
36 | string osSetDynamicTextureData(string dynamicID, string contentType, string data, string extraParams, int timer); | ||
37 | string osSetDynamicTextureDataBlend(string dynamicID, string contentType, string data, string extraParams, | ||
38 | int timer, int alpha); | ||
39 | double osTerrainGetHeight(int x, int y); | ||
40 | int osTerrainSetHeight(int x, int y, double val); | ||
41 | int osRegionRestart(double seconds); | ||
42 | void osRegionNotice(string msg); | ||
43 | bool osConsoleCommand(string Command); | ||
44 | void osSetParcelMediaURL(string url); | ||
45 | void osSetPrimFloatOnWater(int floatYN); | ||
46 | |||
47 | // Animation commands | ||
48 | void osAvatarPlayAnimation(string avatar, string animation); | ||
49 | void osAvatarStopAnimation(string avatar, string animation); | ||
50 | |||
51 | //texture draw functions | ||
52 | string osMovePen(string drawList, int x, int y); | ||
53 | string osDrawLine(string drawList, int startX, int startY, int endX, int endY); | ||
54 | string osDrawLine(string drawList, int endX, int endY); | ||
55 | string osDrawText(string drawList, string text); | ||
56 | string osDrawEllipse(string drawList, int width, int height); | ||
57 | string osDrawRectangle(string drawList, int width, int height); | ||
58 | string osDrawFilledRectangle(string drawList, int width, int height); | ||
59 | string osSetFontSize(string drawList, int fontSize); | ||
60 | string osSetPenSize(string drawList, int penSize); | ||
61 | string osSetPenColour(string drawList, string colour); | ||
62 | string osDrawImage(string drawList, int width, int height, string imageUrl); | ||
63 | void osSetStateEvents(int events); | ||
64 | |||
65 | double osList2Double(LSL_Types.list src, int index); | ||
66 | void osSetRegionWaterHeight(double height); | ||
67 | } | ||
68 | } | ||
diff --git a/OpenSim/Region/ScriptEngine/XEngine/Script/IScript.cs b/OpenSim/Region/ScriptEngine/XEngine/Script/IScript.cs new file mode 100644 index 0000000..e5d0b33 --- /dev/null +++ b/OpenSim/Region/ScriptEngine/XEngine/Script/IScript.cs | |||
@@ -0,0 +1,46 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSim Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System.Reflection; | ||
29 | using System; | ||
30 | using System.Collections; | ||
31 | using System.Collections.Generic; | ||
32 | using OpenSim.Region.Environment.Interfaces; | ||
33 | |||
34 | namespace OpenSim.Region.ScriptEngine.XEngine.Script | ||
35 | { | ||
36 | public interface IScript | ||
37 | { | ||
38 | Type Start(ILSL_ScriptCommands lsl, IOSSL_ScriptCommands ossl); | ||
39 | |||
40 | Dictionary<string, object> GetVars(); | ||
41 | void SetVars(Dictionary<string, object> vars); | ||
42 | void ResetVars(); | ||
43 | |||
44 | string State { get; set; } | ||
45 | } | ||
46 | } | ||
diff --git a/OpenSim/Region/ScriptEngine/XEngine/Script/LSL_Types.cs b/OpenSim/Region/ScriptEngine/XEngine/Script/LSL_Types.cs new file mode 100644 index 0000000..2d5d2b8 --- /dev/null +++ b/OpenSim/Region/ScriptEngine/XEngine/Script/LSL_Types.cs | |||
@@ -0,0 +1,1411 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSim Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | */ | ||
27 | |||
28 | using System; | ||
29 | using System.Collections; | ||
30 | using System.Text.RegularExpressions; | ||
31 | |||
32 | namespace OpenSim.Region.ScriptEngine.XEngine.Script | ||
33 | { | ||
34 | [Serializable] | ||
35 | public partial class LSL_Types | ||
36 | { | ||
37 | // Types are kept is separate .dll to avoid having to add whatever .dll it is in it to script AppDomain | ||
38 | |||
39 | [Serializable] | ||
40 | public struct Vector3 | ||
41 | { | ||
42 | public double x; | ||
43 | public double y; | ||
44 | public double z; | ||
45 | |||
46 | #region Constructors | ||
47 | |||
48 | public Vector3(Vector3 vector) | ||
49 | { | ||
50 | x = (float)vector.x; | ||
51 | y = (float)vector.y; | ||
52 | z = (float)vector.z; | ||
53 | } | ||
54 | |||
55 | public Vector3(double X, double Y, double Z) | ||
56 | { | ||
57 | x = X; | ||
58 | y = Y; | ||
59 | z = Z; | ||
60 | } | ||
61 | |||
62 | public Vector3(string str) | ||
63 | { | ||
64 | str = str.Replace('<', ' '); | ||
65 | str = str.Replace('>', ' '); | ||
66 | string[] tmps = str.Split(new Char[] { ',', '<', '>' }); | ||
67 | if (tmps.Length < 3) | ||
68 | { | ||
69 | x=y=z=0; | ||
70 | return; | ||
71 | } | ||
72 | bool res; | ||
73 | res = Double.TryParse(tmps[0], out x); | ||
74 | res = res & Double.TryParse(tmps[1], out y); | ||
75 | res = res & Double.TryParse(tmps[2], out z); | ||
76 | } | ||
77 | |||
78 | #endregion | ||
79 | |||
80 | #region Overriders | ||
81 | |||
82 | public override string ToString() | ||
83 | { | ||
84 | string s=String.Format("<{0:0.000000},{1:0.000000},{2:0.000000}>", x, y, z); | ||
85 | return s; | ||
86 | } | ||
87 | |||
88 | public static explicit operator LSLString(Vector3 vec) | ||
89 | { | ||
90 | string s=String.Format("<{0:0.000000},{1:0.000000},{2:0.000000}>", vec.x, vec.y, vec.z); | ||
91 | return new LSLString(s); | ||
92 | } | ||
93 | |||
94 | public static explicit operator string(Vector3 vec) | ||
95 | { | ||
96 | string s=String.Format("<{0:0.000000},{1:0.000000},{2:0.000000}>", vec.x, vec.y, vec.z); | ||
97 | return s; | ||
98 | } | ||
99 | |||
100 | public static explicit operator Vector3(string s) | ||
101 | { | ||
102 | return new Vector3(s); | ||
103 | } | ||
104 | |||
105 | public static bool operator ==(Vector3 lhs, Vector3 rhs) | ||
106 | { | ||
107 | return (lhs.x == rhs.x && lhs.y == rhs.y && lhs.z == rhs.z); | ||
108 | } | ||
109 | |||
110 | public static bool operator !=(Vector3 lhs, Vector3 rhs) | ||
111 | { | ||
112 | return !(lhs == rhs); | ||
113 | } | ||
114 | |||
115 | public override int GetHashCode() | ||
116 | { | ||
117 | return (x.GetHashCode() ^ y.GetHashCode() ^ z.GetHashCode()); | ||
118 | } | ||
119 | |||
120 | public override bool Equals(object o) | ||
121 | { | ||
122 | if (!(o is Vector3)) return false; | ||
123 | |||
124 | Vector3 vector = (Vector3)o; | ||
125 | |||
126 | return (x == vector.x && x == vector.x && z == vector.z); | ||
127 | } | ||
128 | |||
129 | #endregion | ||
130 | |||
131 | #region Vector & Vector Math | ||
132 | |||
133 | // Vector-Vector Math | ||
134 | public static Vector3 operator +(Vector3 lhs, Vector3 rhs) | ||
135 | { | ||
136 | return new Vector3(lhs.x + rhs.x, lhs.y + rhs.y, lhs.z + rhs.z); | ||
137 | } | ||
138 | |||
139 | public static Vector3 operator -(Vector3 lhs, Vector3 rhs) | ||
140 | { | ||
141 | return new Vector3(lhs.x - rhs.x, lhs.y - rhs.y, lhs.z - rhs.z); | ||
142 | } | ||
143 | |||
144 | public static Vector3 operator *(Vector3 lhs, Vector3 rhs) | ||
145 | { | ||
146 | return new Vector3(lhs.x * rhs.x, lhs.y * rhs.y, lhs.z * rhs.z); | ||
147 | } | ||
148 | |||
149 | public static Vector3 operator %(Vector3 v1, Vector3 v2) | ||
150 | { | ||
151 | //Cross product | ||
152 | Vector3 tv; | ||
153 | tv.x = (v1.y * v2.z) - (v1.z * v2.y); | ||
154 | tv.y = (v1.z * v2.x) - (v1.x * v2.z); | ||
155 | tv.z = (v1.x * v2.y) - (v1.y * v2.x); | ||
156 | return tv; | ||
157 | } | ||
158 | |||
159 | #endregion | ||
160 | |||
161 | #region Vector & Float Math | ||
162 | |||
163 | // Vector-Float and Float-Vector Math | ||
164 | public static Vector3 operator *(Vector3 vec, float val) | ||
165 | { | ||
166 | return new Vector3(vec.x * val, vec.y * val, vec.z * val); | ||
167 | } | ||
168 | |||
169 | public static Vector3 operator *(float val, Vector3 vec) | ||
170 | { | ||
171 | return new Vector3(vec.x * val, vec.y * val, vec.z * val); | ||
172 | } | ||
173 | |||
174 | public static Vector3 operator /(Vector3 v, float f) | ||
175 | { | ||
176 | v.x = v.x / f; | ||
177 | v.y = v.y / f; | ||
178 | v.z = v.z / f; | ||
179 | return v; | ||
180 | } | ||
181 | |||
182 | #endregion | ||
183 | |||
184 | #region Vector & Double Math | ||
185 | |||
186 | public static Vector3 operator *(Vector3 vec, double val) | ||
187 | { | ||
188 | return new Vector3(vec.x * val, vec.y * val, vec.z * val); | ||
189 | } | ||
190 | |||
191 | public static Vector3 operator *(double val, Vector3 vec) | ||
192 | { | ||
193 | return new Vector3(vec.x * val, vec.y * val, vec.z * val); | ||
194 | } | ||
195 | |||
196 | public static Vector3 operator /(Vector3 v, double f) | ||
197 | { | ||
198 | v.x = v.x / f; | ||
199 | v.y = v.y / f; | ||
200 | v.z = v.z / f; | ||
201 | return v; | ||
202 | } | ||
203 | |||
204 | #endregion | ||
205 | |||
206 | #region Vector & Rotation Math | ||
207 | |||
208 | // Vector-Rotation Math | ||
209 | public static Vector3 operator *(Vector3 v, Quaternion r) | ||
210 | { | ||
211 | Quaternion vq = new Quaternion(v.x, v.y, v.z, 0); | ||
212 | Quaternion nq = new Quaternion(-r.x, -r.y, -r.z, r.s); | ||
213 | |||
214 | // adapted for operator * computing "b * a" | ||
215 | Quaternion result = nq * (vq * r); | ||
216 | |||
217 | return new Vector3(result.x, result.y, result.z); | ||
218 | } | ||
219 | |||
220 | public static Vector3 operator /(Vector3 v, Quaternion r) | ||
221 | { | ||
222 | r.s = -r.s; | ||
223 | return v * r; | ||
224 | } | ||
225 | |||
226 | #endregion | ||
227 | |||
228 | #region Static Helper Functions | ||
229 | |||
230 | public static double Dot(Vector3 v1, Vector3 v2) | ||
231 | { | ||
232 | return (v1.x * v2.x) + (v1.y * v2.y) + (v1.z * v2.z); | ||
233 | } | ||
234 | |||
235 | public static Vector3 Cross(Vector3 v1, Vector3 v2) | ||
236 | { | ||
237 | return new Vector3 | ||
238 | ( | ||
239 | v1.y * v2.z - v1.z * v2.y, | ||
240 | v1.z * v2.x - v1.x * v2.z, | ||
241 | v1.x * v2.y - v1.y * v2.x | ||
242 | ); | ||
243 | } | ||
244 | |||
245 | public static double Mag(Vector3 v) | ||
246 | { | ||
247 | return Math.Sqrt(v.x * v.x + v.y * v.y + v.z * v.z); | ||
248 | } | ||
249 | |||
250 | public static Vector3 Norm(Vector3 vector) | ||
251 | { | ||
252 | double mag = Mag(vector); | ||
253 | return new Vector3(vector.x / mag, vector.y / mag, vector.z / mag); | ||
254 | } | ||
255 | |||
256 | #endregion | ||
257 | } | ||
258 | |||
259 | [Serializable] | ||
260 | public struct Quaternion | ||
261 | { | ||
262 | public double x; | ||
263 | public double y; | ||
264 | public double z; | ||
265 | public double s; | ||
266 | |||
267 | #region Constructors | ||
268 | |||
269 | public Quaternion(Quaternion Quat) | ||
270 | { | ||
271 | x = (float)Quat.x; | ||
272 | y = (float)Quat.y; | ||
273 | z = (float)Quat.z; | ||
274 | s = (float)Quat.s; | ||
275 | if (x == 0 && y == 0 && z == 0 && s == 0) | ||
276 | s = 1; | ||
277 | } | ||
278 | |||
279 | public Quaternion(double X, double Y, double Z, double S) | ||
280 | { | ||
281 | x = X; | ||
282 | y = Y; | ||
283 | z = Z; | ||
284 | s = S; | ||
285 | if (x == 0 && y == 0 && z == 0 && s == 0) | ||
286 | s = 1; | ||
287 | } | ||
288 | |||
289 | public Quaternion(string str) | ||
290 | { | ||
291 | str = str.Replace('<', ' '); | ||
292 | str = str.Replace('>', ' '); | ||
293 | string[] tmps = str.Split(new Char[] { ',', '<', '>' }); | ||
294 | if (tmps.Length < 4) | ||
295 | { | ||
296 | x=y=z=s=0; | ||
297 | return; | ||
298 | } | ||
299 | bool res; | ||
300 | res = Double.TryParse(tmps[0], out x); | ||
301 | res = res & Double.TryParse(tmps[1], out y); | ||
302 | res = res & Double.TryParse(tmps[2], out z); | ||
303 | res = res & Double.TryParse(tmps[3], out s); | ||
304 | if (x == 0 && y == 0 && z == 0 && s == 0) | ||
305 | s = 1; | ||
306 | } | ||
307 | |||
308 | #endregion | ||
309 | |||
310 | #region Overriders | ||
311 | |||
312 | public override int GetHashCode() | ||
313 | { | ||
314 | return (x.GetHashCode() ^ y.GetHashCode() ^ z.GetHashCode() ^ s.GetHashCode()); | ||
315 | } | ||
316 | |||
317 | public override bool Equals(object o) | ||
318 | { | ||
319 | if (!(o is Quaternion)) return false; | ||
320 | |||
321 | Quaternion quaternion = (Quaternion)o; | ||
322 | |||
323 | return x == quaternion.x && y == quaternion.y && z == quaternion.z && s == quaternion.s; | ||
324 | } | ||
325 | |||
326 | public override string ToString() | ||
327 | { | ||
328 | string st=String.Format("<{0:0.000000},{1:0.000000},{2:0.000000},{3:0.000000}>", x, y, z, s); | ||
329 | return st; | ||
330 | } | ||
331 | |||
332 | public static explicit operator string(Quaternion r) | ||
333 | { | ||
334 | string s=String.Format("<{0:0.000000},{1:0.000000},{2:0.000000},{3:0.000000}>", r.x, r.y, r.z, r.s); | ||
335 | return s; | ||
336 | } | ||
337 | |||
338 | public static explicit operator LSLString(Quaternion r) | ||
339 | { | ||
340 | string s=String.Format("<{0:0.000000},{1:0.000000},{2:0.000000},{3:0.000000}>", r.x, r.y, r.z, r.s); | ||
341 | return new LSLString(s); | ||
342 | } | ||
343 | |||
344 | public static explicit operator Quaternion(string s) | ||
345 | { | ||
346 | return new Quaternion(s); | ||
347 | } | ||
348 | |||
349 | public static bool operator ==(Quaternion lhs, Quaternion rhs) | ||
350 | { | ||
351 | // Return true if the fields match: | ||
352 | return lhs.x == rhs.x && lhs.y == rhs.y && lhs.z == rhs.z && lhs.s == rhs.s; | ||
353 | } | ||
354 | |||
355 | public static bool operator !=(Quaternion lhs, Quaternion rhs) | ||
356 | { | ||
357 | return !(lhs == rhs); | ||
358 | } | ||
359 | |||
360 | #endregion | ||
361 | |||
362 | public static Quaternion operator +(Quaternion a, Quaternion b) | ||
363 | { | ||
364 | return new Quaternion(a.x + b.x, a.y + b.y, a.z + b.z, a.s + b.s); | ||
365 | } | ||
366 | |||
367 | public static Quaternion operator /(Quaternion a, Quaternion b) | ||
368 | { | ||
369 | b.s = -b.s; | ||
370 | return a * b; | ||
371 | } | ||
372 | |||
373 | public static Quaternion operator -(Quaternion a, Quaternion b) | ||
374 | { | ||
375 | return new Quaternion(a.x - b.x, a.y - b.y, a.z - b.z, a.s - b.s); | ||
376 | } | ||
377 | |||
378 | // using the equations below, we need to do "b * a" to be compatible with LSL | ||
379 | public static Quaternion operator *(Quaternion b, Quaternion a) | ||
380 | { | ||
381 | Quaternion c; | ||
382 | c.x = a.s * b.x + a.x * b.s + a.y * b.z - a.z * b.y; | ||
383 | c.y = a.s * b.y + a.y * b.s + a.z * b.x - a.x * b.z; | ||
384 | c.z = a.s * b.z + a.z * b.s + a.x * b.y - a.y * b.x; | ||
385 | c.s = a.s * b.s - a.x * b.x - a.y * b.y - a.z * b.z; | ||
386 | return c; | ||
387 | } | ||
388 | } | ||
389 | |||
390 | [Serializable] | ||
391 | public class list | ||
392 | { | ||
393 | private object[] m_data; | ||
394 | |||
395 | public list(params object[] args) | ||
396 | { | ||
397 | m_data = new object[args.Length]; | ||
398 | m_data = args; | ||
399 | } | ||
400 | |||
401 | public int Length | ||
402 | { | ||
403 | get { | ||
404 | if (m_data == null) | ||
405 | m_data=new Object[0]; | ||
406 | return m_data.Length; | ||
407 | } | ||
408 | } | ||
409 | |||
410 | public object[] Data | ||
411 | { | ||
412 | get { | ||
413 | if (m_data == null) | ||
414 | m_data=new Object[0]; | ||
415 | return m_data; | ||
416 | } | ||
417 | } | ||
418 | |||
419 | public static list operator +(list a, list b) | ||
420 | { | ||
421 | object[] tmp; | ||
422 | tmp = new object[a.Length + b.Length]; | ||
423 | a.Data.CopyTo(tmp, 0); | ||
424 | b.Data.CopyTo(tmp, a.Length); | ||
425 | return new list(tmp); | ||
426 | } | ||
427 | |||
428 | public void Add(object o) | ||
429 | { | ||
430 | object[] tmp; | ||
431 | tmp = new object[m_data.Length + 1]; | ||
432 | m_data.CopyTo(tmp, 0); | ||
433 | tmp[m_data.Length] = o; | ||
434 | m_data = tmp; | ||
435 | } | ||
436 | |||
437 | public bool Contains(object o) | ||
438 | { | ||
439 | bool ret = false; | ||
440 | foreach (object i in Data) | ||
441 | { | ||
442 | if (i == o) | ||
443 | { | ||
444 | ret = true; | ||
445 | break; | ||
446 | } | ||
447 | } | ||
448 | return ret; | ||
449 | } | ||
450 | |||
451 | public list DeleteSublist(int start, int end) | ||
452 | { | ||
453 | // Not an easy one | ||
454 | // If start <= end, remove that part | ||
455 | // if either is negative, count from the end of the array | ||
456 | // if the resulting start > end, remove all BUT that part | ||
457 | |||
458 | Object[] ret; | ||
459 | |||
460 | if (start < 0) | ||
461 | start=m_data.Length-start; | ||
462 | |||
463 | if (start < 0) | ||
464 | start=0; | ||
465 | |||
466 | if (end < 0) | ||
467 | end=m_data.Length-end; | ||
468 | if (end < 0) | ||
469 | end=0; | ||
470 | |||
471 | if (start > end) | ||
472 | { | ||
473 | if (end >= m_data.Length) | ||
474 | return new list(new Object[0]); | ||
475 | |||
476 | if (start >= m_data.Length) | ||
477 | start=m_data.Length-1; | ||
478 | |||
479 | return GetSublist(end, start); | ||
480 | } | ||
481 | |||
482 | // start >= 0 && end >= 0 here | ||
483 | if (start >= m_data.Length) | ||
484 | { | ||
485 | ret=new Object[m_data.Length]; | ||
486 | Array.Copy(m_data, 0, ret, 0, m_data.Length); | ||
487 | |||
488 | return new list(ret); | ||
489 | } | ||
490 | |||
491 | if (end >= m_data.Length) | ||
492 | end=m_data.Length-1; | ||
493 | |||
494 | // now, this makes the math easier | ||
495 | int remove=end+1-start; | ||
496 | |||
497 | ret=new Object[m_data.Length-remove]; | ||
498 | if (ret.Length == 0) | ||
499 | return new list(ret); | ||
500 | |||
501 | int src; | ||
502 | int dest=0; | ||
503 | |||
504 | for (src = 0; src < m_data.Length; src++) | ||
505 | { | ||
506 | if (src < start || src > end) | ||
507 | ret[dest++]=m_data[src]; | ||
508 | } | ||
509 | |||
510 | return new list(ret); | ||
511 | } | ||
512 | |||
513 | public list GetSublist(int start, int end) | ||
514 | { | ||
515 | |||
516 | object[] ret; | ||
517 | |||
518 | // Take care of neg start or end's | ||
519 | // NOTE that either index may still be negative after | ||
520 | // adding the length, so we must take additional | ||
521 | // measures to protect against this. Note also that | ||
522 | // after normalisation the negative indices are no | ||
523 | // longer relative to the end of the list. | ||
524 | |||
525 | if (start < 0) | ||
526 | { | ||
527 | start = m_data.Length + start; | ||
528 | } | ||
529 | |||
530 | if (end < 0) | ||
531 | { | ||
532 | end = m_data.Length + end; | ||
533 | } | ||
534 | |||
535 | // The conventional case is start <= end | ||
536 | // NOTE that the case of an empty list is | ||
537 | // dealt with by the initial test. Start | ||
538 | // less than end is taken to be the most | ||
539 | // common case. | ||
540 | |||
541 | if (start <= end) | ||
542 | { | ||
543 | |||
544 | // Start sublist beyond length | ||
545 | // Also deals with start AND end still negative | ||
546 | if (start >= m_data.Length || end < 0) | ||
547 | { | ||
548 | return new list(); | ||
549 | } | ||
550 | |||
551 | // Sublist extends beyond the end of the supplied list | ||
552 | if (end >= m_data.Length) | ||
553 | { | ||
554 | end = m_data.Length - 1; | ||
555 | } | ||
556 | |||
557 | // Sublist still starts before the beginning of the list | ||
558 | if (start < 0) | ||
559 | { | ||
560 | start = 0; | ||
561 | } | ||
562 | |||
563 | ret = new object[end - start + 1]; | ||
564 | |||
565 | Array.Copy(m_data, start, ret, 0, end - start + 1); | ||
566 | |||
567 | return new list(ret); | ||
568 | |||
569 | } | ||
570 | |||
571 | // Deal with the segmented case: 0->end + start->EOL | ||
572 | |||
573 | else | ||
574 | { | ||
575 | |||
576 | list result = null; | ||
577 | |||
578 | // If end is negative, then prefix list is empty | ||
579 | if (end < 0) | ||
580 | { | ||
581 | result = new list(); | ||
582 | // If start is still negative, then the whole of | ||
583 | // the existing list is returned. This case is | ||
584 | // only admitted if end is also still negative. | ||
585 | if (start < 0) | ||
586 | { | ||
587 | return this; | ||
588 | } | ||
589 | |||
590 | } | ||
591 | else | ||
592 | { | ||
593 | result = GetSublist(0,end); | ||
594 | } | ||
595 | |||
596 | // If start is outside of list, then just return | ||
597 | // the prefix, whatever it is. | ||
598 | if (start >= m_data.Length) | ||
599 | { | ||
600 | return result; | ||
601 | } | ||
602 | |||
603 | return result + GetSublist(start, Data.Length); | ||
604 | |||
605 | } | ||
606 | } | ||
607 | |||
608 | public list Sort(int stride, int ascending) | ||
609 | { | ||
610 | if (Data.Length == 0) | ||
611 | return new list(); // Don't even bother | ||
612 | |||
613 | string[] keys; | ||
614 | |||
615 | if (stride == 1) // The simple case | ||
616 | { | ||
617 | Object[] ret=new Object[Data.Length]; | ||
618 | |||
619 | Array.Copy(Data, 0, ret, 0, Data.Length); | ||
620 | |||
621 | keys=new string[Data.Length]; | ||
622 | |||
623 | for (int k = 0; k < Data.Length; k++) | ||
624 | keys[k] = Data[k].ToString(); | ||
625 | |||
626 | Array.Sort(keys, ret); | ||
627 | |||
628 | if (ascending == 0) | ||
629 | Array.Reverse(ret); | ||
630 | return new list(ret); | ||
631 | } | ||
632 | |||
633 | int src=0; | ||
634 | |||
635 | int len=(Data.Length+stride-1)/stride; | ||
636 | |||
637 | keys=new string[len]; | ||
638 | Object[][] vals=new Object[len][]; | ||
639 | |||
640 | int i; | ||
641 | |||
642 | while (src < Data.Length) | ||
643 | { | ||
644 | Object[] o=new Object[stride]; | ||
645 | |||
646 | for (i = 0; i < stride; i++) | ||
647 | { | ||
648 | if (src < Data.Length) | ||
649 | o[i]=Data[src++]; | ||
650 | else | ||
651 | { | ||
652 | o[i]=new Object(); | ||
653 | src++; | ||
654 | } | ||
655 | } | ||
656 | |||
657 | int idx=src/stride-1; | ||
658 | keys[idx]=o[0].ToString(); | ||
659 | vals[idx]=o; | ||
660 | } | ||
661 | |||
662 | Array.Sort(keys, vals); | ||
663 | if (ascending == 0) | ||
664 | { | ||
665 | Array.Reverse(vals); | ||
666 | } | ||
667 | |||
668 | Object[] sorted=new Object[stride*vals.Length]; | ||
669 | |||
670 | for (i = 0; i < vals.Length; i++) | ||
671 | for (int j = 0; j < stride; j++) | ||
672 | sorted[i*stride+j] = vals[i][j]; | ||
673 | |||
674 | return new list(sorted); | ||
675 | } | ||
676 | |||
677 | #region CSV Methods | ||
678 | |||
679 | public static list FromCSV(string csv) | ||
680 | { | ||
681 | return new list(csv.Split(',')); | ||
682 | } | ||
683 | |||
684 | public string ToCSV() | ||
685 | { | ||
686 | string ret = ""; | ||
687 | foreach (object o in this.Data) | ||
688 | { | ||
689 | if (ret == "") | ||
690 | { | ||
691 | ret = o.ToString(); | ||
692 | } | ||
693 | else | ||
694 | { | ||
695 | ret = ret + ", " + o.ToString(); | ||
696 | } | ||
697 | } | ||
698 | return ret; | ||
699 | } | ||
700 | |||
701 | private string ToSoup() | ||
702 | { | ||
703 | string output; | ||
704 | output = String.Empty; | ||
705 | if (m_data.Length == 0) | ||
706 | { | ||
707 | return String.Empty; | ||
708 | } | ||
709 | foreach (object o in m_data) | ||
710 | { | ||
711 | output = output + o.ToString(); | ||
712 | } | ||
713 | return output; | ||
714 | } | ||
715 | |||
716 | public static explicit operator String(list l) | ||
717 | { | ||
718 | return l.ToSoup(); | ||
719 | } | ||
720 | |||
721 | public static explicit operator LSLString(list l) | ||
722 | { | ||
723 | return new LSLString(l.ToSoup()); | ||
724 | } | ||
725 | |||
726 | public override string ToString() | ||
727 | { | ||
728 | return ToSoup(); | ||
729 | } | ||
730 | |||
731 | #endregion | ||
732 | |||
733 | #region Statistic Methods | ||
734 | |||
735 | public double Min() | ||
736 | { | ||
737 | double minimum = double.PositiveInfinity; | ||
738 | double entry; | ||
739 | for (int i = 0; i < Data.Length; i++) | ||
740 | { | ||
741 | if (double.TryParse(Data[i].ToString(), out entry)) | ||
742 | { | ||
743 | if (entry < minimum) minimum = entry; | ||
744 | } | ||
745 | } | ||
746 | return minimum; | ||
747 | } | ||
748 | |||
749 | public double Max() | ||
750 | { | ||
751 | double maximum = double.NegativeInfinity; | ||
752 | double entry; | ||
753 | for (int i = 0; i < Data.Length; i++) | ||
754 | { | ||
755 | if (double.TryParse(Data[i].ToString(), out entry)) | ||
756 | { | ||
757 | if (entry > maximum) maximum = entry; | ||
758 | } | ||
759 | } | ||
760 | return maximum; | ||
761 | } | ||
762 | |||
763 | public double Range() | ||
764 | { | ||
765 | return (this.Max() / this.Min()); | ||
766 | } | ||
767 | |||
768 | public int NumericLength() | ||
769 | { | ||
770 | int count = 0; | ||
771 | double entry; | ||
772 | for (int i = 0; i < Data.Length; i++) | ||
773 | { | ||
774 | if (double.TryParse(Data[i].ToString(), out entry)) | ||
775 | { | ||
776 | count++; | ||
777 | } | ||
778 | } | ||
779 | return count; | ||
780 | } | ||
781 | |||
782 | public static list ToDoubleList(list src) | ||
783 | { | ||
784 | list ret = new list(); | ||
785 | double entry; | ||
786 | for (int i = 0; i < src.Data.Length - 1; i++) | ||
787 | { | ||
788 | if (double.TryParse(src.Data[i].ToString(), out entry)) | ||
789 | { | ||
790 | ret.Add(entry); | ||
791 | } | ||
792 | } | ||
793 | return ret; | ||
794 | } | ||
795 | |||
796 | public double Sum() | ||
797 | { | ||
798 | double sum = 0; | ||
799 | double entry; | ||
800 | for (int i = 0; i < Data.Length; i++) | ||
801 | { | ||
802 | if (double.TryParse(Data[i].ToString(), out entry)) | ||
803 | { | ||
804 | sum = sum + entry; | ||
805 | } | ||
806 | } | ||
807 | return sum; | ||
808 | } | ||
809 | |||
810 | public double SumSqrs() | ||
811 | { | ||
812 | double sum = 0; | ||
813 | double entry; | ||
814 | for (int i = 0; i < Data.Length; i++) | ||
815 | { | ||
816 | if (double.TryParse(Data[i].ToString(), out entry)) | ||
817 | { | ||
818 | sum = sum + Math.Pow(entry, 2); | ||
819 | } | ||
820 | } | ||
821 | return sum; | ||
822 | } | ||
823 | |||
824 | public double Mean() | ||
825 | { | ||
826 | return (this.Sum() / this.NumericLength()); | ||
827 | } | ||
828 | |||
829 | public void NumericSort() | ||
830 | { | ||
831 | IComparer Numeric = new NumericComparer(); | ||
832 | Array.Sort(Data, Numeric); | ||
833 | } | ||
834 | |||
835 | public void AlphaSort() | ||
836 | { | ||
837 | IComparer Alpha = new AlphaCompare(); | ||
838 | Array.Sort(Data, Alpha); | ||
839 | } | ||
840 | |||
841 | public double Median() | ||
842 | { | ||
843 | return Qi(0.5); | ||
844 | } | ||
845 | |||
846 | public double GeometricMean() | ||
847 | { | ||
848 | double ret = 1.0; | ||
849 | list nums = ToDoubleList(this); | ||
850 | for (int i = 0; i < nums.Data.Length; i++) | ||
851 | { | ||
852 | ret *= (double)nums.Data[i]; | ||
853 | } | ||
854 | return Math.Exp(Math.Log(ret) / (double)nums.Data.Length); | ||
855 | } | ||
856 | |||
857 | public double HarmonicMean() | ||
858 | { | ||
859 | double ret = 0.0; | ||
860 | list nums = ToDoubleList(this); | ||
861 | for (int i = 0; i < nums.Data.Length; i++) | ||
862 | { | ||
863 | ret += 1.0 / (double)nums.Data[i]; | ||
864 | } | ||
865 | return ((double)nums.Data.Length / ret); | ||
866 | } | ||
867 | |||
868 | public double Variance() | ||
869 | { | ||
870 | double s = 0; | ||
871 | list num = ToDoubleList(this); | ||
872 | for (int i = 0; i < num.Data.Length; i++) | ||
873 | { | ||
874 | s += Math.Pow((double)num.Data[i], 2); | ||
875 | } | ||
876 | return (s - num.Data.Length * Math.Pow(num.Mean(), 2)) / (num.Data.Length - 1); | ||
877 | } | ||
878 | |||
879 | public double StdDev() | ||
880 | { | ||
881 | return Math.Sqrt(this.Variance()); | ||
882 | } | ||
883 | |||
884 | public double Qi(double i) | ||
885 | { | ||
886 | list j = this; | ||
887 | j.NumericSort(); | ||
888 | |||
889 | if (Math.Ceiling(this.Length * i) == this.Length * i) | ||
890 | { | ||
891 | return (double)((double)j.Data[(int)(this.Length * i - 1)] + (double)j.Data[(int)(this.Length * i)]) / 2; | ||
892 | } | ||
893 | else | ||
894 | { | ||
895 | return (double)j.Data[((int)(Math.Ceiling(this.Length * i))) - 1]; | ||
896 | } | ||
897 | } | ||
898 | |||
899 | #endregion | ||
900 | |||
901 | public string ToPrettyString() | ||
902 | { | ||
903 | string output; | ||
904 | if (m_data.Length == 0) | ||
905 | { | ||
906 | return "[]"; | ||
907 | } | ||
908 | output = "["; | ||
909 | foreach (object o in m_data) | ||
910 | { | ||
911 | if (o is String) | ||
912 | { | ||
913 | output = output + "\"" + o + "\", "; | ||
914 | } | ||
915 | else | ||
916 | { | ||
917 | output = output + o.ToString() + ", "; | ||
918 | } | ||
919 | } | ||
920 | output = output.Substring(0, output.Length - 2); | ||
921 | output = output + "]"; | ||
922 | return output; | ||
923 | } | ||
924 | |||
925 | public class AlphaCompare : IComparer | ||
926 | { | ||
927 | int IComparer.Compare(object x, object y) | ||
928 | { | ||
929 | return string.Compare(x.ToString(), y.ToString()); | ||
930 | } | ||
931 | } | ||
932 | |||
933 | public class NumericComparer : IComparer | ||
934 | { | ||
935 | int IComparer.Compare(object x, object y) | ||
936 | { | ||
937 | double a; | ||
938 | double b; | ||
939 | if (!double.TryParse(x.ToString(), out a)) | ||
940 | { | ||
941 | a = 0.0; | ||
942 | } | ||
943 | if (!double.TryParse(y.ToString(), out b)) | ||
944 | { | ||
945 | b = 0.0; | ||
946 | } | ||
947 | if (a < b) | ||
948 | { | ||
949 | return -1; | ||
950 | } | ||
951 | else if (a == b) | ||
952 | { | ||
953 | return 0; | ||
954 | } | ||
955 | else | ||
956 | { | ||
957 | return 1; | ||
958 | } | ||
959 | } | ||
960 | } | ||
961 | |||
962 | } | ||
963 | |||
964 | // | ||
965 | // BELOW IS WORK IN PROGRESS... IT WILL CHANGE, SO DON'T USE YET! :) | ||
966 | // | ||
967 | |||
968 | public struct StringTest | ||
969 | { | ||
970 | // Our own little string | ||
971 | internal string actualString; | ||
972 | public static implicit operator bool(StringTest mString) | ||
973 | { | ||
974 | if (mString.actualString.Length == 0) | ||
975 | return true; | ||
976 | return false; | ||
977 | } | ||
978 | public override string ToString() | ||
979 | { | ||
980 | return actualString; | ||
981 | } | ||
982 | |||
983 | } | ||
984 | |||
985 | [Serializable] | ||
986 | public struct key | ||
987 | { | ||
988 | public string value; | ||
989 | |||
990 | #region Constructors | ||
991 | public key(string s) | ||
992 | { | ||
993 | value = s; | ||
994 | } | ||
995 | |||
996 | #endregion | ||
997 | |||
998 | #region Methods | ||
999 | |||
1000 | static public bool Parse2Key(string s) | ||
1001 | { | ||
1002 | Regex isuuid = new Regex(@"^[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}$", RegexOptions.Compiled); | ||
1003 | if (isuuid.IsMatch(s)) | ||
1004 | { | ||
1005 | return true; | ||
1006 | } | ||
1007 | else | ||
1008 | { | ||
1009 | return false; | ||
1010 | } | ||
1011 | } | ||
1012 | |||
1013 | #endregion | ||
1014 | |||
1015 | #region Operators | ||
1016 | |||
1017 | static public implicit operator Boolean(key k) | ||
1018 | { | ||
1019 | if (k.value.Length == 0) | ||
1020 | { | ||
1021 | return false; | ||
1022 | } | ||
1023 | |||
1024 | if (k.value == "00000000-0000-0000-0000-000000000000") | ||
1025 | { | ||
1026 | return false; | ||
1027 | } | ||
1028 | Regex isuuid = new Regex(@"^[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}$", RegexOptions.Compiled); | ||
1029 | if (isuuid.IsMatch(k.value)) | ||
1030 | { | ||
1031 | return true; | ||
1032 | } | ||
1033 | else | ||
1034 | { | ||
1035 | return false; | ||
1036 | } | ||
1037 | } | ||
1038 | |||
1039 | static public implicit operator key(string s) | ||
1040 | { | ||
1041 | return new key(s); | ||
1042 | } | ||
1043 | |||
1044 | static public implicit operator String(key k) | ||
1045 | { | ||
1046 | return k.value; | ||
1047 | } | ||
1048 | |||
1049 | public static bool operator ==(key k1, key k2) | ||
1050 | { | ||
1051 | return k1.value == k2.value; | ||
1052 | } | ||
1053 | public static bool operator !=(key k1, key k2) | ||
1054 | { | ||
1055 | return k1.value != k2.value; | ||
1056 | } | ||
1057 | |||
1058 | #endregion | ||
1059 | |||
1060 | #region Overriders | ||
1061 | |||
1062 | public override bool Equals(object o) | ||
1063 | { | ||
1064 | return o.ToString() == value; | ||
1065 | } | ||
1066 | |||
1067 | public override int GetHashCode() | ||
1068 | { | ||
1069 | return value.GetHashCode(); | ||
1070 | } | ||
1071 | |||
1072 | #endregion | ||
1073 | } | ||
1074 | |||
1075 | [Serializable] | ||
1076 | public struct LSLString | ||
1077 | { | ||
1078 | public string m_string; | ||
1079 | #region Constructors | ||
1080 | public LSLString(string s) | ||
1081 | { | ||
1082 | m_string = s; | ||
1083 | } | ||
1084 | |||
1085 | public LSLString(int i) | ||
1086 | { | ||
1087 | m_string=i.ToString(); | ||
1088 | } | ||
1089 | |||
1090 | public LSLString(double d) | ||
1091 | { | ||
1092 | string s=String.Format("{0:0.000000}", d); | ||
1093 | m_string=s; | ||
1094 | } | ||
1095 | |||
1096 | #endregion | ||
1097 | |||
1098 | #region Operators | ||
1099 | static public implicit operator Boolean(LSLString s) | ||
1100 | { | ||
1101 | if (s.m_string.Length == 0) | ||
1102 | { | ||
1103 | return false; | ||
1104 | } | ||
1105 | else | ||
1106 | { | ||
1107 | return true; | ||
1108 | } | ||
1109 | } | ||
1110 | |||
1111 | |||
1112 | |||
1113 | static public implicit operator String(LSLString s) | ||
1114 | { | ||
1115 | return s.m_string; | ||
1116 | } | ||
1117 | |||
1118 | static public implicit operator LSLString(string s) | ||
1119 | { | ||
1120 | return new LSLString(s); | ||
1121 | } | ||
1122 | |||
1123 | public static string ToString(LSLString s) | ||
1124 | { | ||
1125 | return s.m_string; | ||
1126 | } | ||
1127 | |||
1128 | public override string ToString() | ||
1129 | { | ||
1130 | return m_string; | ||
1131 | } | ||
1132 | |||
1133 | public static bool operator ==(LSLString s1, string s2) | ||
1134 | { | ||
1135 | return s1.m_string == s2; | ||
1136 | } | ||
1137 | |||
1138 | public static bool operator !=(LSLString s1, string s2) | ||
1139 | { | ||
1140 | return s1.m_string != s2; | ||
1141 | } | ||
1142 | |||
1143 | public static explicit operator double(LSLString s) | ||
1144 | { | ||
1145 | return Convert.ToDouble(s.m_string); | ||
1146 | } | ||
1147 | |||
1148 | public static explicit operator LSLInteger(LSLString s) | ||
1149 | { | ||
1150 | return new LSLInteger(Convert.ToInt32(s.m_string)); | ||
1151 | } | ||
1152 | |||
1153 | public static explicit operator LSLString(int i) | ||
1154 | { | ||
1155 | return new LSLString(i); | ||
1156 | } | ||
1157 | |||
1158 | public static explicit operator LSLString(double d) | ||
1159 | { | ||
1160 | return new LSLString(d); | ||
1161 | } | ||
1162 | |||
1163 | public static implicit operator Vector3(LSLString s) | ||
1164 | { | ||
1165 | return new Vector3(s.m_string); | ||
1166 | } | ||
1167 | |||
1168 | #endregion | ||
1169 | |||
1170 | #region Overriders | ||
1171 | public override bool Equals(object o) | ||
1172 | { | ||
1173 | return m_string == o.ToString(); | ||
1174 | } | ||
1175 | |||
1176 | public override int GetHashCode() | ||
1177 | { | ||
1178 | return m_string.GetHashCode(); | ||
1179 | } | ||
1180 | |||
1181 | #endregion | ||
1182 | |||
1183 | #region " Standard string functions " | ||
1184 | //Clone,CompareTo,Contains | ||
1185 | //CopyTo,EndsWith,Equals,GetEnumerator,GetHashCode,GetType,GetTypeCode | ||
1186 | //IndexOf,IndexOfAny,Insert,IsNormalized,LastIndexOf,LastIndexOfAny | ||
1187 | //Length,Normalize,PadLeft,PadRight,Remove,Replace,Split,StartsWith,Substring,ToCharArray,ToLowerInvariant | ||
1188 | //ToString,ToUpper,ToUpperInvariant,Trim,TrimEnd,TrimStart | ||
1189 | public bool Contains(string value) { return m_string.Contains(value); } | ||
1190 | public int IndexOf(string value) { return m_string.IndexOf(value); } | ||
1191 | public int Length { get { return m_string.Length; } } | ||
1192 | |||
1193 | |||
1194 | #endregion | ||
1195 | } | ||
1196 | |||
1197 | [Serializable] | ||
1198 | public struct LSLInteger | ||
1199 | { | ||
1200 | public int value; | ||
1201 | |||
1202 | #region Constructors | ||
1203 | public LSLInteger(int i) | ||
1204 | { | ||
1205 | value = i; | ||
1206 | } | ||
1207 | |||
1208 | public LSLInteger(double d) | ||
1209 | { | ||
1210 | value = (int)d; | ||
1211 | } | ||
1212 | |||
1213 | public LSLInteger(Object o) | ||
1214 | { | ||
1215 | if(!(o is Int32)) | ||
1216 | value=0; | ||
1217 | else | ||
1218 | value = (int)o; | ||
1219 | } | ||
1220 | |||
1221 | public LSLInteger(string s) | ||
1222 | { | ||
1223 | value = int.Parse(s); | ||
1224 | } | ||
1225 | |||
1226 | #endregion | ||
1227 | |||
1228 | static public implicit operator int(LSLInteger i) | ||
1229 | { | ||
1230 | return i.value; | ||
1231 | } | ||
1232 | |||
1233 | static public implicit operator uint(LSLInteger i) | ||
1234 | { | ||
1235 | return (uint)i.value; | ||
1236 | } | ||
1237 | |||
1238 | static public explicit operator LSLString(LSLInteger i) | ||
1239 | { | ||
1240 | return new LSLString(i.ToString()); | ||
1241 | } | ||
1242 | |||
1243 | static public explicit operator string(LSLInteger i) | ||
1244 | { | ||
1245 | return i.ToString(); | ||
1246 | } | ||
1247 | |||
1248 | static public implicit operator Boolean(LSLInteger i) | ||
1249 | { | ||
1250 | if (i.value == 0) | ||
1251 | { | ||
1252 | return false; | ||
1253 | } | ||
1254 | else | ||
1255 | { | ||
1256 | return true; | ||
1257 | } | ||
1258 | } | ||
1259 | |||
1260 | static public implicit operator LSLInteger(int i) | ||
1261 | { | ||
1262 | return new LSLInteger(i); | ||
1263 | } | ||
1264 | |||
1265 | static public explicit operator LSLInteger(string s) | ||
1266 | { | ||
1267 | return new LSLInteger(int.Parse(s)); | ||
1268 | } | ||
1269 | |||
1270 | static public implicit operator LSLInteger(double d) | ||
1271 | { | ||
1272 | return new LSLInteger(d); | ||
1273 | } | ||
1274 | |||
1275 | static public bool operator ==(LSLInteger i1, LSLInteger i2) | ||
1276 | { | ||
1277 | bool ret = i1.value == i2.value; | ||
1278 | return ret; | ||
1279 | } | ||
1280 | |||
1281 | static public bool operator !=(LSLInteger i1, LSLInteger i2) | ||
1282 | { | ||
1283 | bool ret = i1.value != i2.value; | ||
1284 | return ret; | ||
1285 | } | ||
1286 | |||
1287 | static public LSLInteger operator &(LSLInteger i1, LSLInteger i2) | ||
1288 | { | ||
1289 | int ret = i1.value & i2.value; | ||
1290 | return ret; | ||
1291 | } | ||
1292 | |||
1293 | public static LSLInteger operator ++(LSLInteger i) | ||
1294 | { | ||
1295 | i.value++; | ||
1296 | return i; | ||
1297 | } | ||
1298 | |||
1299 | |||
1300 | public static LSLInteger operator --(LSLInteger i) | ||
1301 | { | ||
1302 | i.value--; | ||
1303 | return i; | ||
1304 | } | ||
1305 | |||
1306 | static public implicit operator System.Double(LSLInteger i) | ||
1307 | { | ||
1308 | return (double)i.value; | ||
1309 | } | ||
1310 | |||
1311 | public static bool operator true(LSLInteger i) | ||
1312 | { | ||
1313 | return i.value != 0; | ||
1314 | } | ||
1315 | |||
1316 | public static bool operator false(LSLInteger i) | ||
1317 | { | ||
1318 | return i.value == 0; | ||
1319 | } | ||
1320 | |||
1321 | #region Overriders | ||
1322 | |||
1323 | public override string ToString() | ||
1324 | { | ||
1325 | return this.value.ToString(); | ||
1326 | } | ||
1327 | |||
1328 | public override bool Equals(object o) | ||
1329 | { | ||
1330 | if(o is Int32) | ||
1331 | { | ||
1332 | return value == (Int32)o; | ||
1333 | } | ||
1334 | if(o is LSLInteger) | ||
1335 | { | ||
1336 | return value == ((LSLInteger)o).value; | ||
1337 | } | ||
1338 | return false; | ||
1339 | } | ||
1340 | |||
1341 | public override int GetHashCode() | ||
1342 | { | ||
1343 | return value.GetHashCode(); | ||
1344 | } | ||
1345 | |||
1346 | #endregion | ||
1347 | } | ||
1348 | |||
1349 | [Serializable] | ||
1350 | public struct LSLFloat | ||
1351 | { | ||
1352 | public double value; | ||
1353 | |||
1354 | #region Constructors | ||
1355 | public LSLFloat(int i) | ||
1356 | { | ||
1357 | this.value = (double)i; | ||
1358 | } | ||
1359 | |||
1360 | public LSLFloat(double d) | ||
1361 | { | ||
1362 | this.value = d; | ||
1363 | } | ||
1364 | |||
1365 | #endregion | ||
1366 | |||
1367 | #region Operators | ||
1368 | |||
1369 | static public implicit operator Double(LSLFloat f) | ||
1370 | { | ||
1371 | return f.value; | ||
1372 | } | ||
1373 | |||
1374 | //static public implicit operator System.Int32(LSLFloat f) | ||
1375 | //{ | ||
1376 | // return (int)f.value; | ||
1377 | //} | ||
1378 | |||
1379 | |||
1380 | static public implicit operator Boolean(LSLFloat f) | ||
1381 | { | ||
1382 | if (f.value == 0) | ||
1383 | { | ||
1384 | return false; | ||
1385 | } | ||
1386 | else | ||
1387 | { | ||
1388 | return true; | ||
1389 | } | ||
1390 | } | ||
1391 | |||
1392 | static public implicit operator LSLFloat(int i) | ||
1393 | { | ||
1394 | return new LSLFloat(i); | ||
1395 | } | ||
1396 | |||
1397 | static public implicit operator LSLFloat(double d) | ||
1398 | { | ||
1399 | return new LSLFloat(d); | ||
1400 | } | ||
1401 | #endregion | ||
1402 | |||
1403 | #region Overriders | ||
1404 | public override string ToString() | ||
1405 | { | ||
1406 | return this.value.ToString(); | ||
1407 | } | ||
1408 | #endregion | ||
1409 | } | ||
1410 | } | ||
1411 | } | ||
diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs new file mode 100644 index 0000000..3ca03b2 --- /dev/null +++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs | |||
@@ -0,0 +1,1435 @@ | |||
1 | using System; | ||
2 | using System.IO; | ||
3 | using System.Threading; | ||
4 | using System.Collections; | ||
5 | using System.Collections.Generic; | ||
6 | using System.Security.Policy; | ||
7 | using System.Reflection; | ||
8 | using System.Xml; | ||
9 | using libsecondlife; | ||
10 | using log4net; | ||
11 | using Nini.Config; | ||
12 | using Amib.Threading; | ||
13 | using OpenSim.Framework; | ||
14 | using OpenSim.Region.Environment; | ||
15 | using OpenSim.Region.Environment.Scenes; | ||
16 | using OpenSim.Region.Environment.Interfaces; | ||
17 | using OpenSim.Region.ScriptEngine.XEngine.Script; | ||
18 | |||
19 | namespace OpenSim.Region.ScriptEngine.XEngine | ||
20 | { | ||
21 | public class XEngine : IRegionModule | ||
22 | { | ||
23 | private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
24 | |||
25 | private SmartThreadPool m_ThreadPool; | ||
26 | private int m_MaxScriptQueue; | ||
27 | private Scene m_Scene; | ||
28 | private IConfig m_ScriptConfig; | ||
29 | private Compiler m_Compiler; | ||
30 | private EventManager m_EventManager; | ||
31 | private int m_EventLimit; | ||
32 | private bool m_KillTimedOutScripts; | ||
33 | |||
34 | private static List<XEngine> m_ScriptEngines = | ||
35 | new List<XEngine>(); | ||
36 | public AsyncCommandManager m_ASYNCLSLCommandManager; | ||
37 | |||
38 | // Maps the local id to the script inventory items in it | ||
39 | |||
40 | private Dictionary<uint, List<LLUUID> > m_PrimObjects = | ||
41 | new Dictionary<uint, List<LLUUID> >(); | ||
42 | |||
43 | // Maps the LLUUID above to the script instance | ||
44 | |||
45 | private Dictionary<LLUUID, XScriptInstance> m_Scripts = | ||
46 | new Dictionary<LLUUID, XScriptInstance>(); | ||
47 | |||
48 | // Maps the asset ID to the assembly | ||
49 | |||
50 | private Dictionary<LLUUID, string> m_Assemblies = | ||
51 | new Dictionary<LLUUID, string>(); | ||
52 | |||
53 | // This will list AppDomains by script asset | ||
54 | |||
55 | private Dictionary<LLUUID, AppDomain> m_AppDomains = | ||
56 | new Dictionary<LLUUID, AppDomain>(); | ||
57 | |||
58 | // List the scripts running in each appdomain | ||
59 | |||
60 | private Dictionary<LLUUID, List<LLUUID> > m_DomainScripts = | ||
61 | new Dictionary<LLUUID, List<LLUUID> >(); | ||
62 | |||
63 | public string ScriptEngineName | ||
64 | { | ||
65 | get { return "XEngine"; } | ||
66 | } | ||
67 | |||
68 | public Scene World | ||
69 | { | ||
70 | get { return m_Scene; } | ||
71 | } | ||
72 | |||
73 | public ILog Log | ||
74 | { | ||
75 | get { return m_log; } | ||
76 | } | ||
77 | |||
78 | public static List<XEngine> ScriptEngines | ||
79 | { | ||
80 | get { return m_ScriptEngines; } | ||
81 | } | ||
82 | |||
83 | private struct RezScriptParms | ||
84 | { | ||
85 | uint LocalID; | ||
86 | LLUUID ItemID; | ||
87 | string Script; | ||
88 | } | ||
89 | |||
90 | public IConfig ScriptConfigSource | ||
91 | { | ||
92 | get { return m_ScriptConfig; } | ||
93 | } | ||
94 | |||
95 | // | ||
96 | // IRegionModule functions | ||
97 | // | ||
98 | public void Initialise(Scene scene, IConfigSource configSource) | ||
99 | { | ||
100 | AppDomain.CurrentDomain.AssemblyResolve += | ||
101 | OnAssemblyResolve; | ||
102 | |||
103 | m_log.InfoFormat("[XEngine] Initializing scripts in region {0}", | ||
104 | scene.RegionInfo.RegionName); | ||
105 | m_Scene=scene; | ||
106 | |||
107 | m_ScriptConfig = configSource.Configs["XEngine"]; | ||
108 | |||
109 | if(m_ScriptConfig == null) | ||
110 | { | ||
111 | m_log.ErrorFormat("[XEngine] No script configuration found. Scripts disabled"); | ||
112 | return; | ||
113 | } | ||
114 | |||
115 | int minThreads = m_ScriptConfig.GetInt("MinThreads", 2); | ||
116 | int maxThreads = m_ScriptConfig.GetInt("MaxThreads", 2); | ||
117 | int idleTimeout = m_ScriptConfig.GetInt("IdleTimeout", 60); | ||
118 | string priority = m_ScriptConfig.GetString("Priority", "BelowNormal"); | ||
119 | int maxScriptQueue = m_ScriptConfig.GetInt("MaxScriptEventQueue",300); | ||
120 | int stackSize = m_ScriptConfig.GetInt("ThreadStackSize", 262144); | ||
121 | int sleepTime = m_ScriptConfig.GetInt("MaintenanceInterval", | ||
122 | 10)*1000; | ||
123 | m_EventLimit = m_ScriptConfig.GetInt("EventLimit", 30); | ||
124 | m_KillTimedOutScripts = m_ScriptConfig.GetBoolean( | ||
125 | "KillTimedOutScripts", false); | ||
126 | int saveTime = m_ScriptConfig.GetInt("SaveInterval", 300)*1000; | ||
127 | |||
128 | ThreadPriority prio = ThreadPriority.BelowNormal; | ||
129 | switch(priority) | ||
130 | { | ||
131 | case "Lowest": | ||
132 | prio=ThreadPriority.Lowest; | ||
133 | break; | ||
134 | case "BelowNormal": | ||
135 | prio=ThreadPriority.BelowNormal; | ||
136 | break; | ||
137 | case "Normal": | ||
138 | prio=ThreadPriority.Normal; | ||
139 | break; | ||
140 | case "AboveNormal": | ||
141 | prio=ThreadPriority.AboveNormal; | ||
142 | break; | ||
143 | case "Highest": | ||
144 | prio=ThreadPriority.Highest; | ||
145 | break; | ||
146 | default: | ||
147 | m_log.ErrorFormat("[XEngine] Invalid thread priority: '"+ | ||
148 | priority+"'. Assuming BelowNormal"); | ||
149 | break; | ||
150 | } | ||
151 | |||
152 | lock(m_ScriptEngines) | ||
153 | { | ||
154 | m_ScriptEngines.Add(this); | ||
155 | } | ||
156 | |||
157 | m_EventManager = new EventManager(this); | ||
158 | m_ASYNCLSLCommandManager = new AsyncCommandManager(this); | ||
159 | |||
160 | StartEngine(minThreads, maxThreads, idleTimeout, prio, | ||
161 | maxScriptQueue, stackSize); | ||
162 | |||
163 | m_Compiler = new Compiler(this); | ||
164 | |||
165 | m_Scene.EventManager.OnRezScript += OnRezScript; | ||
166 | m_Scene.EventManager.OnRemoveScript += OnRemoveScript; | ||
167 | m_Scene.EventManager.OnScriptReset += OnScriptReset; | ||
168 | |||
169 | if(sleepTime > 0) | ||
170 | { | ||
171 | m_ThreadPool.QueueWorkItem(new WorkItemCallback( | ||
172 | this.DoMaintenance), new Object[] | ||
173 | { sleepTime }); | ||
174 | } | ||
175 | |||
176 | if(saveTime > 0) | ||
177 | { | ||
178 | m_ThreadPool.QueueWorkItem(new WorkItemCallback( | ||
179 | this.DoBackup), new Object[] { saveTime }); | ||
180 | } | ||
181 | } | ||
182 | |||
183 | public void PostInitialise() | ||
184 | { | ||
185 | m_ThreadPool.Start(); | ||
186 | } | ||
187 | |||
188 | public void Close() | ||
189 | { | ||
190 | lock(m_ScriptEngines) | ||
191 | { | ||
192 | if(m_ScriptEngines.Contains(this)) | ||
193 | m_ScriptEngines.Remove(this); | ||
194 | } | ||
195 | } | ||
196 | |||
197 | public object DoBackup(object o) | ||
198 | { | ||
199 | Object[] p = (Object[])o; | ||
200 | int saveTime = (int)p[0]; | ||
201 | |||
202 | System.Threading.Thread.Sleep(saveTime); | ||
203 | |||
204 | // m_log.Debug("[XEngine] Backing up script states"); | ||
205 | |||
206 | List<XScriptInstance> instances = new List<XScriptInstance>(); | ||
207 | |||
208 | lock(m_Scripts) | ||
209 | { | ||
210 | foreach (XScriptInstance instance in m_Scripts.Values) | ||
211 | instances.Add(instance); | ||
212 | } | ||
213 | |||
214 | foreach (XScriptInstance i in instances) | ||
215 | { | ||
216 | string assembly = String.Empty; | ||
217 | |||
218 | lock(m_Scripts) | ||
219 | { | ||
220 | if(!m_Assemblies.ContainsKey(i.AssetID)) | ||
221 | continue; | ||
222 | assembly = m_Assemblies[i.AssetID]; | ||
223 | } | ||
224 | |||
225 | i.SaveState(assembly); | ||
226 | } | ||
227 | |||
228 | instances.Clear(); | ||
229 | |||
230 | m_ThreadPool.QueueWorkItem(new WorkItemCallback( | ||
231 | this.DoBackup), new Object[] { saveTime }); | ||
232 | |||
233 | return 0; | ||
234 | } | ||
235 | |||
236 | public object DoMaintenance(object p) | ||
237 | { | ||
238 | object[] parms = (object[])p; | ||
239 | int sleepTime = (int)parms[0]; | ||
240 | |||
241 | foreach (XScriptInstance inst in m_Scripts.Values) | ||
242 | { | ||
243 | if(inst.EventTime() > m_EventLimit) | ||
244 | { | ||
245 | inst.Stop(100); | ||
246 | if(!m_KillTimedOutScripts) | ||
247 | inst.Start(); | ||
248 | } | ||
249 | } | ||
250 | |||
251 | System.Threading.Thread.Sleep(sleepTime); | ||
252 | |||
253 | m_ThreadPool.QueueWorkItem(new WorkItemCallback( | ||
254 | this.DoMaintenance), new Object[] | ||
255 | { sleepTime }); | ||
256 | |||
257 | return 0; | ||
258 | } | ||
259 | |||
260 | public string Name | ||
261 | { | ||
262 | get { return "XEngine"; } | ||
263 | } | ||
264 | |||
265 | public bool IsSharedModule | ||
266 | { | ||
267 | get { return false; } | ||
268 | } | ||
269 | |||
270 | // | ||
271 | // XEngine functions | ||
272 | // | ||
273 | public int MaxScriptQueue | ||
274 | { | ||
275 | get { return m_MaxScriptQueue; } | ||
276 | } | ||
277 | |||
278 | // | ||
279 | // Hooks | ||
280 | // | ||
281 | public void OnRezScript(uint localID, LLUUID itemID, string script) | ||
282 | { | ||
283 | m_ThreadPool.QueueWorkItem(new WorkItemCallback( | ||
284 | this.DoOnRezScript), new Object[] | ||
285 | { localID, itemID, script}); | ||
286 | } | ||
287 | |||
288 | private object DoOnRezScript(object parm) | ||
289 | { | ||
290 | Object[] p = (Object[])parm; | ||
291 | uint localID = (uint)p[0]; | ||
292 | LLUUID itemID = (LLUUID)p[1]; | ||
293 | string script =(string)p[2]; | ||
294 | |||
295 | // Get the asset ID of the script, so we can check if we | ||
296 | // already have it. | ||
297 | |||
298 | SceneObjectPart part = m_Scene.GetSceneObjectPart(localID); | ||
299 | if(part == null) | ||
300 | return false; | ||
301 | |||
302 | TaskInventoryItem item = part.GetInventoryItem(itemID); | ||
303 | if(item == null) | ||
304 | return false; | ||
305 | |||
306 | LLUUID assetID=item.AssetID; | ||
307 | |||
308 | // m_log.DebugFormat("[XEngine] Compiling script {0} ({1})", | ||
309 | // item.Name, itemID.ToString()); | ||
310 | |||
311 | string assembly=""; | ||
312 | try | ||
313 | { | ||
314 | assembly=m_Compiler.PerformScriptCompile(script, | ||
315 | assetID.ToString()); | ||
316 | m_log.DebugFormat("[XEngine] Loaded script {0}.{1}", | ||
317 | part.ParentGroup.RootPart.Name, item.Name); | ||
318 | } | ||
319 | catch (Exception e) | ||
320 | { | ||
321 | try | ||
322 | { | ||
323 | // DISPLAY ERROR INWORLD | ||
324 | string text = "Error compiling script:\r\n" + e.Message.ToString(); | ||
325 | if (text.Length > 1400) | ||
326 | text = text.Substring(0, 1400); | ||
327 | World.SimChat(Helpers.StringToField(text), | ||
328 | ChatTypeEnum.DebugChannel, 2147483647, | ||
329 | part.AbsolutePosition, | ||
330 | part.Name, part.UUID, false); | ||
331 | } | ||
332 | catch (Exception e2) // LEGIT: User Scripting | ||
333 | { | ||
334 | m_log.Error("[XEngine]: "+ | ||
335 | "Error displaying error in-world: " + | ||
336 | e2.ToString()); | ||
337 | m_log.Error("[XEngine]: " + | ||
338 | "Errormessage: Error compiling script:\r\n" + | ||
339 | e.Message.ToString()); | ||
340 | } | ||
341 | |||
342 | return false; | ||
343 | } | ||
344 | |||
345 | lock(m_Scripts) | ||
346 | { | ||
347 | // Create the object record | ||
348 | |||
349 | if(!m_PrimObjects.ContainsKey(localID)) | ||
350 | m_PrimObjects[localID] = new List<LLUUID>(); | ||
351 | |||
352 | if(!m_PrimObjects[localID].Contains(itemID)) | ||
353 | m_PrimObjects[localID].Add(itemID); | ||
354 | |||
355 | if(!m_Assemblies.ContainsKey(assetID)) | ||
356 | m_Assemblies[assetID] = assembly; | ||
357 | |||
358 | if((!m_Scripts.ContainsKey(itemID)) || | ||
359 | (m_Scripts[itemID].AssetID != assetID)) | ||
360 | { | ||
361 | LLUUID appDomain=assetID; | ||
362 | |||
363 | if(part.ParentGroup.RootPart.m_IsAttachment) | ||
364 | appDomain=part.ParentGroup.RootPart.UUID; | ||
365 | |||
366 | if(!m_AppDomains.ContainsKey(appDomain)) | ||
367 | { | ||
368 | try | ||
369 | { | ||
370 | AppDomainSetup appSetup = new AppDomainSetup(); | ||
371 | // appSetup.ApplicationBase = Path.Combine( | ||
372 | // "ScriptEngines", | ||
373 | // m_Scene.RegionInfo.RegionID.ToString()); | ||
374 | |||
375 | Evidence baseEvidence = | ||
376 | AppDomain.CurrentDomain.Evidence; | ||
377 | Evidence evidence = new Evidence(baseEvidence); | ||
378 | |||
379 | m_AppDomains[appDomain] = | ||
380 | AppDomain.CreateDomain( | ||
381 | m_Scene.RegionInfo.RegionID.ToString(), | ||
382 | evidence, appSetup); | ||
383 | |||
384 | m_AppDomains[appDomain].AssemblyResolve += | ||
385 | new ResolveEventHandler( | ||
386 | AssemblyResolver.OnAssemblyResolve); | ||
387 | m_DomainScripts[appDomain] = new List<LLUUID>(); | ||
388 | } | ||
389 | catch (Exception e) | ||
390 | { | ||
391 | m_log.Error("[XEngine] Exception creating app domain:\n"+e.ToString()); | ||
392 | return false; | ||
393 | } | ||
394 | } | ||
395 | m_DomainScripts[appDomain].Add(itemID); | ||
396 | |||
397 | |||
398 | XScriptInstance instance = new XScriptInstance(this,localID, | ||
399 | part.UUID, itemID, assetID, assembly, | ||
400 | m_AppDomains[appDomain]); | ||
401 | |||
402 | instance.AppDomain = appDomain; | ||
403 | |||
404 | m_Scripts[itemID] = instance; | ||
405 | } | ||
406 | } | ||
407 | return true; | ||
408 | } | ||
409 | |||
410 | public void OnRemoveScript(uint localID, LLUUID itemID) | ||
411 | { | ||
412 | lock(m_Scripts) | ||
413 | { | ||
414 | // Do we even have it? | ||
415 | if(!m_Scripts.ContainsKey(itemID)) | ||
416 | return; | ||
417 | |||
418 | m_ASYNCLSLCommandManager.RemoveScript(localID, itemID); | ||
419 | |||
420 | XScriptInstance instance=m_Scripts[itemID]; | ||
421 | m_Scripts.Remove(itemID); | ||
422 | |||
423 | instance.ClearQueue(); | ||
424 | instance.Stop(0); | ||
425 | |||
426 | SceneObjectPart part = | ||
427 | m_Scene.GetSceneObjectPart(localID); | ||
428 | |||
429 | if(part != null) | ||
430 | part.RemoveScriptEvents(itemID); | ||
431 | |||
432 | // Remove the script from it's prim | ||
433 | if(m_PrimObjects.ContainsKey(localID)) | ||
434 | { | ||
435 | // Remove inventory item record | ||
436 | if(m_PrimObjects[localID].Contains(itemID)) | ||
437 | m_PrimObjects[localID].Remove(itemID); | ||
438 | |||
439 | // If there are no more scripts, remove prim | ||
440 | if(m_PrimObjects[localID].Count == 0) | ||
441 | { | ||
442 | m_PrimObjects.Remove(localID); | ||
443 | } | ||
444 | } | ||
445 | |||
446 | m_DomainScripts[instance.AppDomain].Remove(instance.ItemID); | ||
447 | if(m_DomainScripts[instance.AppDomain].Count == 0) | ||
448 | { | ||
449 | m_DomainScripts.Remove(instance.AppDomain); | ||
450 | UnloadAppDomain(instance.AppDomain); | ||
451 | } | ||
452 | |||
453 | instance = null; | ||
454 | |||
455 | CleanAssemblies(); | ||
456 | } | ||
457 | } | ||
458 | |||
459 | public void OnScriptReset(uint localID, LLUUID itemID) | ||
460 | { | ||
461 | ResetScript(itemID); | ||
462 | } | ||
463 | |||
464 | private void CleanAssemblies() | ||
465 | { | ||
466 | List<LLUUID> assetIDList = new List<LLUUID>(m_Assemblies.Keys); | ||
467 | |||
468 | foreach (XScriptInstance i in m_Scripts.Values) | ||
469 | { | ||
470 | if(assetIDList.Contains(i.AssetID)) | ||
471 | assetIDList.Remove(i.AssetID); | ||
472 | } | ||
473 | |||
474 | foreach (LLUUID assetID in assetIDList) | ||
475 | { | ||
476 | // m_log.DebugFormat("[XEngine] Removing unreferenced assembly {0}", m_Assemblies[assetID]); | ||
477 | try | ||
478 | { | ||
479 | if(File.Exists(m_Assemblies[assetID])) | ||
480 | File.Delete(m_Assemblies[assetID]); | ||
481 | if(File.Exists(m_Assemblies[assetID]+".state")) | ||
482 | File.Delete(m_Assemblies[assetID]+".state"); | ||
483 | if(File.Exists(m_Assemblies[assetID]+".mdb")) | ||
484 | File.Delete(m_Assemblies[assetID]+".mdb"); | ||
485 | } | ||
486 | catch (Exception e) | ||
487 | { | ||
488 | } | ||
489 | m_Assemblies.Remove(assetID); | ||
490 | } | ||
491 | } | ||
492 | |||
493 | private void UnloadAppDomain(LLUUID id) | ||
494 | { | ||
495 | if(m_AppDomains.ContainsKey(id)) | ||
496 | { | ||
497 | AppDomain domain=m_AppDomains[id]; | ||
498 | m_AppDomains.Remove(id); | ||
499 | |||
500 | AppDomain.Unload(domain); | ||
501 | domain = null; | ||
502 | // m_log.DebugFormat("[XEngine] Unloaded app domain {0}", id.ToString()); | ||
503 | } | ||
504 | } | ||
505 | |||
506 | // | ||
507 | // Start processing | ||
508 | // | ||
509 | private void StartEngine(int minThreads, int maxThreads, | ||
510 | int idleTimeout, ThreadPriority threadPriority, | ||
511 | int maxScriptQueue, int stackSize) | ||
512 | { | ||
513 | m_MaxScriptQueue=maxScriptQueue; | ||
514 | |||
515 | STPStartInfo startInfo = new STPStartInfo(); | ||
516 | startInfo.IdleTimeout = idleTimeout; | ||
517 | startInfo.MaxWorkerThreads = maxThreads; | ||
518 | startInfo.MinWorkerThreads = minThreads; | ||
519 | startInfo.ThreadPriority = threadPriority; | ||
520 | startInfo.StackSize = stackSize; | ||
521 | startInfo.StartSuspended = true; | ||
522 | |||
523 | m_ThreadPool = new SmartThreadPool(startInfo); | ||
524 | } | ||
525 | |||
526 | // | ||
527 | // Used by script instances to queue event handler jobs | ||
528 | // | ||
529 | public IWorkItemResult QueueEventHandler(object parms) | ||
530 | { | ||
531 | return m_ThreadPool.QueueWorkItem(new WorkItemCallback( | ||
532 | this.ProcessEventHandler), parms); | ||
533 | } | ||
534 | |||
535 | // | ||
536 | // The main script engine worker | ||
537 | // | ||
538 | private object ProcessEventHandler(object parms) | ||
539 | { | ||
540 | XScriptInstance instance=(XScriptInstance)parms; | ||
541 | |||
542 | return instance.EventProcessor(); | ||
543 | } | ||
544 | |||
545 | // | ||
546 | // Post event to an entire prim | ||
547 | // | ||
548 | public bool PostObjectEvent(uint localID, XEventParams p) | ||
549 | { | ||
550 | bool result = false; | ||
551 | |||
552 | if(!m_PrimObjects.ContainsKey(localID)) | ||
553 | return false; | ||
554 | |||
555 | foreach (LLUUID itemID in m_PrimObjects[localID]) | ||
556 | { | ||
557 | if(m_Scripts.ContainsKey(itemID)) | ||
558 | { | ||
559 | XScriptInstance instance = m_Scripts[itemID]; | ||
560 | if(instance != null) | ||
561 | { | ||
562 | instance.PostEvent(p); | ||
563 | result = true; | ||
564 | } | ||
565 | } | ||
566 | } | ||
567 | return result; | ||
568 | } | ||
569 | |||
570 | // | ||
571 | // Post an event to a single script | ||
572 | // | ||
573 | public bool PostScriptEvent(LLUUID itemID, XEventParams p) | ||
574 | { | ||
575 | if(m_Scripts.ContainsKey(itemID)) | ||
576 | { | ||
577 | XScriptInstance instance = m_Scripts[itemID]; | ||
578 | if(instance != null) | ||
579 | instance.PostEvent(p); | ||
580 | return true; | ||
581 | } | ||
582 | return false; | ||
583 | } | ||
584 | |||
585 | public Assembly OnAssemblyResolve(object sender, | ||
586 | ResolveEventArgs args) | ||
587 | { | ||
588 | if(!(sender is System.AppDomain)) | ||
589 | return null; | ||
590 | |||
591 | string[] pathList=new string[] {"bin", "ScriptEngines", | ||
592 | Path.Combine("ScriptEngines", | ||
593 | m_Scene.RegionInfo.RegionID.ToString())}; | ||
594 | |||
595 | string assemblyName = args.Name; | ||
596 | if(assemblyName.IndexOf(",") != -1) | ||
597 | assemblyName=args.Name.Substring(0, args.Name.IndexOf(",")); | ||
598 | |||
599 | foreach (string s in pathList) | ||
600 | { | ||
601 | string path=Path.Combine(Directory.GetCurrentDirectory(), | ||
602 | Path.Combine(s, assemblyName))+".dll"; | ||
603 | |||
604 | if(File.Exists(path)) | ||
605 | return Assembly.LoadFrom(path); | ||
606 | } | ||
607 | |||
608 | return null; | ||
609 | } | ||
610 | |||
611 | private XScriptInstance GetInstance(LLUUID itemID) | ||
612 | { | ||
613 | XScriptInstance instance; | ||
614 | lock(m_Scripts) | ||
615 | { | ||
616 | if(!m_Scripts.ContainsKey(itemID)) | ||
617 | return null; | ||
618 | instance = m_Scripts[itemID]; | ||
619 | } | ||
620 | return instance; | ||
621 | } | ||
622 | |||
623 | public void SetScriptState(LLUUID itemID, bool running) | ||
624 | { | ||
625 | XScriptInstance instance = GetInstance(itemID); | ||
626 | if(instance != null) | ||
627 | { | ||
628 | if(running) | ||
629 | instance.Start(); | ||
630 | else | ||
631 | instance.Stop(500); | ||
632 | } | ||
633 | } | ||
634 | |||
635 | public bool GetScriptState(LLUUID itemID) | ||
636 | { | ||
637 | XScriptInstance instance = GetInstance(itemID); | ||
638 | if(instance != null) | ||
639 | return instance.Running; | ||
640 | return false; | ||
641 | } | ||
642 | |||
643 | public void ResetScript(LLUUID itemID) | ||
644 | { | ||
645 | XScriptInstance instance = GetInstance(itemID); | ||
646 | if(instance != null) | ||
647 | instance.ResetScript(); | ||
648 | } | ||
649 | |||
650 | public XDetectParams GetDetectParams(LLUUID itemID, int idx) | ||
651 | { | ||
652 | XScriptInstance instance = GetInstance(itemID); | ||
653 | if(instance != null) | ||
654 | return instance.GetDetectParams(idx); | ||
655 | return new XDetectParams(); | ||
656 | } | ||
657 | |||
658 | public LLUUID GetDetectID(LLUUID itemID, int idx) | ||
659 | { | ||
660 | XScriptInstance instance = GetInstance(itemID); | ||
661 | if(instance != null) | ||
662 | return instance.GetDetectID(idx); | ||
663 | return LLUUID.Zero; | ||
664 | } | ||
665 | } | ||
666 | |||
667 | public struct XDetectParams | ||
668 | { | ||
669 | public LLUUID Key; | ||
670 | public LSL_Types.Vector3 OffsetPos; | ||
671 | } | ||
672 | |||
673 | public class XEventParams | ||
674 | { | ||
675 | public XEventParams(string eventName, Object[] eventParams, XDetectParams[] detectParams) | ||
676 | { | ||
677 | EventName=eventName; | ||
678 | Params=eventParams; | ||
679 | DetectParams=detectParams; | ||
680 | } | ||
681 | |||
682 | public string EventName; | ||
683 | public Object[] Params; | ||
684 | public XDetectParams[] DetectParams; | ||
685 | } | ||
686 | |||
687 | public class XScriptInstance | ||
688 | { | ||
689 | private XEngine m_Engine; | ||
690 | private IWorkItemResult m_CurrentResult=null; | ||
691 | private Queue m_EventQueue=new Queue(32); | ||
692 | private bool m_RunEvents=false; | ||
693 | private LLUUID m_ItemID; | ||
694 | private uint m_LocalID; | ||
695 | private LLUUID m_ObjectID; | ||
696 | private LLUUID m_AssetID; | ||
697 | private IScript m_Script; | ||
698 | private LSL_ScriptCommands m_LSLCommands; | ||
699 | private OSSL_ScriptCommands m_OSSLCommands; | ||
700 | private Executor m_Executor; | ||
701 | private LLUUID m_AppDomain; | ||
702 | private XDetectParams[] m_DetectParams; | ||
703 | private bool m_TimerQueued; | ||
704 | private DateTime m_EventStart; | ||
705 | private bool m_InEvent; | ||
706 | |||
707 | // Script state | ||
708 | private string m_State="default"; | ||
709 | |||
710 | public Object[] PluginData = new Object[0]; | ||
711 | |||
712 | public bool Running | ||
713 | { | ||
714 | get { return m_RunEvents; } | ||
715 | } | ||
716 | |||
717 | public string State | ||
718 | { | ||
719 | get { return m_State; } | ||
720 | set { m_State = value; } | ||
721 | } | ||
722 | |||
723 | public XEngine Engine | ||
724 | { | ||
725 | get { return m_Engine; } | ||
726 | } | ||
727 | |||
728 | public LLUUID AppDomain | ||
729 | { | ||
730 | get { return m_AppDomain; } | ||
731 | set { m_AppDomain = value; } | ||
732 | } | ||
733 | |||
734 | public LLUUID ItemID | ||
735 | { | ||
736 | get { return m_ItemID; } | ||
737 | } | ||
738 | |||
739 | public LLUUID ObjectID | ||
740 | { | ||
741 | get { return m_ObjectID; } | ||
742 | } | ||
743 | |||
744 | public uint LocalID | ||
745 | { | ||
746 | get { return m_LocalID; } | ||
747 | } | ||
748 | |||
749 | public LLUUID AssetID | ||
750 | { | ||
751 | get { return m_AssetID; } | ||
752 | } | ||
753 | |||
754 | public Queue EventQueue | ||
755 | { | ||
756 | get { return m_EventQueue; } | ||
757 | } | ||
758 | |||
759 | public void ClearQueue() | ||
760 | { | ||
761 | m_TimerQueued = false; | ||
762 | m_EventQueue.Clear(); | ||
763 | } | ||
764 | |||
765 | public XScriptInstance(XEngine engine, uint localID, LLUUID objectID, | ||
766 | LLUUID itemID, LLUUID assetID, string assembly, AppDomain dom) | ||
767 | { | ||
768 | m_Engine=engine; | ||
769 | |||
770 | m_LocalID = localID; | ||
771 | m_ObjectID = objectID; | ||
772 | m_ItemID = itemID; | ||
773 | m_AssetID = assetID; | ||
774 | |||
775 | SceneObjectPart part=engine.World.GetSceneObjectPart(localID); | ||
776 | if(part == null) | ||
777 | { | ||
778 | engine.Log.Error("[XEngine] SceneObjectPart unavailable. Script NOT started."); | ||
779 | return; | ||
780 | } | ||
781 | |||
782 | m_LSLCommands = new LSL_ScriptCommands(engine, this, part, localID, | ||
783 | itemID); | ||
784 | m_OSSLCommands = new OSSL_ScriptCommands(engine, this, part, | ||
785 | localID, itemID); | ||
786 | |||
787 | try | ||
788 | { | ||
789 | m_Script = (IScript)dom.CreateInstanceAndUnwrap( | ||
790 | Path.GetFileNameWithoutExtension(assembly), | ||
791 | "SecondLife.Script"); | ||
792 | } | ||
793 | catch (Exception e) | ||
794 | { | ||
795 | m_Engine.Log.ErrorFormat("[XEngine] Error loading assembly {0}\n"+e.ToString(), assembly); | ||
796 | } | ||
797 | |||
798 | try | ||
799 | { | ||
800 | m_Script.Start(m_LSLCommands, m_OSSLCommands); | ||
801 | |||
802 | m_Executor = new Executor(m_Script); | ||
803 | |||
804 | // m_Engine.Log.Debug("[XEngine] Script instance created"); | ||
805 | |||
806 | part.SetScriptEvents(m_ItemID, | ||
807 | (int)m_Executor.GetStateEventFlags()); | ||
808 | } | ||
809 | catch (Exception e) | ||
810 | { | ||
811 | m_Engine.Log.Error("Error loading script instance\n"+e.ToString()); | ||
812 | } | ||
813 | |||
814 | string savedState = assembly+".state"; | ||
815 | if(File.Exists(savedState)) | ||
816 | { | ||
817 | string xml = String.Empty; | ||
818 | |||
819 | try | ||
820 | { | ||
821 | FileInfo fi = new FileInfo(savedState); | ||
822 | int size=(int)fi.Length; | ||
823 | if(size < 130000) | ||
824 | { | ||
825 | using (FileStream fs = File.Open(savedState, | ||
826 | FileMode.Open, FileAccess.Read, FileShare.None)) | ||
827 | { | ||
828 | System.Text.ASCIIEncoding enc = | ||
829 | new System.Text.ASCIIEncoding(); | ||
830 | |||
831 | Byte[] data=new Byte[size]; | ||
832 | fs.Read(data, 0, size); | ||
833 | |||
834 | xml=enc.GetString(data); | ||
835 | |||
836 | ScriptSerializer.Deserialize(xml, this); | ||
837 | |||
838 | m_Engine.m_ASYNCLSLCommandManager.CreateFromData( | ||
839 | m_LocalID, m_ItemID, m_ObjectID, | ||
840 | PluginData); | ||
841 | } | ||
842 | } | ||
843 | else | ||
844 | { | ||
845 | m_Engine.Log.Error("Unable to load script state: Memory limit exceeded"); | ||
846 | PostEvent(new XEventParams("state_entry", | ||
847 | new Object[0], new XDetectParams[0])); | ||
848 | } | ||
849 | } | ||
850 | catch (Exception e) | ||
851 | { | ||
852 | m_Engine.Log.ErrorFormat("Unable to load script state from xml: {0}\n"+e.ToString(), xml); | ||
853 | PostEvent(new XEventParams("state_entry", | ||
854 | new Object[0], new XDetectParams[0])); | ||
855 | } | ||
856 | } | ||
857 | else | ||
858 | { | ||
859 | PostEvent(new XEventParams("state_entry", | ||
860 | new Object[0], new XDetectParams[0])); | ||
861 | } | ||
862 | Start(); | ||
863 | } | ||
864 | |||
865 | public void VarDump(Dictionary<string, object> vars) | ||
866 | { | ||
867 | Console.WriteLine("Variable dump for script {0}", m_ItemID.ToString()); | ||
868 | foreach (KeyValuePair<string, object> v in vars) | ||
869 | { | ||
870 | Console.WriteLine("Variable: {0} = '{1}'", v. Key, | ||
871 | v.Value.ToString()); | ||
872 | } | ||
873 | } | ||
874 | |||
875 | public void Start() | ||
876 | { | ||
877 | lock(m_EventQueue) | ||
878 | { | ||
879 | if(Running) | ||
880 | return; | ||
881 | |||
882 | m_RunEvents=true; | ||
883 | |||
884 | if(m_EventQueue.Count > 0) | ||
885 | { | ||
886 | if(m_CurrentResult == null) | ||
887 | m_CurrentResult=m_Engine.QueueEventHandler(this); | ||
888 | } | ||
889 | } | ||
890 | } | ||
891 | |||
892 | public bool Stop(int timeout) | ||
893 | { | ||
894 | IWorkItemResult result; | ||
895 | |||
896 | lock(m_EventQueue) | ||
897 | { | ||
898 | if(!Running) | ||
899 | return true; | ||
900 | |||
901 | if(m_CurrentResult == null) | ||
902 | { | ||
903 | m_RunEvents=false; | ||
904 | return true; | ||
905 | } | ||
906 | |||
907 | if(m_CurrentResult.Cancel()) | ||
908 | { | ||
909 | m_CurrentResult=null; | ||
910 | m_RunEvents=false; | ||
911 | return true; | ||
912 | } | ||
913 | |||
914 | result=m_CurrentResult; | ||
915 | m_RunEvents=false; | ||
916 | } | ||
917 | |||
918 | if(SmartThreadPool.WaitAll(new IWorkItemResult[] {result}, new TimeSpan((long)timeout*100000), false)) | ||
919 | { | ||
920 | return true; | ||
921 | } | ||
922 | |||
923 | lock(m_EventQueue) | ||
924 | { | ||
925 | if(m_CurrentResult != null) | ||
926 | m_CurrentResult.Abort(); | ||
927 | else | ||
928 | return true; | ||
929 | } | ||
930 | |||
931 | return true; | ||
932 | } | ||
933 | |||
934 | public void SetState(string state) | ||
935 | { | ||
936 | PostEvent(new XEventParams("state_exit", new Object[0], | ||
937 | new XDetectParams[0])); | ||
938 | PostEvent(new XEventParams("state", new Object[] { state }, | ||
939 | new XDetectParams[0])); | ||
940 | PostEvent(new XEventParams("state_entry", new Object[0], | ||
941 | new XDetectParams[0])); | ||
942 | } | ||
943 | |||
944 | public void PostEvent(XEventParams data) | ||
945 | { | ||
946 | lock(m_EventQueue) | ||
947 | { | ||
948 | if(m_EventQueue.Count >= m_Engine.MaxScriptQueue) | ||
949 | return; | ||
950 | |||
951 | m_EventQueue.Enqueue(data); | ||
952 | if(data.EventName == "timer") | ||
953 | { | ||
954 | if(m_TimerQueued) | ||
955 | return; | ||
956 | m_TimerQueued = true; | ||
957 | } | ||
958 | |||
959 | if(!m_RunEvents) | ||
960 | return; | ||
961 | |||
962 | if(m_CurrentResult == null) | ||
963 | { | ||
964 | m_CurrentResult=m_Engine.QueueEventHandler(this); | ||
965 | } | ||
966 | } | ||
967 | } | ||
968 | |||
969 | public object EventProcessor() | ||
970 | { | ||
971 | XEventParams data=null; | ||
972 | |||
973 | lock(m_EventQueue) | ||
974 | { | ||
975 | data=(XEventParams)m_EventQueue.Dequeue(); | ||
976 | if(data == null) // Shouldn't happen | ||
977 | { | ||
978 | m_CurrentResult=null; | ||
979 | return 0; | ||
980 | } | ||
981 | if(data.EventName == "timer") | ||
982 | m_TimerQueued = false; | ||
983 | } | ||
984 | |||
985 | m_DetectParams=data.DetectParams; | ||
986 | |||
987 | if(data.EventName == "state") // Hardcoded state change | ||
988 | { | ||
989 | m_State=data.Params[0].ToString(); | ||
990 | m_Engine.m_ASYNCLSLCommandManager.RemoveScript( | ||
991 | m_LocalID, m_ItemID); | ||
992 | |||
993 | SceneObjectPart part=m_Engine.World.GetSceneObjectPart( | ||
994 | m_LocalID); | ||
995 | if(part != null) | ||
996 | { | ||
997 | part.SetScriptEvents(m_ItemID, | ||
998 | (int)m_Executor.GetStateEventFlags()); | ||
999 | } | ||
1000 | } | ||
1001 | else | ||
1002 | { | ||
1003 | // m_Engine.Log.DebugFormat("[XEngine] Processed event {0}", data.EventName); | ||
1004 | SceneObjectPart part=m_Engine.World.GetSceneObjectPart( | ||
1005 | m_LocalID); | ||
1006 | try | ||
1007 | { | ||
1008 | m_EventStart = DateTime.Now; | ||
1009 | m_InEvent = true; | ||
1010 | m_Executor.ExecuteEvent(data.EventName, data.Params); | ||
1011 | m_InEvent = false; | ||
1012 | } | ||
1013 | catch (Exception e) | ||
1014 | { | ||
1015 | m_InEvent = false; | ||
1016 | if(e is System.Threading.ThreadAbortException) | ||
1017 | { | ||
1018 | lock(m_EventQueue) | ||
1019 | { | ||
1020 | if((m_EventQueue.Count > 0) && m_RunEvents) | ||
1021 | { | ||
1022 | m_CurrentResult=m_Engine.QueueEventHandler(this); | ||
1023 | } | ||
1024 | else | ||
1025 | { | ||
1026 | m_CurrentResult=null; | ||
1027 | } | ||
1028 | } | ||
1029 | |||
1030 | m_DetectParams=null; | ||
1031 | |||
1032 | return 0; | ||
1033 | } | ||
1034 | |||
1035 | try | ||
1036 | { | ||
1037 | // DISPLAY ERROR INWORLD | ||
1038 | string text = "Runtime error:\n" + e.ToString(); | ||
1039 | if (text.Length > 1400) | ||
1040 | text = text.Substring(0, 1400); | ||
1041 | m_Engine.World.SimChat(Helpers.StringToField(text), | ||
1042 | ChatTypeEnum.DebugChannel, 2147483647, | ||
1043 | part.AbsolutePosition, | ||
1044 | part.Name, part.UUID, false); | ||
1045 | } | ||
1046 | catch (Exception e2) // LEGIT: User Scripting | ||
1047 | { | ||
1048 | m_Engine.Log.Error("[XEngine]: "+ | ||
1049 | "Error displaying error in-world: " + | ||
1050 | e2.ToString()); | ||
1051 | m_Engine.Log.Error("[XEngine]: " + | ||
1052 | "Errormessage: Error compiling script:\r\n" + | ||
1053 | e.ToString()); | ||
1054 | } | ||
1055 | } | ||
1056 | } | ||
1057 | |||
1058 | lock(m_EventQueue) | ||
1059 | { | ||
1060 | if((m_EventQueue.Count > 0) && m_RunEvents) | ||
1061 | { | ||
1062 | m_CurrentResult=m_Engine.QueueEventHandler(this); | ||
1063 | } | ||
1064 | else | ||
1065 | { | ||
1066 | m_CurrentResult=null; | ||
1067 | } | ||
1068 | } | ||
1069 | |||
1070 | m_DetectParams=null; | ||
1071 | |||
1072 | return 0; | ||
1073 | } | ||
1074 | |||
1075 | public int EventTime() | ||
1076 | { | ||
1077 | if(!m_InEvent) | ||
1078 | return 0; | ||
1079 | |||
1080 | return (DateTime.Now - m_EventStart).Seconds; | ||
1081 | } | ||
1082 | |||
1083 | public void ResetScript() | ||
1084 | { | ||
1085 | Stop(0); | ||
1086 | m_Engine.m_ASYNCLSLCommandManager.RemoveScript(m_LocalID, m_ItemID); | ||
1087 | m_EventQueue.Clear(); | ||
1088 | m_Script.ResetVars(); | ||
1089 | m_State = "default"; | ||
1090 | Start(); | ||
1091 | PostEvent(new XEventParams("state_entry", | ||
1092 | new Object[0], new XDetectParams[0])); | ||
1093 | } | ||
1094 | |||
1095 | public Dictionary<string, object> GetVars() | ||
1096 | { | ||
1097 | return m_Script.GetVars(); | ||
1098 | } | ||
1099 | |||
1100 | public void SetVars(Dictionary<string, object> vars) | ||
1101 | { | ||
1102 | m_Script.SetVars(vars); | ||
1103 | } | ||
1104 | |||
1105 | public XDetectParams GetDetectParams(int idx) | ||
1106 | { | ||
1107 | if(idx < 0 || idx >= m_DetectParams.Length) | ||
1108 | return new XDetectParams(); | ||
1109 | |||
1110 | return m_DetectParams[idx]; | ||
1111 | } | ||
1112 | |||
1113 | public LLUUID GetDetectID(int idx) | ||
1114 | { | ||
1115 | if(idx < 0 || idx >= m_DetectParams.Length) | ||
1116 | return LLUUID.Zero; | ||
1117 | |||
1118 | return m_DetectParams[idx].Key; | ||
1119 | } | ||
1120 | |||
1121 | public void SaveState(string assembly) | ||
1122 | { | ||
1123 | PluginData = | ||
1124 | m_Engine.m_ASYNCLSLCommandManager.GetSerializationData( | ||
1125 | m_ItemID); | ||
1126 | |||
1127 | string xml=ScriptSerializer.Serialize(this); | ||
1128 | |||
1129 | try | ||
1130 | { | ||
1131 | FileStream fs = File.Create(assembly+".state"); | ||
1132 | System.Text.ASCIIEncoding enc = new System.Text.ASCIIEncoding(); | ||
1133 | Byte[] buf=enc.GetBytes(xml); | ||
1134 | fs.Write(buf, 0, buf.Length); | ||
1135 | fs.Close(); | ||
1136 | } | ||
1137 | catch(Exception) | ||
1138 | { | ||
1139 | return; | ||
1140 | } | ||
1141 | } | ||
1142 | } | ||
1143 | |||
1144 | public class ScriptSerializer | ||
1145 | { | ||
1146 | public static string Serialize(XScriptInstance instance) | ||
1147 | { | ||
1148 | instance.Stop(50); | ||
1149 | |||
1150 | XmlDocument xmldoc = new XmlDocument(); | ||
1151 | |||
1152 | XmlNode xmlnode = xmldoc.CreateNode(XmlNodeType.XmlDeclaration, | ||
1153 | "", ""); | ||
1154 | xmldoc.AppendChild(xmlnode); | ||
1155 | |||
1156 | XmlElement rootElement = xmldoc.CreateElement("", "ScriptState", | ||
1157 | ""); | ||
1158 | xmldoc.AppendChild(rootElement); | ||
1159 | |||
1160 | XmlElement state = xmldoc.CreateElement("", "State", ""); | ||
1161 | state.AppendChild(xmldoc.CreateTextNode(instance.State)); | ||
1162 | |||
1163 | rootElement.AppendChild(state); | ||
1164 | |||
1165 | Dictionary<string, Object> vars = instance.GetVars(); | ||
1166 | |||
1167 | XmlElement variables = xmldoc.CreateElement("", "Variables", ""); | ||
1168 | |||
1169 | foreach (KeyValuePair<string, Object> var in vars) | ||
1170 | WriteTypedValue(xmldoc, variables, "Variable", var.Key, | ||
1171 | var.Value); | ||
1172 | |||
1173 | rootElement.AppendChild(variables); | ||
1174 | |||
1175 | XmlElement queue = xmldoc.CreateElement("", "Queue", ""); | ||
1176 | |||
1177 | int count = instance.EventQueue.Count; | ||
1178 | |||
1179 | while(count > 0) | ||
1180 | { | ||
1181 | XEventParams ep = (XEventParams)instance.EventQueue.Dequeue(); | ||
1182 | instance.EventQueue.Enqueue(ep); | ||
1183 | count--; | ||
1184 | |||
1185 | XmlElement item = xmldoc.CreateElement("", "Item", ""); | ||
1186 | XmlAttribute itemEvent = xmldoc.CreateAttribute("", "event", | ||
1187 | ""); | ||
1188 | itemEvent.Value=ep.EventName; | ||
1189 | item.Attributes.Append(itemEvent); | ||
1190 | |||
1191 | XmlElement parms = xmldoc.CreateElement("", "Params", ""); | ||
1192 | |||
1193 | foreach (Object o in ep.Params) | ||
1194 | WriteTypedValue(xmldoc, parms, "Param", String.Empty, o); | ||
1195 | |||
1196 | item.AppendChild(parms); | ||
1197 | |||
1198 | XmlElement detect = xmldoc.CreateElement("", "Detected", ""); | ||
1199 | |||
1200 | foreach (XDetectParams det in ep.DetectParams) | ||
1201 | { | ||
1202 | XmlElement objectElem = xmldoc.CreateElement("", "Object", | ||
1203 | ""); | ||
1204 | XmlAttribute pos = xmldoc.CreateAttribute("", "pos", ""); | ||
1205 | pos.Value=det.OffsetPos.ToString(); | ||
1206 | objectElem.Attributes.Append(pos); | ||
1207 | objectElem.AppendChild( | ||
1208 | xmldoc.CreateTextNode(det.Key.ToString())); | ||
1209 | |||
1210 | detect.AppendChild(objectElem); | ||
1211 | } | ||
1212 | |||
1213 | item.AppendChild(detect); | ||
1214 | |||
1215 | queue.AppendChild(item); | ||
1216 | } | ||
1217 | |||
1218 | rootElement.AppendChild(queue); | ||
1219 | |||
1220 | XmlNode plugins = xmldoc.CreateElement("", "Plugins", ""); | ||
1221 | if(instance.PluginData.Length > 0) | ||
1222 | DumpList(xmldoc, plugins, | ||
1223 | new LSL_Types.list(instance.PluginData)); | ||
1224 | |||
1225 | rootElement.AppendChild(plugins); | ||
1226 | |||
1227 | instance.Start(); | ||
1228 | |||
1229 | return xmldoc.InnerXml; | ||
1230 | } | ||
1231 | |||
1232 | public static void Deserialize(string xml, XScriptInstance instance) | ||
1233 | { | ||
1234 | XmlDocument doc = new XmlDocument(); | ||
1235 | |||
1236 | Dictionary<string, object> vars = instance.GetVars(); | ||
1237 | |||
1238 | instance.PluginData = new Object[0]; | ||
1239 | |||
1240 | doc.LoadXml(xml); | ||
1241 | |||
1242 | XmlNodeList rootL = doc.GetElementsByTagName("ScriptState"); | ||
1243 | if(rootL.Count != 1) | ||
1244 | { | ||
1245 | return; | ||
1246 | } | ||
1247 | XmlNode rootNode = rootL[0]; | ||
1248 | |||
1249 | if(rootNode != null) | ||
1250 | { | ||
1251 | object varValue; | ||
1252 | XmlNodeList partL = rootNode.ChildNodes; | ||
1253 | |||
1254 | foreach (XmlNode part in partL) | ||
1255 | { | ||
1256 | switch(part.Name) | ||
1257 | { | ||
1258 | case "State": | ||
1259 | instance.State=part.InnerText; | ||
1260 | break; | ||
1261 | case "Variables": | ||
1262 | XmlNodeList varL = part.ChildNodes; | ||
1263 | foreach (XmlNode var in varL) | ||
1264 | { | ||
1265 | string varName; | ||
1266 | varValue=ReadTypedValue(var, out varName); | ||
1267 | |||
1268 | if(vars.ContainsKey(varName)) | ||
1269 | vars[varName] = varValue; | ||
1270 | } | ||
1271 | instance.SetVars(vars); | ||
1272 | break; | ||
1273 | case "Queue": | ||
1274 | XmlNodeList itemL = part.ChildNodes; | ||
1275 | foreach (XmlNode item in itemL) | ||
1276 | { | ||
1277 | List<Object> parms = new List<Object>(); | ||
1278 | List<XDetectParams> detected = | ||
1279 | new List<XDetectParams>(); | ||
1280 | |||
1281 | string eventName = | ||
1282 | item.Attributes.GetNamedItem("event").Value; | ||
1283 | XmlNodeList eventL = item.ChildNodes; | ||
1284 | foreach (XmlNode evt in eventL) | ||
1285 | { | ||
1286 | switch(evt.Name) | ||
1287 | { | ||
1288 | case "Params": | ||
1289 | XmlNodeList prms = evt.ChildNodes; | ||
1290 | foreach (XmlNode pm in prms) | ||
1291 | parms.Add(ReadTypedValue(pm)); | ||
1292 | |||
1293 | break; | ||
1294 | case "Detected": | ||
1295 | XmlNodeList detL = evt.ChildNodes; | ||
1296 | foreach (XmlNode det in detL) | ||
1297 | { | ||
1298 | string vect = | ||
1299 | det.Attributes.GetNamedItem( | ||
1300 | "pos").Value; | ||
1301 | LSL_Types.Vector3 v = | ||
1302 | new LSL_Types.Vector3(vect); | ||
1303 | LLUUID uuid = new LLUUID(); | ||
1304 | LLUUID.TryParse(det.InnerText, | ||
1305 | out uuid); | ||
1306 | |||
1307 | XDetectParams d; | ||
1308 | d.Key = uuid; | ||
1309 | d.OffsetPos = v; | ||
1310 | |||
1311 | detected.Add(d); | ||
1312 | } | ||
1313 | break; | ||
1314 | } | ||
1315 | } | ||
1316 | XEventParams ep = new XEventParams( | ||
1317 | eventName, parms.ToArray(), | ||
1318 | detected.ToArray()); | ||
1319 | instance.EventQueue.Enqueue(ep); | ||
1320 | } | ||
1321 | break; | ||
1322 | case "Plugins": | ||
1323 | instance.PluginData = ReadList(part).Data; | ||
1324 | break; | ||
1325 | } | ||
1326 | } | ||
1327 | } | ||
1328 | } | ||
1329 | |||
1330 | private static void DumpList(XmlDocument doc, XmlNode parent, | ||
1331 | LSL_Types.list l) | ||
1332 | { | ||
1333 | foreach (Object o in l.Data) | ||
1334 | WriteTypedValue(doc, parent, "ListItem", "", o); | ||
1335 | } | ||
1336 | |||
1337 | private static LSL_Types.list ReadList(XmlNode parent) | ||
1338 | { | ||
1339 | List<Object> olist = new List<Object>(); | ||
1340 | |||
1341 | XmlNodeList itemL = parent.ChildNodes; | ||
1342 | foreach(XmlNode item in itemL) | ||
1343 | olist.Add(ReadTypedValue(item)); | ||
1344 | |||
1345 | return new LSL_Types.list(olist.ToArray()); | ||
1346 | } | ||
1347 | |||
1348 | private static void WriteTypedValue(XmlDocument doc, XmlNode parent, | ||
1349 | string tag, string name, object value) | ||
1350 | { | ||
1351 | Type t=value.GetType(); | ||
1352 | XmlAttribute typ = doc.CreateAttribute("", "type", ""); | ||
1353 | XmlNode n = doc.CreateElement("", tag, ""); | ||
1354 | |||
1355 | if(value is LSL_Types.list) | ||
1356 | { | ||
1357 | typ.Value = "list"; | ||
1358 | n.Attributes.Append(typ); | ||
1359 | |||
1360 | DumpList(doc, n, (LSL_Types.list) value); | ||
1361 | |||
1362 | if(name != String.Empty) | ||
1363 | { | ||
1364 | XmlAttribute nam = doc.CreateAttribute("", "name", ""); | ||
1365 | nam.Value = name; | ||
1366 | n.Attributes.Append(nam); | ||
1367 | } | ||
1368 | |||
1369 | parent.AppendChild(n); | ||
1370 | return; | ||
1371 | } | ||
1372 | |||
1373 | n.AppendChild(doc.CreateTextNode(value.ToString())); | ||
1374 | |||
1375 | typ.Value = t.ToString(); | ||
1376 | n.Attributes.Append(typ); | ||
1377 | if(name != String.Empty) | ||
1378 | { | ||
1379 | XmlAttribute nam = doc.CreateAttribute("", "name", ""); | ||
1380 | nam.Value = name; | ||
1381 | n.Attributes.Append(nam); | ||
1382 | } | ||
1383 | |||
1384 | parent.AppendChild(n); | ||
1385 | } | ||
1386 | |||
1387 | private static object ReadTypedValue(XmlNode tag, out string name) | ||
1388 | { | ||
1389 | name = tag.Attributes.GetNamedItem("name").Value; | ||
1390 | |||
1391 | return ReadTypedValue(tag); | ||
1392 | } | ||
1393 | |||
1394 | private static object ReadTypedValue(XmlNode tag) | ||
1395 | { | ||
1396 | Object varValue; | ||
1397 | string assembly; | ||
1398 | |||
1399 | string itemType = tag.Attributes.GetNamedItem("type").Value; | ||
1400 | |||
1401 | if(itemType == "list") | ||
1402 | return ReadList(tag); | ||
1403 | |||
1404 | if(itemType == "libsecondlife.LLUUID") | ||
1405 | { | ||
1406 | LLUUID val = new LLUUID(); | ||
1407 | LLUUID.TryParse(tag.InnerText, out val); | ||
1408 | |||
1409 | return val; | ||
1410 | } | ||
1411 | |||
1412 | Type itemT = Type.GetType(itemType); | ||
1413 | if(itemT == null) | ||
1414 | { | ||
1415 | Object[] args = | ||
1416 | new Object[] { tag.InnerText }; | ||
1417 | |||
1418 | assembly = itemType+", OpenSim.Region.ScriptEngine.XEngine.Script"; | ||
1419 | itemT = Type.GetType(assembly); | ||
1420 | if(itemT == null) | ||
1421 | return null; | ||
1422 | |||
1423 | varValue = Activator.CreateInstance(itemT, args); | ||
1424 | |||
1425 | if(varValue == null) | ||
1426 | return null; | ||
1427 | } | ||
1428 | else | ||
1429 | { | ||
1430 | varValue = Convert.ChangeType(tag.InnerText, itemT); | ||
1431 | } | ||
1432 | return varValue; | ||
1433 | } | ||
1434 | } | ||
1435 | } | ||