diff options
author | Tedd Hansen | 2008-01-12 14:30:22 +0000 |
---|---|---|
committer | Tedd Hansen | 2008-01-12 14:30:22 +0000 |
commit | bacbade369a5244f9bcc611488b59f3bd4c8a564 (patch) | |
tree | 2cd909eff401066a69dba96615cbf736fdd73be5 /OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/Server_API | |
parent | * Trying something to see if it helps teleports and border crossings (diff) | |
download | opensim-SC-bacbade369a5244f9bcc611488b59f3bd4c8a564.zip opensim-SC-bacbade369a5244f9bcc611488b59f3bd4c8a564.tar.gz opensim-SC-bacbade369a5244f9bcc611488b59f3bd4c8a564.tar.bz2 opensim-SC-bacbade369a5244f9bcc611488b59f3bd4c8a564.tar.xz |
Major reorganizing of DotNetEngine. Moved common script engine parts to ScriptEngine.Common, only .Net-specific code in DotNetEngine. AppDomains, event handling, event execution queue and multithreading, script load/unload queue, etc has been moved to ScriptEngine.Common.
Loads of things has been put into interfaces instead of the specific class.
We are now one step closer to ScriptServer, and its very easy to implement new script languages. Just a few lines required to make them a OpenSim script module with all its glory.
Diffstat (limited to 'OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/Server_API')
-rw-r--r-- | OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/Server_API/LSL_BuiltIn_Commands.cs | 3015 |
1 files changed, 0 insertions, 3015 deletions
diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/Server_API/LSL_BuiltIn_Commands.cs b/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/Server_API/LSL_BuiltIn_Commands.cs deleted file mode 100644 index 1d9ca96..0000000 --- a/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/Server_API/LSL_BuiltIn_Commands.cs +++ /dev/null | |||
@@ -1,3015 +0,0 @@ | |||
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.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.Interfaces; | ||
38 | using OpenSim.Region.Environment.Scenes; | ||
39 | using OpenSim.Region.ScriptEngine.Common; | ||
40 | using OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL; | ||
41 | |||
42 | namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler | ||
43 | { | ||
44 | // | ||
45 | // !!!IMPORTANT!!! | ||
46 | // | ||
47 | // REMEMBER TO UPDATE http://opensimulator.org/wiki/LlFunction_implementation_status | ||
48 | // | ||
49 | |||
50 | // Notes: | ||
51 | // * If any function here needs to execute a LSL event in the script, use instance of "EventQueueManager" in "ScriptEngine". | ||
52 | // * If any function here needs to do some more advanced stuff like waiting for IO callbacks or similar that takes a long time then use "llSetTimerEvent" function as example. | ||
53 | // There is a class called "LSLLongCmdHandler" that is used for long LSL commands. | ||
54 | |||
55 | |||
56 | /// <summary> | ||
57 | /// Contains all LSL ll-functions. This class will be in Default AppDomain. | ||
58 | /// </summary> | ||
59 | public class LSL_BuiltIn_Commands : MarshalByRefObject, LSL_BuiltIn_Commands_Interface | ||
60 | { | ||
61 | private ASCIIEncoding enc = new ASCIIEncoding(); | ||
62 | private ScriptEngine m_ScriptEngine; | ||
63 | private SceneObjectPart m_host; | ||
64 | private uint m_localID; | ||
65 | private LLUUID m_itemID; | ||
66 | private bool throwErrorOnNotImplemented = true; | ||
67 | |||
68 | public LSL_BuiltIn_Commands(ScriptEngine ScriptEngine, SceneObjectPart host, uint localID, LLUUID itemID) | ||
69 | { | ||
70 | m_ScriptEngine = ScriptEngine; | ||
71 | m_host = host; | ||
72 | m_localID = localID; | ||
73 | m_itemID = itemID; | ||
74 | |||
75 | //MainLog.Instance.Notice("ScriptEngine", "LSL_BaseClass.Start() called. Hosted by [" + m_host.Name + ":" + m_host.UUID + "@" + m_host.AbsolutePosition + "]"); | ||
76 | } | ||
77 | |||
78 | private DateTime m_timer = DateTime.Now; | ||
79 | private string m_state = "default"; | ||
80 | |||
81 | public string State() | ||
82 | { | ||
83 | return m_state; | ||
84 | } | ||
85 | |||
86 | // Object never expires | ||
87 | public override Object InitializeLifetimeService() | ||
88 | { | ||
89 | //Console.WriteLine("LSL_BuiltIn_Commands: InitializeLifetimeService()"); | ||
90 | // return null; | ||
91 | ILease lease = (ILease)base.InitializeLifetimeService(); | ||
92 | |||
93 | if (lease.CurrentState == LeaseState.Initial) | ||
94 | { | ||
95 | lease.InitialLeaseTime = TimeSpan.Zero; // TimeSpan.FromMinutes(1); | ||
96 | // lease.SponsorshipTimeout = TimeSpan.FromMinutes(2); | ||
97 | // lease.RenewOnCallTime = TimeSpan.FromSeconds(2); | ||
98 | } | ||
99 | return lease; | ||
100 | } | ||
101 | |||
102 | public Scene World | ||
103 | { | ||
104 | get { return m_ScriptEngine.World; } | ||
105 | } | ||
106 | |||
107 | //These are the implementations of the various ll-functions used by the LSL scripts. | ||
108 | //starting out, we use the System.Math library for trig functions. - ckrinke 8-14-07 | ||
109 | public double llSin(double f) | ||
110 | { | ||
111 | |||
112 | return (double)Math.Sin(f); | ||
113 | } | ||
114 | |||
115 | public double llCos(double f) | ||
116 | { | ||
117 | return (double)Math.Cos(f); | ||
118 | } | ||
119 | |||
120 | public double llTan(double f) | ||
121 | { | ||
122 | return (double)Math.Tan(f); | ||
123 | } | ||
124 | |||
125 | public double llAtan2(double x, double y) | ||
126 | { | ||
127 | return (double)Math.Atan2(y, x); | ||
128 | } | ||
129 | |||
130 | public double llSqrt(double f) | ||
131 | { | ||
132 | return (double)Math.Sqrt(f); | ||
133 | } | ||
134 | |||
135 | public double llPow(double fbase, double fexponent) | ||
136 | { | ||
137 | return (double)Math.Pow(fbase, fexponent); | ||
138 | } | ||
139 | |||
140 | public int llAbs(int i) | ||
141 | { | ||
142 | return (int)Math.Abs(i); | ||
143 | } | ||
144 | |||
145 | public double llFabs(double f) | ||
146 | { | ||
147 | return (double)Math.Abs(f); | ||
148 | } | ||
149 | |||
150 | public double llFrand(double mag) | ||
151 | { | ||
152 | lock (Util.RandomClass) | ||
153 | { | ||
154 | return Util.RandomClass.NextDouble() * mag; | ||
155 | } | ||
156 | } | ||
157 | |||
158 | public int llFloor(double f) | ||
159 | { | ||
160 | return (int)Math.Floor(f); | ||
161 | } | ||
162 | |||
163 | public int llCeil(double f) | ||
164 | { | ||
165 | return (int)Math.Ceiling(f); | ||
166 | } | ||
167 | |||
168 | public int llRound(double f) | ||
169 | { | ||
170 | return (int)Math.Round(f, 0); | ||
171 | } | ||
172 | |||
173 | //This next group are vector operations involving squaring and square root. ckrinke | ||
174 | public double llVecMag(LSL_Types.Vector3 v) | ||
175 | { | ||
176 | return (v.x * v.x + v.y * v.y + v.z * v.z); | ||
177 | } | ||
178 | |||
179 | public LSL_Types.Vector3 llVecNorm(LSL_Types.Vector3 v) | ||
180 | { | ||
181 | double mag = v.x * v.x + v.y * v.y + v.z * v.z; | ||
182 | LSL_Types.Vector3 nor = new LSL_Types.Vector3(); | ||
183 | nor.x = v.x / mag; | ||
184 | nor.y = v.y / mag; | ||
185 | nor.z = v.z / mag; | ||
186 | return nor; | ||
187 | } | ||
188 | |||
189 | public double llVecDist(LSL_Types.Vector3 a, LSL_Types.Vector3 b) | ||
190 | { | ||
191 | double dx = a.x - b.x; | ||
192 | double dy = a.y - b.y; | ||
193 | double dz = a.z - b.z; | ||
194 | return Math.Sqrt(dx * dx + dy * dy + dz * dz); | ||
195 | } | ||
196 | |||
197 | //Now we start getting into quaternions which means sin/cos, matrices and vectors. ckrinke | ||
198 | public LSL_Types.Vector3 llRot2Euler(LSL_Types.Quaternion r) | ||
199 | { | ||
200 | //This implementation is from http://lslwiki.net/lslwiki/wakka.php?wakka=LibraryRotationFunctions. ckrinke | ||
201 | LSL_Types.Quaternion t = new LSL_Types.Quaternion(r.x * r.x, r.y * r.y, r.z * r.z, r.s * r.s); | ||
202 | double m = (t.x + t.y + t.z + t.s); | ||
203 | if (m == 0) return new LSL_Types.Vector3(); | ||
204 | double n = 2 * (r.y * r.s + r.x * r.z); | ||
205 | double p = m * m - n * n; | ||
206 | if (p > 0) | ||
207 | return new LSL_Types.Vector3(Math.Atan2(2.0 * (r.x * r.s - r.y * r.z), (-t.x - t.y + t.z + t.s)), | ||
208 | Math.Atan2(n, Math.Sqrt(p)), | ||
209 | Math.Atan2(2.0 * (r.z * r.s - r.x * r.y), (t.x - t.y - t.z + t.s))); | ||
210 | else if (n > 0) | ||
211 | return new LSL_Types.Vector3(0.0, Math.PI / 2, Math.Atan2((r.z * r.s + r.x * r.y), 0.5 - t.x - t.z)); | ||
212 | else | ||
213 | return new LSL_Types.Vector3(0.0, -Math.PI / 2, Math.Atan2((r.z * r.s + r.x * r.y), 0.5 - t.x - t.z)); | ||
214 | } | ||
215 | |||
216 | public LSL_Types.Quaternion llEuler2Rot(LSL_Types.Vector3 v) | ||
217 | { | ||
218 | //this comes from from http://lslwiki.net/lslwiki/wakka.php?wakka=LibraryRotationFunctions but is incomplete as of 8/19/07 | ||
219 | float err = 0.00001f; | ||
220 | double ax = Math.Sin(v.x / 2); | ||
221 | double aw = Math.Cos(v.x / 2); | ||
222 | double by = Math.Sin(v.y / 2); | ||
223 | double bw = Math.Cos(v.y / 2); | ||
224 | double cz = Math.Sin(v.z / 2); | ||
225 | double cw = Math.Cos(v.z / 2); | ||
226 | LSL_Types.Quaternion a1 = new LSL_Types.Quaternion(0.0, 0.0, cz, cw); | ||
227 | LSL_Types.Quaternion a2 = new LSL_Types.Quaternion(0.0, by, 0.0, bw); | ||
228 | LSL_Types.Quaternion a3 = new LSL_Types.Quaternion(ax, 0.0, 0.0, aw); | ||
229 | LSL_Types.Quaternion a = (a1 * a2) * a3; | ||
230 | //This multiplication doesnt compile, yet. a = a1 * a2 * a3; | ||
231 | LSL_Types.Quaternion b = new LSL_Types.Quaternion(ax * bw * cw + aw * by * cz, | ||
232 | aw * by * cw - ax * bw * cz, aw * bw * cz + ax * by * cw, | ||
233 | aw * bw * cw - ax * by * cz); | ||
234 | LSL_Types.Quaternion c = new LSL_Types.Quaternion(); | ||
235 | //This addition doesnt compile yet c = a + b; | ||
236 | LSL_Types.Quaternion d = new LSL_Types.Quaternion(); | ||
237 | //This addition doesnt compile yet d = a - b; | ||
238 | if ((Math.Abs(c.x) > err && Math.Abs(d.x) > err) || | ||
239 | (Math.Abs(c.y) > err && Math.Abs(d.y) > err) || | ||
240 | (Math.Abs(c.z) > err && Math.Abs(d.z) > err) || | ||
241 | (Math.Abs(c.s) > err && Math.Abs(d.s) > err)) | ||
242 | { | ||
243 | return b; | ||
244 | //return a new Quaternion that is null until I figure this out | ||
245 | // return b; | ||
246 | // return a; | ||
247 | } | ||
248 | return a; | ||
249 | } | ||
250 | |||
251 | public LSL_Types.Quaternion llAxes2Rot(LSL_Types.Vector3 fwd, LSL_Types.Vector3 left, LSL_Types.Vector3 up) | ||
252 | { | ||
253 | return new LSL_Types.Quaternion(); | ||
254 | } | ||
255 | |||
256 | public LSL_Types.Vector3 llRot2Fwd(LSL_Types.Quaternion r) | ||
257 | { | ||
258 | return new LSL_Types.Vector3(); | ||
259 | } | ||
260 | |||
261 | public LSL_Types.Vector3 llRot2Left(LSL_Types.Quaternion r) | ||
262 | { | ||
263 | return new LSL_Types.Vector3(); | ||
264 | } | ||
265 | |||
266 | public LSL_Types.Vector3 llRot2Up(LSL_Types.Quaternion r) | ||
267 | { | ||
268 | return new LSL_Types.Vector3(); | ||
269 | } | ||
270 | public LSL_Types.Quaternion llRotBetween(LSL_Types.Vector3 a, LSL_Types.Vector3 b) | ||
271 | { | ||
272 | //A and B should both be normalized | ||
273 | |||
274 | double dotProduct = LSL_Types.Vector3.Dot(a, b); | ||
275 | LSL_Types.Vector3 crossProduct = LSL_Types.Vector3.Cross(a, b); | ||
276 | double magProduct = LSL_Types.Vector3.Mag(a) * LSL_Types.Vector3.Mag(b); | ||
277 | double angle = Math.Acos(dotProduct / magProduct); | ||
278 | LSL_Types.Vector3 axis = LSL_Types.Vector3.Norm(crossProduct); | ||
279 | double s = Math.Sin(angle / 2); | ||
280 | |||
281 | return new LSL_Types.Quaternion(axis.x * s, axis.y * s, axis.z * s, (float)Math.Cos(angle / 2)); | ||
282 | } | ||
283 | public void llWhisper(int channelID, string text) | ||
284 | { | ||
285 | World.SimChat(Helpers.StringToField(text), | ||
286 | ChatTypeEnum.Whisper, channelID, m_host.AbsolutePosition, m_host.Name, m_host.UUID); | ||
287 | |||
288 | IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); | ||
289 | wComm.DeliverMessage(m_host.UUID.ToString(), ChatTypeEnum.Whisper, channelID, m_host.Name, text); | ||
290 | } | ||
291 | |||
292 | public void llSay(int channelID, string text) | ||
293 | { | ||
294 | World.SimChat(Helpers.StringToField(text), | ||
295 | ChatTypeEnum.Say, channelID, m_host.AbsolutePosition, m_host.Name, m_host.UUID); | ||
296 | |||
297 | IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); | ||
298 | wComm.DeliverMessage(m_host.UUID.ToString(), ChatTypeEnum.Say, channelID, m_host.Name, text); | ||
299 | } | ||
300 | |||
301 | public void llShout(int channelID, string text) | ||
302 | { | ||
303 | World.SimChat(Helpers.StringToField(text), | ||
304 | ChatTypeEnum.Shout, channelID, m_host.AbsolutePosition, m_host.Name, m_host.UUID); | ||
305 | |||
306 | IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); | ||
307 | wComm.DeliverMessage(m_host.UUID.ToString(), ChatTypeEnum.Shout, channelID, m_host.Name, text); | ||
308 | } | ||
309 | |||
310 | public int llListen(int channelID, string name, string ID, string msg) | ||
311 | { | ||
312 | if (ID == "") | ||
313 | { | ||
314 | ID = LLUUID.Zero.ToString(); | ||
315 | } | ||
316 | IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); | ||
317 | return wComm.Listen(m_localID, m_itemID, m_host.UUID, channelID, name, ID, msg); | ||
318 | } | ||
319 | |||
320 | public void llListenControl(int number, int active) | ||
321 | { | ||
322 | IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); | ||
323 | wComm.ListenControl(number, active); | ||
324 | } | ||
325 | |||
326 | public void llListenRemove(int number) | ||
327 | { | ||
328 | IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); | ||
329 | wComm.ListenRemove(number); | ||
330 | } | ||
331 | |||
332 | public void llSensor(string name, string id, int type, double range, double arc) | ||
333 | { | ||
334 | NotImplemented("llSensor"); | ||
335 | return; | ||
336 | } | ||
337 | |||
338 | public void llSensorRepeat(string name, string id, int type, double range, double arc, double rate) | ||
339 | { | ||
340 | NotImplemented("llSensorRepeat"); | ||
341 | return; | ||
342 | } | ||
343 | |||
344 | public void llSensorRemove() | ||
345 | { | ||
346 | NotImplemented("llSensorRemove"); | ||
347 | return; | ||
348 | } | ||
349 | |||
350 | public string llDetectedName(int number) | ||
351 | { | ||
352 | NotImplemented("llDetectedName"); | ||
353 | return ""; | ||
354 | } | ||
355 | |||
356 | public string llDetectedKey(int number) | ||
357 | { | ||
358 | NotImplemented("llDetectedKey"); | ||
359 | return ""; | ||
360 | } | ||
361 | |||
362 | public string llDetectedOwner(int number) | ||
363 | { | ||
364 | NotImplemented("llDetectedOwner"); | ||
365 | return ""; | ||
366 | } | ||
367 | |||
368 | public int llDetectedType(int number) | ||
369 | { | ||
370 | NotImplemented("llDetectedType"); | ||
371 | return 0; | ||
372 | } | ||
373 | |||
374 | public LSL_Types.Vector3 llDetectedPos(int number) | ||
375 | { | ||
376 | NotImplemented("llDetectedPos"); | ||
377 | return new LSL_Types.Vector3(); | ||
378 | } | ||
379 | |||
380 | public LSL_Types.Vector3 llDetectedVel(int number) | ||
381 | { | ||
382 | NotImplemented("llDetectedVel"); | ||
383 | return new LSL_Types.Vector3(); | ||
384 | } | ||
385 | |||
386 | public LSL_Types.Vector3 llDetectedGrab(int number) | ||
387 | { | ||
388 | NotImplemented("llDetectedGrab"); | ||
389 | return new LSL_Types.Vector3(); | ||
390 | } | ||
391 | |||
392 | public LSL_Types.Quaternion llDetectedRot(int number) | ||
393 | { | ||
394 | NotImplemented("llDetectedRot"); | ||
395 | return new LSL_Types.Quaternion(); | ||
396 | } | ||
397 | |||
398 | public int llDetectedGroup(int number) | ||
399 | { | ||
400 | NotImplemented("llDetectedGroup"); | ||
401 | return 0; | ||
402 | } | ||
403 | |||
404 | public int llDetectedLinkNumber(int number) | ||
405 | { | ||
406 | NotImplemented("llDetectedLinkNumber"); | ||
407 | return 0; | ||
408 | } | ||
409 | |||
410 | public void llDie() | ||
411 | { | ||
412 | World.DeleteSceneObjectGroup(m_host.ParentGroup); | ||
413 | return; | ||
414 | } | ||
415 | |||
416 | public double llGround(LSL_Types.Vector3 offset) | ||
417 | { | ||
418 | int x = (int)(m_host.AbsolutePosition.X + offset.x); | ||
419 | int y = (int)(m_host.AbsolutePosition.Y + offset.y); | ||
420 | return World.GetLandHeight(x, y); | ||
421 | } | ||
422 | |||
423 | public double llCloud(LSL_Types.Vector3 offset) | ||
424 | { | ||
425 | NotImplemented("llCloud"); | ||
426 | return 0; | ||
427 | } | ||
428 | |||
429 | public LSL_Types.Vector3 llWind(LSL_Types.Vector3 offset) | ||
430 | { | ||
431 | NotImplemented("llWind"); | ||
432 | return new LSL_Types.Vector3(); | ||
433 | } | ||
434 | |||
435 | public void llSetStatus(int status, int value) | ||
436 | { | ||
437 | NotImplemented("llSetStatus"); | ||
438 | return; | ||
439 | } | ||
440 | |||
441 | public int llGetStatus(int status) | ||
442 | { | ||
443 | NotImplemented("llGetStatus"); | ||
444 | return 0; | ||
445 | } | ||
446 | |||
447 | public void llSetScale(LSL_Types.Vector3 scale) | ||
448 | { | ||
449 | // TODO: this needs to trigger a persistance save as well | ||
450 | LLVector3 tmp = m_host.Scale; | ||
451 | tmp.X = (float)scale.x; | ||
452 | tmp.Y = (float)scale.y; | ||
453 | tmp.Z = (float)scale.z; | ||
454 | m_host.Scale = tmp; | ||
455 | m_host.SendFullUpdateToAllClients(); | ||
456 | return; | ||
457 | } | ||
458 | |||
459 | public LSL_Types.Vector3 llGetScale() | ||
460 | { | ||
461 | return new LSL_Types.Vector3(m_host.Scale.X, m_host.Scale.Y, m_host.Scale.Z); | ||
462 | } | ||
463 | |||
464 | public void llSetColor(LSL_Types.Vector3 color, int face) | ||
465 | { | ||
466 | LLObject.TextureEntry tex = m_host.Shape.Textures; | ||
467 | LLColor texcolor; | ||
468 | if (face > -1) | ||
469 | { | ||
470 | texcolor = tex.CreateFace((uint)face).RGBA; | ||
471 | texcolor.R = (float)Math.Abs(color.x - 1); | ||
472 | texcolor.G = (float)Math.Abs(color.y - 1); | ||
473 | texcolor.B = (float)Math.Abs(color.z - 1); | ||
474 | tex.FaceTextures[face].RGBA = texcolor; | ||
475 | m_host.UpdateTexture(tex); | ||
476 | return; | ||
477 | } | ||
478 | else if (face == -1) | ||
479 | { | ||
480 | for (uint i = 0; i < 32; i++) | ||
481 | { | ||
482 | if (tex.FaceTextures[i] != null) | ||
483 | { | ||
484 | texcolor = tex.FaceTextures[i].RGBA; | ||
485 | texcolor.R = (float)Math.Abs(color.x - 1); | ||
486 | texcolor.G = (float)Math.Abs(color.y - 1); | ||
487 | texcolor.B = (float)Math.Abs(color.z - 1); | ||
488 | tex.FaceTextures[i].RGBA = texcolor; | ||
489 | } | ||
490 | texcolor = tex.DefaultTexture.RGBA; | ||
491 | texcolor.R = (float)Math.Abs(color.x - 1); | ||
492 | texcolor.G = (float)Math.Abs(color.y - 1); | ||
493 | texcolor.B = (float)Math.Abs(color.z - 1); | ||
494 | tex.DefaultTexture.RGBA = texcolor; | ||
495 | } | ||
496 | m_host.UpdateTexture(tex); | ||
497 | return; | ||
498 | } | ||
499 | NotImplemented("llSetColor"); | ||
500 | return; | ||
501 | } | ||
502 | |||
503 | public double llGetAlpha(int face) | ||
504 | { | ||
505 | LLObject.TextureEntry tex = m_host.Shape.Textures; | ||
506 | if (face == -1) // TMP: Until we can determine number of sides, ALL_SIDES (-1) will return default color | ||
507 | { | ||
508 | return (double)((tex.DefaultTexture.RGBA.A * 255) / 255); | ||
509 | } | ||
510 | if (face > -1) | ||
511 | { | ||
512 | return (double)((tex.GetFace((uint)face).RGBA.A * 255) / 255); | ||
513 | } | ||
514 | return 0; | ||
515 | } | ||
516 | |||
517 | public void llSetAlpha(double alpha, int face) | ||
518 | { | ||
519 | LLObject.TextureEntry tex = m_host.Shape.Textures; | ||
520 | LLColor texcolor; | ||
521 | if (face > -1) | ||
522 | { | ||
523 | texcolor = tex.CreateFace((uint)face).RGBA; | ||
524 | texcolor.A = (float)Math.Abs(alpha - 1); | ||
525 | tex.FaceTextures[face].RGBA = texcolor; | ||
526 | m_host.UpdateTexture(tex); | ||
527 | return; | ||
528 | } | ||
529 | else if (face == -1) | ||
530 | { | ||
531 | for (int i = 0; i < 32; i++) | ||
532 | { | ||
533 | if (tex.FaceTextures[i] != null) | ||
534 | { | ||
535 | texcolor = tex.FaceTextures[i].RGBA; | ||
536 | texcolor.A = (float)Math.Abs(alpha - 1); | ||
537 | tex.FaceTextures[i].RGBA = texcolor; | ||
538 | } | ||
539 | } | ||
540 | texcolor = tex.DefaultTexture.RGBA; | ||
541 | texcolor.A = (float)Math.Abs(alpha - 1); | ||
542 | tex.DefaultTexture.RGBA = texcolor; | ||
543 | m_host.UpdateTexture(tex); | ||
544 | return; | ||
545 | } | ||
546 | NotImplemented("llSetAlpha"); | ||
547 | return; | ||
548 | } | ||
549 | |||
550 | public LSL_Types.Vector3 llGetColor(int face) | ||
551 | { | ||
552 | LLObject.TextureEntry tex = m_host.Shape.Textures; | ||
553 | LLColor texcolor; | ||
554 | LSL_Types.Vector3 rgb; | ||
555 | if (face == -1) // TMP: Until we can determine number of sides, ALL_SIDES (-1) will return default color | ||
556 | { | ||
557 | texcolor = tex.DefaultTexture.RGBA; | ||
558 | rgb.x = (255 - (texcolor.R * 255)) / 255; | ||
559 | rgb.y = (255 - (texcolor.G * 255)) / 255; | ||
560 | rgb.z = (255 - (texcolor.B * 255)) / 255; | ||
561 | return rgb; | ||
562 | } | ||
563 | if (face > -1) | ||
564 | { | ||
565 | texcolor = tex.GetFace((uint)face).RGBA; | ||
566 | rgb.x = (255 - (texcolor.R * 255)) / 255; | ||
567 | rgb.y = (255 - (texcolor.G * 255)) / 255; | ||
568 | rgb.z = (255 - (texcolor.B * 255)) / 255; | ||
569 | return rgb; | ||
570 | } | ||
571 | NotImplemented("llGetColor"); | ||
572 | return new LSL_Types.Vector3(); | ||
573 | } | ||
574 | |||
575 | public void llSetTexture(string texture, int face) | ||
576 | { | ||
577 | LLObject.TextureEntry tex = m_host.Shape.Textures; | ||
578 | |||
579 | if (face > -1) | ||
580 | { | ||
581 | LLObject.TextureEntryFace texface = tex.CreateFace((uint)face); | ||
582 | texface.TextureID = new LLUUID(texture); | ||
583 | tex.FaceTextures[face] = texface; | ||
584 | m_host.UpdateTexture(tex); | ||
585 | return; | ||
586 | } | ||
587 | else if (face == -1) | ||
588 | { | ||
589 | for (uint i = 0; i < 32; i++) | ||
590 | { | ||
591 | if (tex.FaceTextures[i] != null) | ||
592 | { | ||
593 | tex.FaceTextures[i].TextureID = new LLUUID(texture); | ||
594 | } | ||
595 | } | ||
596 | tex.DefaultTexture.TextureID = new LLUUID(texture); | ||
597 | m_host.UpdateTexture(tex); | ||
598 | return; | ||
599 | } | ||
600 | NotImplemented("llSetTexture"); | ||
601 | return; | ||
602 | } | ||
603 | |||
604 | public void llScaleTexture(double u, double v, int face) | ||
605 | { | ||
606 | LLObject.TextureEntry tex = m_host.Shape.Textures; | ||
607 | if (face > -1) | ||
608 | { | ||
609 | LLObject.TextureEntryFace texface = tex.CreateFace((uint)face); | ||
610 | texface.RepeatU = (float)u; | ||
611 | texface.RepeatV = (float)v; | ||
612 | tex.FaceTextures[face] = texface; | ||
613 | m_host.UpdateTexture(tex); | ||
614 | return; | ||
615 | } | ||
616 | if (face == -1) | ||
617 | { | ||
618 | for (int i = 0; i < 32; i++) | ||
619 | { | ||
620 | if (tex.FaceTextures[i] != null) | ||
621 | { | ||
622 | tex.FaceTextures[i].RepeatU = (float)u; | ||
623 | tex.FaceTextures[i].RepeatV = (float)v; | ||
624 | } | ||
625 | } | ||
626 | tex.DefaultTexture.RepeatU = (float)u; | ||
627 | tex.DefaultTexture.RepeatV = (float)v; | ||
628 | m_host.UpdateTexture(tex); | ||
629 | return; | ||
630 | } | ||
631 | NotImplemented("llScaleTexture"); | ||
632 | return; | ||
633 | } | ||
634 | |||
635 | public void llOffsetTexture(double u, double v, int face) | ||
636 | { | ||
637 | LLObject.TextureEntry tex = m_host.Shape.Textures; | ||
638 | if (face > -1) | ||
639 | { | ||
640 | LLObject.TextureEntryFace texface = tex.CreateFace((uint)face); | ||
641 | texface.OffsetU = (float)u; | ||
642 | texface.OffsetV = (float)v; | ||
643 | tex.FaceTextures[face] = texface; | ||
644 | m_host.UpdateTexture(tex); | ||
645 | return; | ||
646 | } | ||
647 | if (face == -1) | ||
648 | { | ||
649 | for (int i = 0; i < 32; i++) | ||
650 | { | ||
651 | if (tex.FaceTextures[i] != null) | ||
652 | { | ||
653 | tex.FaceTextures[i].OffsetU = (float)u; | ||
654 | tex.FaceTextures[i].OffsetV = (float)v; | ||
655 | } | ||
656 | } | ||
657 | tex.DefaultTexture.OffsetU = (float)u; | ||
658 | tex.DefaultTexture.OffsetV = (float)v; | ||
659 | m_host.UpdateTexture(tex); | ||
660 | return; | ||
661 | } | ||
662 | NotImplemented("llOffsetTexture"); | ||
663 | return; | ||
664 | } | ||
665 | |||
666 | public void llRotateTexture(double rotation, int face) | ||
667 | { | ||
668 | LLObject.TextureEntry tex = m_host.Shape.Textures; | ||
669 | if (face > -1) | ||
670 | { | ||
671 | LLObject.TextureEntryFace texface = tex.CreateFace((uint)face); | ||
672 | texface.Rotation = (float)rotation; | ||
673 | tex.FaceTextures[face] = texface; | ||
674 | m_host.UpdateTexture(tex); | ||
675 | return; | ||
676 | } | ||
677 | if (face == -1) | ||
678 | { | ||
679 | for (int i = 0; i < 32; i++) | ||
680 | { | ||
681 | if (tex.FaceTextures[i] != null) | ||
682 | { | ||
683 | tex.FaceTextures[i].Rotation = (float)rotation; | ||
684 | } | ||
685 | } | ||
686 | tex.DefaultTexture.Rotation = (float)rotation; | ||
687 | m_host.UpdateTexture(tex); | ||
688 | return; | ||
689 | } | ||
690 | NotImplemented("llRotateTexture"); | ||
691 | return; | ||
692 | } | ||
693 | |||
694 | public string llGetTexture(int face) | ||
695 | { | ||
696 | LLObject.TextureEntry tex = m_host.Shape.Textures; | ||
697 | if (face == -1) | ||
698 | { | ||
699 | face = 0; | ||
700 | } | ||
701 | if (face > -1) | ||
702 | { | ||
703 | LLObject.TextureEntryFace texface; | ||
704 | texface = tex.GetFace((uint)face); | ||
705 | return texface.TextureID.ToString(); | ||
706 | } | ||
707 | NotImplemented("llGetTexture"); | ||
708 | return ""; | ||
709 | } | ||
710 | |||
711 | public void llSetPos(LSL_Types.Vector3 pos) | ||
712 | { | ||
713 | if (m_host.ParentID != 0) | ||
714 | { | ||
715 | m_host.UpdateOffSet(new LLVector3((float)pos.x, (float)pos.y, (float)pos.z)); | ||
716 | } | ||
717 | else | ||
718 | { | ||
719 | m_host.UpdateGroupPosition(new LLVector3((float)pos.x, (float)pos.y, (float)pos.z)); | ||
720 | } | ||
721 | } | ||
722 | |||
723 | public LSL_Types.Vector3 llGetPos() | ||
724 | { | ||
725 | return new LSL_Types.Vector3(m_host.AbsolutePosition.X, | ||
726 | m_host.AbsolutePosition.Y, | ||
727 | m_host.AbsolutePosition.Z); | ||
728 | } | ||
729 | |||
730 | public LSL_Types.Vector3 llGetLocalPos() | ||
731 | { | ||
732 | if (m_host.ParentID != 0) | ||
733 | { | ||
734 | return new LSL_Types.Vector3(m_host.OffsetPosition.X, | ||
735 | m_host.OffsetPosition.Y, | ||
736 | m_host.OffsetPosition.Z); | ||
737 | } | ||
738 | else | ||
739 | { | ||
740 | return new LSL_Types.Vector3(m_host.AbsolutePosition.X, | ||
741 | m_host.AbsolutePosition.Y, | ||
742 | m_host.AbsolutePosition.Z); | ||
743 | } | ||
744 | } | ||
745 | |||
746 | public void llSetRot(LSL_Types.Quaternion rot) | ||
747 | { | ||
748 | m_host.UpdateRotation(new LLQuaternion((float)rot.x, (float)rot.y, (float)rot.z, (float)rot.s)); | ||
749 | } | ||
750 | |||
751 | public LSL_Types.Quaternion llGetRot() | ||
752 | { | ||
753 | LLQuaternion q = m_host.RotationOffset; | ||
754 | return new LSL_Types.Quaternion(q.X, q.Y, q.Z, q.W); | ||
755 | } | ||
756 | |||
757 | public LSL_Types.Quaternion llGetLocalRot() | ||
758 | { | ||
759 | return new LSL_Types.Quaternion(m_host.RotationOffset.X, m_host.RotationOffset.Y, m_host.RotationOffset.Z, m_host.RotationOffset.W); | ||
760 | } | ||
761 | |||
762 | public void llSetForce(LSL_Types.Vector3 force, int local) | ||
763 | { | ||
764 | NotImplemented("llSetForce"); | ||
765 | } | ||
766 | |||
767 | public LSL_Types.Vector3 llGetForce() | ||
768 | { | ||
769 | NotImplemented("llGetForce"); | ||
770 | return new LSL_Types.Vector3(); | ||
771 | } | ||
772 | |||
773 | public int llTarget(LSL_Types.Vector3 position, double range) | ||
774 | { | ||
775 | NotImplemented("llTarget"); | ||
776 | return 0; | ||
777 | } | ||
778 | |||
779 | public void llTargetRemove(int number) | ||
780 | { | ||
781 | NotImplemented("llTargetRemove"); | ||
782 | } | ||
783 | |||
784 | public int llRotTarget(LSL_Types.Quaternion rot, double error) | ||
785 | { | ||
786 | NotImplemented("llRotTarget"); | ||
787 | return 0; | ||
788 | } | ||
789 | |||
790 | public void llRotTargetRemove(int number) | ||
791 | { | ||
792 | NotImplemented("llRotTargetRemove"); | ||
793 | } | ||
794 | |||
795 | public void llMoveToTarget(LSL_Types.Vector3 target, double tau) | ||
796 | { | ||
797 | NotImplemented("llMoveToTarget"); | ||
798 | } | ||
799 | |||
800 | public void llStopMoveToTarget() | ||
801 | { | ||
802 | NotImplemented("llStopMoveToTarget"); | ||
803 | } | ||
804 | |||
805 | public void llApplyImpulse(LSL_Types.Vector3 force, int local) | ||
806 | { | ||
807 | NotImplemented("llApplyImpulse"); | ||
808 | } | ||
809 | |||
810 | public void llApplyRotationalImpulse(LSL_Types.Vector3 force, int local) | ||
811 | { | ||
812 | NotImplemented("llApplyRotationalImpulse"); | ||
813 | } | ||
814 | |||
815 | public void llSetTorque(LSL_Types.Vector3 torque, int local) | ||
816 | { | ||
817 | NotImplemented("llSetTorque"); | ||
818 | } | ||
819 | |||
820 | public LSL_Types.Vector3 llGetTorque() | ||
821 | { | ||
822 | NotImplemented("llGetTorque"); | ||
823 | return new LSL_Types.Vector3(); | ||
824 | } | ||
825 | |||
826 | public void llSetForceAndTorque(LSL_Types.Vector3 force, LSL_Types.Vector3 torque, int local) | ||
827 | { | ||
828 | NotImplemented("llSetForceAndTorque"); | ||
829 | } | ||
830 | |||
831 | public LSL_Types.Vector3 llGetVel() | ||
832 | { | ||
833 | return new LSL_Types.Vector3(m_host.Velocity.X, m_host.Velocity.Y, m_host.Velocity.Z); | ||
834 | } | ||
835 | |||
836 | public LSL_Types.Vector3 llGetAccel() | ||
837 | { | ||
838 | return new LSL_Types.Vector3(m_host.Acceleration.X, m_host.Acceleration.Y, m_host.Acceleration.Z); | ||
839 | } | ||
840 | |||
841 | public LSL_Types.Vector3 llGetOmega() | ||
842 | { | ||
843 | NotImplemented("llGetOmega"); | ||
844 | return new LSL_Types.Vector3(); | ||
845 | } | ||
846 | |||
847 | public double llGetTimeOfDay() | ||
848 | { | ||
849 | NotImplemented("llGetTimeOfDay"); | ||
850 | return 0; | ||
851 | } | ||
852 | |||
853 | public double llGetWallclock() | ||
854 | { | ||
855 | return DateTime.Now.TimeOfDay.TotalSeconds; | ||
856 | } | ||
857 | |||
858 | public double llGetTime() | ||
859 | { | ||
860 | TimeSpan ScriptTime = DateTime.Now - m_timer; | ||
861 | return (double)(ScriptTime.TotalMilliseconds / 1000); | ||
862 | } | ||
863 | |||
864 | public void llResetTime() | ||
865 | { | ||
866 | m_timer = DateTime.Now; | ||
867 | } | ||
868 | |||
869 | public double llGetAndResetTime() | ||
870 | { | ||
871 | TimeSpan ScriptTime = DateTime.Now - m_timer; | ||
872 | m_timer = DateTime.Now; | ||
873 | return (double)(ScriptTime.TotalMilliseconds / 1000); | ||
874 | } | ||
875 | |||
876 | public void llSound() | ||
877 | { | ||
878 | NotImplemented("llSound"); | ||
879 | } | ||
880 | |||
881 | public void llPlaySound(string sound, double volume) | ||
882 | { | ||
883 | NotImplemented("llPlaySound"); | ||
884 | } | ||
885 | |||
886 | public void llLoopSound(string sound, double volume) | ||
887 | { | ||
888 | NotImplemented("llLoopSound"); | ||
889 | } | ||
890 | |||
891 | public void llLoopSoundMaster(string sound, double volume) | ||
892 | { | ||
893 | NotImplemented("llLoopSoundMaster"); | ||
894 | } | ||
895 | |||
896 | public void llLoopSoundSlave(string sound, double volume) | ||
897 | { | ||
898 | NotImplemented("llLoopSoundSlave"); | ||
899 | } | ||
900 | |||
901 | public void llPlaySoundSlave(string sound, double volume) | ||
902 | { | ||
903 | NotImplemented("llPlaySoundSlave"); | ||
904 | } | ||
905 | |||
906 | public void llTriggerSound(string sound, double volume) | ||
907 | { | ||
908 | NotImplemented("llTriggerSound"); | ||
909 | } | ||
910 | |||
911 | public void llStopSound() | ||
912 | { | ||
913 | NotImplemented("llStopSound"); | ||
914 | } | ||
915 | |||
916 | public void llPreloadSound(string sound) | ||
917 | { | ||
918 | NotImplemented("llPreloadSound"); | ||
919 | } | ||
920 | |||
921 | public string llGetSubString(string src, int start, int end) | ||
922 | { | ||
923 | return src.Substring(start, end); | ||
924 | } | ||
925 | |||
926 | public string llDeleteSubString(string src, int start, int end) | ||
927 | { | ||
928 | return src.Remove(start, end - start); | ||
929 | } | ||
930 | |||
931 | public string llInsertString(string dst, int position, string src) | ||
932 | { | ||
933 | return dst.Insert(position, src); | ||
934 | } | ||
935 | |||
936 | public string llToUpper(string src) | ||
937 | { | ||
938 | return src.ToUpper(); | ||
939 | } | ||
940 | |||
941 | public string llToLower(string src) | ||
942 | { | ||
943 | return src.ToLower(); | ||
944 | } | ||
945 | |||
946 | public int llGiveMoney(string destination, int amount) | ||
947 | { | ||
948 | NotImplemented("llGiveMoney"); | ||
949 | return 0; | ||
950 | } | ||
951 | |||
952 | public void llMakeExplosion() | ||
953 | { | ||
954 | NotImplemented("llMakeExplosion"); | ||
955 | } | ||
956 | |||
957 | public void llMakeFountain() | ||
958 | { | ||
959 | NotImplemented("llMakeFountain"); | ||
960 | } | ||
961 | |||
962 | public void llMakeSmoke() | ||
963 | { | ||
964 | NotImplemented("llMakeSmoke"); | ||
965 | } | ||
966 | |||
967 | public void llMakeFire() | ||
968 | { | ||
969 | NotImplemented("llMakeFire"); | ||
970 | } | ||
971 | |||
972 | public void llRezObject(string inventory, LSL_Types.Vector3 pos, LSL_Types.Quaternion rot, int param) | ||
973 | { | ||
974 | NotImplemented("llRezObject"); | ||
975 | } | ||
976 | |||
977 | public void llLookAt(LSL_Types.Vector3 target, double strength, double damping) | ||
978 | { | ||
979 | NotImplemented("llLookAt"); | ||
980 | } | ||
981 | |||
982 | public void llStopLookAt() | ||
983 | { | ||
984 | NotImplemented("llStopLookAt"); | ||
985 | } | ||
986 | |||
987 | public void llSetTimerEvent(double sec) | ||
988 | { | ||
989 | // Setting timer repeat | ||
990 | m_ScriptEngine.m_LSLLongCmdHandler.SetTimerEvent(m_localID, m_itemID, sec); | ||
991 | } | ||
992 | |||
993 | public void llSleep(double sec) | ||
994 | { | ||
995 | Thread.Sleep((int)(sec * 1000)); | ||
996 | } | ||
997 | |||
998 | public double llGetMass() | ||
999 | { | ||
1000 | return m_host.GetMass(); | ||
1001 | } | ||
1002 | |||
1003 | public void llCollisionFilter(string name, string id, int accept) | ||
1004 | { | ||
1005 | NotImplemented("llCollisionFilter"); | ||
1006 | } | ||
1007 | |||
1008 | public void llTakeControls(int controls, int accept, int pass_on) | ||
1009 | { | ||
1010 | NotImplemented("llTakeControls"); | ||
1011 | } | ||
1012 | |||
1013 | public void llReleaseControls() | ||
1014 | { | ||
1015 | NotImplemented("llReleaseControls"); | ||
1016 | } | ||
1017 | |||
1018 | public void llAttachToAvatar(int attachment) | ||
1019 | { | ||
1020 | NotImplemented("llAttachToAvatar"); | ||
1021 | } | ||
1022 | |||
1023 | public void llDetachFromAvatar() | ||
1024 | { | ||
1025 | NotImplemented("llDetachFromAvatar"); | ||
1026 | } | ||
1027 | |||
1028 | public void llTakeCamera() | ||
1029 | { | ||
1030 | NotImplemented("llTakeCamera"); | ||
1031 | } | ||
1032 | |||
1033 | public void llReleaseCamera() | ||
1034 | { | ||
1035 | NotImplemented("llReleaseCamera"); | ||
1036 | } | ||
1037 | |||
1038 | public string llGetOwner() | ||
1039 | { | ||
1040 | return m_host.ObjectOwner.ToString(); | ||
1041 | } | ||
1042 | |||
1043 | public void llInstantMessage(string user, string message) | ||
1044 | { | ||
1045 | NotImplemented("llInstantMessage"); | ||
1046 | |||
1047 | // We may be able to use ClientView.SendInstantMessage here, but we need a client instance. | ||
1048 | // InstantMessageModule.OnInstantMessage searches through a list of scenes for a client matching the toAgent, | ||
1049 | // but I don't think we have a list of scenes available from here. | ||
1050 | // (We also don't want to duplicate the code in OnInstantMessage if we can avoid it.) | ||
1051 | |||
1052 | // TODO: figure out values for client, fromSession, and imSessionID | ||
1053 | // client.SendInstantMessage(m_host.UUID, fromSession, message, user, imSessionID, m_host.Name, AgentManager.InstantMessageDialog.MessageFromAgent, (uint)Util.UnixTimeSinceEpoch()); | ||
1054 | } | ||
1055 | |||
1056 | public void llEmail(string address, string subject, string message) | ||
1057 | { | ||
1058 | NotImplemented("llEmail"); | ||
1059 | } | ||
1060 | |||
1061 | public void llGetNextEmail(string address, string subject) | ||
1062 | { | ||
1063 | NotImplemented("llGetNextEmail"); | ||
1064 | } | ||
1065 | |||
1066 | public string llGetKey() | ||
1067 | { | ||
1068 | return m_host.UUID.ToString(); | ||
1069 | } | ||
1070 | |||
1071 | public void llSetBuoyancy(double buoyancy) | ||
1072 | { | ||
1073 | NotImplemented("llSetBuoyancy"); | ||
1074 | } | ||
1075 | |||
1076 | public void llSetHoverHeight(double height, int water, double tau) | ||
1077 | { | ||
1078 | NotImplemented("llSetHoverHeight"); | ||
1079 | } | ||
1080 | |||
1081 | public void llStopHover() | ||
1082 | { | ||
1083 | NotImplemented("llStopHover"); | ||
1084 | } | ||
1085 | |||
1086 | public void llMinEventDelay(double delay) | ||
1087 | { | ||
1088 | NotImplemented("llMinEventDelay"); | ||
1089 | } | ||
1090 | |||
1091 | public void llSoundPreload() | ||
1092 | { | ||
1093 | NotImplemented("llSoundPreload"); | ||
1094 | } | ||
1095 | |||
1096 | public void llRotLookAt(LSL_Types.Quaternion target, double strength, double damping) | ||
1097 | { | ||
1098 | NotImplemented("llRotLookAt"); | ||
1099 | } | ||
1100 | |||
1101 | public int llStringLength(string str) | ||
1102 | { | ||
1103 | if (str.Length > 0) | ||
1104 | { | ||
1105 | return str.Length; | ||
1106 | } | ||
1107 | else | ||
1108 | { | ||
1109 | return 0; | ||
1110 | } | ||
1111 | } | ||
1112 | |||
1113 | public void llStartAnimation(string anim) | ||
1114 | { | ||
1115 | NotImplemented("llStartAnimation"); | ||
1116 | } | ||
1117 | |||
1118 | public void llStopAnimation(string anim) | ||
1119 | { | ||
1120 | NotImplemented("llStopAnimation"); | ||
1121 | } | ||
1122 | |||
1123 | public void llPointAt() | ||
1124 | { | ||
1125 | NotImplemented("llPointAt"); | ||
1126 | } | ||
1127 | |||
1128 | public void llStopPointAt() | ||
1129 | { | ||
1130 | NotImplemented("llStopPointAt"); | ||
1131 | } | ||
1132 | |||
1133 | public void llTargetOmega(LSL_Types.Vector3 axis, double spinrate, double gain) | ||
1134 | { | ||
1135 | m_host.RotationalVelocity = new LLVector3((float)(axis.x * spinrate), (float)(axis.y * spinrate), (float)(axis.z * spinrate)); | ||
1136 | m_host.AngularVelocity = new LLVector3((float)(axis.x * spinrate), (float)(axis.y * spinrate), (float)(axis.z * spinrate)); | ||
1137 | m_host.ScheduleTerseUpdate(); | ||
1138 | m_host.SendTerseUpdateToAllClients(); | ||
1139 | //NotImplemented("llTargetOmega"); | ||
1140 | } | ||
1141 | |||
1142 | public int llGetStartParameter() | ||
1143 | { | ||
1144 | NotImplemented("llGetStartParameter"); | ||
1145 | return 0; | ||
1146 | } | ||
1147 | |||
1148 | public void llGodLikeRezObject(string inventory, LSL_Types.Vector3 pos) | ||
1149 | { | ||
1150 | NotImplemented("llGodLikeRezObject"); | ||
1151 | } | ||
1152 | |||
1153 | public void llRequestPermissions(string agent, int perm) | ||
1154 | { | ||
1155 | NotImplemented("llRequestPermissions"); | ||
1156 | } | ||
1157 | |||
1158 | public string llGetPermissionsKey() | ||
1159 | { | ||
1160 | NotImplemented("llGetPermissionsKey"); | ||
1161 | return ""; | ||
1162 | } | ||
1163 | |||
1164 | public int llGetPermissions() | ||
1165 | { | ||
1166 | NotImplemented("llGetPermissions"); | ||
1167 | return 0; | ||
1168 | } | ||
1169 | |||
1170 | public int llGetLinkNumber() | ||
1171 | { | ||
1172 | return m_host.LinkNum; | ||
1173 | } | ||
1174 | |||
1175 | public void llSetLinkColor(int linknumber, LSL_Types.Vector3 color, int face) | ||
1176 | { | ||
1177 | SceneObjectPart part = m_host.ParentGroup.GetLinkNumPart(linknumber); | ||
1178 | if (linknumber > -1) | ||
1179 | { | ||
1180 | LLObject.TextureEntry tex = part.Shape.Textures; | ||
1181 | LLColor texcolor; | ||
1182 | if (face > -1) | ||
1183 | { | ||
1184 | texcolor = tex.CreateFace((uint)face).RGBA; | ||
1185 | texcolor.R = (float)Math.Abs(color.x - 1); | ||
1186 | texcolor.G = (float)Math.Abs(color.y - 1); | ||
1187 | texcolor.B = (float)Math.Abs(color.z - 1); | ||
1188 | tex.FaceTextures[face].RGBA = texcolor; | ||
1189 | part.UpdateTexture(tex); | ||
1190 | return; | ||
1191 | } | ||
1192 | else if (face == -1) | ||
1193 | { | ||
1194 | texcolor = tex.DefaultTexture.RGBA; | ||
1195 | texcolor.R = (float)Math.Abs(color.x - 1); | ||
1196 | texcolor.G = (float)Math.Abs(color.y - 1); | ||
1197 | texcolor.B = (float)Math.Abs(color.z - 1); | ||
1198 | tex.DefaultTexture.RGBA = texcolor; | ||
1199 | for (uint i = 0; i < 32; i++) | ||
1200 | { | ||
1201 | if (tex.FaceTextures[i] != null) | ||
1202 | { | ||
1203 | texcolor = tex.FaceTextures[i].RGBA; | ||
1204 | texcolor.R = (float)Math.Abs(color.x - 1); | ||
1205 | texcolor.G = (float)Math.Abs(color.y - 1); | ||
1206 | texcolor.B = (float)Math.Abs(color.z - 1); | ||
1207 | tex.FaceTextures[i].RGBA = texcolor; | ||
1208 | } | ||
1209 | } | ||
1210 | texcolor = tex.DefaultTexture.RGBA; | ||
1211 | texcolor.R = (float)Math.Abs(color.x - 1); | ||
1212 | texcolor.G = (float)Math.Abs(color.y - 1); | ||
1213 | texcolor.B = (float)Math.Abs(color.z - 1); | ||
1214 | tex.DefaultTexture.RGBA = texcolor; | ||
1215 | part.UpdateTexture(tex); | ||
1216 | return; | ||
1217 | } | ||
1218 | return; | ||
1219 | } | ||
1220 | else if (linknumber == -1) | ||
1221 | { | ||
1222 | int num = m_host.ParentGroup.PrimCount; | ||
1223 | for (int w = 0; w < num; w++) | ||
1224 | { | ||
1225 | linknumber = w; | ||
1226 | part = m_host.ParentGroup.GetLinkNumPart(linknumber); | ||
1227 | LLObject.TextureEntry tex = part.Shape.Textures; | ||
1228 | LLColor texcolor; | ||
1229 | if (face > -1) | ||
1230 | { | ||
1231 | texcolor = tex.CreateFace((uint)face).RGBA; | ||
1232 | texcolor.R = (float)Math.Abs(color.x - 1); | ||
1233 | texcolor.G = (float)Math.Abs(color.y - 1); | ||
1234 | texcolor.B = (float)Math.Abs(color.z - 1); | ||
1235 | tex.FaceTextures[face].RGBA = texcolor; | ||
1236 | part.UpdateTexture(tex); | ||
1237 | } | ||
1238 | else if (face == -1) | ||
1239 | { | ||
1240 | texcolor = tex.DefaultTexture.RGBA; | ||
1241 | texcolor.R = (float)Math.Abs(color.x - 1); | ||
1242 | texcolor.G = (float)Math.Abs(color.y - 1); | ||
1243 | texcolor.B = (float)Math.Abs(color.z - 1); | ||
1244 | tex.DefaultTexture.RGBA = texcolor; | ||
1245 | for (uint i = 0; i < 32; i++) | ||
1246 | { | ||
1247 | if (tex.FaceTextures[i] != null) | ||
1248 | { | ||
1249 | texcolor = tex.FaceTextures[i].RGBA; | ||
1250 | texcolor.R = (float)Math.Abs(color.x - 1); | ||
1251 | texcolor.G = (float)Math.Abs(color.y - 1); | ||
1252 | texcolor.B = (float)Math.Abs(color.z - 1); | ||
1253 | tex.FaceTextures[i].RGBA = texcolor; | ||
1254 | } | ||
1255 | } | ||
1256 | texcolor = tex.DefaultTexture.RGBA; | ||
1257 | texcolor.R = (float)Math.Abs(color.x - 1); | ||
1258 | texcolor.G = (float)Math.Abs(color.y - 1); | ||
1259 | texcolor.B = (float)Math.Abs(color.z - 1); | ||
1260 | tex.DefaultTexture.RGBA = texcolor; | ||
1261 | part.UpdateTexture(tex); | ||
1262 | } | ||
1263 | } | ||
1264 | return; | ||
1265 | } | ||
1266 | else | ||
1267 | { | ||
1268 | NotImplemented("llSetLinkColor"); | ||
1269 | } | ||
1270 | } | ||
1271 | |||
1272 | public void llCreateLink(string target, int parent) | ||
1273 | { | ||
1274 | NotImplemented("llCreateLink"); | ||
1275 | } | ||
1276 | |||
1277 | public void llBreakLink(int linknum) | ||
1278 | { | ||
1279 | NotImplemented("llBreakLink"); | ||
1280 | } | ||
1281 | |||
1282 | public void llBreakAllLinks() | ||
1283 | { | ||
1284 | NotImplemented("llBreakAllLinks"); | ||
1285 | } | ||
1286 | |||
1287 | public string llGetLinkKey(int linknum) | ||
1288 | { | ||
1289 | SceneObjectPart part = m_host.ParentGroup.GetLinkNumPart(linknum); | ||
1290 | if (part != null) | ||
1291 | { | ||
1292 | return part.UUID.ToString(); | ||
1293 | } | ||
1294 | else | ||
1295 | { | ||
1296 | return "00000000-0000-0000-0000-000000000000"; | ||
1297 | } | ||
1298 | } | ||
1299 | |||
1300 | public string llGetLinkName(int linknum) | ||
1301 | { | ||
1302 | SceneObjectPart part = m_host.ParentGroup.GetLinkNumPart(linknum); | ||
1303 | if (part != null) | ||
1304 | { | ||
1305 | return part.Name; | ||
1306 | } | ||
1307 | else | ||
1308 | { | ||
1309 | return "00000000-0000-0000-0000-000000000000"; | ||
1310 | } | ||
1311 | } | ||
1312 | |||
1313 | public int llGetInventoryNumber(int type) | ||
1314 | { | ||
1315 | NotImplemented("llGetInventoryNumber"); | ||
1316 | return 0; | ||
1317 | } | ||
1318 | |||
1319 | public string llGetInventoryName(int type, int number) | ||
1320 | { | ||
1321 | NotImplemented("llGetInventoryName"); | ||
1322 | return ""; | ||
1323 | } | ||
1324 | |||
1325 | public void llSetScriptState(string name, int run) | ||
1326 | { | ||
1327 | NotImplemented("llSetScriptState"); | ||
1328 | } | ||
1329 | |||
1330 | public double llGetEnergy() | ||
1331 | { | ||
1332 | return 1.0f; | ||
1333 | } | ||
1334 | |||
1335 | public void llGiveInventory(string destination, string inventory) | ||
1336 | { | ||
1337 | NotImplemented("llGiveInventory"); | ||
1338 | } | ||
1339 | |||
1340 | public void llRemoveInventory(string item) | ||
1341 | { | ||
1342 | NotImplemented("llRemoveInventory"); | ||
1343 | } | ||
1344 | |||
1345 | public void llSetText(string text, LSL_Types.Vector3 color, double alpha) | ||
1346 | { | ||
1347 | Vector3 av3 = new Vector3((float)color.x, (float)color.y, (float)color.z); | ||
1348 | m_host.SetText(text, av3, alpha); | ||
1349 | } | ||
1350 | |||
1351 | public double llWater(LSL_Types.Vector3 offset) | ||
1352 | { | ||
1353 | return World.RegionInfo.EstateSettings.waterHeight; | ||
1354 | } | ||
1355 | |||
1356 | public void llPassTouches(int pass) | ||
1357 | { | ||
1358 | NotImplemented("llPassTouches"); | ||
1359 | } | ||
1360 | |||
1361 | public string llRequestAgentData(string id, int data) | ||
1362 | { | ||
1363 | NotImplemented("llRequestAgentData"); | ||
1364 | return ""; | ||
1365 | } | ||
1366 | |||
1367 | public string llRequestInventoryData(string name) | ||
1368 | { | ||
1369 | NotImplemented("llRequestInventoryData"); | ||
1370 | return ""; | ||
1371 | } | ||
1372 | |||
1373 | public void llSetDamage(double damage) | ||
1374 | { | ||
1375 | NotImplemented("llSetDamage"); | ||
1376 | } | ||
1377 | |||
1378 | public void llTeleportAgentHome(string agent) | ||
1379 | { | ||
1380 | NotImplemented("llTeleportAgentHome"); | ||
1381 | } | ||
1382 | |||
1383 | public void llModifyLand(int action, int brush) | ||
1384 | { | ||
1385 | double dsize; | ||
1386 | if (World.PermissionsMngr.CanTerraform(m_host.OwnerID, new LLVector3(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y, 0))) | ||
1387 | { | ||
1388 | switch (brush) | ||
1389 | { | ||
1390 | case 1: | ||
1391 | dsize = 2; | ||
1392 | break; | ||
1393 | case 2: | ||
1394 | dsize = 4; | ||
1395 | break; | ||
1396 | case 3: | ||
1397 | dsize = 8; | ||
1398 | break; | ||
1399 | default: | ||
1400 | if (brush < 0) | ||
1401 | { | ||
1402 | dsize = (double)(-1 * brush); | ||
1403 | } | ||
1404 | else | ||
1405 | { | ||
1406 | LSLError("Invalid brush size"); | ||
1407 | dsize = 0; // Should cease execution, but get unassigned local variable dsize on compile. | ||
1408 | } | ||
1409 | break; | ||
1410 | } | ||
1411 | switch (action) | ||
1412 | { | ||
1413 | case 0: | ||
1414 | if (World.Terrain.GetHeight((int)m_host.AbsolutePosition.X, (int)m_host.AbsolutePosition.Y) < m_host.AbsolutePosition.Z) | ||
1415 | { | ||
1416 | World.Terrain.FlattenTerrain(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y, dsize, 1); | ||
1417 | } | ||
1418 | break; | ||
1419 | case 1: | ||
1420 | if (World.Terrain.GetHeight((int)m_host.AbsolutePosition.X, (int)m_host.AbsolutePosition.Y) < (double)m_host.AbsolutePosition.Z) | ||
1421 | { | ||
1422 | World.Terrain.RaiseTerrain(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y, dsize, 0.1); | ||
1423 | } | ||
1424 | break; | ||
1425 | case 2: | ||
1426 | if (World.Terrain.GetHeight((int)m_host.AbsolutePosition.X, (int)m_host.AbsolutePosition.Y) > 0) | ||
1427 | { | ||
1428 | World.Terrain.LowerTerrain(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y, dsize, 1); | ||
1429 | } | ||
1430 | break; | ||
1431 | case 3: | ||
1432 | World.Terrain.SmoothTerrain(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y, dsize, 1); | ||
1433 | break; | ||
1434 | case 4: | ||
1435 | World.Terrain.NoiseTerrain(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y, dsize, 1); | ||
1436 | break; | ||
1437 | case 5: | ||
1438 | World.Terrain.RevertTerrain(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y, dsize, 1); | ||
1439 | break; | ||
1440 | default: | ||
1441 | break; | ||
1442 | } | ||
1443 | } | ||
1444 | } | ||
1445 | |||
1446 | public void llCollisionSound(string impact_sound, double impact_volume) | ||
1447 | { | ||
1448 | NotImplemented("llCollisionSound"); | ||
1449 | } | ||
1450 | |||
1451 | public void llCollisionSprite(string impact_sprite) | ||
1452 | { | ||
1453 | NotImplemented("llCollisionSprite"); | ||
1454 | } | ||
1455 | |||
1456 | public string llGetAnimation(string id) | ||
1457 | { | ||
1458 | NotImplemented("llGetAnimation"); | ||
1459 | return ""; | ||
1460 | } | ||
1461 | |||
1462 | public void llResetScript() | ||
1463 | { | ||
1464 | m_ScriptEngine.m_ScriptManager.ResetScript(m_localID, m_itemID); | ||
1465 | } | ||
1466 | |||
1467 | public void llMessageLinked(int linknum, int num, string str, string id) | ||
1468 | { | ||
1469 | } | ||
1470 | |||
1471 | public void llPushObject(string target, LSL_Types.Vector3 impulse, LSL_Types.Vector3 ang_impulse, int local) | ||
1472 | { | ||
1473 | } | ||
1474 | |||
1475 | public void llPassCollisions(int pass) | ||
1476 | { | ||
1477 | } | ||
1478 | |||
1479 | public string llGetScriptName() | ||
1480 | { | ||
1481 | return ""; | ||
1482 | } | ||
1483 | |||
1484 | public int llGetNumberOfSides() | ||
1485 | { | ||
1486 | return 0; | ||
1487 | } | ||
1488 | |||
1489 | public LSL_Types.Quaternion llAxisAngle2Rot(LSL_Types.Vector3 axis, double angle) | ||
1490 | { | ||
1491 | return new LSL_Types.Quaternion(); | ||
1492 | } | ||
1493 | |||
1494 | public LSL_Types.Vector3 llRot2Axis(LSL_Types.Quaternion rot) | ||
1495 | { | ||
1496 | return new LSL_Types.Vector3(); | ||
1497 | } | ||
1498 | |||
1499 | public void llRot2Angle() | ||
1500 | { | ||
1501 | } | ||
1502 | |||
1503 | public double llAcos(double val) | ||
1504 | { | ||
1505 | return (double)Math.Acos(val); | ||
1506 | } | ||
1507 | |||
1508 | public double llAsin(double val) | ||
1509 | { | ||
1510 | return (double)Math.Asin(val); | ||
1511 | } | ||
1512 | |||
1513 | public double llAngleBetween(LSL_Types.Quaternion a, LSL_Types.Quaternion b) | ||
1514 | { | ||
1515 | return 0; | ||
1516 | } | ||
1517 | |||
1518 | public string llGetInventoryKey(string name) | ||
1519 | { | ||
1520 | return ""; | ||
1521 | } | ||
1522 | |||
1523 | public void llAllowInventoryDrop(int add) | ||
1524 | { | ||
1525 | } | ||
1526 | |||
1527 | public LSL_Types.Vector3 llGetSunDirection() | ||
1528 | { | ||
1529 | return new LSL_Types.Vector3(); | ||
1530 | } | ||
1531 | |||
1532 | public LSL_Types.Vector3 llGetTextureOffset(int face) | ||
1533 | { | ||
1534 | LLObject.TextureEntry tex = m_host.Shape.Textures; | ||
1535 | LSL_Types.Vector3 offset; | ||
1536 | if (face == -1) | ||
1537 | { | ||
1538 | face = 0; | ||
1539 | } | ||
1540 | offset.x = tex.GetFace((uint)face).OffsetU; | ||
1541 | offset.y = tex.GetFace((uint)face).OffsetV; | ||
1542 | offset.z = 0.0; | ||
1543 | return offset; | ||
1544 | } | ||
1545 | |||
1546 | public LSL_Types.Vector3 llGetTextureScale(int side) | ||
1547 | { | ||
1548 | LLObject.TextureEntry tex = m_host.Shape.Textures; | ||
1549 | LSL_Types.Vector3 scale; | ||
1550 | if (side == -1) | ||
1551 | { | ||
1552 | side = 0; | ||
1553 | } | ||
1554 | scale.x = tex.GetFace((uint)side).RepeatU; | ||
1555 | scale.y = tex.GetFace((uint)side).RepeatV; | ||
1556 | scale.z = 0.0; | ||
1557 | return scale; | ||
1558 | } | ||
1559 | |||
1560 | public double llGetTextureRot(int face) | ||
1561 | { | ||
1562 | LLObject.TextureEntry tex = m_host.Shape.Textures; | ||
1563 | if (face == -1) | ||
1564 | { | ||
1565 | face = 0; | ||
1566 | } | ||
1567 | return tex.GetFace((uint)face).Rotation; | ||
1568 | } | ||
1569 | |||
1570 | public int llSubStringIndex(string source, string pattern) | ||
1571 | { | ||
1572 | return source.IndexOf(pattern); | ||
1573 | } | ||
1574 | |||
1575 | public string llGetOwnerKey(string id) | ||
1576 | { | ||
1577 | NotImplemented("llGetOwnerKey"); | ||
1578 | return ""; | ||
1579 | } | ||
1580 | |||
1581 | public LSL_Types.Vector3 llGetCenterOfMass() | ||
1582 | { | ||
1583 | NotImplemented("llGetCenterOfMass"); | ||
1584 | return new LSL_Types.Vector3(); | ||
1585 | } | ||
1586 | |||
1587 | public LSL_Types.list llListSort(LSL_Types.list src, int stride, int ascending) | ||
1588 | { | ||
1589 | // SortedList<string, LSL_Types.list> sorted = new SortedList<string, LSL_Types.list>(); | ||
1590 | // Add chunks to an array | ||
1591 | //int s = stride; | ||
1592 | //if (s < 1) | ||
1593 | // s = 1; | ||
1594 | //int c = 0; | ||
1595 | //LSL_Types.list chunk = new LSL_Types.list(); | ||
1596 | //string chunkString = ""; | ||
1597 | //foreach (string element in src) | ||
1598 | //{ | ||
1599 | // c++; | ||
1600 | // if (c > s) | ||
1601 | // { | ||
1602 | // sorted.Add(chunkString, chunk); | ||
1603 | // chunkString = ""; | ||
1604 | // chunk = new LSL_Types.list(); | ||
1605 | // c = 0; | ||
1606 | // } | ||
1607 | // chunk.Add(element); | ||
1608 | // chunkString += element.ToString(); | ||
1609 | //} | ||
1610 | //if (chunk.Count > 0) | ||
1611 | // sorted.Add(chunkString, chunk); | ||
1612 | |||
1613 | //LSL_Types.list ret = new LSL_Types.list(); | ||
1614 | //foreach (LSL_Types.list ls in sorted.Values) | ||
1615 | //{ | ||
1616 | // ret.AddRange(ls); | ||
1617 | //} | ||
1618 | |||
1619 | //if (ascending == LSL_BaseClass.TRUE) | ||
1620 | // return ret; | ||
1621 | //ret.Reverse(); | ||
1622 | //return ret; | ||
1623 | NotImplemented("llListSort"); | ||
1624 | return new LSL_Types.list(); | ||
1625 | } | ||
1626 | |||
1627 | public int llGetListLength(LSL_Types.list src) | ||
1628 | { | ||
1629 | return src.Length; | ||
1630 | } | ||
1631 | |||
1632 | public int llList2Integer(LSL_Types.list src, int index) | ||
1633 | { | ||
1634 | if (index < 0) | ||
1635 | { | ||
1636 | index = src.Length + index; | ||
1637 | } | ||
1638 | if (index >= src.Length) | ||
1639 | { | ||
1640 | return 0; | ||
1641 | } | ||
1642 | return Convert.ToInt32(src.Data[index]); | ||
1643 | } | ||
1644 | |||
1645 | public double osList2Double(LSL_Types.list src, int index) | ||
1646 | { | ||
1647 | if (index < 0) | ||
1648 | { | ||
1649 | index = src.Length + index; | ||
1650 | } | ||
1651 | if (index >= src.Length) | ||
1652 | { | ||
1653 | return 0.0; | ||
1654 | } | ||
1655 | return Convert.ToDouble(src.Data[index]); | ||
1656 | } | ||
1657 | |||
1658 | public double llList2Float(LSL_Types.list src, int index) | ||
1659 | { | ||
1660 | if (index < 0) | ||
1661 | { | ||
1662 | index = src.Length + index; | ||
1663 | } | ||
1664 | if (index >= src.Length) | ||
1665 | { | ||
1666 | return 0.0; | ||
1667 | } | ||
1668 | return Convert.ToSingle(src.Data[index]); | ||
1669 | } | ||
1670 | |||
1671 | public string llList2String(LSL_Types.list src, int index) | ||
1672 | { | ||
1673 | if (index < 0) | ||
1674 | { | ||
1675 | index = src.Length + index; | ||
1676 | } | ||
1677 | if (index >= src.Length) | ||
1678 | { | ||
1679 | return ""; | ||
1680 | } | ||
1681 | return src.Data[index].ToString(); | ||
1682 | } | ||
1683 | |||
1684 | public string llList2Key(LSL_Types.list src, int index) | ||
1685 | { | ||
1686 | if (index < 0) | ||
1687 | { | ||
1688 | index = src.Length + index; | ||
1689 | } | ||
1690 | if (index >= src.Length) | ||
1691 | { | ||
1692 | return "00000000-0000-0000-0000-000000000000"; | ||
1693 | } | ||
1694 | //return OpenSim.Framework.ToString(src[index]); | ||
1695 | LLUUID tmpkey; | ||
1696 | if (LLUUID.TryParse(src.Data[index].ToString(), out tmpkey)) | ||
1697 | { | ||
1698 | return tmpkey.ToString(); | ||
1699 | } | ||
1700 | else | ||
1701 | { | ||
1702 | return "00000000-0000-0000-0000-000000000000"; | ||
1703 | } | ||
1704 | } | ||
1705 | |||
1706 | public LSL_Types.Vector3 llList2Vector(LSL_Types.list src, int index) | ||
1707 | { | ||
1708 | if (index < 0) | ||
1709 | { | ||
1710 | index = src.Length + index; | ||
1711 | } | ||
1712 | if (index >= src.Length) | ||
1713 | { | ||
1714 | return new LSL_Types.Vector3(0, 0, 0); | ||
1715 | } | ||
1716 | if (src.Data[index].GetType() == typeof(OpenSim.Region.ScriptEngine.Common.LSL_Types.Vector3)) | ||
1717 | { | ||
1718 | return (LSL_Types.Vector3)src.Data[index]; | ||
1719 | } | ||
1720 | else | ||
1721 | { | ||
1722 | return new LSL_Types.Vector3(0, 0, 0); | ||
1723 | } | ||
1724 | } | ||
1725 | |||
1726 | public LSL_Types.Quaternion llList2Rot(LSL_Types.list src, int index) | ||
1727 | { | ||
1728 | if (index < 0) | ||
1729 | { | ||
1730 | index = src.Length + index; | ||
1731 | } | ||
1732 | if (index >= src.Length) | ||
1733 | { | ||
1734 | return new LSL_Types.Quaternion(0, 0, 0, 1); | ||
1735 | } | ||
1736 | if (src.Data[index].GetType() == typeof(OpenSim.Region.ScriptEngine.Common.LSL_Types.Quaternion)) | ||
1737 | { | ||
1738 | return (LSL_Types.Quaternion)src.Data[index]; | ||
1739 | } | ||
1740 | else | ||
1741 | { | ||
1742 | return new LSL_Types.Quaternion(0, 0, 0, 1); | ||
1743 | } | ||
1744 | } | ||
1745 | |||
1746 | public LSL_Types.list llList2List(LSL_Types.list src, int start, int end) | ||
1747 | { | ||
1748 | return src.GetSublist(start, end); | ||
1749 | } | ||
1750 | |||
1751 | public LSL_Types.list llDeleteSubList(LSL_Types.list src, int start, int end) | ||
1752 | { | ||
1753 | //LSL_Types.list ret = new LSL_Types.list(src); | ||
1754 | //ret.RemoveRange(start, end - start); | ||
1755 | //return ret; | ||
1756 | |||
1757 | // Just a hunch - needs testing | ||
1758 | return src.GetSublist(end, start); | ||
1759 | } | ||
1760 | |||
1761 | public int llGetListEntryType(LSL_Types.list src, int index) | ||
1762 | { | ||
1763 | if (index < 0) | ||
1764 | { | ||
1765 | index = src.Length + index; | ||
1766 | } | ||
1767 | if (index >= src.Length) | ||
1768 | { | ||
1769 | return 0; | ||
1770 | } | ||
1771 | |||
1772 | if (src.Data[index] is System.Int32) | ||
1773 | return 1; | ||
1774 | if (src.Data[index] is System.Double) | ||
1775 | return 2; | ||
1776 | if (src.Data[index] is System.String) | ||
1777 | { | ||
1778 | LLUUID tuuid; | ||
1779 | if (LLUUID.TryParse(src.Data[index].ToString(), out tuuid)) | ||
1780 | { | ||
1781 | return 3; | ||
1782 | } | ||
1783 | else | ||
1784 | { | ||
1785 | return 4; | ||
1786 | } | ||
1787 | } | ||
1788 | if (src.Data[index] is OpenSim.Region.ScriptEngine.Common.LSL_Types.Vector3) | ||
1789 | return 5; | ||
1790 | if (src.Data[index] is OpenSim.Region.ScriptEngine.Common.LSL_Types.Quaternion) | ||
1791 | return 6; | ||
1792 | if (src.Data[index] is OpenSim.Region.ScriptEngine.Common.LSL_Types.list) | ||
1793 | return 7; | ||
1794 | return 0; | ||
1795 | |||
1796 | } | ||
1797 | |||
1798 | public string llList2CSV(LSL_Types.list src) | ||
1799 | { | ||
1800 | string ret = ""; | ||
1801 | foreach (object o in src.Data) | ||
1802 | { | ||
1803 | ret = ret + o.ToString() + ","; | ||
1804 | } | ||
1805 | ret = ret.Substring(0, ret.Length - 2); | ||
1806 | return ret; | ||
1807 | } | ||
1808 | |||
1809 | public LSL_Types.list llCSV2List(string src) | ||
1810 | { | ||
1811 | return new LSL_Types.list(src.Split(",".ToCharArray())); | ||
1812 | } | ||
1813 | |||
1814 | public LSL_Types.list llListRandomize(LSL_Types.list src, int stride) | ||
1815 | { | ||
1816 | //int s = stride; | ||
1817 | //if (s < 1) | ||
1818 | // s = 1; | ||
1819 | |||
1820 | // This is a cowardly way of doing it ;) | ||
1821 | // TODO: Instead, randomize and check if random is mod stride or if it can not be, then array.removerange | ||
1822 | //List<LSL_Types.list> tmp = new List<LSL_Types.list>(); | ||
1823 | |||
1824 | // Add chunks to an array | ||
1825 | //int c = 0; | ||
1826 | //LSL_Types.list chunk = new LSL_Types.list(); | ||
1827 | //foreach (string element in src) | ||
1828 | //{ | ||
1829 | // c++; | ||
1830 | // if (c > s) | ||
1831 | // { | ||
1832 | // tmp.Add(chunk); | ||
1833 | // chunk = new LSL_Types.list(); | ||
1834 | // c = 0; | ||
1835 | // } | ||
1836 | // chunk.Add(element); | ||
1837 | //} | ||
1838 | //if (chunk.Count > 0) | ||
1839 | // tmp.Add(chunk); | ||
1840 | |||
1841 | // Decreate (<- what kind of word is that? :D ) array back into a list | ||
1842 | //int rnd; | ||
1843 | //LSL_Types.list ret = new LSL_Types.list(); | ||
1844 | //while (tmp.Count > 0) | ||
1845 | //{ | ||
1846 | // rnd = Util.RandomClass.Next(tmp.Count); | ||
1847 | // foreach (string str in tmp[rnd]) | ||
1848 | // { | ||
1849 | // ret.Add(str); | ||
1850 | // } | ||
1851 | // tmp.RemoveAt(rnd); | ||
1852 | //} | ||
1853 | |||
1854 | //return ret; | ||
1855 | NotImplemented("llListRandomize"); | ||
1856 | return new LSL_Types.list(); | ||
1857 | } | ||
1858 | |||
1859 | public LSL_Types.list llList2ListStrided(LSL_Types.list src, int start, int end, int stride) | ||
1860 | { | ||
1861 | LSL_Types.list ret = new LSL_Types.list(); | ||
1862 | //int s = stride; | ||
1863 | //if (s < 1) | ||
1864 | // s = 1; | ||
1865 | |||
1866 | //int sc = s; | ||
1867 | //for (int i = start; i < src.Count; i++) | ||
1868 | //{ | ||
1869 | // sc--; | ||
1870 | // if (sc == 0) | ||
1871 | // { | ||
1872 | // sc = s; | ||
1873 | // // Addthis | ||
1874 | // ret.Add(src[i]); | ||
1875 | // } | ||
1876 | // if (i == end) | ||
1877 | // break; | ||
1878 | //} | ||
1879 | NotImplemented("llList2ListStrided"); | ||
1880 | return ret; | ||
1881 | } | ||
1882 | |||
1883 | public LSL_Types.Vector3 llGetRegionCorner() | ||
1884 | { | ||
1885 | return new LSL_Types.Vector3(World.RegionInfo.RegionLocX * 256, World.RegionInfo.RegionLocY * 256, 0); | ||
1886 | } | ||
1887 | |||
1888 | public LSL_Types.list llListInsertList(LSL_Types.list dest, LSL_Types.list src, int start) | ||
1889 | { | ||
1890 | return dest.GetSublist(0, start - 1) + src + dest.GetSublist(start, -1); | ||
1891 | } | ||
1892 | |||
1893 | public int llListFindList(LSL_Types.list src, LSL_Types.list test) | ||
1894 | { | ||
1895 | //foreach (string s in test) | ||
1896 | //{ | ||
1897 | // for (int ci = 0; ci < src.Count; ci++) | ||
1898 | // { | ||
1899 | // if (s == src[ci]) | ||
1900 | // return ci; | ||
1901 | // } | ||
1902 | //} | ||
1903 | NotImplemented("llListFindList"); | ||
1904 | return -1; | ||
1905 | } | ||
1906 | |||
1907 | public string llGetObjectName() | ||
1908 | { | ||
1909 | return m_host.Name; | ||
1910 | } | ||
1911 | |||
1912 | public void llSetObjectName(string name) | ||
1913 | { | ||
1914 | m_host.Name = name; | ||
1915 | } | ||
1916 | |||
1917 | public string llGetDate() | ||
1918 | { | ||
1919 | DateTime date = DateTime.Now.ToUniversalTime(); | ||
1920 | string result = date.ToString("yyyy-MM-dd"); | ||
1921 | return result; | ||
1922 | } | ||
1923 | |||
1924 | public int llEdgeOfWorld(LSL_Types.Vector3 pos, LSL_Types.Vector3 dir) | ||
1925 | { | ||
1926 | NotImplemented("llEdgeOfWorld"); | ||
1927 | return 0; | ||
1928 | } | ||
1929 | |||
1930 | public int llGetAgentInfo(string id) | ||
1931 | { | ||
1932 | NotImplemented("llGetAgentInfo"); | ||
1933 | return 0; | ||
1934 | } | ||
1935 | |||
1936 | public void llAdjustSoundVolume(double volume) | ||
1937 | { | ||
1938 | NotImplemented("llAdjustSoundVolume"); | ||
1939 | } | ||
1940 | |||
1941 | public void llSetSoundQueueing(int queue) | ||
1942 | { | ||
1943 | NotImplemented("llSetSoundQueueing"); | ||
1944 | } | ||
1945 | |||
1946 | public void llSetSoundRadius(double radius) | ||
1947 | { | ||
1948 | NotImplemented("llSetSoundRadius"); | ||
1949 | } | ||
1950 | |||
1951 | public string llKey2Name(string id) | ||
1952 | { | ||
1953 | NotImplemented("llKey2Name"); | ||
1954 | return ""; | ||
1955 | } | ||
1956 | |||
1957 | public void llSetTextureAnim(int mode, int face, int sizex, int sizey, double start, double length, double rate) | ||
1958 | { | ||
1959 | NotImplemented("llSetTextureAnim"); | ||
1960 | } | ||
1961 | |||
1962 | public void llTriggerSoundLimited(string sound, double volume, LSL_Types.Vector3 top_north_east, | ||
1963 | LSL_Types.Vector3 bottom_south_west) | ||
1964 | { | ||
1965 | NotImplemented("llTriggerSoundLimited"); | ||
1966 | } | ||
1967 | |||
1968 | public void llEjectFromLand(string pest) | ||
1969 | { | ||
1970 | NotImplemented("llEjectFromLand"); | ||
1971 | } | ||
1972 | |||
1973 | public void llParseString2List() | ||
1974 | { | ||
1975 | NotImplemented("llParseString2List"); | ||
1976 | } | ||
1977 | |||
1978 | public int llOverMyLand(string id) | ||
1979 | { | ||
1980 | NotImplemented("llOverMyLand"); | ||
1981 | return 0; | ||
1982 | } | ||
1983 | |||
1984 | public string llGetLandOwnerAt(LSL_Types.Vector3 pos) | ||
1985 | { | ||
1986 | return World.GetLandOwner((float)pos.x, (float)pos.y).ToString(); | ||
1987 | } | ||
1988 | |||
1989 | public string llGetNotecardLine(string name, int line) | ||
1990 | { | ||
1991 | NotImplemented("llGetNotecardLine"); | ||
1992 | return ""; | ||
1993 | } | ||
1994 | |||
1995 | public LSL_Types.Vector3 llGetAgentSize(string id) | ||
1996 | { | ||
1997 | NotImplemented("llGetAgentSize"); | ||
1998 | return new LSL_Types.Vector3(); | ||
1999 | } | ||
2000 | |||
2001 | public int llSameGroup(string agent) | ||
2002 | { | ||
2003 | NotImplemented("llSameGroup"); | ||
2004 | return 0; | ||
2005 | } | ||
2006 | |||
2007 | public void llUnSit(string id) | ||
2008 | { | ||
2009 | NotImplemented("llUnSit"); | ||
2010 | } | ||
2011 | |||
2012 | public LSL_Types.Vector3 llGroundSlope(LSL_Types.Vector3 offset) | ||
2013 | { | ||
2014 | NotImplemented("llGroundSlope"); | ||
2015 | return new LSL_Types.Vector3(); | ||
2016 | } | ||
2017 | |||
2018 | public LSL_Types.Vector3 llGroundNormal(LSL_Types.Vector3 offset) | ||
2019 | { | ||
2020 | NotImplemented("llGroundNormal"); | ||
2021 | return new LSL_Types.Vector3(); | ||
2022 | } | ||
2023 | |||
2024 | public LSL_Types.Vector3 llGroundContour(LSL_Types.Vector3 offset) | ||
2025 | { | ||
2026 | NotImplemented("llGroundContour"); | ||
2027 | return new LSL_Types.Vector3(); | ||
2028 | } | ||
2029 | |||
2030 | public int llGetAttached() | ||
2031 | { | ||
2032 | NotImplemented("llGetAttached"); | ||
2033 | return 0; | ||
2034 | } | ||
2035 | |||
2036 | public int llGetFreeMemory() | ||
2037 | { | ||
2038 | NotImplemented("llGetFreeMemory"); | ||
2039 | return 0; | ||
2040 | } | ||
2041 | |||
2042 | public string llGetRegionName() | ||
2043 | { | ||
2044 | return World.RegionInfo.RegionName; | ||
2045 | } | ||
2046 | |||
2047 | public double llGetRegionTimeDilation() | ||
2048 | { | ||
2049 | return (double)World.TimeDilation; | ||
2050 | } | ||
2051 | |||
2052 | public double llGetRegionFPS() | ||
2053 | { | ||
2054 | return 10.0f; | ||
2055 | } | ||
2056 | |||
2057 | /* particle system rules should be coming into this routine as doubles, that is | ||
2058 | rule[0] should be an integer from this list and rule[1] should be the arg | ||
2059 | for the same integer. wiki.secondlife.com has most of this mapping, but some | ||
2060 | came from http://www.caligari-designs.com/p4u2 | ||
2061 | |||
2062 | We iterate through the list for 'Count' elements, incrementing by two for each | ||
2063 | iteration and set the members of Primitive.ParticleSystem, one at a time. | ||
2064 | */ | ||
2065 | |||
2066 | public enum PrimitiveRule : int | ||
2067 | { | ||
2068 | PSYS_PART_FLAGS = 0, | ||
2069 | PSYS_PART_START_COLOR = 1, | ||
2070 | PSYS_PART_START_ALPHA = 2, | ||
2071 | PSYS_PART_END_COLOR = 3, | ||
2072 | PSYS_PART_END_ALPHA = 4, | ||
2073 | PSYS_PART_START_SCALE = 5, | ||
2074 | PSYS_PART_END_SCALE = 6, | ||
2075 | PSYS_PART_MAX_AGE = 7, | ||
2076 | PSYS_SRC_ACCEL = 8, | ||
2077 | PSYS_SRC_PATTERN = 9, | ||
2078 | PSYS_SRC_TEXTURE = 12, | ||
2079 | PSYS_SRC_BURST_RATE = 13, | ||
2080 | PSYS_SRC_BURST_PART_COUNT = 15, | ||
2081 | PSYS_SRC_BURST_RADIUS = 16, | ||
2082 | PSYS_SRC_BURST_SPEED_MIN = 17, | ||
2083 | PSYS_SRC_BURST_SPEED_MAX = 18, | ||
2084 | PSYS_SRC_MAX_AGE = 19, | ||
2085 | PSYS_SRC_TARGET_KEY = 20, | ||
2086 | PSYS_SRC_OMEGA = 21, | ||
2087 | PSYS_SRC_ANGLE_BEGIN = 22, | ||
2088 | PSYS_SRC_ANGLE_END = 23 | ||
2089 | } | ||
2090 | |||
2091 | public void llParticleSystem(List<Object> rules) | ||
2092 | { | ||
2093 | Primitive.ParticleSystem prules = new Primitive.ParticleSystem(); | ||
2094 | for (int i = 0; i < rules.Count; i += 2) | ||
2095 | { | ||
2096 | switch ((int)rules[i]) | ||
2097 | { | ||
2098 | case (int)LSL_BaseClass.PSYS_PART_FLAGS: | ||
2099 | prules.PartFlags = (uint)rules[i + 1]; | ||
2100 | break; | ||
2101 | |||
2102 | case (int)LSL_BaseClass.PSYS_PART_START_COLOR: | ||
2103 | prules.PartStartColor = (LLColor)rules[i + 1]; | ||
2104 | break; | ||
2105 | |||
2106 | case (int)LSL_BaseClass.PSYS_PART_START_ALPHA: | ||
2107 | //what is the cast? prules.PartStartColor = (LSL_Types.Vec)rules[i + 1]; | ||
2108 | break; | ||
2109 | |||
2110 | case (int)LSL_BaseClass.PSYS_PART_END_COLOR: | ||
2111 | prules.PartEndColor = (LLColor)rules[i + 1]; | ||
2112 | break; | ||
2113 | |||
2114 | case (int)LSL_BaseClass.PSYS_PART_END_ALPHA: | ||
2115 | //what is the cast? prules.PartStartColor = (LLColor)rules[i + 1]; | ||
2116 | break; | ||
2117 | |||
2118 | case (int)LSL_BaseClass.PSYS_PART_START_SCALE: | ||
2119 | //what is the cast? prules.PartStartColor = (LLColor)rules[i + 1]; | ||
2120 | break; | ||
2121 | |||
2122 | case (int)LSL_BaseClass.PSYS_PART_END_SCALE: | ||
2123 | //what is the cast? prules.PartStartColor = (LLColor)rules[i + 1]; | ||
2124 | break; | ||
2125 | |||
2126 | case (int)LSL_BaseClass.PSYS_PART_MAX_AGE: | ||
2127 | prules.MaxAge = (float)rules[i + 1]; | ||
2128 | break; | ||
2129 | |||
2130 | case (int)LSL_BaseClass.PSYS_SRC_ACCEL: | ||
2131 | //what is the cast? prules.PartStartColor = (LLColor)rules[i + 1]; | ||
2132 | break; | ||
2133 | |||
2134 | case (int)LSL_BaseClass.PSYS_SRC_PATTERN: | ||
2135 | //what is the cast? prules.PartStartColor = (LLColor)rules[i + 1]; | ||
2136 | break; | ||
2137 | |||
2138 | case (int)LSL_BaseClass.PSYS_SRC_TEXTURE: | ||
2139 | prules.Texture = (LLUUID)rules[i + 1]; | ||
2140 | break; | ||
2141 | |||
2142 | case (int)LSL_BaseClass.PSYS_SRC_BURST_RATE: | ||
2143 | prules.BurstRate = (float)rules[i + 1]; | ||
2144 | break; | ||
2145 | |||
2146 | case (int)LSL_BaseClass.PSYS_SRC_BURST_PART_COUNT: | ||
2147 | prules.BurstPartCount = (byte)rules[i + 1]; | ||
2148 | break; | ||
2149 | |||
2150 | case (int)LSL_BaseClass.PSYS_SRC_BURST_RADIUS: | ||
2151 | prules.BurstRadius = (float)rules[i + 1]; | ||
2152 | break; | ||
2153 | |||
2154 | case (int)LSL_BaseClass.PSYS_SRC_BURST_SPEED_MIN: | ||
2155 | prules.BurstSpeedMin = (float)rules[i + 1]; | ||
2156 | break; | ||
2157 | |||
2158 | case (int)LSL_BaseClass.PSYS_SRC_BURST_SPEED_MAX: | ||
2159 | prules.BurstSpeedMax = (float)rules[i + 1]; | ||
2160 | break; | ||
2161 | |||
2162 | case (int)LSL_BaseClass.PSYS_SRC_MAX_AGE: | ||
2163 | prules.MaxAge = (float)rules[i + 1]; | ||
2164 | break; | ||
2165 | |||
2166 | case (int)LSL_BaseClass.PSYS_SRC_TARGET_KEY: | ||
2167 | prules.Target = (LLUUID)rules[i + 1]; | ||
2168 | break; | ||
2169 | |||
2170 | case (int)LSL_BaseClass.PSYS_SRC_OMEGA: | ||
2171 | //cast?? prules.MaxAge = (float)rules[i + 1]; | ||
2172 | break; | ||
2173 | |||
2174 | case (int)LSL_BaseClass.PSYS_SRC_ANGLE_BEGIN: | ||
2175 | prules.InnerAngle = (float)rules[i + 1]; | ||
2176 | break; | ||
2177 | |||
2178 | case (int)LSL_BaseClass.PSYS_SRC_ANGLE_END: | ||
2179 | prules.OuterAngle = (float)rules[i + 1]; | ||
2180 | break; | ||
2181 | } | ||
2182 | } | ||
2183 | |||
2184 | m_host.AddNewParticleSystem(prules); | ||
2185 | } | ||
2186 | |||
2187 | public void llGroundRepel(double height, int water, double tau) | ||
2188 | { | ||
2189 | NotImplemented("llGroundRepel"); | ||
2190 | } | ||
2191 | |||
2192 | public void llGiveInventoryList() | ||
2193 | { | ||
2194 | NotImplemented("llGiveInventoryList"); | ||
2195 | } | ||
2196 | |||
2197 | public void llSetVehicleType(int type) | ||
2198 | { | ||
2199 | NotImplemented("llSetVehicleType"); | ||
2200 | } | ||
2201 | |||
2202 | public void llSetVehicledoubleParam(int param, double value) | ||
2203 | { | ||
2204 | NotImplemented("llSetVehicledoubleParam"); | ||
2205 | } | ||
2206 | |||
2207 | public void llSetVehicleVectorParam(int param, LSL_Types.Vector3 vec) | ||
2208 | { | ||
2209 | NotImplemented("llSetVehicleVectorParam"); | ||
2210 | } | ||
2211 | |||
2212 | public void llSetVehicleRotationParam(int param, LSL_Types.Quaternion rot) | ||
2213 | { | ||
2214 | NotImplemented("llSetVehicleRotationParam"); | ||
2215 | } | ||
2216 | |||
2217 | public void llSetVehicleFlags(int flags) | ||
2218 | { | ||
2219 | NotImplemented("llSetVehicleFlags"); | ||
2220 | } | ||
2221 | |||
2222 | public void llRemoveVehicleFlags(int flags) | ||
2223 | { | ||
2224 | NotImplemented("llRemoveVehicleFlags"); | ||
2225 | } | ||
2226 | |||
2227 | public void llSitTarget(LSL_Types.Vector3 offset, LSL_Types.Quaternion rot) | ||
2228 | { | ||
2229 | // LSL quaternions can normalize to 0, normal Quaternions can't. | ||
2230 | if (rot.s == 0 && rot.x == 0 && rot.y == 0 && rot.z == 0) | ||
2231 | rot.z = 1; // ZERO_ROTATION = 0,0,0,1 | ||
2232 | |||
2233 | 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)); | ||
2234 | } | ||
2235 | |||
2236 | public string llAvatarOnSitTarget() | ||
2237 | { | ||
2238 | LLUUID AVID = m_host.GetAvatarOnSitTarget(); | ||
2239 | |||
2240 | if (AVID != LLUUID.Zero) | ||
2241 | return AVID.ToString(); | ||
2242 | else | ||
2243 | return ""; | ||
2244 | } | ||
2245 | |||
2246 | public void llAddToLandPassList(string avatar, double hours) | ||
2247 | { | ||
2248 | NotImplemented("llAddToLandPassList"); | ||
2249 | } | ||
2250 | |||
2251 | public void llSetTouchText(string text) | ||
2252 | { | ||
2253 | m_host.TouchName = text; | ||
2254 | } | ||
2255 | |||
2256 | public void llSetSitText(string text) | ||
2257 | { | ||
2258 | m_host.SitName = text; | ||
2259 | } | ||
2260 | |||
2261 | public void llSetCameraEyeOffset(LSL_Types.Vector3 offset) | ||
2262 | { | ||
2263 | NotImplemented("llSetCameraEyeOffset"); | ||
2264 | } | ||
2265 | |||
2266 | public void llSetCameraAtOffset(LSL_Types.Vector3 offset) | ||
2267 | { | ||
2268 | NotImplemented("llSetCameraAtOffset"); | ||
2269 | } | ||
2270 | |||
2271 | public string llDumpList2String(LSL_Types.list src, string seperator) | ||
2272 | { | ||
2273 | if (src.Length == 0) | ||
2274 | { | ||
2275 | return ""; | ||
2276 | } | ||
2277 | string ret = ""; | ||
2278 | foreach (object o in src.Data) | ||
2279 | { | ||
2280 | ret = ret + o.ToString() + seperator; | ||
2281 | } | ||
2282 | ret = ret.Substring(0, ret.Length - seperator.Length); | ||
2283 | return ret; | ||
2284 | } | ||
2285 | |||
2286 | public void llScriptDanger(LSL_Types.Vector3 pos) | ||
2287 | { | ||
2288 | NotImplemented("llScriptDanger"); | ||
2289 | } | ||
2290 | |||
2291 | public void llDialog(string avatar, string message, LSL_Types.list buttons, int chat_channel) | ||
2292 | { | ||
2293 | NotImplemented("llDialog"); | ||
2294 | } | ||
2295 | |||
2296 | public void llVolumeDetect(int detect) | ||
2297 | { | ||
2298 | NotImplemented("llVolumeDetect"); | ||
2299 | } | ||
2300 | |||
2301 | public void llResetOtherScript(string name) | ||
2302 | { | ||
2303 | NotImplemented("llResetOtherScript"); | ||
2304 | } | ||
2305 | |||
2306 | public int llGetScriptState(string name) | ||
2307 | { | ||
2308 | NotImplemented("llGetScriptState"); | ||
2309 | return 0; | ||
2310 | } | ||
2311 | |||
2312 | public void llRemoteLoadScript() | ||
2313 | { | ||
2314 | NotImplemented("llRemoteLoadScript"); | ||
2315 | } | ||
2316 | |||
2317 | public void llSetRemoteScriptAccessPin(int pin) | ||
2318 | { | ||
2319 | NotImplemented("llSetRemoteScriptAccessPin"); | ||
2320 | } | ||
2321 | |||
2322 | public void llRemoteLoadScriptPin(string target, string name, int pin, int running, int start_param) | ||
2323 | { | ||
2324 | NotImplemented("llRemoteLoadScriptPin"); | ||
2325 | } | ||
2326 | |||
2327 | // remote_data(integer type, key channel, key message_id, string sender, integer ival, string sval) | ||
2328 | // Not sure where these constants should live: | ||
2329 | // REMOTE_DATA_CHANNEL = 1 | ||
2330 | // REMOTE_DATA_REQUEST = 2 | ||
2331 | // REMOTE_DATA_REPLY = 3 | ||
2332 | public void llOpenRemoteDataChannel() | ||
2333 | { | ||
2334 | IXMLRPC xmlrpcMod = m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>(); | ||
2335 | if (xmlrpcMod.IsEnabled()) | ||
2336 | { | ||
2337 | LLUUID channelID = xmlrpcMod.OpenXMLRPCChannel(m_localID, m_itemID); | ||
2338 | object[] resobj = new object[] { 1, channelID.ToString(), LLUUID.Zero.ToString(), "", 0, "" }; | ||
2339 | m_ScriptEngine.m_EventQueueManager.AddToScriptQueue(m_localID, m_itemID, "remote_data", resobj); | ||
2340 | } | ||
2341 | } | ||
2342 | |||
2343 | public string llSendRemoteData(string channel, string dest, int idata, string sdata) | ||
2344 | { | ||
2345 | NotImplemented("llSendRemoteData"); | ||
2346 | return ""; | ||
2347 | } | ||
2348 | |||
2349 | public void llRemoteDataReply(string channel, string message_id, string sdata, int idata) | ||
2350 | { | ||
2351 | IXMLRPC xmlrpcMod = m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>(); | ||
2352 | xmlrpcMod.RemoteDataReply(channel, message_id, sdata, idata); | ||
2353 | } | ||
2354 | |||
2355 | public void llCloseRemoteDataChannel(string channel) | ||
2356 | { | ||
2357 | IXMLRPC xmlrpcMod = m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>(); | ||
2358 | xmlrpcMod.CloseXMLRPCChannel(channel); | ||
2359 | } | ||
2360 | |||
2361 | public string llMD5String(string src, int nonce) | ||
2362 | { | ||
2363 | return Util.Md5Hash(src + ":" + nonce.ToString()); | ||
2364 | } | ||
2365 | |||
2366 | public void llSetPrimitiveParams(LSL_Types.list rules) | ||
2367 | { | ||
2368 | NotImplemented("llSetPrimitiveParams"); | ||
2369 | } | ||
2370 | |||
2371 | public string llStringToBase64(string str) | ||
2372 | { | ||
2373 | try | ||
2374 | { | ||
2375 | byte[] encData_byte = new byte[str.Length]; | ||
2376 | encData_byte = Encoding.UTF8.GetBytes(str); | ||
2377 | string encodedData = Convert.ToBase64String(encData_byte); | ||
2378 | return encodedData; | ||
2379 | } | ||
2380 | catch (Exception e) | ||
2381 | { | ||
2382 | throw new Exception("Error in base64Encode" + e.Message); | ||
2383 | } | ||
2384 | } | ||
2385 | |||
2386 | public string llBase64ToString(string str) | ||
2387 | { | ||
2388 | UTF8Encoding encoder = new UTF8Encoding(); | ||
2389 | Decoder utf8Decode = encoder.GetDecoder(); | ||
2390 | try | ||
2391 | { | ||
2392 | byte[] todecode_byte = Convert.FromBase64String(str); | ||
2393 | int charCount = utf8Decode.GetCharCount(todecode_byte, 0, todecode_byte.Length); | ||
2394 | char[] decoded_char = new char[charCount]; | ||
2395 | utf8Decode.GetChars(todecode_byte, 0, todecode_byte.Length, decoded_char, 0); | ||
2396 | string result = new String(decoded_char); | ||
2397 | return result; | ||
2398 | } | ||
2399 | catch (Exception e) | ||
2400 | { | ||
2401 | throw new Exception("Error in base64Decode" + e.Message); | ||
2402 | } | ||
2403 | } | ||
2404 | |||
2405 | public void llXorBase64Strings() | ||
2406 | { | ||
2407 | throw new Exception("Command deprecated! Use llXorBase64StringsCorrect instead."); | ||
2408 | } | ||
2409 | |||
2410 | public void llRemoteDataSetRegion() | ||
2411 | { | ||
2412 | NotImplemented("llRemoteDataSetRegion"); | ||
2413 | } | ||
2414 | |||
2415 | public double llLog10(double val) | ||
2416 | { | ||
2417 | return (double)Math.Log10(val); | ||
2418 | } | ||
2419 | |||
2420 | public double llLog(double val) | ||
2421 | { | ||
2422 | return (double)Math.Log(val); | ||
2423 | } | ||
2424 | |||
2425 | public LSL_Types.list llGetAnimationList(string id) | ||
2426 | { | ||
2427 | NotImplemented("llGetAnimationList"); | ||
2428 | return new LSL_Types.list(); | ||
2429 | } | ||
2430 | |||
2431 | public void llSetParcelMusicURL(string url) | ||
2432 | { | ||
2433 | LLUUID landowner = World.GetLandOwner(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y); | ||
2434 | if (landowner.Equals(null)) | ||
2435 | { | ||
2436 | return; | ||
2437 | } | ||
2438 | if (landowner != m_host.ObjectOwner) | ||
2439 | { | ||
2440 | return; | ||
2441 | } | ||
2442 | World.SetLandMusicURL(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y, url); | ||
2443 | } | ||
2444 | |||
2445 | public LSL_Types.Vector3 llGetRootPosition() | ||
2446 | { | ||
2447 | return new LSL_Types.Vector3(m_host.ParentGroup.AbsolutePosition.X, m_host.ParentGroup.AbsolutePosition.Y, m_host.ParentGroup.AbsolutePosition.Z); | ||
2448 | } | ||
2449 | |||
2450 | public LSL_Types.Quaternion llGetRootRotation() | ||
2451 | { | ||
2452 | 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); | ||
2453 | } | ||
2454 | |||
2455 | public string llGetObjectDesc() | ||
2456 | { | ||
2457 | return m_host.Description; | ||
2458 | } | ||
2459 | |||
2460 | public void llSetObjectDesc(string desc) | ||
2461 | { | ||
2462 | m_host.Description = desc; | ||
2463 | } | ||
2464 | |||
2465 | public string llGetCreator() | ||
2466 | { | ||
2467 | return m_host.ObjectCreator.ToString(); | ||
2468 | } | ||
2469 | |||
2470 | public string llGetTimestamp() | ||
2471 | { | ||
2472 | return DateTime.Now.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss.fffffffZ"); | ||
2473 | } | ||
2474 | |||
2475 | public void llSetLinkAlpha(int linknumber, double alpha, int face) | ||
2476 | { | ||
2477 | SceneObjectPart part = m_host.ParentGroup.GetLinkNumPart(linknumber); | ||
2478 | if (linknumber > -1) | ||
2479 | { | ||
2480 | LLObject.TextureEntry tex = part.Shape.Textures; | ||
2481 | LLColor texcolor; | ||
2482 | if (face > -1) | ||
2483 | { | ||
2484 | texcolor = tex.CreateFace((uint)face).RGBA; | ||
2485 | texcolor.A = (float)Math.Abs(alpha - 1); | ||
2486 | tex.FaceTextures[face].RGBA = texcolor; | ||
2487 | part.UpdateTexture(tex); | ||
2488 | return; | ||
2489 | } | ||
2490 | else if (face == -1) | ||
2491 | { | ||
2492 | texcolor = tex.DefaultTexture.RGBA; | ||
2493 | texcolor.A = (float)Math.Abs(alpha - 1); | ||
2494 | tex.DefaultTexture.RGBA = texcolor; | ||
2495 | for (uint i = 0; i < 32; i++) | ||
2496 | { | ||
2497 | if (tex.FaceTextures[i] != null) | ||
2498 | { | ||
2499 | texcolor = tex.FaceTextures[i].RGBA; | ||
2500 | texcolor.A = (float)Math.Abs(alpha - 1); | ||
2501 | tex.FaceTextures[i].RGBA = texcolor; | ||
2502 | } | ||
2503 | } | ||
2504 | texcolor = tex.DefaultTexture.RGBA; | ||
2505 | texcolor.A = (float)Math.Abs(alpha - 1); | ||
2506 | tex.DefaultTexture.RGBA = texcolor; | ||
2507 | part.UpdateTexture(tex); | ||
2508 | return; | ||
2509 | } | ||
2510 | return; | ||
2511 | } | ||
2512 | else if (linknumber == -1) | ||
2513 | { | ||
2514 | int num = m_host.ParentGroup.PrimCount; | ||
2515 | for (int w = 0; w < num; w++) | ||
2516 | { | ||
2517 | linknumber = w; | ||
2518 | part = m_host.ParentGroup.GetLinkNumPart(linknumber); | ||
2519 | LLObject.TextureEntry tex = part.Shape.Textures; | ||
2520 | LLColor texcolor; | ||
2521 | if (face > -1) | ||
2522 | { | ||
2523 | texcolor = tex.CreateFace((uint)face).RGBA; | ||
2524 | texcolor.A = (float)Math.Abs(alpha - 1); | ||
2525 | tex.FaceTextures[face].RGBA = texcolor; | ||
2526 | part.UpdateTexture(tex); | ||
2527 | } | ||
2528 | else if (face == -1) | ||
2529 | { | ||
2530 | texcolor = tex.DefaultTexture.RGBA; | ||
2531 | texcolor.A = (float)Math.Abs(alpha - 1); | ||
2532 | tex.DefaultTexture.RGBA = texcolor; | ||
2533 | for (uint i = 0; i < 32; i++) | ||
2534 | { | ||
2535 | if (tex.FaceTextures[i] != null) | ||
2536 | { | ||
2537 | texcolor = tex.FaceTextures[i].RGBA; | ||
2538 | texcolor.A = (float)Math.Abs(alpha - 1); | ||
2539 | tex.FaceTextures[i].RGBA = texcolor; | ||
2540 | } | ||
2541 | } | ||
2542 | texcolor = tex.DefaultTexture.RGBA; | ||
2543 | texcolor.A = (float)Math.Abs(alpha - 1); | ||
2544 | tex.DefaultTexture.RGBA = texcolor; | ||
2545 | part.UpdateTexture(tex); | ||
2546 | } | ||
2547 | } | ||
2548 | return; | ||
2549 | } | ||
2550 | else | ||
2551 | { | ||
2552 | NotImplemented("llSetLinkAlpha"); | ||
2553 | } | ||
2554 | } | ||
2555 | |||
2556 | public int llGetNumberOfPrims() | ||
2557 | { | ||
2558 | return m_host.ParentGroup.PrimCount; | ||
2559 | } | ||
2560 | |||
2561 | public string llGetNumberOfNotecardLines(string name) | ||
2562 | { | ||
2563 | NotImplemented("llGetNumberOfNotecardLines"); | ||
2564 | return ""; | ||
2565 | } | ||
2566 | |||
2567 | public LSL_Types.list llGetBoundingBox(string obj) | ||
2568 | { | ||
2569 | NotImplemented("llGetBoundingBox"); | ||
2570 | return new LSL_Types.list(); | ||
2571 | } | ||
2572 | |||
2573 | public LSL_Types.Vector3 llGetGeometricCenter() | ||
2574 | { | ||
2575 | return new LSL_Types.Vector3(m_host.GetGeometricCenter().X, m_host.GetGeometricCenter().Y, m_host.GetGeometricCenter().Z); | ||
2576 | } | ||
2577 | |||
2578 | public void llGetPrimitiveParams() | ||
2579 | { | ||
2580 | NotImplemented("llGetPrimitiveParams"); | ||
2581 | } | ||
2582 | |||
2583 | public string llIntegerToBase64(int number) | ||
2584 | { | ||
2585 | NotImplemented("llIntegerToBase64"); | ||
2586 | return ""; | ||
2587 | } | ||
2588 | |||
2589 | public int llBase64ToInteger(string str) | ||
2590 | { | ||
2591 | NotImplemented("llBase64ToInteger"); | ||
2592 | return 0; | ||
2593 | } | ||
2594 | |||
2595 | public double llGetGMTclock() | ||
2596 | { | ||
2597 | return DateTime.UtcNow.TimeOfDay.TotalSeconds; | ||
2598 | } | ||
2599 | |||
2600 | public string llGetSimulatorHostname() | ||
2601 | { | ||
2602 | return System.Environment.MachineName; | ||
2603 | } | ||
2604 | |||
2605 | public void llSetLocalRot(LSL_Types.Quaternion rot) | ||
2606 | { | ||
2607 | m_host.RotationOffset = new LLQuaternion((float)rot.x, (float)rot.y, (float)rot.z, (float)rot.s); | ||
2608 | } | ||
2609 | |||
2610 | public LSL_Types.list llParseStringKeepNulls(string src, LSL_Types.list seperators, LSL_Types.list spacers) | ||
2611 | { | ||
2612 | NotImplemented("llParseStringKeepNulls"); | ||
2613 | return new LSL_Types.list(); | ||
2614 | } | ||
2615 | |||
2616 | public void llRezAtRoot(string inventory, LSL_Types.Vector3 position, LSL_Types.Vector3 velocity, | ||
2617 | LSL_Types.Quaternion rot, int param) | ||
2618 | { | ||
2619 | NotImplemented("llRezAtRoot"); | ||
2620 | } | ||
2621 | |||
2622 | public int llGetObjectPermMask(int mask) | ||
2623 | { | ||
2624 | NotImplemented("llGetObjectPermMask"); | ||
2625 | return 0; | ||
2626 | } | ||
2627 | |||
2628 | public void llSetObjectPermMask(int mask, int value) | ||
2629 | { | ||
2630 | NotImplemented("llSetObjectPermMask"); | ||
2631 | } | ||
2632 | |||
2633 | public void llGetInventoryPermMask(string item, int mask) | ||
2634 | { | ||
2635 | NotImplemented("llGetInventoryPermMask"); | ||
2636 | } | ||
2637 | |||
2638 | public void llSetInventoryPermMask(string item, int mask, int value) | ||
2639 | { | ||
2640 | NotImplemented("llSetInventoryPermMask"); | ||
2641 | } | ||
2642 | |||
2643 | public string llGetInventoryCreator(string item) | ||
2644 | { | ||
2645 | NotImplemented("llGetInventoryCreator"); | ||
2646 | return ""; | ||
2647 | } | ||
2648 | |||
2649 | public void llOwnerSay(string msg) | ||
2650 | { | ||
2651 | //temp fix so that lsl wiki examples aren't annoying to use to test other functions | ||
2652 | World.SimChat(Helpers.StringToField(msg), ChatTypeEnum.Say, 0, m_host.AbsolutePosition, m_host.Name, m_host.UUID); | ||
2653 | IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); | ||
2654 | wComm.DeliverMessage(m_host.UUID.ToString(), ChatTypeEnum.Say, 0, m_host.Name, msg); | ||
2655 | } | ||
2656 | |||
2657 | public void llRequestSimulatorData(string simulator, int data) | ||
2658 | { | ||
2659 | NotImplemented("llRequestSimulatorData"); | ||
2660 | } | ||
2661 | |||
2662 | public void llForceMouselook(int mouselook) | ||
2663 | { | ||
2664 | NotImplemented("llForceMouselook"); | ||
2665 | } | ||
2666 | |||
2667 | public double llGetObjectMass(string id) | ||
2668 | { | ||
2669 | NotImplemented("llGetObjectMass"); | ||
2670 | return 0; | ||
2671 | } | ||
2672 | |||
2673 | public LSL_Types.list llListReplaceList(LSL_Types.list dest, LSL_Types.list src, int start, int end) | ||
2674 | { | ||
2675 | return dest.GetSublist(0, start - 1) + src + dest.GetSublist(end + 1, -1); | ||
2676 | } | ||
2677 | |||
2678 | public void llLoadURL(string avatar_id, string message, string url) | ||
2679 | { | ||
2680 | LLUUID avatarId = new LLUUID(avatar_id); | ||
2681 | m_ScriptEngine.World.SendUrlToUser(avatarId, m_host.Name, m_host.UUID, m_host.ObjectOwner, false, message, | ||
2682 | url); | ||
2683 | } | ||
2684 | |||
2685 | public void llParcelMediaCommandList(LSL_Types.list commandList) | ||
2686 | { | ||
2687 | NotImplemented("llParcelMediaCommandList"); | ||
2688 | } | ||
2689 | |||
2690 | public void llParcelMediaQuery() | ||
2691 | { | ||
2692 | NotImplemented("llParcelMediaQuery"); | ||
2693 | } | ||
2694 | |||
2695 | public int llModPow(int a, int b, int c) | ||
2696 | { | ||
2697 | Int64 tmp = 0; | ||
2698 | Int64 val = Math.DivRem(Convert.ToInt64(Math.Pow(a, b)), c, out tmp); | ||
2699 | return Convert.ToInt32(tmp); | ||
2700 | } | ||
2701 | |||
2702 | public int llGetInventoryType(string name) | ||
2703 | { | ||
2704 | NotImplemented("llGetInventoryType"); | ||
2705 | return 0; | ||
2706 | } | ||
2707 | |||
2708 | public void llSetPayPrice(int price, LSL_Types.list quick_pay_buttons) | ||
2709 | { | ||
2710 | NotImplemented("llSetPayPrice"); | ||
2711 | } | ||
2712 | |||
2713 | public LSL_Types.Vector3 llGetCameraPos() | ||
2714 | { | ||
2715 | NotImplemented("llGetCameraPos"); | ||
2716 | return new LSL_Types.Vector3(); | ||
2717 | } | ||
2718 | |||
2719 | public LSL_Types.Quaternion llGetCameraRot() | ||
2720 | { | ||
2721 | NotImplemented("llGetCameraRot"); | ||
2722 | return new LSL_Types.Quaternion(); | ||
2723 | } | ||
2724 | |||
2725 | public void llSetPrimURL() | ||
2726 | { | ||
2727 | NotImplemented("llSetPrimURL"); | ||
2728 | } | ||
2729 | |||
2730 | public void llRefreshPrimURL() | ||
2731 | { | ||
2732 | NotImplemented("llRefreshPrimURL"); | ||
2733 | } | ||
2734 | |||
2735 | public string llEscapeURL(string url) | ||
2736 | { | ||
2737 | try | ||
2738 | { | ||
2739 | return Uri.EscapeUriString(url); | ||
2740 | } | ||
2741 | catch (Exception ex) | ||
2742 | { | ||
2743 | return "llEscapeURL: " + ex.ToString(); | ||
2744 | } | ||
2745 | } | ||
2746 | |||
2747 | public string llUnescapeURL(string url) | ||
2748 | { | ||
2749 | try | ||
2750 | { | ||
2751 | return Uri.UnescapeDataString(url); | ||
2752 | } | ||
2753 | catch (Exception ex) | ||
2754 | { | ||
2755 | return "llUnescapeURL: " + ex.ToString(); | ||
2756 | } | ||
2757 | } | ||
2758 | |||
2759 | public void llMapDestination(string simname, LSL_Types.Vector3 pos, LSL_Types.Vector3 look_at) | ||
2760 | { | ||
2761 | NotImplemented("llMapDestination"); | ||
2762 | } | ||
2763 | |||
2764 | public void llAddToLandBanList(string avatar, double hours) | ||
2765 | { | ||
2766 | NotImplemented("llAddToLandBanList"); | ||
2767 | } | ||
2768 | |||
2769 | public void llRemoveFromLandPassList(string avatar) | ||
2770 | { | ||
2771 | NotImplemented("llRemoveFromLandPassList"); | ||
2772 | } | ||
2773 | |||
2774 | public void llRemoveFromLandBanList(string avatar) | ||
2775 | { | ||
2776 | NotImplemented("llRemoveFromLandBanList"); | ||
2777 | } | ||
2778 | |||
2779 | public void llSetCameraParams(LSL_Types.list rules) | ||
2780 | { | ||
2781 | NotImplemented("llSetCameraParams"); | ||
2782 | } | ||
2783 | |||
2784 | public void llClearCameraParams() | ||
2785 | { | ||
2786 | NotImplemented("llClearCameraParams"); | ||
2787 | } | ||
2788 | |||
2789 | public double llListStatistics(int operation, LSL_Types.list src) | ||
2790 | { | ||
2791 | NotImplemented("llListStatistics"); | ||
2792 | return 0; | ||
2793 | } | ||
2794 | |||
2795 | public int llGetUnixTime() | ||
2796 | { | ||
2797 | return Util.UnixTimeSinceEpoch(); | ||
2798 | } | ||
2799 | |||
2800 | public int llGetParcelFlags(LSL_Types.Vector3 pos) | ||
2801 | { | ||
2802 | NotImplemented("llGetParcelFlags"); | ||
2803 | return 0; | ||
2804 | } | ||
2805 | |||
2806 | public int llGetRegionFlags() | ||
2807 | { | ||
2808 | NotImplemented("llGetRegionFlags"); | ||
2809 | return 0; | ||
2810 | } | ||
2811 | |||
2812 | public string llXorBase64StringsCorrect(string str1, string str2) | ||
2813 | { | ||
2814 | string ret = ""; | ||
2815 | string src1 = llBase64ToString(str1); | ||
2816 | string src2 = llBase64ToString(str2); | ||
2817 | int c = 0; | ||
2818 | for (int i = 0; i < src1.Length; i++) | ||
2819 | { | ||
2820 | ret += src1[i] ^ src2[c]; | ||
2821 | |||
2822 | c++; | ||
2823 | if (c > src2.Length) | ||
2824 | c = 0; | ||
2825 | } | ||
2826 | return llStringToBase64(ret); | ||
2827 | } | ||
2828 | |||
2829 | public string llHTTPRequest(string url, LSL_Types.list parameters, string body) | ||
2830 | { | ||
2831 | IHttpRequests httpScriptMod = | ||
2832 | m_ScriptEngine.World.RequestModuleInterface<IHttpRequests>(); | ||
2833 | List<string> param = new List<string>(); | ||
2834 | foreach (object o in parameters.Data) | ||
2835 | { | ||
2836 | param.Add(o.ToString()); | ||
2837 | } | ||
2838 | LLUUID reqID = httpScriptMod. | ||
2839 | StartHttpRequest(m_localID, m_itemID, url, param, body); | ||
2840 | |||
2841 | if (!reqID.Equals(null)) | ||
2842 | return reqID.ToString(); | ||
2843 | else | ||
2844 | return null; | ||
2845 | } | ||
2846 | |||
2847 | public void llResetLandBanList() | ||
2848 | { | ||
2849 | NotImplemented("llResetLandBanList"); | ||
2850 | } | ||
2851 | |||
2852 | public void llResetLandPassList() | ||
2853 | { | ||
2854 | NotImplemented("llResetLandPassList"); | ||
2855 | } | ||
2856 | |||
2857 | public int llGetParcelPrimCount(LSL_Types.Vector3 pos, int category, int sim_wide) | ||
2858 | { | ||
2859 | NotImplemented("llGetParcelPrimCount"); | ||
2860 | return 0; | ||
2861 | } | ||
2862 | |||
2863 | public LSL_Types.list llGetParcelPrimOwners(LSL_Types.Vector3 pos) | ||
2864 | { | ||
2865 | NotImplemented("llGetParcelPrimOwners"); | ||
2866 | return new LSL_Types.list(); | ||
2867 | } | ||
2868 | |||
2869 | public int llGetObjectPrimCount(string object_id) | ||
2870 | { | ||
2871 | SceneObjectPart part = World.GetSceneObjectPart(new LLUUID(object_id)); | ||
2872 | if (part == null) | ||
2873 | { | ||
2874 | return 0; | ||
2875 | } | ||
2876 | else | ||
2877 | { | ||
2878 | return part.ParentGroup.Children.Count; | ||
2879 | } | ||
2880 | } | ||
2881 | |||
2882 | public int llGetParcelMaxPrims(LSL_Types.Vector3 pos, int sim_wide) | ||
2883 | { | ||
2884 | // Alondria: This currently just is utilizing the normal grid's 0.22 prims/m2 calculation | ||
2885 | // Which probably will be irrelevent in OpenSim.... | ||
2886 | LandData land = World.GetLandData((float)pos.x, (float)pos.y); | ||
2887 | float bonusfactor = World.RegionInfo.EstateSettings.objectBonusFactor; | ||
2888 | if (land == null) | ||
2889 | { | ||
2890 | return 0; | ||
2891 | } | ||
2892 | if (sim_wide == 1) | ||
2893 | { | ||
2894 | decimal v = land.simwideArea * (decimal)(0.22) * (decimal)bonusfactor; | ||
2895 | return (int)v; | ||
2896 | } | ||
2897 | else | ||
2898 | { | ||
2899 | decimal v = land.area * (decimal)(0.22) * (decimal)bonusfactor; | ||
2900 | return (int)v; | ||
2901 | } | ||
2902 | |||
2903 | } | ||
2904 | |||
2905 | public LSL_Types.list llGetParcelDetails(LSL_Types.Vector3 pos, LSL_Types.list param) | ||
2906 | { | ||
2907 | LandData land = World.GetLandData((float)pos.x, (float)pos.y); | ||
2908 | if (land == null) | ||
2909 | { | ||
2910 | return new LSL_Types.list(0); | ||
2911 | } | ||
2912 | LSL_Types.list ret = new LSL_Types.list(); | ||
2913 | foreach (object o in param.Data) | ||
2914 | { | ||
2915 | switch (o.ToString()) | ||
2916 | { | ||
2917 | case "0": | ||
2918 | ret = ret + new LSL_Types.list(land.landName); | ||
2919 | break; | ||
2920 | case "1": | ||
2921 | ret = ret + new LSL_Types.list(land.landDesc); | ||
2922 | break; | ||
2923 | case "2": | ||
2924 | ret = ret + new LSL_Types.list(land.ownerID.ToString()); | ||
2925 | break; | ||
2926 | case "3": | ||
2927 | ret = ret + new LSL_Types.list(land.groupID.ToString()); | ||
2928 | break; | ||
2929 | case "4": | ||
2930 | ret = ret + new LSL_Types.list(land.area); | ||
2931 | break; | ||
2932 | default: | ||
2933 | ret = ret + new LSL_Types.list(0); | ||
2934 | break; | ||
2935 | } | ||
2936 | } | ||
2937 | return ret; | ||
2938 | } | ||
2939 | |||
2940 | // | ||
2941 | // OpenSim functions | ||
2942 | // | ||
2943 | public int osTerrainSetHeight(int x, int y, double val) | ||
2944 | { | ||
2945 | if (x > 255 || x < 0 || y > 255 || y < 0) | ||
2946 | LSLError("osTerrainSetHeight: Coordinate out of bounds"); | ||
2947 | |||
2948 | if (World.PermissionsMngr.CanTerraform(m_host.OwnerID, new LLVector3(x, y, 0))) | ||
2949 | { | ||
2950 | World.Terrain.Set(x, y, val); | ||
2951 | return 1; | ||
2952 | } | ||
2953 | else | ||
2954 | { | ||
2955 | return 0; | ||
2956 | } | ||
2957 | } | ||
2958 | |||
2959 | public double osTerrainGetHeight(int x, int y) | ||
2960 | { | ||
2961 | if (x > 255 || x < 0 || y > 255 || y < 0) | ||
2962 | LSLError("osTerrainGetHeight: Coordinate out of bounds"); | ||
2963 | |||
2964 | return World.Terrain.GetHeight(x, y); | ||
2965 | } | ||
2966 | |||
2967 | public int osRegionRestart(double seconds) | ||
2968 | { | ||
2969 | if (World.PermissionsMngr.CanRestartSim(m_host.OwnerID)) | ||
2970 | { | ||
2971 | World.Restart((float)seconds); | ||
2972 | return 1; | ||
2973 | } | ||
2974 | else | ||
2975 | { | ||
2976 | return 0; | ||
2977 | } | ||
2978 | } | ||
2979 | |||
2980 | public void osRegionNotice(string msg) | ||
2981 | { | ||
2982 | World.SendGeneralAlert(msg); | ||
2983 | } | ||
2984 | |||
2985 | public string osSetDynamicTextureURL(string dynamicID, string contentType, string url, string extraParams, | ||
2986 | int timer) | ||
2987 | { | ||
2988 | if (dynamicID == "") | ||
2989 | { | ||
2990 | IDynamicTextureManager textureManager = World.RequestModuleInterface<IDynamicTextureManager>(); | ||
2991 | LLUUID createdTexture = | ||
2992 | textureManager.AddDynamicTextureURL(World.RegionInfo.RegionID, m_host.UUID, contentType, url, | ||
2993 | extraParams, timer); | ||
2994 | return createdTexture.ToString(); | ||
2995 | } | ||
2996 | else | ||
2997 | { | ||
2998 | //TODO update existing dynamic textures | ||
2999 | } | ||
3000 | |||
3001 | return LLUUID.Zero.ToString(); | ||
3002 | } | ||
3003 | |||
3004 | private void NotImplemented(string Command) | ||
3005 | { | ||
3006 | if (throwErrorOnNotImplemented) | ||
3007 | throw new NotImplementedException("Command not implemented: " + Command); | ||
3008 | } | ||
3009 | |||
3010 | private void LSLError(string msg) | ||
3011 | { | ||
3012 | throw new Exception("LSL Runtime Error: " + msg); | ||
3013 | } | ||
3014 | } | ||
3015 | } | ||