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/Common | |
parent | * Trying something to see if it helps teleports and border crossings (diff) | |
download | opensim-SC_OLD-bacbade369a5244f9bcc611488b59f3bd4c8a564.zip opensim-SC_OLD-bacbade369a5244f9bcc611488b59f3bd4c8a564.tar.gz opensim-SC_OLD-bacbade369a5244f9bcc611488b59f3bd4c8a564.tar.bz2 opensim-SC_OLD-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/Common')
11 files changed, 6864 insertions, 2 deletions
diff --git a/OpenSim/Region/ScriptEngine/Common/IScript.cs b/OpenSim/Region/ScriptEngine/Common/IScript.cs index 08c0e9c..c94b187 100644 --- a/OpenSim/Region/ScriptEngine/Common/IScript.cs +++ b/OpenSim/Region/ScriptEngine/Common/IScript.cs | |||
@@ -32,5 +32,7 @@ namespace OpenSim.Region.ScriptEngine.Common | |||
32 | { | 32 | { |
33 | string State(); | 33 | string State(); |
34 | Executor Exec { get; } | 34 | Executor Exec { get; } |
35 | string Source { get; set; } | ||
36 | void Start(LSL_BuiltIn_Commands_Interface BuiltIn_Commands); | ||
35 | } | 37 | } |
36 | } \ No newline at end of file | 38 | } \ No newline at end of file |
diff --git a/OpenSim/Region/ScriptEngine/Common/LSL_BaseClass.cs b/OpenSim/Region/ScriptEngine/Common/LSL_BaseClass.cs new file mode 100644 index 0000000..5de9a85 --- /dev/null +++ b/OpenSim/Region/ScriptEngine/Common/LSL_BaseClass.cs | |||
@@ -0,0 +1,2165 @@ | |||
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.Threading; | ||
33 | using OpenSim.Region.ScriptEngine.Common; | ||
34 | using integer = System.Int32; | ||
35 | using key = System.String; | ||
36 | using vector = OpenSim.Region.ScriptEngine.Common.LSL_Types.Vector3; | ||
37 | using rotation = OpenSim.Region.ScriptEngine.Common.LSL_Types.Quaternion; | ||
38 | |||
39 | namespace OpenSim.Region.ScriptEngine.Common | ||
40 | { | ||
41 | public class LSL_BaseClass : MarshalByRefObject, LSL_BuiltIn_Commands_Interface, IScript | ||
42 | { | ||
43 | |||
44 | // | ||
45 | // Included as base for any LSL-script that is compiled. | ||
46 | // Any function added here will be accessible to the LSL script. But it must also be added to "LSL_BuiltIn_Commands_Interface" in "OpenSim.Region.ScriptEngine.Common" class. | ||
47 | // | ||
48 | // Security note: This script will be running inside an restricted AppDomain. Currently AppDomain is not very restricted. | ||
49 | // | ||
50 | |||
51 | // Object never expires | ||
52 | public override Object InitializeLifetimeService() | ||
53 | { | ||
54 | //Console.WriteLine("LSL_BaseClass: InitializeLifetimeService()"); | ||
55 | // return null; | ||
56 | ILease lease = (ILease)base.InitializeLifetimeService(); | ||
57 | |||
58 | if (lease.CurrentState == LeaseState.Initial) | ||
59 | { | ||
60 | lease.InitialLeaseTime = TimeSpan.Zero; // TimeSpan.FromMinutes(1); | ||
61 | //lease.SponsorshipTimeout = TimeSpan.FromMinutes(2); | ||
62 | //lease.RenewOnCallTime = TimeSpan.FromSeconds(2); | ||
63 | } | ||
64 | return lease; | ||
65 | } | ||
66 | |||
67 | |||
68 | private Executor m_Exec; | ||
69 | |||
70 | Executor IScript.Exec | ||
71 | { | ||
72 | get | ||
73 | { | ||
74 | if (m_Exec == null) | ||
75 | m_Exec = new Executor(this); | ||
76 | return m_Exec; | ||
77 | } | ||
78 | } | ||
79 | |||
80 | |||
81 | public LSL_BuiltIn_Commands_Interface m_LSL_Functions; | ||
82 | private string _Source = ""; | ||
83 | public string Source | ||
84 | { | ||
85 | get | ||
86 | { | ||
87 | return _Source; | ||
88 | } | ||
89 | set { _Source = value; } | ||
90 | } | ||
91 | |||
92 | |||
93 | public LSL_BaseClass() | ||
94 | { | ||
95 | } | ||
96 | |||
97 | public string State() | ||
98 | { | ||
99 | return m_LSL_Functions.State(); | ||
100 | } | ||
101 | |||
102 | |||
103 | |||
104 | public void Start(LSL_BuiltIn_Commands_Interface LSL_Functions) | ||
105 | { | ||
106 | m_LSL_Functions = LSL_Functions; | ||
107 | |||
108 | //MainLog.Instance.Notice("ScriptEngine", "LSL_BaseClass.Start() called."); | ||
109 | |||
110 | // Get this AppDomain's settings and display some of them. | ||
111 | AppDomainSetup ads = AppDomain.CurrentDomain.SetupInformation; | ||
112 | Console.WriteLine("AppName={0}, AppBase={1}, ConfigFile={2}", | ||
113 | ads.ApplicationName, | ||
114 | ads.ApplicationBase, | ||
115 | ads.ConfigurationFile | ||
116 | ); | ||
117 | |||
118 | // Display the name of the calling AppDomain and the name | ||
119 | // of the second domain. | ||
120 | // NOTE: The application's thread has transitioned between | ||
121 | // AppDomains. | ||
122 | Console.WriteLine("Calling to '{0}'.", | ||
123 | Thread.GetDomain().FriendlyName | ||
124 | ); | ||
125 | |||
126 | return; | ||
127 | } | ||
128 | |||
129 | |||
130 | // | ||
131 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs | ||
132 | // | ||
133 | // They are only forwarders to LSL_BuiltIn_Commands.cs | ||
134 | // | ||
135 | public double llSin(double f) | ||
136 | { | ||
137 | return m_LSL_Functions.llSin(f); | ||
138 | } | ||
139 | |||
140 | public double llCos(double f) | ||
141 | { | ||
142 | return m_LSL_Functions.llCos(f); | ||
143 | } | ||
144 | |||
145 | public double llTan(double f) | ||
146 | { | ||
147 | return m_LSL_Functions.llTan(f); | ||
148 | } | ||
149 | |||
150 | public double llAtan2(double x, double y) | ||
151 | { | ||
152 | return m_LSL_Functions.llAtan2(x, y); | ||
153 | } | ||
154 | |||
155 | public double llSqrt(double f) | ||
156 | { | ||
157 | return m_LSL_Functions.llSqrt(f); | ||
158 | } | ||
159 | |||
160 | public double llPow(double fbase, double fexponent) | ||
161 | { | ||
162 | return m_LSL_Functions.llPow(fbase, fexponent); | ||
163 | } | ||
164 | |||
165 | public int llAbs(int i) | ||
166 | { | ||
167 | return m_LSL_Functions.llAbs(i); | ||
168 | } | ||
169 | |||
170 | public double llFabs(double f) | ||
171 | { | ||
172 | return m_LSL_Functions.llFabs(f); | ||
173 | } | ||
174 | |||
175 | public double llFrand(double mag) | ||
176 | { | ||
177 | return m_LSL_Functions.llFrand(mag); | ||
178 | } | ||
179 | |||
180 | public int llFloor(double f) | ||
181 | { | ||
182 | return m_LSL_Functions.llFloor(f); | ||
183 | } | ||
184 | |||
185 | public int llCeil(double f) | ||
186 | { | ||
187 | return m_LSL_Functions.llCeil(f); | ||
188 | } | ||
189 | |||
190 | public int llRound(double f) | ||
191 | { | ||
192 | return m_LSL_Functions.llRound(f); | ||
193 | } | ||
194 | |||
195 | public double llVecMag(vector v) | ||
196 | { | ||
197 | return m_LSL_Functions.llVecMag(v); | ||
198 | } | ||
199 | |||
200 | public vector llVecNorm(vector v) | ||
201 | { | ||
202 | return m_LSL_Functions.llVecNorm(v); | ||
203 | } | ||
204 | |||
205 | public double llVecDist(vector a, vector b) | ||
206 | { | ||
207 | return m_LSL_Functions.llVecDist(a, b); | ||
208 | } | ||
209 | |||
210 | public vector llRot2Euler(rotation r) | ||
211 | { | ||
212 | return m_LSL_Functions.llRot2Euler(r); | ||
213 | } | ||
214 | |||
215 | public rotation llEuler2Rot(vector v) | ||
216 | { | ||
217 | return m_LSL_Functions.llEuler2Rot(v); | ||
218 | } | ||
219 | |||
220 | public rotation llAxes2Rot(vector fwd, vector left, vector up) | ||
221 | { | ||
222 | return m_LSL_Functions.llAxes2Rot(fwd, left, up); | ||
223 | } | ||
224 | |||
225 | public vector llRot2Fwd(rotation r) | ||
226 | { | ||
227 | return m_LSL_Functions.llRot2Fwd(r); | ||
228 | } | ||
229 | |||
230 | public vector llRot2Left(rotation r) | ||
231 | { | ||
232 | return m_LSL_Functions.llRot2Left(r); | ||
233 | } | ||
234 | |||
235 | public vector llRot2Up(rotation r) | ||
236 | { | ||
237 | return m_LSL_Functions.llRot2Up(r); | ||
238 | } | ||
239 | |||
240 | public rotation llRotBetween(vector start, vector end) | ||
241 | { | ||
242 | return m_LSL_Functions.llRotBetween(start, end); | ||
243 | } | ||
244 | |||
245 | public void llWhisper(int channelID, string text) | ||
246 | { | ||
247 | m_LSL_Functions.llWhisper(channelID, text); | ||
248 | } | ||
249 | |||
250 | public void llSay(int channelID, string text) | ||
251 | { | ||
252 | m_LSL_Functions.llSay(channelID, text); | ||
253 | } | ||
254 | |||
255 | // | ||
256 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs | ||
257 | // | ||
258 | public void llShout(int channelID, string text) | ||
259 | { | ||
260 | m_LSL_Functions.llShout(channelID, text); | ||
261 | } | ||
262 | |||
263 | public int llListen(int channelID, string name, string ID, string msg) | ||
264 | { | ||
265 | return m_LSL_Functions.llListen(channelID, name, ID, msg); | ||
266 | } | ||
267 | |||
268 | public void llListenControl(int number, int active) | ||
269 | { | ||
270 | m_LSL_Functions.llListenControl(number, active); | ||
271 | } | ||
272 | |||
273 | public void llListenRemove(int number) | ||
274 | { | ||
275 | m_LSL_Functions.llListenRemove(number); | ||
276 | } | ||
277 | |||
278 | public void llSensor(string name, string id, int type, double range, double arc) | ||
279 | { | ||
280 | m_LSL_Functions.llSensor(name, id, type, range, arc); | ||
281 | } | ||
282 | |||
283 | public void llSensorRepeat(string name, string id, int type, double range, double arc, double rate) | ||
284 | { | ||
285 | m_LSL_Functions.llSensorRepeat(name, id, type, range, arc, rate); | ||
286 | } | ||
287 | |||
288 | public void llSensorRemove() | ||
289 | { | ||
290 | m_LSL_Functions.llSensorRemove(); | ||
291 | } | ||
292 | |||
293 | public string llDetectedName(int number) | ||
294 | { | ||
295 | return m_LSL_Functions.llDetectedName(number); | ||
296 | } | ||
297 | |||
298 | public string llDetectedKey(int number) | ||
299 | { | ||
300 | return m_LSL_Functions.llDetectedKey(number); | ||
301 | } | ||
302 | |||
303 | public string llDetectedOwner(int number) | ||
304 | { | ||
305 | return m_LSL_Functions.llDetectedOwner(number); | ||
306 | } | ||
307 | |||
308 | public int llDetectedType(int number) | ||
309 | { | ||
310 | return m_LSL_Functions.llDetectedType(number); | ||
311 | } | ||
312 | |||
313 | public vector llDetectedPos(int number) | ||
314 | { | ||
315 | return m_LSL_Functions.llDetectedPos(number); | ||
316 | } | ||
317 | |||
318 | public vector llDetectedVel(int number) | ||
319 | { | ||
320 | return m_LSL_Functions.llDetectedVel(number); | ||
321 | } | ||
322 | |||
323 | public vector llDetectedGrab(int number) | ||
324 | { | ||
325 | return m_LSL_Functions.llDetectedGrab(number); | ||
326 | } | ||
327 | |||
328 | public rotation llDetectedRot(int number) | ||
329 | { | ||
330 | return m_LSL_Functions.llDetectedRot(number); | ||
331 | } | ||
332 | |||
333 | public int llDetectedGroup(int number) | ||
334 | { | ||
335 | return m_LSL_Functions.llDetectedGroup(number); | ||
336 | } | ||
337 | |||
338 | public int llDetectedLinkNumber(int number) | ||
339 | { | ||
340 | return m_LSL_Functions.llDetectedLinkNumber(number); | ||
341 | } | ||
342 | |||
343 | // | ||
344 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs | ||
345 | // | ||
346 | public void llDie() | ||
347 | { | ||
348 | m_LSL_Functions.llDie(); | ||
349 | } | ||
350 | |||
351 | public double llGround(vector offset) | ||
352 | { | ||
353 | return m_LSL_Functions.llGround(offset); | ||
354 | } | ||
355 | |||
356 | public double llCloud(vector offset) | ||
357 | { | ||
358 | return m_LSL_Functions.llCloud(offset); | ||
359 | } | ||
360 | |||
361 | public vector llWind(vector offset) | ||
362 | { | ||
363 | return m_LSL_Functions.llWind(offset); | ||
364 | } | ||
365 | |||
366 | public void llSetStatus(int status, int value) | ||
367 | { | ||
368 | m_LSL_Functions.llSetStatus(status, value); | ||
369 | } | ||
370 | |||
371 | public int llGetStatus(int status) | ||
372 | { | ||
373 | return m_LSL_Functions.llGetStatus(status); | ||
374 | } | ||
375 | |||
376 | public void llSetScale(vector scale) | ||
377 | { | ||
378 | m_LSL_Functions.llSetScale(scale); | ||
379 | } | ||
380 | |||
381 | public vector llGetScale() | ||
382 | { | ||
383 | return m_LSL_Functions.llGetScale(); | ||
384 | } | ||
385 | |||
386 | public void llSetColor(vector color, int face) | ||
387 | { | ||
388 | m_LSL_Functions.llSetColor(color, face); | ||
389 | } | ||
390 | |||
391 | public double llGetAlpha(int face) | ||
392 | { | ||
393 | return m_LSL_Functions.llGetAlpha(face); | ||
394 | } | ||
395 | |||
396 | public void llSetAlpha(double alpha, int face) | ||
397 | { | ||
398 | m_LSL_Functions.llSetAlpha(alpha, face); | ||
399 | } | ||
400 | |||
401 | public vector llGetColor(int face) | ||
402 | { | ||
403 | return m_LSL_Functions.llGetColor(face); | ||
404 | } | ||
405 | |||
406 | public void llSetTexture(string texture, int face) | ||
407 | { | ||
408 | m_LSL_Functions.llSetTexture(texture, face); | ||
409 | } | ||
410 | |||
411 | public void llScaleTexture(double u, double v, int face) | ||
412 | { | ||
413 | m_LSL_Functions.llScaleTexture(u, v, face); | ||
414 | } | ||
415 | |||
416 | public void llOffsetTexture(double u, double v, int face) | ||
417 | { | ||
418 | m_LSL_Functions.llOffsetTexture(u, v, face); | ||
419 | } | ||
420 | |||
421 | public void llRotateTexture(double rotation, int face) | ||
422 | { | ||
423 | m_LSL_Functions.llRotateTexture(rotation, face); | ||
424 | } | ||
425 | |||
426 | public string llGetTexture(int face) | ||
427 | { | ||
428 | return m_LSL_Functions.llGetTexture(face); | ||
429 | } | ||
430 | |||
431 | // | ||
432 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs | ||
433 | // | ||
434 | public void llSetPos(vector pos) | ||
435 | { | ||
436 | m_LSL_Functions.llSetPos(pos); | ||
437 | } | ||
438 | |||
439 | public vector llGetPos() | ||
440 | { | ||
441 | return m_LSL_Functions.llGetPos(); | ||
442 | } | ||
443 | |||
444 | public vector llGetLocalPos() | ||
445 | { | ||
446 | return m_LSL_Functions.llGetLocalPos(); | ||
447 | } | ||
448 | |||
449 | public void llSetRot(rotation rot) | ||
450 | { | ||
451 | m_LSL_Functions.llSetRot(rot); | ||
452 | } | ||
453 | |||
454 | public rotation llGetRot() | ||
455 | { | ||
456 | return m_LSL_Functions.llGetRot(); | ||
457 | } | ||
458 | |||
459 | public rotation llGetLocalRot() | ||
460 | { | ||
461 | return m_LSL_Functions.llGetLocalRot(); | ||
462 | } | ||
463 | |||
464 | public void llSetForce(vector force, int local) | ||
465 | { | ||
466 | m_LSL_Functions.llSetForce(force, local); | ||
467 | } | ||
468 | |||
469 | public vector llGetForce() | ||
470 | { | ||
471 | return m_LSL_Functions.llGetForce(); | ||
472 | } | ||
473 | |||
474 | public int llTarget(vector position, double range) | ||
475 | { | ||
476 | return m_LSL_Functions.llTarget(position, range); | ||
477 | } | ||
478 | |||
479 | public void llTargetRemove(int number) | ||
480 | { | ||
481 | m_LSL_Functions.llTargetRemove(number); | ||
482 | } | ||
483 | |||
484 | public int llRotTarget(rotation rot, double error) | ||
485 | { | ||
486 | return m_LSL_Functions.llRotTarget(rot, error); | ||
487 | } | ||
488 | |||
489 | public void llRotTargetRemove(int number) | ||
490 | { | ||
491 | m_LSL_Functions.llRotTargetRemove(number); | ||
492 | } | ||
493 | |||
494 | public void llMoveToTarget(vector target, double tau) | ||
495 | { | ||
496 | m_LSL_Functions.llMoveToTarget(target, tau); | ||
497 | } | ||
498 | |||
499 | public void llStopMoveToTarget() | ||
500 | { | ||
501 | m_LSL_Functions.llStopMoveToTarget(); | ||
502 | } | ||
503 | |||
504 | public void llApplyImpulse(vector force, int local) | ||
505 | { | ||
506 | m_LSL_Functions.llApplyImpulse(force, local); | ||
507 | } | ||
508 | |||
509 | // | ||
510 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs | ||
511 | // | ||
512 | public void llApplyRotationalImpulse(vector force, int local) | ||
513 | { | ||
514 | m_LSL_Functions.llApplyRotationalImpulse(force, local); | ||
515 | } | ||
516 | |||
517 | public void llSetTorque(vector torque, int local) | ||
518 | { | ||
519 | m_LSL_Functions.llSetTorque(torque, local); | ||
520 | } | ||
521 | |||
522 | public vector llGetTorque() | ||
523 | { | ||
524 | return m_LSL_Functions.llGetTorque(); | ||
525 | } | ||
526 | |||
527 | public void llSetForceAndTorque(vector force, vector torque, int local) | ||
528 | { | ||
529 | m_LSL_Functions.llSetForceAndTorque(force, torque, local); | ||
530 | } | ||
531 | |||
532 | public vector llGetVel() | ||
533 | { | ||
534 | return m_LSL_Functions.llGetVel(); | ||
535 | } | ||
536 | |||
537 | public vector llGetAccel() | ||
538 | { | ||
539 | return m_LSL_Functions.llGetAccel(); | ||
540 | } | ||
541 | |||
542 | public vector llGetOmega() | ||
543 | { | ||
544 | return m_LSL_Functions.llGetOmega(); | ||
545 | } | ||
546 | |||
547 | public double llGetTimeOfDay() | ||
548 | { | ||
549 | return m_LSL_Functions.llGetTimeOfDay(); | ||
550 | } | ||
551 | |||
552 | public double llGetWallclock() | ||
553 | { | ||
554 | return m_LSL_Functions.llGetWallclock(); | ||
555 | } | ||
556 | |||
557 | public double llGetTime() | ||
558 | { | ||
559 | return m_LSL_Functions.llGetTime(); | ||
560 | } | ||
561 | |||
562 | public void llResetTime() | ||
563 | { | ||
564 | m_LSL_Functions.llResetTime(); | ||
565 | } | ||
566 | |||
567 | public double llGetAndResetTime() | ||
568 | { | ||
569 | return m_LSL_Functions.llGetAndResetTime(); | ||
570 | } | ||
571 | |||
572 | public void llSound() | ||
573 | { | ||
574 | m_LSL_Functions.llSound(); | ||
575 | } | ||
576 | |||
577 | public void llPlaySound(string sound, double volume) | ||
578 | { | ||
579 | m_LSL_Functions.llPlaySound(sound, volume); | ||
580 | } | ||
581 | |||
582 | public void llLoopSound(string sound, double volume) | ||
583 | { | ||
584 | m_LSL_Functions.llLoopSound(sound, volume); | ||
585 | } | ||
586 | |||
587 | public void llLoopSoundMaster(string sound, double volume) | ||
588 | { | ||
589 | m_LSL_Functions.llLoopSoundMaster(sound, volume); | ||
590 | } | ||
591 | |||
592 | public void llLoopSoundSlave(string sound, double volume) | ||
593 | { | ||
594 | m_LSL_Functions.llLoopSoundSlave(sound, volume); | ||
595 | } | ||
596 | |||
597 | public void llPlaySoundSlave(string sound, double volume) | ||
598 | { | ||
599 | m_LSL_Functions.llPlaySoundSlave(sound, volume); | ||
600 | } | ||
601 | |||
602 | // | ||
603 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs | ||
604 | // | ||
605 | public void llTriggerSound(string sound, double volume) | ||
606 | { | ||
607 | m_LSL_Functions.llTriggerSound(sound, volume); | ||
608 | } | ||
609 | |||
610 | public void llStopSound() | ||
611 | { | ||
612 | m_LSL_Functions.llStopSound(); | ||
613 | } | ||
614 | |||
615 | public void llPreloadSound(string sound) | ||
616 | { | ||
617 | m_LSL_Functions.llPreloadSound(sound); | ||
618 | } | ||
619 | |||
620 | public string llGetSubString(string src, int start, int end) | ||
621 | { | ||
622 | return m_LSL_Functions.llGetSubString(src, start, end); | ||
623 | } | ||
624 | |||
625 | public string llDeleteSubString(string src, int start, int end) | ||
626 | { | ||
627 | return m_LSL_Functions.llDeleteSubString(src, start, end); | ||
628 | } | ||
629 | |||
630 | public string llInsertString(string dst, int position, string src) | ||
631 | { | ||
632 | return m_LSL_Functions.llInsertString(dst, position, src); | ||
633 | } | ||
634 | |||
635 | public string llToUpper(string source) | ||
636 | { | ||
637 | return m_LSL_Functions.llToUpper(source); | ||
638 | } | ||
639 | |||
640 | public string llToLower(string source) | ||
641 | { | ||
642 | return m_LSL_Functions.llToLower(source); | ||
643 | } | ||
644 | |||
645 | public int llGiveMoney(string destination, int amount) | ||
646 | { | ||
647 | return m_LSL_Functions.llGiveMoney(destination, amount); | ||
648 | } | ||
649 | |||
650 | public void llMakeExplosion() | ||
651 | { | ||
652 | m_LSL_Functions.llMakeExplosion(); | ||
653 | } | ||
654 | |||
655 | public void llMakeFountain() | ||
656 | { | ||
657 | m_LSL_Functions.llMakeFountain(); | ||
658 | } | ||
659 | |||
660 | public void llMakeSmoke() | ||
661 | { | ||
662 | m_LSL_Functions.llMakeSmoke(); | ||
663 | } | ||
664 | |||
665 | public void llMakeFire() | ||
666 | { | ||
667 | m_LSL_Functions.llMakeFire(); | ||
668 | } | ||
669 | |||
670 | public void llRezObject(string inventory, vector pos, rotation rot, int param) | ||
671 | { | ||
672 | m_LSL_Functions.llRezObject(inventory, pos, rot, param); | ||
673 | } | ||
674 | |||
675 | public void llLookAt(vector target, double strength, double damping) | ||
676 | { | ||
677 | m_LSL_Functions.llLookAt(target, strength, damping); | ||
678 | } | ||
679 | |||
680 | public void llStopLookAt() | ||
681 | { | ||
682 | m_LSL_Functions.llStopLookAt(); | ||
683 | } | ||
684 | |||
685 | public void llSetTimerEvent(double sec) | ||
686 | { | ||
687 | m_LSL_Functions.llSetTimerEvent(sec); | ||
688 | } | ||
689 | |||
690 | public void llSleep(double sec) | ||
691 | { | ||
692 | m_LSL_Functions.llSleep(sec); | ||
693 | } | ||
694 | |||
695 | // | ||
696 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs | ||
697 | // | ||
698 | public double llGetMass() | ||
699 | { | ||
700 | return m_LSL_Functions.llGetMass(); | ||
701 | } | ||
702 | |||
703 | public void llCollisionFilter(string name, string id, int accept) | ||
704 | { | ||
705 | m_LSL_Functions.llCollisionFilter(name, id, accept); | ||
706 | } | ||
707 | |||
708 | public void llTakeControls(int controls, int accept, int pass_on) | ||
709 | { | ||
710 | m_LSL_Functions.llTakeControls(controls, accept, pass_on); | ||
711 | } | ||
712 | |||
713 | public void llReleaseControls() | ||
714 | { | ||
715 | m_LSL_Functions.llReleaseControls(); | ||
716 | } | ||
717 | |||
718 | public void llAttachToAvatar(int attachment) | ||
719 | { | ||
720 | m_LSL_Functions.llAttachToAvatar(attachment); | ||
721 | } | ||
722 | |||
723 | public void llDetachFromAvatar() | ||
724 | { | ||
725 | m_LSL_Functions.llDetachFromAvatar(); | ||
726 | } | ||
727 | |||
728 | public void llTakeCamera() | ||
729 | { | ||
730 | m_LSL_Functions.llTakeCamera(); | ||
731 | } | ||
732 | |||
733 | public void llReleaseCamera() | ||
734 | { | ||
735 | m_LSL_Functions.llReleaseCamera(); | ||
736 | } | ||
737 | |||
738 | public string llGetOwner() | ||
739 | { | ||
740 | return m_LSL_Functions.llGetOwner(); | ||
741 | } | ||
742 | |||
743 | public void llInstantMessage(string user, string message) | ||
744 | { | ||
745 | m_LSL_Functions.llInstantMessage(user, message); | ||
746 | } | ||
747 | |||
748 | public void llEmail(string address, string subject, string message) | ||
749 | { | ||
750 | m_LSL_Functions.llEmail(address, subject, message); | ||
751 | } | ||
752 | |||
753 | public void llGetNextEmail(string address, string subject) | ||
754 | { | ||
755 | m_LSL_Functions.llGetNextEmail(address, subject); | ||
756 | } | ||
757 | |||
758 | public string llGetKey() | ||
759 | { | ||
760 | return m_LSL_Functions.llGetKey(); | ||
761 | } | ||
762 | |||
763 | public void llSetBuoyancy(double buoyancy) | ||
764 | { | ||
765 | m_LSL_Functions.llSetBuoyancy(buoyancy); | ||
766 | } | ||
767 | |||
768 | public void llSetHoverHeight(double height, int water, double tau) | ||
769 | { | ||
770 | m_LSL_Functions.llSetHoverHeight(height, water, tau); | ||
771 | } | ||
772 | |||
773 | public void llStopHover() | ||
774 | { | ||
775 | m_LSL_Functions.llStopHover(); | ||
776 | } | ||
777 | |||
778 | public void llMinEventDelay(double delay) | ||
779 | { | ||
780 | m_LSL_Functions.llMinEventDelay(delay); | ||
781 | } | ||
782 | |||
783 | public void llSoundPreload() | ||
784 | { | ||
785 | m_LSL_Functions.llSoundPreload(); | ||
786 | } | ||
787 | |||
788 | public void llRotLookAt(rotation target, double strength, double damping) | ||
789 | { | ||
790 | m_LSL_Functions.llRotLookAt(target, strength, damping); | ||
791 | } | ||
792 | |||
793 | // | ||
794 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs | ||
795 | // | ||
796 | public int llStringLength(string str) | ||
797 | { | ||
798 | return m_LSL_Functions.llStringLength(str); | ||
799 | } | ||
800 | |||
801 | public void llStartAnimation(string anim) | ||
802 | { | ||
803 | m_LSL_Functions.llStartAnimation(anim); | ||
804 | } | ||
805 | |||
806 | public void llStopAnimation(string anim) | ||
807 | { | ||
808 | m_LSL_Functions.llStopAnimation(anim); | ||
809 | } | ||
810 | |||
811 | public void llPointAt() | ||
812 | { | ||
813 | m_LSL_Functions.llPointAt(); | ||
814 | } | ||
815 | |||
816 | public void llStopPointAt() | ||
817 | { | ||
818 | m_LSL_Functions.llStopPointAt(); | ||
819 | } | ||
820 | |||
821 | public void llTargetOmega(vector axis, double spinrate, double gain) | ||
822 | { | ||
823 | m_LSL_Functions.llTargetOmega(axis, spinrate, gain); | ||
824 | } | ||
825 | |||
826 | public int llGetStartParameter() | ||
827 | { | ||
828 | return m_LSL_Functions.llGetStartParameter(); | ||
829 | } | ||
830 | |||
831 | public void llGodLikeRezObject(string inventory, vector pos) | ||
832 | { | ||
833 | m_LSL_Functions.llGodLikeRezObject(inventory, pos); | ||
834 | } | ||
835 | |||
836 | public void llRequestPermissions(string agent, int perm) | ||
837 | { | ||
838 | m_LSL_Functions.llRequestPermissions(agent, perm); | ||
839 | } | ||
840 | |||
841 | public string llGetPermissionsKey() | ||
842 | { | ||
843 | return m_LSL_Functions.llGetPermissionsKey(); | ||
844 | } | ||
845 | |||
846 | public int llGetPermissions() | ||
847 | { | ||
848 | return m_LSL_Functions.llGetPermissions(); | ||
849 | } | ||
850 | |||
851 | public int llGetLinkNumber() | ||
852 | { | ||
853 | return m_LSL_Functions.llGetLinkNumber(); | ||
854 | } | ||
855 | |||
856 | public void llSetLinkColor(int linknumber, vector color, int face) | ||
857 | { | ||
858 | m_LSL_Functions.llSetLinkColor(linknumber, color, face); | ||
859 | } | ||
860 | |||
861 | public void llCreateLink(string target, int parent) | ||
862 | { | ||
863 | m_LSL_Functions.llCreateLink(target, parent); | ||
864 | } | ||
865 | |||
866 | public void llBreakLink(int linknum) | ||
867 | { | ||
868 | m_LSL_Functions.llBreakLink(linknum); | ||
869 | } | ||
870 | |||
871 | public void llBreakAllLinks() | ||
872 | { | ||
873 | m_LSL_Functions.llBreakAllLinks(); | ||
874 | } | ||
875 | |||
876 | public string llGetLinkKey(int linknum) | ||
877 | { | ||
878 | return m_LSL_Functions.llGetLinkKey(linknum); | ||
879 | } | ||
880 | |||
881 | public string llGetLinkName(int linknum) | ||
882 | { | ||
883 | return m_LSL_Functions.llGetLinkName(linknum); | ||
884 | } | ||
885 | |||
886 | public int llGetInventoryNumber(int type) | ||
887 | { | ||
888 | return m_LSL_Functions.llGetInventoryNumber(type); | ||
889 | } | ||
890 | |||
891 | public string llGetInventoryName(int type, int number) | ||
892 | { | ||
893 | return m_LSL_Functions.llGetInventoryName(type, number); | ||
894 | } | ||
895 | |||
896 | // | ||
897 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs | ||
898 | // | ||
899 | public void llSetScriptState(string name, int run) | ||
900 | { | ||
901 | m_LSL_Functions.llSetScriptState(name, run); | ||
902 | } | ||
903 | |||
904 | public double llGetEnergy() | ||
905 | { | ||
906 | return m_LSL_Functions.llGetEnergy(); | ||
907 | } | ||
908 | |||
909 | public void llGiveInventory(string destination, string inventory) | ||
910 | { | ||
911 | m_LSL_Functions.llGiveInventory(destination, inventory); | ||
912 | } | ||
913 | |||
914 | public void llRemoveInventory(string item) | ||
915 | { | ||
916 | m_LSL_Functions.llRemoveInventory(item); | ||
917 | } | ||
918 | |||
919 | public void llSetText(string text, vector color, double alpha) | ||
920 | { | ||
921 | m_LSL_Functions.llSetText(text, color, alpha); | ||
922 | } | ||
923 | |||
924 | public double llWater(vector offset) | ||
925 | { | ||
926 | return m_LSL_Functions.llWater(offset); | ||
927 | } | ||
928 | |||
929 | public void llPassTouches(int pass) | ||
930 | { | ||
931 | m_LSL_Functions.llPassTouches(pass); | ||
932 | } | ||
933 | |||
934 | public string llRequestAgentData(string id, int data) | ||
935 | { | ||
936 | return m_LSL_Functions.llRequestAgentData(id, data); | ||
937 | } | ||
938 | |||
939 | public string llRequestInventoryData(string name) | ||
940 | { | ||
941 | return m_LSL_Functions.llRequestInventoryData(name); | ||
942 | } | ||
943 | |||
944 | public void llSetDamage(double damage) | ||
945 | { | ||
946 | m_LSL_Functions.llSetDamage(damage); | ||
947 | } | ||
948 | |||
949 | public void llTeleportAgentHome(string agent) | ||
950 | { | ||
951 | m_LSL_Functions.llTeleportAgentHome(agent); | ||
952 | } | ||
953 | |||
954 | public void llModifyLand(int action, int brush) | ||
955 | { | ||
956 | m_LSL_Functions.llModifyLand(action, brush); | ||
957 | } | ||
958 | |||
959 | public void llCollisionSound(string impact_sound, double impact_volume) | ||
960 | { | ||
961 | m_LSL_Functions.llCollisionSound(impact_sound, impact_volume); | ||
962 | } | ||
963 | |||
964 | public void llCollisionSprite(string impact_sprite) | ||
965 | { | ||
966 | m_LSL_Functions.llCollisionSprite(impact_sprite); | ||
967 | } | ||
968 | |||
969 | public string llGetAnimation(string id) | ||
970 | { | ||
971 | return m_LSL_Functions.llGetAnimation(id); | ||
972 | } | ||
973 | |||
974 | public void llResetScript() | ||
975 | { | ||
976 | m_LSL_Functions.llResetScript(); | ||
977 | } | ||
978 | |||
979 | public void llMessageLinked(int linknum, int num, string str, string id) | ||
980 | { | ||
981 | m_LSL_Functions.llMessageLinked(linknum, num, str, id); | ||
982 | } | ||
983 | |||
984 | public void llPushObject(string target, vector impulse, vector ang_impulse, int local) | ||
985 | { | ||
986 | m_LSL_Functions.llPushObject(target, impulse, ang_impulse, local); | ||
987 | } | ||
988 | |||
989 | public void llPassCollisions(int pass) | ||
990 | { | ||
991 | m_LSL_Functions.llPassCollisions(pass); | ||
992 | } | ||
993 | |||
994 | public string llGetScriptName() | ||
995 | { | ||
996 | return m_LSL_Functions.llGetScriptName(); | ||
997 | } | ||
998 | |||
999 | public int llGetNumberOfSides() | ||
1000 | { | ||
1001 | return m_LSL_Functions.llGetNumberOfSides(); | ||
1002 | } | ||
1003 | |||
1004 | // | ||
1005 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs | ||
1006 | // | ||
1007 | public rotation llAxisAngle2Rot(vector axis, double angle) | ||
1008 | { | ||
1009 | return m_LSL_Functions.llAxisAngle2Rot(axis, angle); | ||
1010 | } | ||
1011 | |||
1012 | public vector llRot2Axis(rotation rot) | ||
1013 | { | ||
1014 | return m_LSL_Functions.llRot2Axis(rot); | ||
1015 | } | ||
1016 | |||
1017 | public void llRot2Angle() | ||
1018 | { | ||
1019 | m_LSL_Functions.llRot2Angle(); | ||
1020 | } | ||
1021 | |||
1022 | public double llAcos(double val) | ||
1023 | { | ||
1024 | return m_LSL_Functions.llAcos(val); | ||
1025 | } | ||
1026 | |||
1027 | public double llAsin(double val) | ||
1028 | { | ||
1029 | return m_LSL_Functions.llAsin(val); | ||
1030 | } | ||
1031 | |||
1032 | public double llAngleBetween(rotation a, rotation b) | ||
1033 | { | ||
1034 | return m_LSL_Functions.llAngleBetween(a, b); | ||
1035 | } | ||
1036 | |||
1037 | public string llGetInventoryKey(string name) | ||
1038 | { | ||
1039 | return m_LSL_Functions.llGetInventoryKey(name); | ||
1040 | } | ||
1041 | |||
1042 | public void llAllowInventoryDrop(int add) | ||
1043 | { | ||
1044 | m_LSL_Functions.llAllowInventoryDrop(add); | ||
1045 | } | ||
1046 | |||
1047 | public vector llGetSunDirection() | ||
1048 | { | ||
1049 | return m_LSL_Functions.llGetSunDirection(); | ||
1050 | } | ||
1051 | |||
1052 | public vector llGetTextureOffset(int face) | ||
1053 | { | ||
1054 | return m_LSL_Functions.llGetTextureOffset(face); | ||
1055 | } | ||
1056 | |||
1057 | public vector llGetTextureScale(int side) | ||
1058 | { | ||
1059 | return m_LSL_Functions.llGetTextureScale(side); | ||
1060 | } | ||
1061 | |||
1062 | public double llGetTextureRot(int side) | ||
1063 | { | ||
1064 | return m_LSL_Functions.llGetTextureRot(side); | ||
1065 | } | ||
1066 | |||
1067 | public int llSubStringIndex(string source, string pattern) | ||
1068 | { | ||
1069 | return m_LSL_Functions.llSubStringIndex(source, pattern); | ||
1070 | } | ||
1071 | |||
1072 | public string llGetOwnerKey(string id) | ||
1073 | { | ||
1074 | return m_LSL_Functions.llGetOwnerKey(id); | ||
1075 | } | ||
1076 | |||
1077 | public vector llGetCenterOfMass() | ||
1078 | { | ||
1079 | return m_LSL_Functions.llGetCenterOfMass(); | ||
1080 | } | ||
1081 | |||
1082 | public LSL_Types.list llListSort(LSL_Types.list src, int stride, int ascending) | ||
1083 | { | ||
1084 | return m_LSL_Functions.llListSort(src, stride, ascending); | ||
1085 | } | ||
1086 | |||
1087 | public int llGetListLength(LSL_Types.list src) | ||
1088 | { | ||
1089 | return m_LSL_Functions.llGetListLength(src); | ||
1090 | } | ||
1091 | |||
1092 | // | ||
1093 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs | ||
1094 | // | ||
1095 | public int llList2Integer(LSL_Types.list src, int index) | ||
1096 | { | ||
1097 | return m_LSL_Functions.llList2Integer(src, index); | ||
1098 | } | ||
1099 | |||
1100 | public double osList2Double(LSL_Types.list src, int index) | ||
1101 | { | ||
1102 | return m_LSL_Functions.osList2Double(src, index); | ||
1103 | } | ||
1104 | |||
1105 | public string llList2String(LSL_Types.list src, int index) | ||
1106 | { | ||
1107 | return m_LSL_Functions.llList2String(src, index); | ||
1108 | } | ||
1109 | |||
1110 | public string llList2Key(LSL_Types.list src, int index) | ||
1111 | { | ||
1112 | return m_LSL_Functions.llList2Key(src, index); | ||
1113 | } | ||
1114 | |||
1115 | public vector llList2Vector(LSL_Types.list src, int index) | ||
1116 | { | ||
1117 | return m_LSL_Functions.llList2Vector(src, index); | ||
1118 | } | ||
1119 | |||
1120 | public rotation llList2Rot(LSL_Types.list src, int index) | ||
1121 | { | ||
1122 | return m_LSL_Functions.llList2Rot(src, index); | ||
1123 | } | ||
1124 | |||
1125 | public LSL_Types.list llList2List(LSL_Types.list src, int start, int end) | ||
1126 | { | ||
1127 | return m_LSL_Functions.llList2List(src, start, end); | ||
1128 | } | ||
1129 | |||
1130 | public LSL_Types.list llDeleteSubList(LSL_Types.list src, int start, int end) | ||
1131 | { | ||
1132 | return m_LSL_Functions.llDeleteSubList(src, start, end); | ||
1133 | } | ||
1134 | |||
1135 | public int llGetListEntryType(LSL_Types.list src, int index) | ||
1136 | { | ||
1137 | return m_LSL_Functions.llGetListEntryType(src, index); | ||
1138 | } | ||
1139 | |||
1140 | public string llList2CSV(LSL_Types.list src) | ||
1141 | { | ||
1142 | return m_LSL_Functions.llList2CSV(src); | ||
1143 | } | ||
1144 | |||
1145 | public LSL_Types.list llCSV2List(string src) | ||
1146 | { | ||
1147 | return m_LSL_Functions.llCSV2List(src); | ||
1148 | } | ||
1149 | |||
1150 | public LSL_Types.list llListRandomize(LSL_Types.list src, int stride) | ||
1151 | { | ||
1152 | return m_LSL_Functions.llListRandomize(src, stride); | ||
1153 | } | ||
1154 | |||
1155 | public LSL_Types.list llList2ListStrided(LSL_Types.list src, int start, int end, int stride) | ||
1156 | { | ||
1157 | return m_LSL_Functions.llList2ListStrided(src, start, end, stride); | ||
1158 | } | ||
1159 | |||
1160 | public vector llGetRegionCorner() | ||
1161 | { | ||
1162 | return m_LSL_Functions.llGetRegionCorner(); | ||
1163 | } | ||
1164 | |||
1165 | public LSL_Types.list llListInsertList(LSL_Types.list dest, LSL_Types.list src, int start) | ||
1166 | { | ||
1167 | return m_LSL_Functions.llListInsertList(dest, src, start); | ||
1168 | } | ||
1169 | |||
1170 | public int llListFindList(LSL_Types.list src, LSL_Types.list test) | ||
1171 | { | ||
1172 | return m_LSL_Functions.llListFindList(src, test); | ||
1173 | } | ||
1174 | |||
1175 | public string llGetObjectName() | ||
1176 | { | ||
1177 | return m_LSL_Functions.llGetObjectName(); | ||
1178 | } | ||
1179 | |||
1180 | public void llSetObjectName(string name) | ||
1181 | { | ||
1182 | m_LSL_Functions.llSetObjectName(name); | ||
1183 | } | ||
1184 | |||
1185 | public string llGetDate() | ||
1186 | { | ||
1187 | return m_LSL_Functions.llGetDate(); | ||
1188 | } | ||
1189 | |||
1190 | public int llEdgeOfWorld(vector pos, vector dir) | ||
1191 | { | ||
1192 | return m_LSL_Functions.llEdgeOfWorld(pos, dir); | ||
1193 | } | ||
1194 | |||
1195 | public int llGetAgentInfo(string id) | ||
1196 | { | ||
1197 | return m_LSL_Functions.llGetAgentInfo(id); | ||
1198 | } | ||
1199 | |||
1200 | // | ||
1201 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs | ||
1202 | // | ||
1203 | public void llAdjustSoundVolume(double volume) | ||
1204 | { | ||
1205 | m_LSL_Functions.llAdjustSoundVolume(volume); | ||
1206 | } | ||
1207 | |||
1208 | public void llSetSoundQueueing(int queue) | ||
1209 | { | ||
1210 | m_LSL_Functions.llSetSoundQueueing(queue); | ||
1211 | } | ||
1212 | |||
1213 | public void llSetSoundRadius(double radius) | ||
1214 | { | ||
1215 | m_LSL_Functions.llSetSoundRadius(radius); | ||
1216 | } | ||
1217 | |||
1218 | public string llKey2Name(string id) | ||
1219 | { | ||
1220 | return m_LSL_Functions.llKey2Name(id); | ||
1221 | } | ||
1222 | |||
1223 | public void llSetTextureAnim(int mode, int face, int sizex, int sizey, double start, double length, double rate) | ||
1224 | { | ||
1225 | m_LSL_Functions.llSetTextureAnim(mode, face, sizex, sizey, start, length, rate); | ||
1226 | } | ||
1227 | |||
1228 | public void llTriggerSoundLimited(string sound, double volume, vector top_north_east, vector bottom_south_west) | ||
1229 | { | ||
1230 | m_LSL_Functions.llTriggerSoundLimited(sound, volume, top_north_east, bottom_south_west); | ||
1231 | } | ||
1232 | |||
1233 | public void llEjectFromLand(string pest) | ||
1234 | { | ||
1235 | m_LSL_Functions.llEjectFromLand(pest); | ||
1236 | } | ||
1237 | |||
1238 | public void llParseString2List() | ||
1239 | { | ||
1240 | m_LSL_Functions.llParseString2List(); | ||
1241 | } | ||
1242 | |||
1243 | public int llOverMyLand(string id) | ||
1244 | { | ||
1245 | return m_LSL_Functions.llOverMyLand(id); | ||
1246 | } | ||
1247 | |||
1248 | public string llGetLandOwnerAt(vector pos) | ||
1249 | { | ||
1250 | return m_LSL_Functions.llGetLandOwnerAt(pos); | ||
1251 | } | ||
1252 | |||
1253 | public string llGetNotecardLine(string name, int line) | ||
1254 | { | ||
1255 | return m_LSL_Functions.llGetNotecardLine(name, line); | ||
1256 | } | ||
1257 | |||
1258 | public vector llGetAgentSize(string id) | ||
1259 | { | ||
1260 | return m_LSL_Functions.llGetAgentSize(id); | ||
1261 | } | ||
1262 | |||
1263 | public int llSameGroup(string agent) | ||
1264 | { | ||
1265 | return m_LSL_Functions.llSameGroup(agent); | ||
1266 | } | ||
1267 | |||
1268 | public void llUnSit(string id) | ||
1269 | { | ||
1270 | m_LSL_Functions.llUnSit(id); | ||
1271 | } | ||
1272 | |||
1273 | public vector llGroundSlope(vector offset) | ||
1274 | { | ||
1275 | return m_LSL_Functions.llGroundSlope(offset); | ||
1276 | } | ||
1277 | |||
1278 | public vector llGroundNormal(vector offset) | ||
1279 | { | ||
1280 | return m_LSL_Functions.llGroundNormal(offset); | ||
1281 | } | ||
1282 | |||
1283 | public vector llGroundContour(vector offset) | ||
1284 | { | ||
1285 | return m_LSL_Functions.llGroundContour(offset); | ||
1286 | } | ||
1287 | |||
1288 | public int llGetAttached() | ||
1289 | { | ||
1290 | return m_LSL_Functions.llGetAttached(); | ||
1291 | } | ||
1292 | |||
1293 | public int llGetFreeMemory() | ||
1294 | { | ||
1295 | return m_LSL_Functions.llGetFreeMemory(); | ||
1296 | } | ||
1297 | |||
1298 | public string llGetRegionName() | ||
1299 | { | ||
1300 | return m_LSL_Functions.llGetRegionName(); | ||
1301 | } | ||
1302 | |||
1303 | public double llGetRegionTimeDilation() | ||
1304 | { | ||
1305 | return m_LSL_Functions.llGetRegionTimeDilation(); | ||
1306 | } | ||
1307 | |||
1308 | public double llGetRegionFPS() | ||
1309 | { | ||
1310 | return m_LSL_Functions.llGetRegionFPS(); | ||
1311 | } | ||
1312 | |||
1313 | // | ||
1314 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs | ||
1315 | // | ||
1316 | public void llParticleSystem(List<Object> rules) | ||
1317 | { | ||
1318 | m_LSL_Functions.llParticleSystem(rules); | ||
1319 | } | ||
1320 | |||
1321 | public void llGroundRepel(double height, int water, double tau) | ||
1322 | { | ||
1323 | m_LSL_Functions.llGroundRepel(height, water, tau); | ||
1324 | } | ||
1325 | |||
1326 | public void llGiveInventoryList() | ||
1327 | { | ||
1328 | m_LSL_Functions.llGiveInventoryList(); | ||
1329 | } | ||
1330 | |||
1331 | public void llSetVehicleType(int type) | ||
1332 | { | ||
1333 | m_LSL_Functions.llSetVehicleType(type); | ||
1334 | } | ||
1335 | |||
1336 | public void llSetVehicledoubleParam(int param, double value) | ||
1337 | { | ||
1338 | m_LSL_Functions.llSetVehicledoubleParam(param, value); | ||
1339 | } | ||
1340 | |||
1341 | public void llSetVehicleVectorParam(int param, vector vec) | ||
1342 | { | ||
1343 | m_LSL_Functions.llSetVehicleVectorParam(param, vec); | ||
1344 | } | ||
1345 | |||
1346 | public void llSetVehicleRotationParam(int param, rotation rot) | ||
1347 | { | ||
1348 | m_LSL_Functions.llSetVehicleRotationParam(param, rot); | ||
1349 | } | ||
1350 | |||
1351 | public void llSetVehicleFlags(int flags) | ||
1352 | { | ||
1353 | m_LSL_Functions.llSetVehicleFlags(flags); | ||
1354 | } | ||
1355 | |||
1356 | public void llRemoveVehicleFlags(int flags) | ||
1357 | { | ||
1358 | m_LSL_Functions.llRemoveVehicleFlags(flags); | ||
1359 | } | ||
1360 | |||
1361 | public void llSitTarget(vector offset, rotation rot) | ||
1362 | { | ||
1363 | m_LSL_Functions.llSitTarget(offset, rot); | ||
1364 | } | ||
1365 | |||
1366 | public string llAvatarOnSitTarget() | ||
1367 | { | ||
1368 | return m_LSL_Functions.llAvatarOnSitTarget(); | ||
1369 | } | ||
1370 | |||
1371 | public void llAddToLandPassList(string avatar, double hours) | ||
1372 | { | ||
1373 | m_LSL_Functions.llAddToLandPassList(avatar, hours); | ||
1374 | } | ||
1375 | |||
1376 | public void llSetTouchText(string text) | ||
1377 | { | ||
1378 | m_LSL_Functions.llSetTouchText(text); | ||
1379 | } | ||
1380 | |||
1381 | public void llSetSitText(string text) | ||
1382 | { | ||
1383 | m_LSL_Functions.llSetSitText(text); | ||
1384 | } | ||
1385 | |||
1386 | public void llSetCameraEyeOffset(vector offset) | ||
1387 | { | ||
1388 | m_LSL_Functions.llSetCameraEyeOffset(offset); | ||
1389 | } | ||
1390 | |||
1391 | public void llSetCameraAtOffset(vector offset) | ||
1392 | { | ||
1393 | m_LSL_Functions.llSetCameraAtOffset(offset); | ||
1394 | } | ||
1395 | |||
1396 | public string llDumpList2String(LSL_Types.list src, string seperator) | ||
1397 | { | ||
1398 | return m_LSL_Functions.llDumpList2String(src, seperator); | ||
1399 | } | ||
1400 | |||
1401 | public void llScriptDanger(vector pos) | ||
1402 | { | ||
1403 | m_LSL_Functions.llScriptDanger(pos); | ||
1404 | } | ||
1405 | |||
1406 | public void llDialog(string avatar, string message, LSL_Types.list buttons, int chat_channel) | ||
1407 | { | ||
1408 | m_LSL_Functions.llDialog(avatar, message, buttons, chat_channel); | ||
1409 | } | ||
1410 | |||
1411 | public void llVolumeDetect(int detect) | ||
1412 | { | ||
1413 | m_LSL_Functions.llVolumeDetect(detect); | ||
1414 | } | ||
1415 | |||
1416 | public void llResetOtherScript(string name) | ||
1417 | { | ||
1418 | m_LSL_Functions.llResetOtherScript(name); | ||
1419 | } | ||
1420 | |||
1421 | public int llGetScriptState(string name) | ||
1422 | { | ||
1423 | return m_LSL_Functions.llGetScriptState(name); | ||
1424 | } | ||
1425 | |||
1426 | public void llRemoteLoadScript() | ||
1427 | { | ||
1428 | m_LSL_Functions.llRemoteLoadScript(); | ||
1429 | } | ||
1430 | |||
1431 | public void llSetRemoteScriptAccessPin(int pin) | ||
1432 | { | ||
1433 | m_LSL_Functions.llSetRemoteScriptAccessPin(pin); | ||
1434 | } | ||
1435 | |||
1436 | public void llRemoteLoadScriptPin(string target, string name, int pin, int running, int start_param) | ||
1437 | { | ||
1438 | m_LSL_Functions.llRemoteLoadScriptPin(target, name, pin, running, start_param); | ||
1439 | } | ||
1440 | |||
1441 | // | ||
1442 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs | ||
1443 | // | ||
1444 | public void llOpenRemoteDataChannel() | ||
1445 | { | ||
1446 | m_LSL_Functions.llOpenRemoteDataChannel(); | ||
1447 | } | ||
1448 | |||
1449 | public string llSendRemoteData(string channel, string dest, int idata, string sdata) | ||
1450 | { | ||
1451 | return m_LSL_Functions.llSendRemoteData(channel, dest, idata, sdata); | ||
1452 | } | ||
1453 | |||
1454 | public void llRemoteDataReply(string channel, string message_id, string sdata, int idata) | ||
1455 | { | ||
1456 | m_LSL_Functions.llRemoteDataReply(channel, message_id, sdata, idata); | ||
1457 | } | ||
1458 | |||
1459 | public void llCloseRemoteDataChannel(string channel) | ||
1460 | { | ||
1461 | m_LSL_Functions.llCloseRemoteDataChannel(channel); | ||
1462 | } | ||
1463 | |||
1464 | public string llMD5String(string src, int nonce) | ||
1465 | { | ||
1466 | return m_LSL_Functions.llMD5String(src, nonce); | ||
1467 | } | ||
1468 | |||
1469 | public void llSetPrimitiveParams(LSL_Types.list rules) | ||
1470 | { | ||
1471 | m_LSL_Functions.llSetPrimitiveParams(rules); | ||
1472 | } | ||
1473 | |||
1474 | public string llStringToBase64(string str) | ||
1475 | { | ||
1476 | return m_LSL_Functions.llStringToBase64(str); | ||
1477 | } | ||
1478 | |||
1479 | public string llBase64ToString(string str) | ||
1480 | { | ||
1481 | return m_LSL_Functions.llBase64ToString(str); | ||
1482 | } | ||
1483 | |||
1484 | public void llXorBase64Strings() | ||
1485 | { | ||
1486 | m_LSL_Functions.llXorBase64Strings(); | ||
1487 | } | ||
1488 | |||
1489 | public void llRemoteDataSetRegion() | ||
1490 | { | ||
1491 | m_LSL_Functions.llRemoteDataSetRegion(); | ||
1492 | } | ||
1493 | |||
1494 | public double llLog10(double val) | ||
1495 | { | ||
1496 | return m_LSL_Functions.llLog10(val); | ||
1497 | } | ||
1498 | |||
1499 | public double llLog(double val) | ||
1500 | { | ||
1501 | return m_LSL_Functions.llLog(val); | ||
1502 | } | ||
1503 | |||
1504 | public LSL_Types.list llGetAnimationList(string id) | ||
1505 | { | ||
1506 | return m_LSL_Functions.llGetAnimationList(id); | ||
1507 | } | ||
1508 | |||
1509 | public void llSetParcelMusicURL(string url) | ||
1510 | { | ||
1511 | m_LSL_Functions.llSetParcelMusicURL(url); | ||
1512 | } | ||
1513 | |||
1514 | public vector llGetRootPosition() | ||
1515 | { | ||
1516 | return m_LSL_Functions.llGetRootPosition(); | ||
1517 | } | ||
1518 | |||
1519 | public rotation llGetRootRotation() | ||
1520 | { | ||
1521 | return m_LSL_Functions.llGetRootRotation(); | ||
1522 | } | ||
1523 | |||
1524 | public string llGetObjectDesc() | ||
1525 | { | ||
1526 | return m_LSL_Functions.llGetObjectDesc(); | ||
1527 | } | ||
1528 | |||
1529 | public void llSetObjectDesc(string desc) | ||
1530 | { | ||
1531 | m_LSL_Functions.llSetObjectDesc(desc); | ||
1532 | } | ||
1533 | |||
1534 | public string llGetCreator() | ||
1535 | { | ||
1536 | return m_LSL_Functions.llGetCreator(); | ||
1537 | } | ||
1538 | |||
1539 | public string llGetTimestamp() | ||
1540 | { | ||
1541 | return m_LSL_Functions.llGetTimestamp(); | ||
1542 | } | ||
1543 | |||
1544 | public void llSetLinkAlpha(int linknumber, double alpha, int face) | ||
1545 | { | ||
1546 | m_LSL_Functions.llSetLinkAlpha(linknumber, alpha, face); | ||
1547 | } | ||
1548 | |||
1549 | public int llGetNumberOfPrims() | ||
1550 | { | ||
1551 | return m_LSL_Functions.llGetNumberOfPrims(); | ||
1552 | } | ||
1553 | |||
1554 | public string llGetNumberOfNotecardLines(string name) | ||
1555 | { | ||
1556 | return m_LSL_Functions.llGetNumberOfNotecardLines(name); | ||
1557 | } | ||
1558 | |||
1559 | public LSL_Types.list llGetBoundingBox(string obj) | ||
1560 | { | ||
1561 | return m_LSL_Functions.llGetBoundingBox(obj); | ||
1562 | } | ||
1563 | |||
1564 | public vector llGetGeometricCenter() | ||
1565 | { | ||
1566 | return m_LSL_Functions.llGetGeometricCenter(); | ||
1567 | } | ||
1568 | |||
1569 | public void llGetPrimitiveParams() | ||
1570 | { | ||
1571 | m_LSL_Functions.llGetPrimitiveParams(); | ||
1572 | } | ||
1573 | |||
1574 | // | ||
1575 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs | ||
1576 | // | ||
1577 | public string llIntegerToBase64(int number) | ||
1578 | { | ||
1579 | return m_LSL_Functions.llIntegerToBase64(number); | ||
1580 | } | ||
1581 | |||
1582 | public int llBase64ToInteger(string str) | ||
1583 | { | ||
1584 | return m_LSL_Functions.llBase64ToInteger(str); | ||
1585 | } | ||
1586 | |||
1587 | public double llGetGMTclock() | ||
1588 | { | ||
1589 | return m_LSL_Functions.llGetGMTclock(); | ||
1590 | } | ||
1591 | |||
1592 | public string llGetSimulatorHostname() | ||
1593 | { | ||
1594 | return m_LSL_Functions.llGetSimulatorHostname(); | ||
1595 | } | ||
1596 | |||
1597 | public void llSetLocalRot(rotation rot) | ||
1598 | { | ||
1599 | m_LSL_Functions.llSetLocalRot(rot); | ||
1600 | } | ||
1601 | |||
1602 | public LSL_Types.list llParseStringKeepNulls(string src, LSL_Types.list seperators, LSL_Types.list spacers) | ||
1603 | { | ||
1604 | return m_LSL_Functions.llParseStringKeepNulls(src, seperators, spacers); | ||
1605 | } | ||
1606 | |||
1607 | public void llRezAtRoot(string inventory, vector position, vector velocity, rotation rot, int param) | ||
1608 | { | ||
1609 | m_LSL_Functions.llRezAtRoot(inventory, position, velocity, rot, param); | ||
1610 | } | ||
1611 | |||
1612 | public int llGetObjectPermMask(int mask) | ||
1613 | { | ||
1614 | return m_LSL_Functions.llGetObjectPermMask(mask); | ||
1615 | } | ||
1616 | |||
1617 | public void llSetObjectPermMask(int mask, int value) | ||
1618 | { | ||
1619 | m_LSL_Functions.llSetObjectPermMask(mask, value); | ||
1620 | } | ||
1621 | |||
1622 | public void llGetInventoryPermMask(string item, int mask) | ||
1623 | { | ||
1624 | m_LSL_Functions.llGetInventoryPermMask(item, mask); | ||
1625 | } | ||
1626 | |||
1627 | public void llSetInventoryPermMask(string item, int mask, int value) | ||
1628 | { | ||
1629 | m_LSL_Functions.llSetInventoryPermMask(item, mask, value); | ||
1630 | } | ||
1631 | |||
1632 | public string llGetInventoryCreator(string item) | ||
1633 | { | ||
1634 | return m_LSL_Functions.llGetInventoryCreator(item); | ||
1635 | } | ||
1636 | |||
1637 | public void llOwnerSay(string msg) | ||
1638 | { | ||
1639 | m_LSL_Functions.llOwnerSay(msg); | ||
1640 | } | ||
1641 | |||
1642 | public void llRequestSimulatorData(string simulator, int data) | ||
1643 | { | ||
1644 | m_LSL_Functions.llRequestSimulatorData(simulator, data); | ||
1645 | } | ||
1646 | |||
1647 | public void llForceMouselook(int mouselook) | ||
1648 | { | ||
1649 | m_LSL_Functions.llForceMouselook(mouselook); | ||
1650 | } | ||
1651 | |||
1652 | public double llGetObjectMass(string id) | ||
1653 | { | ||
1654 | return m_LSL_Functions.llGetObjectMass(id); | ||
1655 | } | ||
1656 | |||
1657 | public LSL_Types.list llListReplaceList(LSL_Types.list dest, LSL_Types.list src, int start, int end) | ||
1658 | { | ||
1659 | return m_LSL_Functions.llListReplaceList(dest, src, start, end); | ||
1660 | } | ||
1661 | |||
1662 | public void llLoadURL(string avatar_id, string message, string url) | ||
1663 | { | ||
1664 | m_LSL_Functions.llLoadURL(avatar_id, message, url); | ||
1665 | } | ||
1666 | |||
1667 | public void llParcelMediaCommandList(LSL_Types.list commandList) | ||
1668 | { | ||
1669 | m_LSL_Functions.llParcelMediaCommandList(commandList); | ||
1670 | } | ||
1671 | |||
1672 | public void llParcelMediaQuery() | ||
1673 | { | ||
1674 | m_LSL_Functions.llParcelMediaQuery(); | ||
1675 | } | ||
1676 | |||
1677 | public int llModPow(int a, int b, int c) | ||
1678 | { | ||
1679 | return m_LSL_Functions.llModPow(a, b, c); | ||
1680 | } | ||
1681 | |||
1682 | // | ||
1683 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs | ||
1684 | // | ||
1685 | public int llGetInventoryType(string name) | ||
1686 | { | ||
1687 | return m_LSL_Functions.llGetInventoryType(name); | ||
1688 | } | ||
1689 | |||
1690 | public void llSetPayPrice(int price, LSL_Types.list quick_pay_buttons) | ||
1691 | { | ||
1692 | m_LSL_Functions.llSetPayPrice(price, quick_pay_buttons); | ||
1693 | } | ||
1694 | |||
1695 | public vector llGetCameraPos() | ||
1696 | { | ||
1697 | return m_LSL_Functions.llGetCameraPos(); | ||
1698 | } | ||
1699 | |||
1700 | public rotation llGetCameraRot() | ||
1701 | { | ||
1702 | return m_LSL_Functions.llGetCameraRot(); | ||
1703 | } | ||
1704 | |||
1705 | public void llSetPrimURL() | ||
1706 | { | ||
1707 | m_LSL_Functions.llSetPrimURL(); | ||
1708 | } | ||
1709 | |||
1710 | public void llRefreshPrimURL() | ||
1711 | { | ||
1712 | m_LSL_Functions.llRefreshPrimURL(); | ||
1713 | } | ||
1714 | |||
1715 | public string llEscapeURL(string url) | ||
1716 | { | ||
1717 | return m_LSL_Functions.llEscapeURL(url); | ||
1718 | } | ||
1719 | |||
1720 | public string llUnescapeURL(string url) | ||
1721 | { | ||
1722 | return m_LSL_Functions.llUnescapeURL(url); | ||
1723 | } | ||
1724 | |||
1725 | public void llMapDestination(string simname, vector pos, vector look_at) | ||
1726 | { | ||
1727 | m_LSL_Functions.llMapDestination(simname, pos, look_at); | ||
1728 | } | ||
1729 | |||
1730 | public void llAddToLandBanList(string avatar, double hours) | ||
1731 | { | ||
1732 | m_LSL_Functions.llAddToLandBanList(avatar, hours); | ||
1733 | } | ||
1734 | |||
1735 | public void llRemoveFromLandPassList(string avatar) | ||
1736 | { | ||
1737 | m_LSL_Functions.llRemoveFromLandPassList(avatar); | ||
1738 | } | ||
1739 | |||
1740 | public void llRemoveFromLandBanList(string avatar) | ||
1741 | { | ||
1742 | m_LSL_Functions.llRemoveFromLandBanList(avatar); | ||
1743 | } | ||
1744 | |||
1745 | public void llSetCameraParams(LSL_Types.list rules) | ||
1746 | { | ||
1747 | m_LSL_Functions.llSetCameraParams(rules); | ||
1748 | } | ||
1749 | |||
1750 | public void llClearCameraParams() | ||
1751 | { | ||
1752 | m_LSL_Functions.llClearCameraParams(); | ||
1753 | } | ||
1754 | |||
1755 | public double llListStatistics(int operation, LSL_Types.list src) | ||
1756 | { | ||
1757 | return m_LSL_Functions.llListStatistics(operation, src); | ||
1758 | } | ||
1759 | |||
1760 | public int llGetUnixTime() | ||
1761 | { | ||
1762 | return m_LSL_Functions.llGetUnixTime(); | ||
1763 | } | ||
1764 | |||
1765 | public int llGetParcelFlags(vector pos) | ||
1766 | { | ||
1767 | return m_LSL_Functions.llGetParcelFlags(pos); | ||
1768 | } | ||
1769 | |||
1770 | public int llGetRegionFlags() | ||
1771 | { | ||
1772 | return m_LSL_Functions.llGetRegionFlags(); | ||
1773 | } | ||
1774 | |||
1775 | public string llXorBase64StringsCorrect(string str1, string str2) | ||
1776 | { | ||
1777 | return m_LSL_Functions.llXorBase64StringsCorrect(str1, str2); | ||
1778 | } | ||
1779 | |||
1780 | public string llHTTPRequest(string url, LSL_Types.list parameters, string body) | ||
1781 | { | ||
1782 | return m_LSL_Functions.llHTTPRequest(url, parameters, body); | ||
1783 | } | ||
1784 | |||
1785 | public void llResetLandBanList() | ||
1786 | { | ||
1787 | m_LSL_Functions.llResetLandBanList(); | ||
1788 | } | ||
1789 | |||
1790 | public void llResetLandPassList() | ||
1791 | { | ||
1792 | m_LSL_Functions.llResetLandPassList(); | ||
1793 | } | ||
1794 | |||
1795 | public int llGetParcelPrimCount(vector pos, int category, int sim_wide) | ||
1796 | { | ||
1797 | return m_LSL_Functions.llGetParcelPrimCount(pos, category, sim_wide); | ||
1798 | } | ||
1799 | |||
1800 | public LSL_Types.list llGetParcelPrimOwners(vector pos) | ||
1801 | { | ||
1802 | return m_LSL_Functions.llGetParcelPrimOwners(pos); | ||
1803 | } | ||
1804 | |||
1805 | public int llGetObjectPrimCount(string object_id) | ||
1806 | { | ||
1807 | return m_LSL_Functions.llGetObjectPrimCount(object_id); | ||
1808 | } | ||
1809 | |||
1810 | // | ||
1811 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs | ||
1812 | // | ||
1813 | public int llGetParcelMaxPrims(vector pos, int sim_wide) | ||
1814 | { | ||
1815 | return m_LSL_Functions.llGetParcelMaxPrims(pos, sim_wide); | ||
1816 | } | ||
1817 | |||
1818 | public LSL_Types.list llGetParcelDetails(vector pos, LSL_Types.list param) | ||
1819 | { | ||
1820 | return m_LSL_Functions.llGetParcelDetails(pos, param); | ||
1821 | } | ||
1822 | |||
1823 | // | ||
1824 | // OpenSim Functions | ||
1825 | // | ||
1826 | public string osSetDynamicTextureURL(string dynamicID, string contentType, string url, string extraParams, | ||
1827 | int timer) | ||
1828 | { | ||
1829 | return m_LSL_Functions.osSetDynamicTextureURL(dynamicID, contentType, url, extraParams, timer); | ||
1830 | } | ||
1831 | |||
1832 | public double osTerrainGetHeight(int x, int y) | ||
1833 | { | ||
1834 | return m_LSL_Functions.osTerrainGetHeight(x, y); | ||
1835 | } | ||
1836 | |||
1837 | public int osTerrainSetHeight(int x, int y, double val) | ||
1838 | { | ||
1839 | return m_LSL_Functions.osTerrainSetHeight(x, y, val); | ||
1840 | } | ||
1841 | |||
1842 | public int osRegionRestart(double seconds) | ||
1843 | { | ||
1844 | return m_LSL_Functions.osRegionRestart(seconds); | ||
1845 | } | ||
1846 | |||
1847 | // LSL CONSTANTS | ||
1848 | public const int TRUE = 1; | ||
1849 | public const int FALSE = 0; | ||
1850 | public const int STATUS_PHYSICS = 1; | ||
1851 | public const int STATUS_ROTATE_X = 2; | ||
1852 | public const int STATUS_ROTATE_Y = 4; | ||
1853 | public const int STATUS_ROTATE_Z = 8; | ||
1854 | public const int STATUS_PHANTOM = 16; | ||
1855 | public const int STATUS_SANDBOX = 32; | ||
1856 | public const int STATUS_BLOCK_GRAB = 64; | ||
1857 | public const int STATUS_DIE_AT_EDGE = 128; | ||
1858 | public const int STATUS_RETURN_AT_EDGE = 256; | ||
1859 | public const int AGENT = 1; | ||
1860 | public const int ACTIVE = 2; | ||
1861 | public const int PASSIVE = 4; | ||
1862 | public const int SCRIPTED = 8; | ||
1863 | public const int CONTROL_FWD = 1; | ||
1864 | public const int CONTROL_BACK = 2; | ||
1865 | public const int CONTROL_LEFT = 4; | ||
1866 | public const int CONTROL_RIGHT = 8; | ||
1867 | public const int CONTROL_UP = 16; | ||
1868 | public const int CONTROL_DOWN = 32; | ||
1869 | public const int CONTROL_ROT_LEFT = 256; | ||
1870 | public const int CONTROL_ROT_RIGHT = 512; | ||
1871 | public const int CONTROL_LBUTTON = 268435456; | ||
1872 | public const int CONTROL_ML_LBUTTON = 1073741824; | ||
1873 | public const int PERMISSION_DEBIT = 2; | ||
1874 | public const int PERMISSION_TAKE_CONTROLS = 4; | ||
1875 | public const int PERMISSION_REMAP_CONTROLS = 8; | ||
1876 | public const int PERMISSION_TRIGGER_ANIMATION = 16; | ||
1877 | public const int PERMISSION_ATTACH = 32; | ||
1878 | public const int PERMISSION_RELEASE_OWNERSHIP = 64; | ||
1879 | public const int PERMISSION_CHANGE_LINKS = 128; | ||
1880 | public const int PERMISSION_CHANGE_JOINTS = 256; | ||
1881 | public const int PERMISSION_CHANGE_PERMISSIONS = 512; | ||
1882 | public const int PERMISSION_TRACK_CAMERA = 1024; | ||
1883 | public const int AGENT_FLYING = 1; | ||
1884 | public const int AGENT_ATTACHMENTS = 2; | ||
1885 | public const int AGENT_SCRIPTED = 4; | ||
1886 | public const int AGENT_MOUSELOOK = 8; | ||
1887 | public const int AGENT_SITTING = 16; | ||
1888 | public const int AGENT_ON_OBJECT = 32; | ||
1889 | public const int AGENT_AWAY = 64; | ||
1890 | public const int AGENT_WALKING = 128; | ||
1891 | public const int AGENT_IN_AIR = 256; | ||
1892 | public const int AGENT_TYPING = 512; | ||
1893 | public const int AGENT_CROUCHING = 1024; | ||
1894 | public const int AGENT_BUSY = 2048; | ||
1895 | public const int AGENT_ALWAYS_RUN = 4096; | ||
1896 | public const int PSYS_PART_INTERP_COLOR_MASK = 1; | ||
1897 | public const int PSYS_PART_INTERP_SCALE_MASK = 2; | ||
1898 | public const int PSYS_PART_BOUNCE_MASK = 4; | ||
1899 | public const int PSYS_PART_WIND_MASK = 8; | ||
1900 | public const int PSYS_PART_FOLLOW_SRC_MASK = 16; | ||
1901 | public const int PSYS_PART_FOLLOW_VELOCITY_MASK = 32; | ||
1902 | public const int PSYS_PART_TARGET_POS_MASK = 64; | ||
1903 | public const int PSYS_PART_TARGET_LINEAR_MASK = 128; | ||
1904 | public const int PSYS_PART_EMISSIVE_MASK = 256; | ||
1905 | public const int PSYS_PART_FLAGS = 0; | ||
1906 | public const int PSYS_PART_START_COLOR = 1; | ||
1907 | public const int PSYS_PART_START_ALPHA = 2; | ||
1908 | public const int PSYS_PART_END_COLOR = 3; | ||
1909 | public const int PSYS_PART_END_ALPHA = 4; | ||
1910 | public const int PSYS_PART_START_SCALE = 5; | ||
1911 | public const int PSYS_PART_END_SCALE = 6; | ||
1912 | public const int PSYS_PART_MAX_AGE = 7; | ||
1913 | public const int PSYS_SRC_ACCEL = 8; | ||
1914 | public const int PSYS_SRC_PATTERN = 9; | ||
1915 | public const int PSYS_SRC_INNERANGLE = 10; | ||
1916 | public const int PSYS_SRC_OUTERANGLE = 11; | ||
1917 | public const int PSYS_SRC_TEXTURE = 12; | ||
1918 | public const int PSYS_SRC_BURST_RATE = 13; | ||
1919 | public const int PSYS_SRC_BURST_PART_COUNT = 15; | ||
1920 | public const int PSYS_SRC_BURST_RADIUS = 16; | ||
1921 | public const int PSYS_SRC_BURST_SPEED_MIN = 17; | ||
1922 | public const int PSYS_SRC_BURST_SPEED_MAX = 18; | ||
1923 | public const int PSYS_SRC_MAX_AGE = 19; | ||
1924 | public const int PSYS_SRC_TARGET_KEY = 20; | ||
1925 | public const int PSYS_SRC_OMEGA = 21; | ||
1926 | public const int PSYS_SRC_ANGLE_BEGIN = 22; | ||
1927 | public const int PSYS_SRC_ANGLE_END = 23; | ||
1928 | public const int PSYS_SRC_PATTERN_DROP = 1; | ||
1929 | public const int PSYS_SRC_PATTERN_EXPLODE = 2; | ||
1930 | public const int PSYS_SRC_PATTERN_ANGLE = 4; | ||
1931 | public const int PSYS_SRC_PATTERN_ANGLE_CONE = 8; | ||
1932 | public const int PSYS_SRC_PATTERN_ANGLE_CONE_EMPTY = 16; | ||
1933 | public const int VEHICLE_TYPE_NONE = 0; | ||
1934 | public const int VEHICLE_TYPE_SLED = 1; | ||
1935 | public const int VEHICLE_TYPE_CAR = 2; | ||
1936 | public const int VEHICLE_TYPE_BOAT = 3; | ||
1937 | public const int VEHICLE_TYPE_AIRPLANE = 4; | ||
1938 | public const int VEHICLE_TYPE_BALLOON = 5; | ||
1939 | public const int VEHICLE_LINEAR_FRICTION_TIMESCALE = 16; | ||
1940 | public const int VEHICLE_ANGULAR_FRICTION_TIMESCALE = 17; | ||
1941 | public const int VEHICLE_LINEAR_MOTOR_DIRECTION = 18; | ||
1942 | public const int VEHICLE_LINEAR_MOTOR_OFFSET = 20; | ||
1943 | public const int VEHICLE_ANGULAR_MOTOR_DIRECTION = 19; | ||
1944 | public const int VEHICLE_HOVER_HEIGHT = 24; | ||
1945 | public const int VEHICLE_HOVER_EFFICIENCY = 25; | ||
1946 | public const int VEHICLE_HOVER_TIMESCALE = 26; | ||
1947 | public const int VEHICLE_BUOYANCY = 27; | ||
1948 | public const int VEHICLE_LINEAR_DEFLECTION_EFFICIENCY = 28; | ||
1949 | public const int VEHICLE_LINEAR_DEFLECTION_TIMESCALE = 29; | ||
1950 | public const int VEHICLE_LINEAR_MOTOR_TIMESCALE = 30; | ||
1951 | public const int VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE = 31; | ||
1952 | public const int VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY = 32; | ||
1953 | public const int VEHICLE_ANGULAR_DEFLECTION_TIMESCALE = 33; | ||
1954 | public const int VEHICLE_ANGULAR_MOTOR_TIMESCALE = 34; | ||
1955 | public const int VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE = 35; | ||
1956 | public const int VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY = 36; | ||
1957 | public const int VEHICLE_VERTICAL_ATTRACTION_TIMESCALE = 37; | ||
1958 | public const int VEHICLE_BANKING_EFFICIENCY = 38; | ||
1959 | public const int VEHICLE_BANKING_MIX = 39; | ||
1960 | public const int VEHICLE_BANKING_TIMESCALE = 40; | ||
1961 | public const int VEHICLE_REFERENCE_FRAME = 44; | ||
1962 | public const int VEHICLE_FLAG_NO_DEFLECTION_UP = 1; | ||
1963 | public const int VEHICLE_FLAG_LIMIT_ROLL_ONLY = 2; | ||
1964 | public const int VEHICLE_FLAG_HOVER_WATER_ONLY = 4; | ||
1965 | public const int VEHICLE_FLAG_HOVER_TERRAIN_ONLY = 8; | ||
1966 | public const int VEHICLE_FLAG_HOVER_GLOBAL_HEIGHT = 16; | ||
1967 | public const int VEHICLE_FLAG_HOVER_UP_ONLY = 32; | ||
1968 | public const int VEHICLE_FLAG_LIMIT_MOTOR_UP = 64; | ||
1969 | public const int VEHICLE_FLAG_MOUSELOOK_STEER = 128; | ||
1970 | public const int VEHICLE_FLAG_MOUSELOOK_BANK = 256; | ||
1971 | public const int VEHICLE_FLAG_CAMERA_DECOUPLED = 512; | ||
1972 | public const int INVENTORY_ALL = -1; | ||
1973 | public const int INVENTORY_NONE = -1; | ||
1974 | public const int INVENTORY_TEXTURE = 0; | ||
1975 | public const int INVENTORY_SOUND = 1; | ||
1976 | public const int INVENTORY_LANDMARK = 3; | ||
1977 | public const int INVENTORY_CLOTHING = 5; | ||
1978 | public const int INVENTORY_OBJECT = 6; | ||
1979 | public const int INVENTORY_NOTECARD = 7; | ||
1980 | public const int INVENTORY_SCRIPT = 10; | ||
1981 | public const int INVENTORY_BODYPART = 13; | ||
1982 | public const int INVENTORY_ANIMATION = 20; | ||
1983 | public const int INVENTORY_GESTURE = 21; | ||
1984 | public const int ATTACH_CHEST = 1; | ||
1985 | public const int ATTACH_HEAD = 2; | ||
1986 | public const int ATTACH_LSHOULDER = 3; | ||
1987 | public const int ATTACH_RSHOULDER = 4; | ||
1988 | public const int ATTACH_LHAND = 5; | ||
1989 | public const int ATTACH_RHAND = 6; | ||
1990 | public const int ATTACH_LFOOT = 7; | ||
1991 | public const int ATTACH_RFOOT = 8; | ||
1992 | public const int ATTACH_BACK = 9; | ||
1993 | public const int ATTACH_PELVIS = 10; | ||
1994 | public const int ATTACH_MOUTH = 11; | ||
1995 | public const int ATTACH_CHIN = 12; | ||
1996 | public const int ATTACH_LEAR = 13; | ||
1997 | public const int ATTACH_REAR = 14; | ||
1998 | public const int ATTACH_LEYE = 15; | ||
1999 | public const int ATTACH_REYE = 16; | ||
2000 | public const int ATTACH_NOSE = 17; | ||
2001 | public const int ATTACH_RUARM = 18; | ||
2002 | public const int ATTACH_RLARM = 19; | ||
2003 | public const int ATTACH_LUARM = 20; | ||
2004 | public const int ATTACH_LLARM = 21; | ||
2005 | public const int ATTACH_RHIP = 22; | ||
2006 | public const int ATTACH_RULEG = 23; | ||
2007 | public const int ATTACH_RLLEG = 24; | ||
2008 | public const int ATTACH_LHIP = 25; | ||
2009 | public const int ATTACH_LULEG = 26; | ||
2010 | public const int ATTACH_LLLEG = 27; | ||
2011 | public const int ATTACH_BELLY = 28; | ||
2012 | public const int ATTACH_RPEC = 29; | ||
2013 | public const int ATTACH_LPEC = 30; | ||
2014 | public const int LAND_LEVEL = 0; | ||
2015 | public const int LAND_RAISE = 1; | ||
2016 | public const int LAND_LOWER = 2; | ||
2017 | public const int LAND_SMOOTH = 3; | ||
2018 | public const int LAND_NOISE = 4; | ||
2019 | public const int LAND_REVERT = 5; | ||
2020 | public const int LAND_SMALL_BRUSH = 1; | ||
2021 | public const int LAND_MEDIUM_BRUSH = 2; | ||
2022 | public const int LAND_LARGE_BRUSH = 3; | ||
2023 | public const int DATA_ONLINE = 1; | ||
2024 | public const int DATA_NAME = 2; | ||
2025 | public const int DATA_BORN = 3; | ||
2026 | public const int DATA_RATING = 4; | ||
2027 | public const int DATA_SIM_POS = 5; | ||
2028 | public const int DATA_SIM_STATUS = 6; | ||
2029 | public const int DATA_SIM_RATING = 7; | ||
2030 | public const int ANIM_ON = 1; | ||
2031 | public const int LOOP = 2; | ||
2032 | public const int REVERSE = 4; | ||
2033 | public const int PING_PONG = 8; | ||
2034 | public const int SMOOTH = 16; | ||
2035 | public const int ROTATE = 32; | ||
2036 | public const int SCALE = 64; | ||
2037 | public const int ALL_SIDES = -1; | ||
2038 | public const int LINK_SET = -1; | ||
2039 | public const int LINK_ROOT = 1; | ||
2040 | public const int LINK_ALL_OTHERS = -2; | ||
2041 | public const int LINK_ALL_CHILDREN = -3; | ||
2042 | public const int LINK_THIS = -4; | ||
2043 | public const int CHANGED_INVENTORY = 1; | ||
2044 | public const int CHANGED_COLOR = 2; | ||
2045 | public const int CHANGED_SHAPE = 4; | ||
2046 | public const int CHANGED_SCALE = 8; | ||
2047 | public const int CHANGED_TEXTURE = 16; | ||
2048 | public const int CHANGED_LINK = 32; | ||
2049 | public const int CHANGED_ALLOWED_DROP = 64; | ||
2050 | public const int CHANGED_OWNER = 128; | ||
2051 | public const int TYPE_INVALID = 0; | ||
2052 | public const int TYPE_INTEGER = 1; | ||
2053 | public const int TYPE_double = 2; | ||
2054 | public const int TYPE_STRING = 3; | ||
2055 | public const int TYPE_KEY = 4; | ||
2056 | public const int TYPE_VECTOR = 5; | ||
2057 | public const int TYPE_ROTATION = 6; | ||
2058 | public const int REMOTE_DATA_CHANNEL = 1; | ||
2059 | public const int REMOTE_DATA_REQUEST = 2; | ||
2060 | public const int REMOTE_DATA_REPLY = 3; | ||
2061 | |||
2062 | public const int PRIM_MATERIAL = 2; | ||
2063 | public const int PRIM_PHYSICS = 3; | ||
2064 | public const int PRIM_TEMP_ON_REZ = 4; | ||
2065 | public const int PRIM_PHANTOM = 5; | ||
2066 | public const int PRIM_POSITION = 6; | ||
2067 | public const int PRIM_SIZE = 7; | ||
2068 | public const int PRIM_ROTATION = 8; | ||
2069 | public const int PRIM_TYPE = 9; | ||
2070 | public const int PRIM_TEXTURE = 17; | ||
2071 | public const int PRIM_COLOR = 18; | ||
2072 | public const int PRIM_BUMP_SHINY = 19; | ||
2073 | public const int PRIM_FULLBRIGHT = 20; | ||
2074 | public const int PRIM_FLEXIBLE = 21; | ||
2075 | public const int PRIM_TEXGEN = 22; | ||
2076 | public const int PRIM_CAST_SHADOWS = 24; // Not implemented, here for completeness sake | ||
2077 | public const int PRIM_POINT_LIGHT = 23; // Huh? | ||
2078 | public const int PRIM_TEXGEN_DEFAULT = 0; | ||
2079 | public const int PRIM_TEXGEN_PLANAR = 1; | ||
2080 | public const int PRIM_TYPE_BOX = 0; | ||
2081 | public const int PRIM_TYPE_CYLINDER = 1; | ||
2082 | public const int PRIM_TYPE_PRISM = 2; | ||
2083 | public const int PRIM_TYPE_SPHERE = 3; | ||
2084 | public const int PRIM_TYPE_TORUS = 4; | ||
2085 | public const int PRIM_TYPE_TUBE = 5; | ||
2086 | public const int PRIM_TYPE_RING = 6; | ||
2087 | public const int PRIM_TYPE_SCULPT = 7; | ||
2088 | public const int PRIM_HOLE_DEFAULT = 0; | ||
2089 | public const int PRIM_HOLE_CIRCLE = 16; | ||
2090 | public const int PRIM_HOLE_SQUARE = 32; | ||
2091 | public const int PRIM_HOLE_TRIANGLE = 48; | ||
2092 | public const int PRIM_MATERIAL_STONE = 0; | ||
2093 | public const int PRIM_MATERIAL_METAL = 1; | ||
2094 | public const int PRIM_MATERIAL_GLASS = 2; | ||
2095 | public const int PRIM_MATERIAL_WOOD = 3; | ||
2096 | public const int PRIM_MATERIAL_FLESH = 4; | ||
2097 | public const int PRIM_MATERIAL_PLASTIC = 5; | ||
2098 | public const int PRIM_MATERIAL_RUBBER = 6; | ||
2099 | public const int PRIM_MATERIAL_LIGHT = 7; | ||
2100 | public const int PRIM_SHINY_NONE = 0; | ||
2101 | public const int PRIM_SHINY_LOW = 1; | ||
2102 | public const int PRIM_SHINY_MEDIUM = 2; | ||
2103 | public const int PRIM_SHINY_HIGH = 3; | ||
2104 | public const int PRIM_BUMP_NONE = 0; | ||
2105 | public const int PRIM_BUMP_BRIGHT = 1; | ||
2106 | public const int PRIM_BUMP_DARK = 2; | ||
2107 | public const int PRIM_BUMP_WOOD = 3; | ||
2108 | public const int PRIM_BUMP_BARK = 4; | ||
2109 | public const int PRIM_BUMP_BRICKS = 5; | ||
2110 | public const int PRIM_BUMP_CHECKER = 6; | ||
2111 | public const int PRIM_BUMP_CONCRETE = 7; | ||
2112 | public const int PRIM_BUMP_TILE = 8; | ||
2113 | public const int PRIM_BUMP_STONE = 9; | ||
2114 | public const int PRIM_BUMP_DISKS = 10; | ||
2115 | public const int PRIM_BUMP_GRAVEL = 11; | ||
2116 | public const int PRIM_BUMP_BLOBS = 12; | ||
2117 | public const int PRIM_BUMP_SIDING = 13; | ||
2118 | public const int PRIM_BUMP_LARGETILE = 14; | ||
2119 | public const int PRIM_BUMP_STUCCO = 15; | ||
2120 | public const int PRIM_BUMP_SUCTION = 16; | ||
2121 | public const int PRIM_BUMP_WEAVE = 17; | ||
2122 | |||
2123 | public const int PRIM_SCULPT_TYPE_SPHERE = 1; | ||
2124 | public const int PRIM_SCULPT_TYPE_TORUS = 2; | ||
2125 | public const int PRIM_SCULPT_TYPE_PLANE = 3; | ||
2126 | public const int PRIM_SCULPT_TYPE_CYLINDER = 4; | ||
2127 | |||
2128 | |||
2129 | public const int MASK_BASE = 0; | ||
2130 | public const int MASK_OWNER = 1; | ||
2131 | public const int MASK_GROUP = 2; | ||
2132 | public const int MASK_EVERYONE = 3; | ||
2133 | public const int MASK_NEXT = 4; | ||
2134 | public const int PERM_TRANSFER = 8192; | ||
2135 | public const int PERM_MODIFY = 16384; | ||
2136 | public const int PERM_COPY = 32768; | ||
2137 | public const int PERM_MOVE = 524288; | ||
2138 | public const int PERM_ALL = 2147483647; | ||
2139 | public const int PARCEL_MEDIA_COMMAND_STOP = 0; | ||
2140 | public const int PARCEL_MEDIA_COMMAND_PAUSE = 1; | ||
2141 | public const int PARCEL_MEDIA_COMMAND_PLAY = 2; | ||
2142 | public const int PARCEL_MEDIA_COMMAND_LOOP = 3; | ||
2143 | public const int PARCEL_MEDIA_COMMAND_TEXTURE = 4; | ||
2144 | public const int PARCEL_MEDIA_COMMAND_URL = 5; | ||
2145 | public const int PARCEL_MEDIA_COMMAND_TIME = 6; | ||
2146 | public const int PARCEL_MEDIA_COMMAND_AGENT = 7; | ||
2147 | public const int PARCEL_MEDIA_COMMAND_UNLOAD = 8; | ||
2148 | public const int PARCEL_MEDIA_COMMAND_AUTO_ALIGN = 9; | ||
2149 | public const int PAY_HIDE = -1; | ||
2150 | public const int PAY_DEFAULT = -2; | ||
2151 | public const string NULL_KEY = "00000000-0000-0000-0000-000000000000"; | ||
2152 | public const string EOF = "\n\n\n"; | ||
2153 | public const double PI = 3.14159274f; | ||
2154 | public const double TWO_PI = 6.28318548f; | ||
2155 | public const double PI_BY_TWO = 1.57079637f; | ||
2156 | public const double DEG_TO_RAD = 0.01745329238f; | ||
2157 | public const double RAD_TO_DEG = 57.29578f; | ||
2158 | public const double SQRT2 = 1.414213538f; | ||
2159 | |||
2160 | // Can not be public const? | ||
2161 | public vector ZERO_VECTOR = new vector(0, 0, 0); | ||
2162 | public rotation ZERO_ROTATION = new rotation(0, 0, 0, 0); | ||
2163 | |||
2164 | } | ||
2165 | } \ No newline at end of file | ||
diff --git a/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs b/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs new file mode 100644 index 0000000..f4a1a00 --- /dev/null +++ b/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs | |||
@@ -0,0 +1,3003 @@ | |||
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.Common | ||
43 | { | ||
44 | /// <summary> | ||
45 | /// Contains all LSL ll-functions. This class will be in Default AppDomain. | ||
46 | /// </summary> | ||
47 | public class LSL_BuiltIn_Commands : MarshalByRefObject, LSL_BuiltIn_Commands_Interface | ||
48 | { | ||
49 | private ASCIIEncoding enc = new ASCIIEncoding(); | ||
50 | private ScriptEngineBase.ScriptEngine m_ScriptEngine; | ||
51 | private SceneObjectPart m_host; | ||
52 | private uint m_localID; | ||
53 | private LLUUID m_itemID; | ||
54 | private bool throwErrorOnNotImplemented = true; | ||
55 | |||
56 | public LSL_BuiltIn_Commands(ScriptEngineBase.ScriptEngine ScriptEngine, SceneObjectPart host, uint localID, LLUUID itemID) | ||
57 | { | ||
58 | m_ScriptEngine = ScriptEngine; | ||
59 | m_host = host; | ||
60 | m_localID = localID; | ||
61 | m_itemID = itemID; | ||
62 | |||
63 | //MainLog.Instance.Notice("ScriptEngine", "LSL_BaseClass.Start() called. Hosted by [" + m_host.Name + ":" + m_host.UUID + "@" + m_host.AbsolutePosition + "]"); | ||
64 | } | ||
65 | |||
66 | private DateTime m_timer = DateTime.Now; | ||
67 | private string m_state = "default"; | ||
68 | |||
69 | public string State() | ||
70 | { | ||
71 | return m_state; | ||
72 | } | ||
73 | |||
74 | // Object never expires | ||
75 | public override Object InitializeLifetimeService() | ||
76 | { | ||
77 | //Console.WriteLine("LSL_BuiltIn_Commands: InitializeLifetimeService()"); | ||
78 | // return null; | ||
79 | ILease lease = (ILease)base.InitializeLifetimeService(); | ||
80 | |||
81 | if (lease.CurrentState == LeaseState.Initial) | ||
82 | { | ||
83 | lease.InitialLeaseTime = TimeSpan.Zero; // TimeSpan.FromMinutes(1); | ||
84 | // lease.SponsorshipTimeout = TimeSpan.FromMinutes(2); | ||
85 | // lease.RenewOnCallTime = TimeSpan.FromSeconds(2); | ||
86 | } | ||
87 | return lease; | ||
88 | } | ||
89 | |||
90 | public Scene World | ||
91 | { | ||
92 | get { return m_ScriptEngine.World; } | ||
93 | } | ||
94 | |||
95 | //These are the implementations of the various ll-functions used by the LSL scripts. | ||
96 | //starting out, we use the System.Math library for trig functions. - ckrinke 8-14-07 | ||
97 | public double llSin(double f) | ||
98 | { | ||
99 | |||
100 | return (double)Math.Sin(f); | ||
101 | } | ||
102 | |||
103 | public double llCos(double f) | ||
104 | { | ||
105 | return (double)Math.Cos(f); | ||
106 | } | ||
107 | |||
108 | public double llTan(double f) | ||
109 | { | ||
110 | return (double)Math.Tan(f); | ||
111 | } | ||
112 | |||
113 | public double llAtan2(double x, double y) | ||
114 | { | ||
115 | return (double)Math.Atan2(y, x); | ||
116 | } | ||
117 | |||
118 | public double llSqrt(double f) | ||
119 | { | ||
120 | return (double)Math.Sqrt(f); | ||
121 | } | ||
122 | |||
123 | public double llPow(double fbase, double fexponent) | ||
124 | { | ||
125 | return (double)Math.Pow(fbase, fexponent); | ||
126 | } | ||
127 | |||
128 | public int llAbs(int i) | ||
129 | { | ||
130 | return (int)Math.Abs(i); | ||
131 | } | ||
132 | |||
133 | public double llFabs(double f) | ||
134 | { | ||
135 | return (double)Math.Abs(f); | ||
136 | } | ||
137 | |||
138 | public double llFrand(double mag) | ||
139 | { | ||
140 | lock (Util.RandomClass) | ||
141 | { | ||
142 | return Util.RandomClass.NextDouble() * mag; | ||
143 | } | ||
144 | } | ||
145 | |||
146 | public int llFloor(double f) | ||
147 | { | ||
148 | return (int)Math.Floor(f); | ||
149 | } | ||
150 | |||
151 | public int llCeil(double f) | ||
152 | { | ||
153 | return (int)Math.Ceiling(f); | ||
154 | } | ||
155 | |||
156 | public int llRound(double f) | ||
157 | { | ||
158 | return (int)Math.Round(f, 0); | ||
159 | } | ||
160 | |||
161 | //This next group are vector operations involving squaring and square root. ckrinke | ||
162 | public double llVecMag(LSL_Types.Vector3 v) | ||
163 | { | ||
164 | return (v.x * v.x + v.y * v.y + v.z * v.z); | ||
165 | } | ||
166 | |||
167 | public LSL_Types.Vector3 llVecNorm(LSL_Types.Vector3 v) | ||
168 | { | ||
169 | double mag = v.x * v.x + v.y * v.y + v.z * v.z; | ||
170 | LSL_Types.Vector3 nor = new LSL_Types.Vector3(); | ||
171 | nor.x = v.x / mag; | ||
172 | nor.y = v.y / mag; | ||
173 | nor.z = v.z / mag; | ||
174 | return nor; | ||
175 | } | ||
176 | |||
177 | public double llVecDist(LSL_Types.Vector3 a, LSL_Types.Vector3 b) | ||
178 | { | ||
179 | double dx = a.x - b.x; | ||
180 | double dy = a.y - b.y; | ||
181 | double dz = a.z - b.z; | ||
182 | return Math.Sqrt(dx * dx + dy * dy + dz * dz); | ||
183 | } | ||
184 | |||
185 | //Now we start getting into quaternions which means sin/cos, matrices and vectors. ckrinke | ||
186 | public LSL_Types.Vector3 llRot2Euler(LSL_Types.Quaternion r) | ||
187 | { | ||
188 | //This implementation is from http://lslwiki.net/lslwiki/wakka.php?wakka=LibraryRotationFunctions. ckrinke | ||
189 | LSL_Types.Quaternion t = new LSL_Types.Quaternion(r.x * r.x, r.y * r.y, r.z * r.z, r.s * r.s); | ||
190 | double m = (t.x + t.y + t.z + t.s); | ||
191 | if (m == 0) return new LSL_Types.Vector3(); | ||
192 | double n = 2 * (r.y * r.s + r.x * r.z); | ||
193 | double p = m * m - n * n; | ||
194 | if (p > 0) | ||
195 | 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)), | ||
196 | Math.Atan2(n, Math.Sqrt(p)), | ||
197 | Math.Atan2(2.0 * (r.z * r.s - r.x * r.y), (t.x - t.y - t.z + t.s))); | ||
198 | else if (n > 0) | ||
199 | 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)); | ||
200 | else | ||
201 | 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)); | ||
202 | } | ||
203 | |||
204 | public LSL_Types.Quaternion llEuler2Rot(LSL_Types.Vector3 v) | ||
205 | { | ||
206 | //this comes from from http://lslwiki.net/lslwiki/wakka.php?wakka=LibraryRotationFunctions but is incomplete as of 8/19/07 | ||
207 | float err = 0.00001f; | ||
208 | double ax = Math.Sin(v.x / 2); | ||
209 | double aw = Math.Cos(v.x / 2); | ||
210 | double by = Math.Sin(v.y / 2); | ||
211 | double bw = Math.Cos(v.y / 2); | ||
212 | double cz = Math.Sin(v.z / 2); | ||
213 | double cw = Math.Cos(v.z / 2); | ||
214 | LSL_Types.Quaternion a1 = new LSL_Types.Quaternion(0.0, 0.0, cz, cw); | ||
215 | LSL_Types.Quaternion a2 = new LSL_Types.Quaternion(0.0, by, 0.0, bw); | ||
216 | LSL_Types.Quaternion a3 = new LSL_Types.Quaternion(ax, 0.0, 0.0, aw); | ||
217 | LSL_Types.Quaternion a = (a1 * a2) * a3; | ||
218 | //This multiplication doesnt compile, yet. a = a1 * a2 * a3; | ||
219 | LSL_Types.Quaternion b = new LSL_Types.Quaternion(ax * bw * cw + aw * by * cz, | ||
220 | aw * by * cw - ax * bw * cz, aw * bw * cz + ax * by * cw, | ||
221 | aw * bw * cw - ax * by * cz); | ||
222 | LSL_Types.Quaternion c = new LSL_Types.Quaternion(); | ||
223 | //This addition doesnt compile yet c = a + b; | ||
224 | LSL_Types.Quaternion d = new LSL_Types.Quaternion(); | ||
225 | //This addition doesnt compile yet d = a - b; | ||
226 | if ((Math.Abs(c.x) > err && Math.Abs(d.x) > err) || | ||
227 | (Math.Abs(c.y) > err && Math.Abs(d.y) > err) || | ||
228 | (Math.Abs(c.z) > err && Math.Abs(d.z) > err) || | ||
229 | (Math.Abs(c.s) > err && Math.Abs(d.s) > err)) | ||
230 | { | ||
231 | return b; | ||
232 | //return a new Quaternion that is null until I figure this out | ||
233 | // return b; | ||
234 | // return a; | ||
235 | } | ||
236 | return a; | ||
237 | } | ||
238 | |||
239 | public LSL_Types.Quaternion llAxes2Rot(LSL_Types.Vector3 fwd, LSL_Types.Vector3 left, LSL_Types.Vector3 up) | ||
240 | { | ||
241 | return new LSL_Types.Quaternion(); | ||
242 | } | ||
243 | |||
244 | public LSL_Types.Vector3 llRot2Fwd(LSL_Types.Quaternion r) | ||
245 | { | ||
246 | return new LSL_Types.Vector3(); | ||
247 | } | ||
248 | |||
249 | public LSL_Types.Vector3 llRot2Left(LSL_Types.Quaternion r) | ||
250 | { | ||
251 | return new LSL_Types.Vector3(); | ||
252 | } | ||
253 | |||
254 | public LSL_Types.Vector3 llRot2Up(LSL_Types.Quaternion r) | ||
255 | { | ||
256 | return new LSL_Types.Vector3(); | ||
257 | } | ||
258 | public LSL_Types.Quaternion llRotBetween(LSL_Types.Vector3 a, LSL_Types.Vector3 b) | ||
259 | { | ||
260 | //A and B should both be normalized | ||
261 | |||
262 | double dotProduct = LSL_Types.Vector3.Dot(a, b); | ||
263 | LSL_Types.Vector3 crossProduct = LSL_Types.Vector3.Cross(a, b); | ||
264 | double magProduct = LSL_Types.Vector3.Mag(a) * LSL_Types.Vector3.Mag(b); | ||
265 | double angle = Math.Acos(dotProduct / magProduct); | ||
266 | LSL_Types.Vector3 axis = LSL_Types.Vector3.Norm(crossProduct); | ||
267 | double s = Math.Sin(angle / 2); | ||
268 | |||
269 | return new LSL_Types.Quaternion(axis.x * s, axis.y * s, axis.z * s, (float)Math.Cos(angle / 2)); | ||
270 | } | ||
271 | public void llWhisper(int channelID, string text) | ||
272 | { | ||
273 | World.SimChat(Helpers.StringToField(text), | ||
274 | ChatTypeEnum.Whisper, channelID, m_host.AbsolutePosition, m_host.Name, m_host.UUID); | ||
275 | |||
276 | IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); | ||
277 | wComm.DeliverMessage(m_host.UUID.ToString(), ChatTypeEnum.Whisper, channelID, m_host.Name, text); | ||
278 | } | ||
279 | |||
280 | public void llSay(int channelID, string text) | ||
281 | { | ||
282 | World.SimChat(Helpers.StringToField(text), | ||
283 | ChatTypeEnum.Say, channelID, m_host.AbsolutePosition, m_host.Name, m_host.UUID); | ||
284 | |||
285 | IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); | ||
286 | wComm.DeliverMessage(m_host.UUID.ToString(), ChatTypeEnum.Say, channelID, m_host.Name, text); | ||
287 | } | ||
288 | |||
289 | public void llShout(int channelID, string text) | ||
290 | { | ||
291 | World.SimChat(Helpers.StringToField(text), | ||
292 | ChatTypeEnum.Shout, channelID, m_host.AbsolutePosition, m_host.Name, m_host.UUID); | ||
293 | |||
294 | IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); | ||
295 | wComm.DeliverMessage(m_host.UUID.ToString(), ChatTypeEnum.Shout, channelID, m_host.Name, text); | ||
296 | } | ||
297 | |||
298 | public int llListen(int channelID, string name, string ID, string msg) | ||
299 | { | ||
300 | if (ID == "") | ||
301 | { | ||
302 | ID = LLUUID.Zero.ToString(); | ||
303 | } | ||
304 | IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); | ||
305 | return wComm.Listen(m_localID, m_itemID, m_host.UUID, channelID, name, ID, msg); | ||
306 | } | ||
307 | |||
308 | public void llListenControl(int number, int active) | ||
309 | { | ||
310 | IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); | ||
311 | wComm.ListenControl(number, active); | ||
312 | } | ||
313 | |||
314 | public void llListenRemove(int number) | ||
315 | { | ||
316 | IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); | ||
317 | wComm.ListenRemove(number); | ||
318 | } | ||
319 | |||
320 | public void llSensor(string name, string id, int type, double range, double arc) | ||
321 | { | ||
322 | NotImplemented("llSensor"); | ||
323 | return; | ||
324 | } | ||
325 | |||
326 | public void llSensorRepeat(string name, string id, int type, double range, double arc, double rate) | ||
327 | { | ||
328 | NotImplemented("llSensorRepeat"); | ||
329 | return; | ||
330 | } | ||
331 | |||
332 | public void llSensorRemove() | ||
333 | { | ||
334 | NotImplemented("llSensorRemove"); | ||
335 | return; | ||
336 | } | ||
337 | |||
338 | public string llDetectedName(int number) | ||
339 | { | ||
340 | NotImplemented("llDetectedName"); | ||
341 | return ""; | ||
342 | } | ||
343 | |||
344 | public string llDetectedKey(int number) | ||
345 | { | ||
346 | NotImplemented("llDetectedKey"); | ||
347 | return ""; | ||
348 | } | ||
349 | |||
350 | public string llDetectedOwner(int number) | ||
351 | { | ||
352 | NotImplemented("llDetectedOwner"); | ||
353 | return ""; | ||
354 | } | ||
355 | |||
356 | public int llDetectedType(int number) | ||
357 | { | ||
358 | NotImplemented("llDetectedType"); | ||
359 | return 0; | ||
360 | } | ||
361 | |||
362 | public LSL_Types.Vector3 llDetectedPos(int number) | ||
363 | { | ||
364 | NotImplemented("llDetectedPos"); | ||
365 | return new LSL_Types.Vector3(); | ||
366 | } | ||
367 | |||
368 | public LSL_Types.Vector3 llDetectedVel(int number) | ||
369 | { | ||
370 | NotImplemented("llDetectedVel"); | ||
371 | return new LSL_Types.Vector3(); | ||
372 | } | ||
373 | |||
374 | public LSL_Types.Vector3 llDetectedGrab(int number) | ||
375 | { | ||
376 | NotImplemented("llDetectedGrab"); | ||
377 | return new LSL_Types.Vector3(); | ||
378 | } | ||
379 | |||
380 | public LSL_Types.Quaternion llDetectedRot(int number) | ||
381 | { | ||
382 | NotImplemented("llDetectedRot"); | ||
383 | return new LSL_Types.Quaternion(); | ||
384 | } | ||
385 | |||
386 | public int llDetectedGroup(int number) | ||
387 | { | ||
388 | NotImplemented("llDetectedGroup"); | ||
389 | return 0; | ||
390 | } | ||
391 | |||
392 | public int llDetectedLinkNumber(int number) | ||
393 | { | ||
394 | NotImplemented("llDetectedLinkNumber"); | ||
395 | return 0; | ||
396 | } | ||
397 | |||
398 | public void llDie() | ||
399 | { | ||
400 | World.DeleteSceneObjectGroup(m_host.ParentGroup); | ||
401 | return; | ||
402 | } | ||
403 | |||
404 | public double llGround(LSL_Types.Vector3 offset) | ||
405 | { | ||
406 | int x = (int)(m_host.AbsolutePosition.X + offset.x); | ||
407 | int y = (int)(m_host.AbsolutePosition.Y + offset.y); | ||
408 | return World.GetLandHeight(x, y); | ||
409 | } | ||
410 | |||
411 | public double llCloud(LSL_Types.Vector3 offset) | ||
412 | { | ||
413 | NotImplemented("llCloud"); | ||
414 | return 0; | ||
415 | } | ||
416 | |||
417 | public LSL_Types.Vector3 llWind(LSL_Types.Vector3 offset) | ||
418 | { | ||
419 | NotImplemented("llWind"); | ||
420 | return new LSL_Types.Vector3(); | ||
421 | } | ||
422 | |||
423 | public void llSetStatus(int status, int value) | ||
424 | { | ||
425 | NotImplemented("llSetStatus"); | ||
426 | return; | ||
427 | } | ||
428 | |||
429 | public int llGetStatus(int status) | ||
430 | { | ||
431 | NotImplemented("llGetStatus"); | ||
432 | return 0; | ||
433 | } | ||
434 | |||
435 | public void llSetScale(LSL_Types.Vector3 scale) | ||
436 | { | ||
437 | // TODO: this needs to trigger a persistance save as well | ||
438 | LLVector3 tmp = m_host.Scale; | ||
439 | tmp.X = (float)scale.x; | ||
440 | tmp.Y = (float)scale.y; | ||
441 | tmp.Z = (float)scale.z; | ||
442 | m_host.Scale = tmp; | ||
443 | m_host.SendFullUpdateToAllClients(); | ||
444 | return; | ||
445 | } | ||
446 | |||
447 | public LSL_Types.Vector3 llGetScale() | ||
448 | { | ||
449 | return new LSL_Types.Vector3(m_host.Scale.X, m_host.Scale.Y, m_host.Scale.Z); | ||
450 | } | ||
451 | |||
452 | public void llSetColor(LSL_Types.Vector3 color, int face) | ||
453 | { | ||
454 | LLObject.TextureEntry tex = m_host.Shape.Textures; | ||
455 | LLColor texcolor; | ||
456 | if (face > -1) | ||
457 | { | ||
458 | texcolor = tex.CreateFace((uint)face).RGBA; | ||
459 | texcolor.R = (float)Math.Abs(color.x - 1); | ||
460 | texcolor.G = (float)Math.Abs(color.y - 1); | ||
461 | texcolor.B = (float)Math.Abs(color.z - 1); | ||
462 | tex.FaceTextures[face].RGBA = texcolor; | ||
463 | m_host.UpdateTexture(tex); | ||
464 | return; | ||
465 | } | ||
466 | else if (face == -1) | ||
467 | { | ||
468 | for (uint i = 0; i < 32; i++) | ||
469 | { | ||
470 | if (tex.FaceTextures[i] != null) | ||
471 | { | ||
472 | texcolor = tex.FaceTextures[i].RGBA; | ||
473 | texcolor.R = (float)Math.Abs(color.x - 1); | ||
474 | texcolor.G = (float)Math.Abs(color.y - 1); | ||
475 | texcolor.B = (float)Math.Abs(color.z - 1); | ||
476 | tex.FaceTextures[i].RGBA = texcolor; | ||
477 | } | ||
478 | texcolor = tex.DefaultTexture.RGBA; | ||
479 | texcolor.R = (float)Math.Abs(color.x - 1); | ||
480 | texcolor.G = (float)Math.Abs(color.y - 1); | ||
481 | texcolor.B = (float)Math.Abs(color.z - 1); | ||
482 | tex.DefaultTexture.RGBA = texcolor; | ||
483 | } | ||
484 | m_host.UpdateTexture(tex); | ||
485 | return; | ||
486 | } | ||
487 | NotImplemented("llSetColor"); | ||
488 | return; | ||
489 | } | ||
490 | |||
491 | public double llGetAlpha(int face) | ||
492 | { | ||
493 | LLObject.TextureEntry tex = m_host.Shape.Textures; | ||
494 | if (face == -1) // TMP: Until we can determine number of sides, ALL_SIDES (-1) will return default color | ||
495 | { | ||
496 | return (double)((tex.DefaultTexture.RGBA.A * 255) / 255); | ||
497 | } | ||
498 | if (face > -1) | ||
499 | { | ||
500 | return (double)((tex.GetFace((uint)face).RGBA.A * 255) / 255); | ||
501 | } | ||
502 | return 0; | ||
503 | } | ||
504 | |||
505 | public void llSetAlpha(double alpha, int face) | ||
506 | { | ||
507 | LLObject.TextureEntry tex = m_host.Shape.Textures; | ||
508 | LLColor texcolor; | ||
509 | if (face > -1) | ||
510 | { | ||
511 | texcolor = tex.CreateFace((uint)face).RGBA; | ||
512 | texcolor.A = (float)Math.Abs(alpha - 1); | ||
513 | tex.FaceTextures[face].RGBA = texcolor; | ||
514 | m_host.UpdateTexture(tex); | ||
515 | return; | ||
516 | } | ||
517 | else if (face == -1) | ||
518 | { | ||
519 | for (int i = 0; i < 32; i++) | ||
520 | { | ||
521 | if (tex.FaceTextures[i] != null) | ||
522 | { | ||
523 | texcolor = tex.FaceTextures[i].RGBA; | ||
524 | texcolor.A = (float)Math.Abs(alpha - 1); | ||
525 | tex.FaceTextures[i].RGBA = texcolor; | ||
526 | } | ||
527 | } | ||
528 | texcolor = tex.DefaultTexture.RGBA; | ||
529 | texcolor.A = (float)Math.Abs(alpha - 1); | ||
530 | tex.DefaultTexture.RGBA = texcolor; | ||
531 | m_host.UpdateTexture(tex); | ||
532 | return; | ||
533 | } | ||
534 | NotImplemented("llSetAlpha"); | ||
535 | return; | ||
536 | } | ||
537 | |||
538 | public LSL_Types.Vector3 llGetColor(int face) | ||
539 | { | ||
540 | LLObject.TextureEntry tex = m_host.Shape.Textures; | ||
541 | LLColor texcolor; | ||
542 | LSL_Types.Vector3 rgb; | ||
543 | if (face == -1) // TMP: Until we can determine number of sides, ALL_SIDES (-1) will return default color | ||
544 | { | ||
545 | texcolor = tex.DefaultTexture.RGBA; | ||
546 | rgb.x = (255 - (texcolor.R * 255)) / 255; | ||
547 | rgb.y = (255 - (texcolor.G * 255)) / 255; | ||
548 | rgb.z = (255 - (texcolor.B * 255)) / 255; | ||
549 | return rgb; | ||
550 | } | ||
551 | if (face > -1) | ||
552 | { | ||
553 | texcolor = tex.GetFace((uint)face).RGBA; | ||
554 | rgb.x = (255 - (texcolor.R * 255)) / 255; | ||
555 | rgb.y = (255 - (texcolor.G * 255)) / 255; | ||
556 | rgb.z = (255 - (texcolor.B * 255)) / 255; | ||
557 | return rgb; | ||
558 | } | ||
559 | NotImplemented("llGetColor"); | ||
560 | return new LSL_Types.Vector3(); | ||
561 | } | ||
562 | |||
563 | public void llSetTexture(string texture, int face) | ||
564 | { | ||
565 | LLObject.TextureEntry tex = m_host.Shape.Textures; | ||
566 | |||
567 | if (face > -1) | ||
568 | { | ||
569 | LLObject.TextureEntryFace texface = tex.CreateFace((uint)face); | ||
570 | texface.TextureID = new LLUUID(texture); | ||
571 | tex.FaceTextures[face] = texface; | ||
572 | m_host.UpdateTexture(tex); | ||
573 | return; | ||
574 | } | ||
575 | else if (face == -1) | ||
576 | { | ||
577 | for (uint i = 0; i < 32; i++) | ||
578 | { | ||
579 | if (tex.FaceTextures[i] != null) | ||
580 | { | ||
581 | tex.FaceTextures[i].TextureID = new LLUUID(texture); | ||
582 | } | ||
583 | } | ||
584 | tex.DefaultTexture.TextureID = new LLUUID(texture); | ||
585 | m_host.UpdateTexture(tex); | ||
586 | return; | ||
587 | } | ||
588 | NotImplemented("llSetTexture"); | ||
589 | return; | ||
590 | } | ||
591 | |||
592 | public void llScaleTexture(double u, double v, int face) | ||
593 | { | ||
594 | LLObject.TextureEntry tex = m_host.Shape.Textures; | ||
595 | if (face > -1) | ||
596 | { | ||
597 | LLObject.TextureEntryFace texface = tex.CreateFace((uint)face); | ||
598 | texface.RepeatU = (float)u; | ||
599 | texface.RepeatV = (float)v; | ||
600 | tex.FaceTextures[face] = texface; | ||
601 | m_host.UpdateTexture(tex); | ||
602 | return; | ||
603 | } | ||
604 | if (face == -1) | ||
605 | { | ||
606 | for (int i = 0; i < 32; i++) | ||
607 | { | ||
608 | if (tex.FaceTextures[i] != null) | ||
609 | { | ||
610 | tex.FaceTextures[i].RepeatU = (float)u; | ||
611 | tex.FaceTextures[i].RepeatV = (float)v; | ||
612 | } | ||
613 | } | ||
614 | tex.DefaultTexture.RepeatU = (float)u; | ||
615 | tex.DefaultTexture.RepeatV = (float)v; | ||
616 | m_host.UpdateTexture(tex); | ||
617 | return; | ||
618 | } | ||
619 | NotImplemented("llScaleTexture"); | ||
620 | return; | ||
621 | } | ||
622 | |||
623 | public void llOffsetTexture(double u, double v, int face) | ||
624 | { | ||
625 | LLObject.TextureEntry tex = m_host.Shape.Textures; | ||
626 | if (face > -1) | ||
627 | { | ||
628 | LLObject.TextureEntryFace texface = tex.CreateFace((uint)face); | ||
629 | texface.OffsetU = (float)u; | ||
630 | texface.OffsetV = (float)v; | ||
631 | tex.FaceTextures[face] = texface; | ||
632 | m_host.UpdateTexture(tex); | ||
633 | return; | ||
634 | } | ||
635 | if (face == -1) | ||
636 | { | ||
637 | for (int i = 0; i < 32; i++) | ||
638 | { | ||
639 | if (tex.FaceTextures[i] != null) | ||
640 | { | ||
641 | tex.FaceTextures[i].OffsetU = (float)u; | ||
642 | tex.FaceTextures[i].OffsetV = (float)v; | ||
643 | } | ||
644 | } | ||
645 | tex.DefaultTexture.OffsetU = (float)u; | ||
646 | tex.DefaultTexture.OffsetV = (float)v; | ||
647 | m_host.UpdateTexture(tex); | ||
648 | return; | ||
649 | } | ||
650 | NotImplemented("llOffsetTexture"); | ||
651 | return; | ||
652 | } | ||
653 | |||
654 | public void llRotateTexture(double rotation, int face) | ||
655 | { | ||
656 | LLObject.TextureEntry tex = m_host.Shape.Textures; | ||
657 | if (face > -1) | ||
658 | { | ||
659 | LLObject.TextureEntryFace texface = tex.CreateFace((uint)face); | ||
660 | texface.Rotation = (float)rotation; | ||
661 | tex.FaceTextures[face] = texface; | ||
662 | m_host.UpdateTexture(tex); | ||
663 | return; | ||
664 | } | ||
665 | if (face == -1) | ||
666 | { | ||
667 | for (int i = 0; i < 32; i++) | ||
668 | { | ||
669 | if (tex.FaceTextures[i] != null) | ||
670 | { | ||
671 | tex.FaceTextures[i].Rotation = (float)rotation; | ||
672 | } | ||
673 | } | ||
674 | tex.DefaultTexture.Rotation = (float)rotation; | ||
675 | m_host.UpdateTexture(tex); | ||
676 | return; | ||
677 | } | ||
678 | NotImplemented("llRotateTexture"); | ||
679 | return; | ||
680 | } | ||
681 | |||
682 | public string llGetTexture(int face) | ||
683 | { | ||
684 | LLObject.TextureEntry tex = m_host.Shape.Textures; | ||
685 | if (face == -1) | ||
686 | { | ||
687 | face = 0; | ||
688 | } | ||
689 | if (face > -1) | ||
690 | { | ||
691 | LLObject.TextureEntryFace texface; | ||
692 | texface = tex.GetFace((uint)face); | ||
693 | return texface.TextureID.ToString(); | ||
694 | } | ||
695 | NotImplemented("llGetTexture"); | ||
696 | return ""; | ||
697 | } | ||
698 | |||
699 | public void llSetPos(LSL_Types.Vector3 pos) | ||
700 | { | ||
701 | if (m_host.ParentID != 0) | ||
702 | { | ||
703 | m_host.UpdateOffSet(new LLVector3((float)pos.x, (float)pos.y, (float)pos.z)); | ||
704 | } | ||
705 | else | ||
706 | { | ||
707 | m_host.UpdateGroupPosition(new LLVector3((float)pos.x, (float)pos.y, (float)pos.z)); | ||
708 | } | ||
709 | } | ||
710 | |||
711 | public LSL_Types.Vector3 llGetPos() | ||
712 | { | ||
713 | return new LSL_Types.Vector3(m_host.AbsolutePosition.X, | ||
714 | m_host.AbsolutePosition.Y, | ||
715 | m_host.AbsolutePosition.Z); | ||
716 | } | ||
717 | |||
718 | public LSL_Types.Vector3 llGetLocalPos() | ||
719 | { | ||
720 | if (m_host.ParentID != 0) | ||
721 | { | ||
722 | return new LSL_Types.Vector3(m_host.OffsetPosition.X, | ||
723 | m_host.OffsetPosition.Y, | ||
724 | m_host.OffsetPosition.Z); | ||
725 | } | ||
726 | else | ||
727 | { | ||
728 | return new LSL_Types.Vector3(m_host.AbsolutePosition.X, | ||
729 | m_host.AbsolutePosition.Y, | ||
730 | m_host.AbsolutePosition.Z); | ||
731 | } | ||
732 | } | ||
733 | |||
734 | public void llSetRot(LSL_Types.Quaternion rot) | ||
735 | { | ||
736 | m_host.UpdateRotation(new LLQuaternion((float)rot.x, (float)rot.y, (float)rot.z, (float)rot.s)); | ||
737 | } | ||
738 | |||
739 | public LSL_Types.Quaternion llGetRot() | ||
740 | { | ||
741 | LLQuaternion q = m_host.RotationOffset; | ||
742 | return new LSL_Types.Quaternion(q.X, q.Y, q.Z, q.W); | ||
743 | } | ||
744 | |||
745 | public LSL_Types.Quaternion llGetLocalRot() | ||
746 | { | ||
747 | return new LSL_Types.Quaternion(m_host.RotationOffset.X, m_host.RotationOffset.Y, m_host.RotationOffset.Z, m_host.RotationOffset.W); | ||
748 | } | ||
749 | |||
750 | public void llSetForce(LSL_Types.Vector3 force, int local) | ||
751 | { | ||
752 | NotImplemented("llSetForce"); | ||
753 | } | ||
754 | |||
755 | public LSL_Types.Vector3 llGetForce() | ||
756 | { | ||
757 | NotImplemented("llGetForce"); | ||
758 | return new LSL_Types.Vector3(); | ||
759 | } | ||
760 | |||
761 | public int llTarget(LSL_Types.Vector3 position, double range) | ||
762 | { | ||
763 | NotImplemented("llTarget"); | ||
764 | return 0; | ||
765 | } | ||
766 | |||
767 | public void llTargetRemove(int number) | ||
768 | { | ||
769 | NotImplemented("llTargetRemove"); | ||
770 | } | ||
771 | |||
772 | public int llRotTarget(LSL_Types.Quaternion rot, double error) | ||
773 | { | ||
774 | NotImplemented("llRotTarget"); | ||
775 | return 0; | ||
776 | } | ||
777 | |||
778 | public void llRotTargetRemove(int number) | ||
779 | { | ||
780 | NotImplemented("llRotTargetRemove"); | ||
781 | } | ||
782 | |||
783 | public void llMoveToTarget(LSL_Types.Vector3 target, double tau) | ||
784 | { | ||
785 | NotImplemented("llMoveToTarget"); | ||
786 | } | ||
787 | |||
788 | public void llStopMoveToTarget() | ||
789 | { | ||
790 | NotImplemented("llStopMoveToTarget"); | ||
791 | } | ||
792 | |||
793 | public void llApplyImpulse(LSL_Types.Vector3 force, int local) | ||
794 | { | ||
795 | NotImplemented("llApplyImpulse"); | ||
796 | } | ||
797 | |||
798 | public void llApplyRotationalImpulse(LSL_Types.Vector3 force, int local) | ||
799 | { | ||
800 | NotImplemented("llApplyRotationalImpulse"); | ||
801 | } | ||
802 | |||
803 | public void llSetTorque(LSL_Types.Vector3 torque, int local) | ||
804 | { | ||
805 | NotImplemented("llSetTorque"); | ||
806 | } | ||
807 | |||
808 | public LSL_Types.Vector3 llGetTorque() | ||
809 | { | ||
810 | NotImplemented("llGetTorque"); | ||
811 | return new LSL_Types.Vector3(); | ||
812 | } | ||
813 | |||
814 | public void llSetForceAndTorque(LSL_Types.Vector3 force, LSL_Types.Vector3 torque, int local) | ||
815 | { | ||
816 | NotImplemented("llSetForceAndTorque"); | ||
817 | } | ||
818 | |||
819 | public LSL_Types.Vector3 llGetVel() | ||
820 | { | ||
821 | return new LSL_Types.Vector3(m_host.Velocity.X, m_host.Velocity.Y, m_host.Velocity.Z); | ||
822 | } | ||
823 | |||
824 | public LSL_Types.Vector3 llGetAccel() | ||
825 | { | ||
826 | return new LSL_Types.Vector3(m_host.Acceleration.X, m_host.Acceleration.Y, m_host.Acceleration.Z); | ||
827 | } | ||
828 | |||
829 | public LSL_Types.Vector3 llGetOmega() | ||
830 | { | ||
831 | NotImplemented("llGetOmega"); | ||
832 | return new LSL_Types.Vector3(); | ||
833 | } | ||
834 | |||
835 | public double llGetTimeOfDay() | ||
836 | { | ||
837 | NotImplemented("llGetTimeOfDay"); | ||
838 | return 0; | ||
839 | } | ||
840 | |||
841 | public double llGetWallclock() | ||
842 | { | ||
843 | return DateTime.Now.TimeOfDay.TotalSeconds; | ||
844 | } | ||
845 | |||
846 | public double llGetTime() | ||
847 | { | ||
848 | TimeSpan ScriptTime = DateTime.Now - m_timer; | ||
849 | return (double)(ScriptTime.TotalMilliseconds / 1000); | ||
850 | } | ||
851 | |||
852 | public void llResetTime() | ||
853 | { | ||
854 | m_timer = DateTime.Now; | ||
855 | } | ||
856 | |||
857 | public double llGetAndResetTime() | ||
858 | { | ||
859 | TimeSpan ScriptTime = DateTime.Now - m_timer; | ||
860 | m_timer = DateTime.Now; | ||
861 | return (double)(ScriptTime.TotalMilliseconds / 1000); | ||
862 | } | ||
863 | |||
864 | public void llSound() | ||
865 | { | ||
866 | NotImplemented("llSound"); | ||
867 | } | ||
868 | |||
869 | public void llPlaySound(string sound, double volume) | ||
870 | { | ||
871 | NotImplemented("llPlaySound"); | ||
872 | } | ||
873 | |||
874 | public void llLoopSound(string sound, double volume) | ||
875 | { | ||
876 | NotImplemented("llLoopSound"); | ||
877 | } | ||
878 | |||
879 | public void llLoopSoundMaster(string sound, double volume) | ||
880 | { | ||
881 | NotImplemented("llLoopSoundMaster"); | ||
882 | } | ||
883 | |||
884 | public void llLoopSoundSlave(string sound, double volume) | ||
885 | { | ||
886 | NotImplemented("llLoopSoundSlave"); | ||
887 | } | ||
888 | |||
889 | public void llPlaySoundSlave(string sound, double volume) | ||
890 | { | ||
891 | NotImplemented("llPlaySoundSlave"); | ||
892 | } | ||
893 | |||
894 | public void llTriggerSound(string sound, double volume) | ||
895 | { | ||
896 | NotImplemented("llTriggerSound"); | ||
897 | } | ||
898 | |||
899 | public void llStopSound() | ||
900 | { | ||
901 | NotImplemented("llStopSound"); | ||
902 | } | ||
903 | |||
904 | public void llPreloadSound(string sound) | ||
905 | { | ||
906 | NotImplemented("llPreloadSound"); | ||
907 | } | ||
908 | |||
909 | public string llGetSubString(string src, int start, int end) | ||
910 | { | ||
911 | return src.Substring(start, end); | ||
912 | } | ||
913 | |||
914 | public string llDeleteSubString(string src, int start, int end) | ||
915 | { | ||
916 | return src.Remove(start, end - start); | ||
917 | } | ||
918 | |||
919 | public string llInsertString(string dst, int position, string src) | ||
920 | { | ||
921 | return dst.Insert(position, src); | ||
922 | } | ||
923 | |||
924 | public string llToUpper(string src) | ||
925 | { | ||
926 | return src.ToUpper(); | ||
927 | } | ||
928 | |||
929 | public string llToLower(string src) | ||
930 | { | ||
931 | return src.ToLower(); | ||
932 | } | ||
933 | |||
934 | public int llGiveMoney(string destination, int amount) | ||
935 | { | ||
936 | NotImplemented("llGiveMoney"); | ||
937 | return 0; | ||
938 | } | ||
939 | |||
940 | public void llMakeExplosion() | ||
941 | { | ||
942 | NotImplemented("llMakeExplosion"); | ||
943 | } | ||
944 | |||
945 | public void llMakeFountain() | ||
946 | { | ||
947 | NotImplemented("llMakeFountain"); | ||
948 | } | ||
949 | |||
950 | public void llMakeSmoke() | ||
951 | { | ||
952 | NotImplemented("llMakeSmoke"); | ||
953 | } | ||
954 | |||
955 | public void llMakeFire() | ||
956 | { | ||
957 | NotImplemented("llMakeFire"); | ||
958 | } | ||
959 | |||
960 | public void llRezObject(string inventory, LSL_Types.Vector3 pos, LSL_Types.Quaternion rot, int param) | ||
961 | { | ||
962 | NotImplemented("llRezObject"); | ||
963 | } | ||
964 | |||
965 | public void llLookAt(LSL_Types.Vector3 target, double strength, double damping) | ||
966 | { | ||
967 | NotImplemented("llLookAt"); | ||
968 | } | ||
969 | |||
970 | public void llStopLookAt() | ||
971 | { | ||
972 | NotImplemented("llStopLookAt"); | ||
973 | } | ||
974 | |||
975 | public void llSetTimerEvent(double sec) | ||
976 | { | ||
977 | // Setting timer repeat | ||
978 | m_ScriptEngine.m_LSLLongCmdHandler.SetTimerEvent(m_localID, m_itemID, sec); | ||
979 | } | ||
980 | |||
981 | public void llSleep(double sec) | ||
982 | { | ||
983 | Thread.Sleep((int)(sec * 1000)); | ||
984 | } | ||
985 | |||
986 | public double llGetMass() | ||
987 | { | ||
988 | return m_host.GetMass(); | ||
989 | } | ||
990 | |||
991 | public void llCollisionFilter(string name, string id, int accept) | ||
992 | { | ||
993 | NotImplemented("llCollisionFilter"); | ||
994 | } | ||
995 | |||
996 | public void llTakeControls(int controls, int accept, int pass_on) | ||
997 | { | ||
998 | NotImplemented("llTakeControls"); | ||
999 | } | ||
1000 | |||
1001 | public void llReleaseControls() | ||
1002 | { | ||
1003 | NotImplemented("llReleaseControls"); | ||
1004 | } | ||
1005 | |||
1006 | public void llAttachToAvatar(int attachment) | ||
1007 | { | ||
1008 | NotImplemented("llAttachToAvatar"); | ||
1009 | } | ||
1010 | |||
1011 | public void llDetachFromAvatar() | ||
1012 | { | ||
1013 | NotImplemented("llDetachFromAvatar"); | ||
1014 | } | ||
1015 | |||
1016 | public void llTakeCamera() | ||
1017 | { | ||
1018 | NotImplemented("llTakeCamera"); | ||
1019 | } | ||
1020 | |||
1021 | public void llReleaseCamera() | ||
1022 | { | ||
1023 | NotImplemented("llReleaseCamera"); | ||
1024 | } | ||
1025 | |||
1026 | public string llGetOwner() | ||
1027 | { | ||
1028 | return m_host.ObjectOwner.ToString(); | ||
1029 | } | ||
1030 | |||
1031 | public void llInstantMessage(string user, string message) | ||
1032 | { | ||
1033 | NotImplemented("llInstantMessage"); | ||
1034 | |||
1035 | // We may be able to use ClientView.SendInstantMessage here, but we need a client instance. | ||
1036 | // InstantMessageModule.OnInstantMessage searches through a list of scenes for a client matching the toAgent, | ||
1037 | // but I don't think we have a list of scenes available from here. | ||
1038 | // (We also don't want to duplicate the code in OnInstantMessage if we can avoid it.) | ||
1039 | |||
1040 | // TODO: figure out values for client, fromSession, and imSessionID | ||
1041 | // client.SendInstantMessage(m_host.UUID, fromSession, message, user, imSessionID, m_host.Name, AgentManager.InstantMessageDialog.MessageFromAgent, (uint)Util.UnixTimeSinceEpoch()); | ||
1042 | } | ||
1043 | |||
1044 | public void llEmail(string address, string subject, string message) | ||
1045 | { | ||
1046 | NotImplemented("llEmail"); | ||
1047 | } | ||
1048 | |||
1049 | public void llGetNextEmail(string address, string subject) | ||
1050 | { | ||
1051 | NotImplemented("llGetNextEmail"); | ||
1052 | } | ||
1053 | |||
1054 | public string llGetKey() | ||
1055 | { | ||
1056 | return m_host.UUID.ToString(); | ||
1057 | } | ||
1058 | |||
1059 | public void llSetBuoyancy(double buoyancy) | ||
1060 | { | ||
1061 | NotImplemented("llSetBuoyancy"); | ||
1062 | } | ||
1063 | |||
1064 | public void llSetHoverHeight(double height, int water, double tau) | ||
1065 | { | ||
1066 | NotImplemented("llSetHoverHeight"); | ||
1067 | } | ||
1068 | |||
1069 | public void llStopHover() | ||
1070 | { | ||
1071 | NotImplemented("llStopHover"); | ||
1072 | } | ||
1073 | |||
1074 | public void llMinEventDelay(double delay) | ||
1075 | { | ||
1076 | NotImplemented("llMinEventDelay"); | ||
1077 | } | ||
1078 | |||
1079 | public void llSoundPreload() | ||
1080 | { | ||
1081 | NotImplemented("llSoundPreload"); | ||
1082 | } | ||
1083 | |||
1084 | public void llRotLookAt(LSL_Types.Quaternion target, double strength, double damping) | ||
1085 | { | ||
1086 | NotImplemented("llRotLookAt"); | ||
1087 | } | ||
1088 | |||
1089 | public int llStringLength(string str) | ||
1090 | { | ||
1091 | if (str.Length > 0) | ||
1092 | { | ||
1093 | return str.Length; | ||
1094 | } | ||
1095 | else | ||
1096 | { | ||
1097 | return 0; | ||
1098 | } | ||
1099 | } | ||
1100 | |||
1101 | public void llStartAnimation(string anim) | ||
1102 | { | ||
1103 | NotImplemented("llStartAnimation"); | ||
1104 | } | ||
1105 | |||
1106 | public void llStopAnimation(string anim) | ||
1107 | { | ||
1108 | NotImplemented("llStopAnimation"); | ||
1109 | } | ||
1110 | |||
1111 | public void llPointAt() | ||
1112 | { | ||
1113 | NotImplemented("llPointAt"); | ||
1114 | } | ||
1115 | |||
1116 | public void llStopPointAt() | ||
1117 | { | ||
1118 | NotImplemented("llStopPointAt"); | ||
1119 | } | ||
1120 | |||
1121 | public void llTargetOmega(LSL_Types.Vector3 axis, double spinrate, double gain) | ||
1122 | { | ||
1123 | m_host.RotationalVelocity = new LLVector3((float)(axis.x * spinrate), (float)(axis.y * spinrate), (float)(axis.z * spinrate)); | ||
1124 | m_host.AngularVelocity = new LLVector3((float)(axis.x * spinrate), (float)(axis.y * spinrate), (float)(axis.z * spinrate)); | ||
1125 | m_host.ScheduleTerseUpdate(); | ||
1126 | m_host.SendTerseUpdateToAllClients(); | ||
1127 | //NotImplemented("llTargetOmega"); | ||
1128 | } | ||
1129 | |||
1130 | public int llGetStartParameter() | ||
1131 | { | ||
1132 | NotImplemented("llGetStartParameter"); | ||
1133 | return 0; | ||
1134 | } | ||
1135 | |||
1136 | public void llGodLikeRezObject(string inventory, LSL_Types.Vector3 pos) | ||
1137 | { | ||
1138 | NotImplemented("llGodLikeRezObject"); | ||
1139 | } | ||
1140 | |||
1141 | public void llRequestPermissions(string agent, int perm) | ||
1142 | { | ||
1143 | NotImplemented("llRequestPermissions"); | ||
1144 | } | ||
1145 | |||
1146 | public string llGetPermissionsKey() | ||
1147 | { | ||
1148 | NotImplemented("llGetPermissionsKey"); | ||
1149 | return ""; | ||
1150 | } | ||
1151 | |||
1152 | public int llGetPermissions() | ||
1153 | { | ||
1154 | NotImplemented("llGetPermissions"); | ||
1155 | return 0; | ||
1156 | } | ||
1157 | |||
1158 | public int llGetLinkNumber() | ||
1159 | { | ||
1160 | return m_host.LinkNum; | ||
1161 | } | ||
1162 | |||
1163 | public void llSetLinkColor(int linknumber, LSL_Types.Vector3 color, int face) | ||
1164 | { | ||
1165 | SceneObjectPart part = m_host.ParentGroup.GetLinkNumPart(linknumber); | ||
1166 | if (linknumber > -1) | ||
1167 | { | ||
1168 | LLObject.TextureEntry tex = part.Shape.Textures; | ||
1169 | LLColor texcolor; | ||
1170 | if (face > -1) | ||
1171 | { | ||
1172 | texcolor = tex.CreateFace((uint)face).RGBA; | ||
1173 | texcolor.R = (float)Math.Abs(color.x - 1); | ||
1174 | texcolor.G = (float)Math.Abs(color.y - 1); | ||
1175 | texcolor.B = (float)Math.Abs(color.z - 1); | ||
1176 | tex.FaceTextures[face].RGBA = texcolor; | ||
1177 | part.UpdateTexture(tex); | ||
1178 | return; | ||
1179 | } | ||
1180 | else if (face == -1) | ||
1181 | { | ||
1182 | texcolor = tex.DefaultTexture.RGBA; | ||
1183 | texcolor.R = (float)Math.Abs(color.x - 1); | ||
1184 | texcolor.G = (float)Math.Abs(color.y - 1); | ||
1185 | texcolor.B = (float)Math.Abs(color.z - 1); | ||
1186 | tex.DefaultTexture.RGBA = texcolor; | ||
1187 | for (uint i = 0; i < 32; i++) | ||
1188 | { | ||
1189 | if (tex.FaceTextures[i] != null) | ||
1190 | { | ||
1191 | texcolor = tex.FaceTextures[i].RGBA; | ||
1192 | texcolor.R = (float)Math.Abs(color.x - 1); | ||
1193 | texcolor.G = (float)Math.Abs(color.y - 1); | ||
1194 | texcolor.B = (float)Math.Abs(color.z - 1); | ||
1195 | tex.FaceTextures[i].RGBA = texcolor; | ||
1196 | } | ||
1197 | } | ||
1198 | texcolor = tex.DefaultTexture.RGBA; | ||
1199 | texcolor.R = (float)Math.Abs(color.x - 1); | ||
1200 | texcolor.G = (float)Math.Abs(color.y - 1); | ||
1201 | texcolor.B = (float)Math.Abs(color.z - 1); | ||
1202 | tex.DefaultTexture.RGBA = texcolor; | ||
1203 | part.UpdateTexture(tex); | ||
1204 | return; | ||
1205 | } | ||
1206 | return; | ||
1207 | } | ||
1208 | else if (linknumber == -1) | ||
1209 | { | ||
1210 | int num = m_host.ParentGroup.PrimCount; | ||
1211 | for (int w = 0; w < num; w++) | ||
1212 | { | ||
1213 | linknumber = w; | ||
1214 | part = m_host.ParentGroup.GetLinkNumPart(linknumber); | ||
1215 | LLObject.TextureEntry tex = part.Shape.Textures; | ||
1216 | LLColor texcolor; | ||
1217 | if (face > -1) | ||
1218 | { | ||
1219 | texcolor = tex.CreateFace((uint)face).RGBA; | ||
1220 | texcolor.R = (float)Math.Abs(color.x - 1); | ||
1221 | texcolor.G = (float)Math.Abs(color.y - 1); | ||
1222 | texcolor.B = (float)Math.Abs(color.z - 1); | ||
1223 | tex.FaceTextures[face].RGBA = texcolor; | ||
1224 | part.UpdateTexture(tex); | ||
1225 | } | ||
1226 | else if (face == -1) | ||
1227 | { | ||
1228 | texcolor = tex.DefaultTexture.RGBA; | ||
1229 | texcolor.R = (float)Math.Abs(color.x - 1); | ||
1230 | texcolor.G = (float)Math.Abs(color.y - 1); | ||
1231 | texcolor.B = (float)Math.Abs(color.z - 1); | ||
1232 | tex.DefaultTexture.RGBA = texcolor; | ||
1233 | for (uint i = 0; i < 32; i++) | ||
1234 | { | ||
1235 | if (tex.FaceTextures[i] != null) | ||
1236 | { | ||
1237 | texcolor = tex.FaceTextures[i].RGBA; | ||
1238 | texcolor.R = (float)Math.Abs(color.x - 1); | ||
1239 | texcolor.G = (float)Math.Abs(color.y - 1); | ||
1240 | texcolor.B = (float)Math.Abs(color.z - 1); | ||
1241 | tex.FaceTextures[i].RGBA = texcolor; | ||
1242 | } | ||
1243 | } | ||
1244 | texcolor = tex.DefaultTexture.RGBA; | ||
1245 | texcolor.R = (float)Math.Abs(color.x - 1); | ||
1246 | texcolor.G = (float)Math.Abs(color.y - 1); | ||
1247 | texcolor.B = (float)Math.Abs(color.z - 1); | ||
1248 | tex.DefaultTexture.RGBA = texcolor; | ||
1249 | part.UpdateTexture(tex); | ||
1250 | } | ||
1251 | } | ||
1252 | return; | ||
1253 | } | ||
1254 | else | ||
1255 | { | ||
1256 | NotImplemented("llSetLinkColor"); | ||
1257 | } | ||
1258 | } | ||
1259 | |||
1260 | public void llCreateLink(string target, int parent) | ||
1261 | { | ||
1262 | NotImplemented("llCreateLink"); | ||
1263 | } | ||
1264 | |||
1265 | public void llBreakLink(int linknum) | ||
1266 | { | ||
1267 | NotImplemented("llBreakLink"); | ||
1268 | } | ||
1269 | |||
1270 | public void llBreakAllLinks() | ||
1271 | { | ||
1272 | NotImplemented("llBreakAllLinks"); | ||
1273 | } | ||
1274 | |||
1275 | public string llGetLinkKey(int linknum) | ||
1276 | { | ||
1277 | SceneObjectPart part = m_host.ParentGroup.GetLinkNumPart(linknum); | ||
1278 | if (part != null) | ||
1279 | { | ||
1280 | return part.UUID.ToString(); | ||
1281 | } | ||
1282 | else | ||
1283 | { | ||
1284 | return "00000000-0000-0000-0000-000000000000"; | ||
1285 | } | ||
1286 | } | ||
1287 | |||
1288 | public string llGetLinkName(int linknum) | ||
1289 | { | ||
1290 | SceneObjectPart part = m_host.ParentGroup.GetLinkNumPart(linknum); | ||
1291 | if (part != null) | ||
1292 | { | ||
1293 | return part.Name; | ||
1294 | } | ||
1295 | else | ||
1296 | { | ||
1297 | return "00000000-0000-0000-0000-000000000000"; | ||
1298 | } | ||
1299 | } | ||
1300 | |||
1301 | public int llGetInventoryNumber(int type) | ||
1302 | { | ||
1303 | NotImplemented("llGetInventoryNumber"); | ||
1304 | return 0; | ||
1305 | } | ||
1306 | |||
1307 | public string llGetInventoryName(int type, int number) | ||
1308 | { | ||
1309 | NotImplemented("llGetInventoryName"); | ||
1310 | return ""; | ||
1311 | } | ||
1312 | |||
1313 | public void llSetScriptState(string name, int run) | ||
1314 | { | ||
1315 | NotImplemented("llSetScriptState"); | ||
1316 | } | ||
1317 | |||
1318 | public double llGetEnergy() | ||
1319 | { | ||
1320 | return 1.0f; | ||
1321 | } | ||
1322 | |||
1323 | public void llGiveInventory(string destination, string inventory) | ||
1324 | { | ||
1325 | NotImplemented("llGiveInventory"); | ||
1326 | } | ||
1327 | |||
1328 | public void llRemoveInventory(string item) | ||
1329 | { | ||
1330 | NotImplemented("llRemoveInventory"); | ||
1331 | } | ||
1332 | |||
1333 | public void llSetText(string text, LSL_Types.Vector3 color, double alpha) | ||
1334 | { | ||
1335 | Vector3 av3 = new Vector3((float)color.x, (float)color.y, (float)color.z); | ||
1336 | m_host.SetText(text, av3, alpha); | ||
1337 | } | ||
1338 | |||
1339 | public double llWater(LSL_Types.Vector3 offset) | ||
1340 | { | ||
1341 | return World.RegionInfo.EstateSettings.waterHeight; | ||
1342 | } | ||
1343 | |||
1344 | public void llPassTouches(int pass) | ||
1345 | { | ||
1346 | NotImplemented("llPassTouches"); | ||
1347 | } | ||
1348 | |||
1349 | public string llRequestAgentData(string id, int data) | ||
1350 | { | ||
1351 | NotImplemented("llRequestAgentData"); | ||
1352 | return ""; | ||
1353 | } | ||
1354 | |||
1355 | public string llRequestInventoryData(string name) | ||
1356 | { | ||
1357 | NotImplemented("llRequestInventoryData"); | ||
1358 | return ""; | ||
1359 | } | ||
1360 | |||
1361 | public void llSetDamage(double damage) | ||
1362 | { | ||
1363 | NotImplemented("llSetDamage"); | ||
1364 | } | ||
1365 | |||
1366 | public void llTeleportAgentHome(string agent) | ||
1367 | { | ||
1368 | NotImplemented("llTeleportAgentHome"); | ||
1369 | } | ||
1370 | |||
1371 | public void llModifyLand(int action, int brush) | ||
1372 | { | ||
1373 | double dsize; | ||
1374 | if (World.PermissionsMngr.CanTerraform(m_host.OwnerID, new LLVector3(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y, 0))) | ||
1375 | { | ||
1376 | switch (brush) | ||
1377 | { | ||
1378 | case 1: | ||
1379 | dsize = 2; | ||
1380 | break; | ||
1381 | case 2: | ||
1382 | dsize = 4; | ||
1383 | break; | ||
1384 | case 3: | ||
1385 | dsize = 8; | ||
1386 | break; | ||
1387 | default: | ||
1388 | if (brush < 0) | ||
1389 | { | ||
1390 | dsize = (double)(-1 * brush); | ||
1391 | } | ||
1392 | else | ||
1393 | { | ||
1394 | LSLError("Invalid brush size"); | ||
1395 | dsize = 0; // Should cease execution, but get unassigned local variable dsize on compile. | ||
1396 | } | ||
1397 | break; | ||
1398 | } | ||
1399 | switch (action) | ||
1400 | { | ||
1401 | case 0: | ||
1402 | if (World.Terrain.GetHeight((int)m_host.AbsolutePosition.X, (int)m_host.AbsolutePosition.Y) < m_host.AbsolutePosition.Z) | ||
1403 | { | ||
1404 | World.Terrain.FlattenTerrain(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y, dsize, 1); | ||
1405 | } | ||
1406 | break; | ||
1407 | case 1: | ||
1408 | if (World.Terrain.GetHeight((int)m_host.AbsolutePosition.X, (int)m_host.AbsolutePosition.Y) < (double)m_host.AbsolutePosition.Z) | ||
1409 | { | ||
1410 | World.Terrain.RaiseTerrain(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y, dsize, 0.1); | ||
1411 | } | ||
1412 | break; | ||
1413 | case 2: | ||
1414 | if (World.Terrain.GetHeight((int)m_host.AbsolutePosition.X, (int)m_host.AbsolutePosition.Y) > 0) | ||
1415 | { | ||
1416 | World.Terrain.LowerTerrain(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y, dsize, 1); | ||
1417 | } | ||
1418 | break; | ||
1419 | case 3: | ||
1420 | World.Terrain.SmoothTerrain(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y, dsize, 1); | ||
1421 | break; | ||
1422 | case 4: | ||
1423 | World.Terrain.NoiseTerrain(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y, dsize, 1); | ||
1424 | break; | ||
1425 | case 5: | ||
1426 | World.Terrain.RevertTerrain(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y, dsize, 1); | ||
1427 | break; | ||
1428 | default: | ||
1429 | break; | ||
1430 | } | ||
1431 | } | ||
1432 | } | ||
1433 | |||
1434 | public void llCollisionSound(string impact_sound, double impact_volume) | ||
1435 | { | ||
1436 | NotImplemented("llCollisionSound"); | ||
1437 | } | ||
1438 | |||
1439 | public void llCollisionSprite(string impact_sprite) | ||
1440 | { | ||
1441 | NotImplemented("llCollisionSprite"); | ||
1442 | } | ||
1443 | |||
1444 | public string llGetAnimation(string id) | ||
1445 | { | ||
1446 | NotImplemented("llGetAnimation"); | ||
1447 | return ""; | ||
1448 | } | ||
1449 | |||
1450 | public void llResetScript() | ||
1451 | { | ||
1452 | m_ScriptEngine.m_ScriptManager.ResetScript(m_localID, m_itemID); | ||
1453 | } | ||
1454 | |||
1455 | public void llMessageLinked(int linknum, int num, string str, string id) | ||
1456 | { | ||
1457 | } | ||
1458 | |||
1459 | public void llPushObject(string target, LSL_Types.Vector3 impulse, LSL_Types.Vector3 ang_impulse, int local) | ||
1460 | { | ||
1461 | } | ||
1462 | |||
1463 | public void llPassCollisions(int pass) | ||
1464 | { | ||
1465 | } | ||
1466 | |||
1467 | public string llGetScriptName() | ||
1468 | { | ||
1469 | return ""; | ||
1470 | } | ||
1471 | |||
1472 | public int llGetNumberOfSides() | ||
1473 | { | ||
1474 | return 0; | ||
1475 | } | ||
1476 | |||
1477 | public LSL_Types.Quaternion llAxisAngle2Rot(LSL_Types.Vector3 axis, double angle) | ||
1478 | { | ||
1479 | return new LSL_Types.Quaternion(); | ||
1480 | } | ||
1481 | |||
1482 | public LSL_Types.Vector3 llRot2Axis(LSL_Types.Quaternion rot) | ||
1483 | { | ||
1484 | return new LSL_Types.Vector3(); | ||
1485 | } | ||
1486 | |||
1487 | public void llRot2Angle() | ||
1488 | { | ||
1489 | } | ||
1490 | |||
1491 | public double llAcos(double val) | ||
1492 | { | ||
1493 | return (double)Math.Acos(val); | ||
1494 | } | ||
1495 | |||
1496 | public double llAsin(double val) | ||
1497 | { | ||
1498 | return (double)Math.Asin(val); | ||
1499 | } | ||
1500 | |||
1501 | public double llAngleBetween(LSL_Types.Quaternion a, LSL_Types.Quaternion b) | ||
1502 | { | ||
1503 | return 0; | ||
1504 | } | ||
1505 | |||
1506 | public string llGetInventoryKey(string name) | ||
1507 | { | ||
1508 | return ""; | ||
1509 | } | ||
1510 | |||
1511 | public void llAllowInventoryDrop(int add) | ||
1512 | { | ||
1513 | } | ||
1514 | |||
1515 | public LSL_Types.Vector3 llGetSunDirection() | ||
1516 | { | ||
1517 | return new LSL_Types.Vector3(); | ||
1518 | } | ||
1519 | |||
1520 | public LSL_Types.Vector3 llGetTextureOffset(int face) | ||
1521 | { | ||
1522 | LLObject.TextureEntry tex = m_host.Shape.Textures; | ||
1523 | LSL_Types.Vector3 offset; | ||
1524 | if (face == -1) | ||
1525 | { | ||
1526 | face = 0; | ||
1527 | } | ||
1528 | offset.x = tex.GetFace((uint)face).OffsetU; | ||
1529 | offset.y = tex.GetFace((uint)face).OffsetV; | ||
1530 | offset.z = 0.0; | ||
1531 | return offset; | ||
1532 | } | ||
1533 | |||
1534 | public LSL_Types.Vector3 llGetTextureScale(int side) | ||
1535 | { | ||
1536 | LLObject.TextureEntry tex = m_host.Shape.Textures; | ||
1537 | LSL_Types.Vector3 scale; | ||
1538 | if (side == -1) | ||
1539 | { | ||
1540 | side = 0; | ||
1541 | } | ||
1542 | scale.x = tex.GetFace((uint)side).RepeatU; | ||
1543 | scale.y = tex.GetFace((uint)side).RepeatV; | ||
1544 | scale.z = 0.0; | ||
1545 | return scale; | ||
1546 | } | ||
1547 | |||
1548 | public double llGetTextureRot(int face) | ||
1549 | { | ||
1550 | LLObject.TextureEntry tex = m_host.Shape.Textures; | ||
1551 | if (face == -1) | ||
1552 | { | ||
1553 | face = 0; | ||
1554 | } | ||
1555 | return tex.GetFace((uint)face).Rotation; | ||
1556 | } | ||
1557 | |||
1558 | public int llSubStringIndex(string source, string pattern) | ||
1559 | { | ||
1560 | return source.IndexOf(pattern); | ||
1561 | } | ||
1562 | |||
1563 | public string llGetOwnerKey(string id) | ||
1564 | { | ||
1565 | NotImplemented("llGetOwnerKey"); | ||
1566 | return ""; | ||
1567 | } | ||
1568 | |||
1569 | public LSL_Types.Vector3 llGetCenterOfMass() | ||
1570 | { | ||
1571 | NotImplemented("llGetCenterOfMass"); | ||
1572 | return new LSL_Types.Vector3(); | ||
1573 | } | ||
1574 | |||
1575 | public LSL_Types.list llListSort(LSL_Types.list src, int stride, int ascending) | ||
1576 | { | ||
1577 | // SortedList<string, LSL_Types.list> sorted = new SortedList<string, LSL_Types.list>(); | ||
1578 | // Add chunks to an array | ||
1579 | //int s = stride; | ||
1580 | //if (s < 1) | ||
1581 | // s = 1; | ||
1582 | //int c = 0; | ||
1583 | //LSL_Types.list chunk = new LSL_Types.list(); | ||
1584 | //string chunkString = ""; | ||
1585 | //foreach (string element in src) | ||
1586 | //{ | ||
1587 | // c++; | ||
1588 | // if (c > s) | ||
1589 | // { | ||
1590 | // sorted.Add(chunkString, chunk); | ||
1591 | // chunkString = ""; | ||
1592 | // chunk = new LSL_Types.list(); | ||
1593 | // c = 0; | ||
1594 | // } | ||
1595 | // chunk.Add(element); | ||
1596 | // chunkString += element.ToString(); | ||
1597 | //} | ||
1598 | //if (chunk.Count > 0) | ||
1599 | // sorted.Add(chunkString, chunk); | ||
1600 | |||
1601 | //LSL_Types.list ret = new LSL_Types.list(); | ||
1602 | //foreach (LSL_Types.list ls in sorted.Values) | ||
1603 | //{ | ||
1604 | // ret.AddRange(ls); | ||
1605 | //} | ||
1606 | |||
1607 | //if (ascending == LSL_BaseClass.TRUE) | ||
1608 | // return ret; | ||
1609 | //ret.Reverse(); | ||
1610 | //return ret; | ||
1611 | NotImplemented("llListSort"); | ||
1612 | return new LSL_Types.list(); | ||
1613 | } | ||
1614 | |||
1615 | public int llGetListLength(LSL_Types.list src) | ||
1616 | { | ||
1617 | return src.Length; | ||
1618 | } | ||
1619 | |||
1620 | public int llList2Integer(LSL_Types.list src, int index) | ||
1621 | { | ||
1622 | if (index < 0) | ||
1623 | { | ||
1624 | index = src.Length + index; | ||
1625 | } | ||
1626 | if (index >= src.Length) | ||
1627 | { | ||
1628 | return 0; | ||
1629 | } | ||
1630 | return Convert.ToInt32(src.Data[index]); | ||
1631 | } | ||
1632 | |||
1633 | public double osList2Double(LSL_Types.list src, int index) | ||
1634 | { | ||
1635 | if (index < 0) | ||
1636 | { | ||
1637 | index = src.Length + index; | ||
1638 | } | ||
1639 | if (index >= src.Length) | ||
1640 | { | ||
1641 | return 0.0; | ||
1642 | } | ||
1643 | return Convert.ToDouble(src.Data[index]); | ||
1644 | } | ||
1645 | |||
1646 | public double llList2Float(LSL_Types.list src, int index) | ||
1647 | { | ||
1648 | if (index < 0) | ||
1649 | { | ||
1650 | index = src.Length + index; | ||
1651 | } | ||
1652 | if (index >= src.Length) | ||
1653 | { | ||
1654 | return 0.0; | ||
1655 | } | ||
1656 | return Convert.ToSingle(src.Data[index]); | ||
1657 | } | ||
1658 | |||
1659 | public string llList2String(LSL_Types.list src, int index) | ||
1660 | { | ||
1661 | if (index < 0) | ||
1662 | { | ||
1663 | index = src.Length + index; | ||
1664 | } | ||
1665 | if (index >= src.Length) | ||
1666 | { | ||
1667 | return ""; | ||
1668 | } | ||
1669 | return src.Data[index].ToString(); | ||
1670 | } | ||
1671 | |||
1672 | public string llList2Key(LSL_Types.list src, int index) | ||
1673 | { | ||
1674 | if (index < 0) | ||
1675 | { | ||
1676 | index = src.Length + index; | ||
1677 | } | ||
1678 | if (index >= src.Length) | ||
1679 | { | ||
1680 | return "00000000-0000-0000-0000-000000000000"; | ||
1681 | } | ||
1682 | //return OpenSim.Framework.ToString(src[index]); | ||
1683 | LLUUID tmpkey; | ||
1684 | if (LLUUID.TryParse(src.Data[index].ToString(), out tmpkey)) | ||
1685 | { | ||
1686 | return tmpkey.ToString(); | ||
1687 | } | ||
1688 | else | ||
1689 | { | ||
1690 | return "00000000-0000-0000-0000-000000000000"; | ||
1691 | } | ||
1692 | } | ||
1693 | |||
1694 | public LSL_Types.Vector3 llList2Vector(LSL_Types.list src, int index) | ||
1695 | { | ||
1696 | if (index < 0) | ||
1697 | { | ||
1698 | index = src.Length + index; | ||
1699 | } | ||
1700 | if (index >= src.Length) | ||
1701 | { | ||
1702 | return new LSL_Types.Vector3(0, 0, 0); | ||
1703 | } | ||
1704 | if (src.Data[index].GetType() == typeof(OpenSim.Region.ScriptEngine.Common.LSL_Types.Vector3)) | ||
1705 | { | ||
1706 | return (LSL_Types.Vector3)src.Data[index]; | ||
1707 | } | ||
1708 | else | ||
1709 | { | ||
1710 | return new LSL_Types.Vector3(0, 0, 0); | ||
1711 | } | ||
1712 | } | ||
1713 | |||
1714 | public LSL_Types.Quaternion llList2Rot(LSL_Types.list src, int index) | ||
1715 | { | ||
1716 | if (index < 0) | ||
1717 | { | ||
1718 | index = src.Length + index; | ||
1719 | } | ||
1720 | if (index >= src.Length) | ||
1721 | { | ||
1722 | return new LSL_Types.Quaternion(0, 0, 0, 1); | ||
1723 | } | ||
1724 | if (src.Data[index].GetType() == typeof(OpenSim.Region.ScriptEngine.Common.LSL_Types.Quaternion)) | ||
1725 | { | ||
1726 | return (LSL_Types.Quaternion)src.Data[index]; | ||
1727 | } | ||
1728 | else | ||
1729 | { | ||
1730 | return new LSL_Types.Quaternion(0, 0, 0, 1); | ||
1731 | } | ||
1732 | } | ||
1733 | |||
1734 | public LSL_Types.list llList2List(LSL_Types.list src, int start, int end) | ||
1735 | { | ||
1736 | return src.GetSublist(start, end); | ||
1737 | } | ||
1738 | |||
1739 | public LSL_Types.list llDeleteSubList(LSL_Types.list src, int start, int end) | ||
1740 | { | ||
1741 | //LSL_Types.list ret = new LSL_Types.list(src); | ||
1742 | //ret.RemoveRange(start, end - start); | ||
1743 | //return ret; | ||
1744 | |||
1745 | // Just a hunch - needs testing | ||
1746 | return src.GetSublist(end, start); | ||
1747 | } | ||
1748 | |||
1749 | public int llGetListEntryType(LSL_Types.list src, int index) | ||
1750 | { | ||
1751 | if (index < 0) | ||
1752 | { | ||
1753 | index = src.Length + index; | ||
1754 | } | ||
1755 | if (index >= src.Length) | ||
1756 | { | ||
1757 | return 0; | ||
1758 | } | ||
1759 | |||
1760 | if (src.Data[index] is System.Int32) | ||
1761 | return 1; | ||
1762 | if (src.Data[index] is System.Double) | ||
1763 | return 2; | ||
1764 | if (src.Data[index] is System.String) | ||
1765 | { | ||
1766 | LLUUID tuuid; | ||
1767 | if (LLUUID.TryParse(src.Data[index].ToString(), out tuuid)) | ||
1768 | { | ||
1769 | return 3; | ||
1770 | } | ||
1771 | else | ||
1772 | { | ||
1773 | return 4; | ||
1774 | } | ||
1775 | } | ||
1776 | if (src.Data[index] is OpenSim.Region.ScriptEngine.Common.LSL_Types.Vector3) | ||
1777 | return 5; | ||
1778 | if (src.Data[index] is OpenSim.Region.ScriptEngine.Common.LSL_Types.Quaternion) | ||
1779 | return 6; | ||
1780 | if (src.Data[index] is OpenSim.Region.ScriptEngine.Common.LSL_Types.list) | ||
1781 | return 7; | ||
1782 | return 0; | ||
1783 | |||
1784 | } | ||
1785 | |||
1786 | public string llList2CSV(LSL_Types.list src) | ||
1787 | { | ||
1788 | string ret = ""; | ||
1789 | foreach (object o in src.Data) | ||
1790 | { | ||
1791 | ret = ret + o.ToString() + ","; | ||
1792 | } | ||
1793 | ret = ret.Substring(0, ret.Length - 2); | ||
1794 | return ret; | ||
1795 | } | ||
1796 | |||
1797 | public LSL_Types.list llCSV2List(string src) | ||
1798 | { | ||
1799 | return new LSL_Types.list(src.Split(",".ToCharArray())); | ||
1800 | } | ||
1801 | |||
1802 | public LSL_Types.list llListRandomize(LSL_Types.list src, int stride) | ||
1803 | { | ||
1804 | //int s = stride; | ||
1805 | //if (s < 1) | ||
1806 | // s = 1; | ||
1807 | |||
1808 | // This is a cowardly way of doing it ;) | ||
1809 | // TODO: Instead, randomize and check if random is mod stride or if it can not be, then array.removerange | ||
1810 | //List<LSL_Types.list> tmp = new List<LSL_Types.list>(); | ||
1811 | |||
1812 | // Add chunks to an array | ||
1813 | //int c = 0; | ||
1814 | //LSL_Types.list chunk = new LSL_Types.list(); | ||
1815 | //foreach (string element in src) | ||
1816 | //{ | ||
1817 | // c++; | ||
1818 | // if (c > s) | ||
1819 | // { | ||
1820 | // tmp.Add(chunk); | ||
1821 | // chunk = new LSL_Types.list(); | ||
1822 | // c = 0; | ||
1823 | // } | ||
1824 | // chunk.Add(element); | ||
1825 | //} | ||
1826 | //if (chunk.Count > 0) | ||
1827 | // tmp.Add(chunk); | ||
1828 | |||
1829 | // Decreate (<- what kind of word is that? :D ) array back into a list | ||
1830 | //int rnd; | ||
1831 | //LSL_Types.list ret = new LSL_Types.list(); | ||
1832 | //while (tmp.Count > 0) | ||
1833 | //{ | ||
1834 | // rnd = Util.RandomClass.Next(tmp.Count); | ||
1835 | // foreach (string str in tmp[rnd]) | ||
1836 | // { | ||
1837 | // ret.Add(str); | ||
1838 | // } | ||
1839 | // tmp.RemoveAt(rnd); | ||
1840 | //} | ||
1841 | |||
1842 | //return ret; | ||
1843 | NotImplemented("llListRandomize"); | ||
1844 | return new LSL_Types.list(); | ||
1845 | } | ||
1846 | |||
1847 | public LSL_Types.list llList2ListStrided(LSL_Types.list src, int start, int end, int stride) | ||
1848 | { | ||
1849 | LSL_Types.list ret = new LSL_Types.list(); | ||
1850 | //int s = stride; | ||
1851 | //if (s < 1) | ||
1852 | // s = 1; | ||
1853 | |||
1854 | //int sc = s; | ||
1855 | //for (int i = start; i < src.Count; i++) | ||
1856 | //{ | ||
1857 | // sc--; | ||
1858 | // if (sc == 0) | ||
1859 | // { | ||
1860 | // sc = s; | ||
1861 | // // Addthis | ||
1862 | // ret.Add(src[i]); | ||
1863 | // } | ||
1864 | // if (i == end) | ||
1865 | // break; | ||
1866 | //} | ||
1867 | NotImplemented("llList2ListStrided"); | ||
1868 | return ret; | ||
1869 | } | ||
1870 | |||
1871 | public LSL_Types.Vector3 llGetRegionCorner() | ||
1872 | { | ||
1873 | return new LSL_Types.Vector3(World.RegionInfo.RegionLocX * 256, World.RegionInfo.RegionLocY * 256, 0); | ||
1874 | } | ||
1875 | |||
1876 | public LSL_Types.list llListInsertList(LSL_Types.list dest, LSL_Types.list src, int start) | ||
1877 | { | ||
1878 | return dest.GetSublist(0, start - 1) + src + dest.GetSublist(start, -1); | ||
1879 | } | ||
1880 | |||
1881 | public int llListFindList(LSL_Types.list src, LSL_Types.list test) | ||
1882 | { | ||
1883 | //foreach (string s in test) | ||
1884 | //{ | ||
1885 | // for (int ci = 0; ci < src.Count; ci++) | ||
1886 | // { | ||
1887 | // if (s == src[ci]) | ||
1888 | // return ci; | ||
1889 | // } | ||
1890 | //} | ||
1891 | NotImplemented("llListFindList"); | ||
1892 | return -1; | ||
1893 | } | ||
1894 | |||
1895 | public string llGetObjectName() | ||
1896 | { | ||
1897 | return m_host.Name; | ||
1898 | } | ||
1899 | |||
1900 | public void llSetObjectName(string name) | ||
1901 | { | ||
1902 | m_host.Name = name; | ||
1903 | } | ||
1904 | |||
1905 | public string llGetDate() | ||
1906 | { | ||
1907 | DateTime date = DateTime.Now.ToUniversalTime(); | ||
1908 | string result = date.ToString("yyyy-MM-dd"); | ||
1909 | return result; | ||
1910 | } | ||
1911 | |||
1912 | public int llEdgeOfWorld(LSL_Types.Vector3 pos, LSL_Types.Vector3 dir) | ||
1913 | { | ||
1914 | NotImplemented("llEdgeOfWorld"); | ||
1915 | return 0; | ||
1916 | } | ||
1917 | |||
1918 | public int llGetAgentInfo(string id) | ||
1919 | { | ||
1920 | NotImplemented("llGetAgentInfo"); | ||
1921 | return 0; | ||
1922 | } | ||
1923 | |||
1924 | public void llAdjustSoundVolume(double volume) | ||
1925 | { | ||
1926 | NotImplemented("llAdjustSoundVolume"); | ||
1927 | } | ||
1928 | |||
1929 | public void llSetSoundQueueing(int queue) | ||
1930 | { | ||
1931 | NotImplemented("llSetSoundQueueing"); | ||
1932 | } | ||
1933 | |||
1934 | public void llSetSoundRadius(double radius) | ||
1935 | { | ||
1936 | NotImplemented("llSetSoundRadius"); | ||
1937 | } | ||
1938 | |||
1939 | public string llKey2Name(string id) | ||
1940 | { | ||
1941 | NotImplemented("llKey2Name"); | ||
1942 | return ""; | ||
1943 | } | ||
1944 | |||
1945 | public void llSetTextureAnim(int mode, int face, int sizex, int sizey, double start, double length, double rate) | ||
1946 | { | ||
1947 | NotImplemented("llSetTextureAnim"); | ||
1948 | } | ||
1949 | |||
1950 | public void llTriggerSoundLimited(string sound, double volume, LSL_Types.Vector3 top_north_east, | ||
1951 | LSL_Types.Vector3 bottom_south_west) | ||
1952 | { | ||
1953 | NotImplemented("llTriggerSoundLimited"); | ||
1954 | } | ||
1955 | |||
1956 | public void llEjectFromLand(string pest) | ||
1957 | { | ||
1958 | NotImplemented("llEjectFromLand"); | ||
1959 | } | ||
1960 | |||
1961 | public void llParseString2List() | ||
1962 | { | ||
1963 | NotImplemented("llParseString2List"); | ||
1964 | } | ||
1965 | |||
1966 | public int llOverMyLand(string id) | ||
1967 | { | ||
1968 | NotImplemented("llOverMyLand"); | ||
1969 | return 0; | ||
1970 | } | ||
1971 | |||
1972 | public string llGetLandOwnerAt(LSL_Types.Vector3 pos) | ||
1973 | { | ||
1974 | return World.GetLandOwner((float)pos.x, (float)pos.y).ToString(); | ||
1975 | } | ||
1976 | |||
1977 | public string llGetNotecardLine(string name, int line) | ||
1978 | { | ||
1979 | NotImplemented("llGetNotecardLine"); | ||
1980 | return ""; | ||
1981 | } | ||
1982 | |||
1983 | public LSL_Types.Vector3 llGetAgentSize(string id) | ||
1984 | { | ||
1985 | NotImplemented("llGetAgentSize"); | ||
1986 | return new LSL_Types.Vector3(); | ||
1987 | } | ||
1988 | |||
1989 | public int llSameGroup(string agent) | ||
1990 | { | ||
1991 | NotImplemented("llSameGroup"); | ||
1992 | return 0; | ||
1993 | } | ||
1994 | |||
1995 | public void llUnSit(string id) | ||
1996 | { | ||
1997 | NotImplemented("llUnSit"); | ||
1998 | } | ||
1999 | |||
2000 | public LSL_Types.Vector3 llGroundSlope(LSL_Types.Vector3 offset) | ||
2001 | { | ||
2002 | NotImplemented("llGroundSlope"); | ||
2003 | return new LSL_Types.Vector3(); | ||
2004 | } | ||
2005 | |||
2006 | public LSL_Types.Vector3 llGroundNormal(LSL_Types.Vector3 offset) | ||
2007 | { | ||
2008 | NotImplemented("llGroundNormal"); | ||
2009 | return new LSL_Types.Vector3(); | ||
2010 | } | ||
2011 | |||
2012 | public LSL_Types.Vector3 llGroundContour(LSL_Types.Vector3 offset) | ||
2013 | { | ||
2014 | NotImplemented("llGroundContour"); | ||
2015 | return new LSL_Types.Vector3(); | ||
2016 | } | ||
2017 | |||
2018 | public int llGetAttached() | ||
2019 | { | ||
2020 | NotImplemented("llGetAttached"); | ||
2021 | return 0; | ||
2022 | } | ||
2023 | |||
2024 | public int llGetFreeMemory() | ||
2025 | { | ||
2026 | NotImplemented("llGetFreeMemory"); | ||
2027 | return 0; | ||
2028 | } | ||
2029 | |||
2030 | public string llGetRegionName() | ||
2031 | { | ||
2032 | return World.RegionInfo.RegionName; | ||
2033 | } | ||
2034 | |||
2035 | public double llGetRegionTimeDilation() | ||
2036 | { | ||
2037 | return (double)World.TimeDilation; | ||
2038 | } | ||
2039 | |||
2040 | public double llGetRegionFPS() | ||
2041 | { | ||
2042 | return 10.0f; | ||
2043 | } | ||
2044 | |||
2045 | /* particle system rules should be coming into this routine as doubles, that is | ||
2046 | rule[0] should be an integer from this list and rule[1] should be the arg | ||
2047 | for the same integer. wiki.secondlife.com has most of this mapping, but some | ||
2048 | came from http://www.caligari-designs.com/p4u2 | ||
2049 | |||
2050 | We iterate through the list for 'Count' elements, incrementing by two for each | ||
2051 | iteration and set the members of Primitive.ParticleSystem, one at a time. | ||
2052 | */ | ||
2053 | |||
2054 | public enum PrimitiveRule : int | ||
2055 | { | ||
2056 | PSYS_PART_FLAGS = 0, | ||
2057 | PSYS_PART_START_COLOR = 1, | ||
2058 | PSYS_PART_START_ALPHA = 2, | ||
2059 | PSYS_PART_END_COLOR = 3, | ||
2060 | PSYS_PART_END_ALPHA = 4, | ||
2061 | PSYS_PART_START_SCALE = 5, | ||
2062 | PSYS_PART_END_SCALE = 6, | ||
2063 | PSYS_PART_MAX_AGE = 7, | ||
2064 | PSYS_SRC_ACCEL = 8, | ||
2065 | PSYS_SRC_PATTERN = 9, | ||
2066 | PSYS_SRC_TEXTURE = 12, | ||
2067 | PSYS_SRC_BURST_RATE = 13, | ||
2068 | PSYS_SRC_BURST_PART_COUNT = 15, | ||
2069 | PSYS_SRC_BURST_RADIUS = 16, | ||
2070 | PSYS_SRC_BURST_SPEED_MIN = 17, | ||
2071 | PSYS_SRC_BURST_SPEED_MAX = 18, | ||
2072 | PSYS_SRC_MAX_AGE = 19, | ||
2073 | PSYS_SRC_TARGET_KEY = 20, | ||
2074 | PSYS_SRC_OMEGA = 21, | ||
2075 | PSYS_SRC_ANGLE_BEGIN = 22, | ||
2076 | PSYS_SRC_ANGLE_END = 23 | ||
2077 | } | ||
2078 | |||
2079 | public void llParticleSystem(List<Object> rules) | ||
2080 | { | ||
2081 | Primitive.ParticleSystem prules = new Primitive.ParticleSystem(); | ||
2082 | for (int i = 0; i < rules.Count; i += 2) | ||
2083 | { | ||
2084 | switch ((int)rules[i]) | ||
2085 | { | ||
2086 | case (int)LSL_BaseClass.PSYS_PART_FLAGS: | ||
2087 | prules.PartFlags = (uint)rules[i + 1]; | ||
2088 | break; | ||
2089 | |||
2090 | case (int)LSL_BaseClass.PSYS_PART_START_COLOR: | ||
2091 | prules.PartStartColor = (LLColor)rules[i + 1]; | ||
2092 | break; | ||
2093 | |||
2094 | case (int)LSL_BaseClass.PSYS_PART_START_ALPHA: | ||
2095 | //what is the cast? prules.PartStartColor = (LSL_Types.Vec)rules[i + 1]; | ||
2096 | break; | ||
2097 | |||
2098 | case (int)LSL_BaseClass.PSYS_PART_END_COLOR: | ||
2099 | prules.PartEndColor = (LLColor)rules[i + 1]; | ||
2100 | break; | ||
2101 | |||
2102 | case (int)LSL_BaseClass.PSYS_PART_END_ALPHA: | ||
2103 | //what is the cast? prules.PartStartColor = (LLColor)rules[i + 1]; | ||
2104 | break; | ||
2105 | |||
2106 | case (int)LSL_BaseClass.PSYS_PART_START_SCALE: | ||
2107 | //what is the cast? prules.PartStartColor = (LLColor)rules[i + 1]; | ||
2108 | break; | ||
2109 | |||
2110 | case (int)LSL_BaseClass.PSYS_PART_END_SCALE: | ||
2111 | //what is the cast? prules.PartStartColor = (LLColor)rules[i + 1]; | ||
2112 | break; | ||
2113 | |||
2114 | case (int)LSL_BaseClass.PSYS_PART_MAX_AGE: | ||
2115 | prules.MaxAge = (float)rules[i + 1]; | ||
2116 | break; | ||
2117 | |||
2118 | case (int)LSL_BaseClass.PSYS_SRC_ACCEL: | ||
2119 | //what is the cast? prules.PartStartColor = (LLColor)rules[i + 1]; | ||
2120 | break; | ||
2121 | |||
2122 | case (int)LSL_BaseClass.PSYS_SRC_PATTERN: | ||
2123 | //what is the cast? prules.PartStartColor = (LLColor)rules[i + 1]; | ||
2124 | break; | ||
2125 | |||
2126 | case (int)LSL_BaseClass.PSYS_SRC_TEXTURE: | ||
2127 | prules.Texture = (LLUUID)rules[i + 1]; | ||
2128 | break; | ||
2129 | |||
2130 | case (int)LSL_BaseClass.PSYS_SRC_BURST_RATE: | ||
2131 | prules.BurstRate = (float)rules[i + 1]; | ||
2132 | break; | ||
2133 | |||
2134 | case (int)LSL_BaseClass.PSYS_SRC_BURST_PART_COUNT: | ||
2135 | prules.BurstPartCount = (byte)rules[i + 1]; | ||
2136 | break; | ||
2137 | |||
2138 | case (int)LSL_BaseClass.PSYS_SRC_BURST_RADIUS: | ||
2139 | prules.BurstRadius = (float)rules[i + 1]; | ||
2140 | break; | ||
2141 | |||
2142 | case (int)LSL_BaseClass.PSYS_SRC_BURST_SPEED_MIN: | ||
2143 | prules.BurstSpeedMin = (float)rules[i + 1]; | ||
2144 | break; | ||
2145 | |||
2146 | case (int)LSL_BaseClass.PSYS_SRC_BURST_SPEED_MAX: | ||
2147 | prules.BurstSpeedMax = (float)rules[i + 1]; | ||
2148 | break; | ||
2149 | |||
2150 | case (int)LSL_BaseClass.PSYS_SRC_MAX_AGE: | ||
2151 | prules.MaxAge = (float)rules[i + 1]; | ||
2152 | break; | ||
2153 | |||
2154 | case (int)LSL_BaseClass.PSYS_SRC_TARGET_KEY: | ||
2155 | prules.Target = (LLUUID)rules[i + 1]; | ||
2156 | break; | ||
2157 | |||
2158 | case (int)LSL_BaseClass.PSYS_SRC_OMEGA: | ||
2159 | //cast?? prules.MaxAge = (float)rules[i + 1]; | ||
2160 | break; | ||
2161 | |||
2162 | case (int)LSL_BaseClass.PSYS_SRC_ANGLE_BEGIN: | ||
2163 | prules.InnerAngle = (float)rules[i + 1]; | ||
2164 | break; | ||
2165 | |||
2166 | case (int)LSL_BaseClass.PSYS_SRC_ANGLE_END: | ||
2167 | prules.OuterAngle = (float)rules[i + 1]; | ||
2168 | break; | ||
2169 | } | ||
2170 | } | ||
2171 | |||
2172 | m_host.AddNewParticleSystem(prules); | ||
2173 | } | ||
2174 | |||
2175 | public void llGroundRepel(double height, int water, double tau) | ||
2176 | { | ||
2177 | NotImplemented("llGroundRepel"); | ||
2178 | } | ||
2179 | |||
2180 | public void llGiveInventoryList() | ||
2181 | { | ||
2182 | NotImplemented("llGiveInventoryList"); | ||
2183 | } | ||
2184 | |||
2185 | public void llSetVehicleType(int type) | ||
2186 | { | ||
2187 | NotImplemented("llSetVehicleType"); | ||
2188 | } | ||
2189 | |||
2190 | public void llSetVehicledoubleParam(int param, double value) | ||
2191 | { | ||
2192 | NotImplemented("llSetVehicledoubleParam"); | ||
2193 | } | ||
2194 | |||
2195 | public void llSetVehicleVectorParam(int param, LSL_Types.Vector3 vec) | ||
2196 | { | ||
2197 | NotImplemented("llSetVehicleVectorParam"); | ||
2198 | } | ||
2199 | |||
2200 | public void llSetVehicleRotationParam(int param, LSL_Types.Quaternion rot) | ||
2201 | { | ||
2202 | NotImplemented("llSetVehicleRotationParam"); | ||
2203 | } | ||
2204 | |||
2205 | public void llSetVehicleFlags(int flags) | ||
2206 | { | ||
2207 | NotImplemented("llSetVehicleFlags"); | ||
2208 | } | ||
2209 | |||
2210 | public void llRemoveVehicleFlags(int flags) | ||
2211 | { | ||
2212 | NotImplemented("llRemoveVehicleFlags"); | ||
2213 | } | ||
2214 | |||
2215 | public void llSitTarget(LSL_Types.Vector3 offset, LSL_Types.Quaternion rot) | ||
2216 | { | ||
2217 | // LSL quaternions can normalize to 0, normal Quaternions can't. | ||
2218 | if (rot.s == 0 && rot.x == 0 && rot.y == 0 && rot.z == 0) | ||
2219 | rot.z = 1; // ZERO_ROTATION = 0,0,0,1 | ||
2220 | |||
2221 | 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)); | ||
2222 | } | ||
2223 | |||
2224 | public string llAvatarOnSitTarget() | ||
2225 | { | ||
2226 | LLUUID AVID = m_host.GetAvatarOnSitTarget(); | ||
2227 | |||
2228 | if (AVID != LLUUID.Zero) | ||
2229 | return AVID.ToString(); | ||
2230 | else | ||
2231 | return ""; | ||
2232 | } | ||
2233 | |||
2234 | public void llAddToLandPassList(string avatar, double hours) | ||
2235 | { | ||
2236 | NotImplemented("llAddToLandPassList"); | ||
2237 | } | ||
2238 | |||
2239 | public void llSetTouchText(string text) | ||
2240 | { | ||
2241 | m_host.TouchName = text; | ||
2242 | } | ||
2243 | |||
2244 | public void llSetSitText(string text) | ||
2245 | { | ||
2246 | m_host.SitName = text; | ||
2247 | } | ||
2248 | |||
2249 | public void llSetCameraEyeOffset(LSL_Types.Vector3 offset) | ||
2250 | { | ||
2251 | NotImplemented("llSetCameraEyeOffset"); | ||
2252 | } | ||
2253 | |||
2254 | public void llSetCameraAtOffset(LSL_Types.Vector3 offset) | ||
2255 | { | ||
2256 | NotImplemented("llSetCameraAtOffset"); | ||
2257 | } | ||
2258 | |||
2259 | public string llDumpList2String(LSL_Types.list src, string seperator) | ||
2260 | { | ||
2261 | if (src.Length == 0) | ||
2262 | { | ||
2263 | return ""; | ||
2264 | } | ||
2265 | string ret = ""; | ||
2266 | foreach (object o in src.Data) | ||
2267 | { | ||
2268 | ret = ret + o.ToString() + seperator; | ||
2269 | } | ||
2270 | ret = ret.Substring(0, ret.Length - seperator.Length); | ||
2271 | return ret; | ||
2272 | } | ||
2273 | |||
2274 | public void llScriptDanger(LSL_Types.Vector3 pos) | ||
2275 | { | ||
2276 | NotImplemented("llScriptDanger"); | ||
2277 | } | ||
2278 | |||
2279 | public void llDialog(string avatar, string message, LSL_Types.list buttons, int chat_channel) | ||
2280 | { | ||
2281 | NotImplemented("llDialog"); | ||
2282 | } | ||
2283 | |||
2284 | public void llVolumeDetect(int detect) | ||
2285 | { | ||
2286 | NotImplemented("llVolumeDetect"); | ||
2287 | } | ||
2288 | |||
2289 | public void llResetOtherScript(string name) | ||
2290 | { | ||
2291 | NotImplemented("llResetOtherScript"); | ||
2292 | } | ||
2293 | |||
2294 | public int llGetScriptState(string name) | ||
2295 | { | ||
2296 | NotImplemented("llGetScriptState"); | ||
2297 | return 0; | ||
2298 | } | ||
2299 | |||
2300 | public void llRemoteLoadScript() | ||
2301 | { | ||
2302 | NotImplemented("llRemoteLoadScript"); | ||
2303 | } | ||
2304 | |||
2305 | public void llSetRemoteScriptAccessPin(int pin) | ||
2306 | { | ||
2307 | NotImplemented("llSetRemoteScriptAccessPin"); | ||
2308 | } | ||
2309 | |||
2310 | public void llRemoteLoadScriptPin(string target, string name, int pin, int running, int start_param) | ||
2311 | { | ||
2312 | NotImplemented("llRemoteLoadScriptPin"); | ||
2313 | } | ||
2314 | |||
2315 | // remote_data(integer type, key channel, key message_id, string sender, integer ival, string sval) | ||
2316 | // Not sure where these constants should live: | ||
2317 | // REMOTE_DATA_CHANNEL = 1 | ||
2318 | // REMOTE_DATA_REQUEST = 2 | ||
2319 | // REMOTE_DATA_REPLY = 3 | ||
2320 | public void llOpenRemoteDataChannel() | ||
2321 | { | ||
2322 | IXMLRPC xmlrpcMod = m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>(); | ||
2323 | if (xmlrpcMod.IsEnabled()) | ||
2324 | { | ||
2325 | LLUUID channelID = xmlrpcMod.OpenXMLRPCChannel(m_localID, m_itemID); | ||
2326 | object[] resobj = new object[] { 1, channelID.ToString(), LLUUID.Zero.ToString(), "", 0, "" }; | ||
2327 | m_ScriptEngine.m_EventQueueManager.AddToScriptQueue(m_localID, m_itemID, "remote_data", resobj); | ||
2328 | } | ||
2329 | } | ||
2330 | |||
2331 | public string llSendRemoteData(string channel, string dest, int idata, string sdata) | ||
2332 | { | ||
2333 | NotImplemented("llSendRemoteData"); | ||
2334 | return ""; | ||
2335 | } | ||
2336 | |||
2337 | public void llRemoteDataReply(string channel, string message_id, string sdata, int idata) | ||
2338 | { | ||
2339 | IXMLRPC xmlrpcMod = m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>(); | ||
2340 | xmlrpcMod.RemoteDataReply(channel, message_id, sdata, idata); | ||
2341 | } | ||
2342 | |||
2343 | public void llCloseRemoteDataChannel(string channel) | ||
2344 | { | ||
2345 | IXMLRPC xmlrpcMod = m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>(); | ||
2346 | xmlrpcMod.CloseXMLRPCChannel(channel); | ||
2347 | } | ||
2348 | |||
2349 | public string llMD5String(string src, int nonce) | ||
2350 | { | ||
2351 | return Util.Md5Hash(src + ":" + nonce.ToString()); | ||
2352 | } | ||
2353 | |||
2354 | public void llSetPrimitiveParams(LSL_Types.list rules) | ||
2355 | { | ||
2356 | NotImplemented("llSetPrimitiveParams"); | ||
2357 | } | ||
2358 | |||
2359 | public string llStringToBase64(string str) | ||
2360 | { | ||
2361 | try | ||
2362 | { | ||
2363 | byte[] encData_byte = new byte[str.Length]; | ||
2364 | encData_byte = Encoding.UTF8.GetBytes(str); | ||
2365 | string encodedData = Convert.ToBase64String(encData_byte); | ||
2366 | return encodedData; | ||
2367 | } | ||
2368 | catch (Exception e) | ||
2369 | { | ||
2370 | throw new Exception("Error in base64Encode" + e.Message); | ||
2371 | } | ||
2372 | } | ||
2373 | |||
2374 | public string llBase64ToString(string str) | ||
2375 | { | ||
2376 | UTF8Encoding encoder = new UTF8Encoding(); | ||
2377 | Decoder utf8Decode = encoder.GetDecoder(); | ||
2378 | try | ||
2379 | { | ||
2380 | byte[] todecode_byte = Convert.FromBase64String(str); | ||
2381 | int charCount = utf8Decode.GetCharCount(todecode_byte, 0, todecode_byte.Length); | ||
2382 | char[] decoded_char = new char[charCount]; | ||
2383 | utf8Decode.GetChars(todecode_byte, 0, todecode_byte.Length, decoded_char, 0); | ||
2384 | string result = new String(decoded_char); | ||
2385 | return result; | ||
2386 | } | ||
2387 | catch (Exception e) | ||
2388 | { | ||
2389 | throw new Exception("Error in base64Decode" + e.Message); | ||
2390 | } | ||
2391 | } | ||
2392 | |||
2393 | public void llXorBase64Strings() | ||
2394 | { | ||
2395 | throw new Exception("Command deprecated! Use llXorBase64StringsCorrect instead."); | ||
2396 | } | ||
2397 | |||
2398 | public void llRemoteDataSetRegion() | ||
2399 | { | ||
2400 | NotImplemented("llRemoteDataSetRegion"); | ||
2401 | } | ||
2402 | |||
2403 | public double llLog10(double val) | ||
2404 | { | ||
2405 | return (double)Math.Log10(val); | ||
2406 | } | ||
2407 | |||
2408 | public double llLog(double val) | ||
2409 | { | ||
2410 | return (double)Math.Log(val); | ||
2411 | } | ||
2412 | |||
2413 | public LSL_Types.list llGetAnimationList(string id) | ||
2414 | { | ||
2415 | NotImplemented("llGetAnimationList"); | ||
2416 | return new LSL_Types.list(); | ||
2417 | } | ||
2418 | |||
2419 | public void llSetParcelMusicURL(string url) | ||
2420 | { | ||
2421 | LLUUID landowner = World.GetLandOwner(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y); | ||
2422 | if (landowner.Equals(null)) | ||
2423 | { | ||
2424 | return; | ||
2425 | } | ||
2426 | if (landowner != m_host.ObjectOwner) | ||
2427 | { | ||
2428 | return; | ||
2429 | } | ||
2430 | World.SetLandMusicURL(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y, url); | ||
2431 | } | ||
2432 | |||
2433 | public LSL_Types.Vector3 llGetRootPosition() | ||
2434 | { | ||
2435 | return new LSL_Types.Vector3(m_host.ParentGroup.AbsolutePosition.X, m_host.ParentGroup.AbsolutePosition.Y, m_host.ParentGroup.AbsolutePosition.Z); | ||
2436 | } | ||
2437 | |||
2438 | public LSL_Types.Quaternion llGetRootRotation() | ||
2439 | { | ||
2440 | 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); | ||
2441 | } | ||
2442 | |||
2443 | public string llGetObjectDesc() | ||
2444 | { | ||
2445 | return m_host.Description; | ||
2446 | } | ||
2447 | |||
2448 | public void llSetObjectDesc(string desc) | ||
2449 | { | ||
2450 | m_host.Description = desc; | ||
2451 | } | ||
2452 | |||
2453 | public string llGetCreator() | ||
2454 | { | ||
2455 | return m_host.ObjectCreator.ToString(); | ||
2456 | } | ||
2457 | |||
2458 | public string llGetTimestamp() | ||
2459 | { | ||
2460 | return DateTime.Now.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss.fffffffZ"); | ||
2461 | } | ||
2462 | |||
2463 | public void llSetLinkAlpha(int linknumber, double alpha, int face) | ||
2464 | { | ||
2465 | SceneObjectPart part = m_host.ParentGroup.GetLinkNumPart(linknumber); | ||
2466 | if (linknumber > -1) | ||
2467 | { | ||
2468 | LLObject.TextureEntry tex = part.Shape.Textures; | ||
2469 | LLColor texcolor; | ||
2470 | if (face > -1) | ||
2471 | { | ||
2472 | texcolor = tex.CreateFace((uint)face).RGBA; | ||
2473 | texcolor.A = (float)Math.Abs(alpha - 1); | ||
2474 | tex.FaceTextures[face].RGBA = texcolor; | ||
2475 | part.UpdateTexture(tex); | ||
2476 | return; | ||
2477 | } | ||
2478 | else if (face == -1) | ||
2479 | { | ||
2480 | texcolor = tex.DefaultTexture.RGBA; | ||
2481 | texcolor.A = (float)Math.Abs(alpha - 1); | ||
2482 | tex.DefaultTexture.RGBA = texcolor; | ||
2483 | for (uint i = 0; i < 32; i++) | ||
2484 | { | ||
2485 | if (tex.FaceTextures[i] != null) | ||
2486 | { | ||
2487 | texcolor = tex.FaceTextures[i].RGBA; | ||
2488 | texcolor.A = (float)Math.Abs(alpha - 1); | ||
2489 | tex.FaceTextures[i].RGBA = texcolor; | ||
2490 | } | ||
2491 | } | ||
2492 | texcolor = tex.DefaultTexture.RGBA; | ||
2493 | texcolor.A = (float)Math.Abs(alpha - 1); | ||
2494 | tex.DefaultTexture.RGBA = texcolor; | ||
2495 | part.UpdateTexture(tex); | ||
2496 | return; | ||
2497 | } | ||
2498 | return; | ||
2499 | } | ||
2500 | else if (linknumber == -1) | ||
2501 | { | ||
2502 | int num = m_host.ParentGroup.PrimCount; | ||
2503 | for (int w = 0; w < num; w++) | ||
2504 | { | ||
2505 | linknumber = w; | ||
2506 | part = m_host.ParentGroup.GetLinkNumPart(linknumber); | ||
2507 | LLObject.TextureEntry tex = part.Shape.Textures; | ||
2508 | LLColor texcolor; | ||
2509 | if (face > -1) | ||
2510 | { | ||
2511 | texcolor = tex.CreateFace((uint)face).RGBA; | ||
2512 | texcolor.A = (float)Math.Abs(alpha - 1); | ||
2513 | tex.FaceTextures[face].RGBA = texcolor; | ||
2514 | part.UpdateTexture(tex); | ||
2515 | } | ||
2516 | else if (face == -1) | ||
2517 | { | ||
2518 | texcolor = tex.DefaultTexture.RGBA; | ||
2519 | texcolor.A = (float)Math.Abs(alpha - 1); | ||
2520 | tex.DefaultTexture.RGBA = texcolor; | ||
2521 | for (uint i = 0; i < 32; i++) | ||
2522 | { | ||
2523 | if (tex.FaceTextures[i] != null) | ||
2524 | { | ||
2525 | texcolor = tex.FaceTextures[i].RGBA; | ||
2526 | texcolor.A = (float)Math.Abs(alpha - 1); | ||
2527 | tex.FaceTextures[i].RGBA = texcolor; | ||
2528 | } | ||
2529 | } | ||
2530 | texcolor = tex.DefaultTexture.RGBA; | ||
2531 | texcolor.A = (float)Math.Abs(alpha - 1); | ||
2532 | tex.DefaultTexture.RGBA = texcolor; | ||
2533 | part.UpdateTexture(tex); | ||
2534 | } | ||
2535 | } | ||
2536 | return; | ||
2537 | } | ||
2538 | else | ||
2539 | { | ||
2540 | NotImplemented("llSetLinkAlpha"); | ||
2541 | } | ||
2542 | } | ||
2543 | |||
2544 | public int llGetNumberOfPrims() | ||
2545 | { | ||
2546 | return m_host.ParentGroup.PrimCount; | ||
2547 | } | ||
2548 | |||
2549 | public string llGetNumberOfNotecardLines(string name) | ||
2550 | { | ||
2551 | NotImplemented("llGetNumberOfNotecardLines"); | ||
2552 | return ""; | ||
2553 | } | ||
2554 | |||
2555 | public LSL_Types.list llGetBoundingBox(string obj) | ||
2556 | { | ||
2557 | NotImplemented("llGetBoundingBox"); | ||
2558 | return new LSL_Types.list(); | ||
2559 | } | ||
2560 | |||
2561 | public LSL_Types.Vector3 llGetGeometricCenter() | ||
2562 | { | ||
2563 | return new LSL_Types.Vector3(m_host.GetGeometricCenter().X, m_host.GetGeometricCenter().Y, m_host.GetGeometricCenter().Z); | ||
2564 | } | ||
2565 | |||
2566 | public void llGetPrimitiveParams() | ||
2567 | { | ||
2568 | NotImplemented("llGetPrimitiveParams"); | ||
2569 | } | ||
2570 | |||
2571 | public string llIntegerToBase64(int number) | ||
2572 | { | ||
2573 | NotImplemented("llIntegerToBase64"); | ||
2574 | return ""; | ||
2575 | } | ||
2576 | |||
2577 | public int llBase64ToInteger(string str) | ||
2578 | { | ||
2579 | NotImplemented("llBase64ToInteger"); | ||
2580 | return 0; | ||
2581 | } | ||
2582 | |||
2583 | public double llGetGMTclock() | ||
2584 | { | ||
2585 | return DateTime.UtcNow.TimeOfDay.TotalSeconds; | ||
2586 | } | ||
2587 | |||
2588 | public string llGetSimulatorHostname() | ||
2589 | { | ||
2590 | return System.Environment.MachineName; | ||
2591 | } | ||
2592 | |||
2593 | public void llSetLocalRot(LSL_Types.Quaternion rot) | ||
2594 | { | ||
2595 | m_host.RotationOffset = new LLQuaternion((float)rot.x, (float)rot.y, (float)rot.z, (float)rot.s); | ||
2596 | } | ||
2597 | |||
2598 | public LSL_Types.list llParseStringKeepNulls(string src, LSL_Types.list seperators, LSL_Types.list spacers) | ||
2599 | { | ||
2600 | NotImplemented("llParseStringKeepNulls"); | ||
2601 | return new LSL_Types.list(); | ||
2602 | } | ||
2603 | |||
2604 | public void llRezAtRoot(string inventory, LSL_Types.Vector3 position, LSL_Types.Vector3 velocity, | ||
2605 | LSL_Types.Quaternion rot, int param) | ||
2606 | { | ||
2607 | NotImplemented("llRezAtRoot"); | ||
2608 | } | ||
2609 | |||
2610 | public int llGetObjectPermMask(int mask) | ||
2611 | { | ||
2612 | NotImplemented("llGetObjectPermMask"); | ||
2613 | return 0; | ||
2614 | } | ||
2615 | |||
2616 | public void llSetObjectPermMask(int mask, int value) | ||
2617 | { | ||
2618 | NotImplemented("llSetObjectPermMask"); | ||
2619 | } | ||
2620 | |||
2621 | public void llGetInventoryPermMask(string item, int mask) | ||
2622 | { | ||
2623 | NotImplemented("llGetInventoryPermMask"); | ||
2624 | } | ||
2625 | |||
2626 | public void llSetInventoryPermMask(string item, int mask, int value) | ||
2627 | { | ||
2628 | NotImplemented("llSetInventoryPermMask"); | ||
2629 | } | ||
2630 | |||
2631 | public string llGetInventoryCreator(string item) | ||
2632 | { | ||
2633 | NotImplemented("llGetInventoryCreator"); | ||
2634 | return ""; | ||
2635 | } | ||
2636 | |||
2637 | public void llOwnerSay(string msg) | ||
2638 | { | ||
2639 | //temp fix so that lsl wiki examples aren't annoying to use to test other functions | ||
2640 | World.SimChat(Helpers.StringToField(msg), ChatTypeEnum.Say, 0, m_host.AbsolutePosition, m_host.Name, m_host.UUID); | ||
2641 | IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); | ||
2642 | wComm.DeliverMessage(m_host.UUID.ToString(), ChatTypeEnum.Say, 0, m_host.Name, msg); | ||
2643 | } | ||
2644 | |||
2645 | public void llRequestSimulatorData(string simulator, int data) | ||
2646 | { | ||
2647 | NotImplemented("llRequestSimulatorData"); | ||
2648 | } | ||
2649 | |||
2650 | public void llForceMouselook(int mouselook) | ||
2651 | { | ||
2652 | NotImplemented("llForceMouselook"); | ||
2653 | } | ||
2654 | |||
2655 | public double llGetObjectMass(string id) | ||
2656 | { | ||
2657 | NotImplemented("llGetObjectMass"); | ||
2658 | return 0; | ||
2659 | } | ||
2660 | |||
2661 | public LSL_Types.list llListReplaceList(LSL_Types.list dest, LSL_Types.list src, int start, int end) | ||
2662 | { | ||
2663 | return dest.GetSublist(0, start - 1) + src + dest.GetSublist(end + 1, -1); | ||
2664 | } | ||
2665 | |||
2666 | public void llLoadURL(string avatar_id, string message, string url) | ||
2667 | { | ||
2668 | LLUUID avatarId = new LLUUID(avatar_id); | ||
2669 | m_ScriptEngine.World.SendUrlToUser(avatarId, m_host.Name, m_host.UUID, m_host.ObjectOwner, false, message, | ||
2670 | url); | ||
2671 | } | ||
2672 | |||
2673 | public void llParcelMediaCommandList(LSL_Types.list commandList) | ||
2674 | { | ||
2675 | NotImplemented("llParcelMediaCommandList"); | ||
2676 | } | ||
2677 | |||
2678 | public void llParcelMediaQuery() | ||
2679 | { | ||
2680 | NotImplemented("llParcelMediaQuery"); | ||
2681 | } | ||
2682 | |||
2683 | public int llModPow(int a, int b, int c) | ||
2684 | { | ||
2685 | Int64 tmp = 0; | ||
2686 | Int64 val = Math.DivRem(Convert.ToInt64(Math.Pow(a, b)), c, out tmp); | ||
2687 | return Convert.ToInt32(tmp); | ||
2688 | } | ||
2689 | |||
2690 | public int llGetInventoryType(string name) | ||
2691 | { | ||
2692 | NotImplemented("llGetInventoryType"); | ||
2693 | return 0; | ||
2694 | } | ||
2695 | |||
2696 | public void llSetPayPrice(int price, LSL_Types.list quick_pay_buttons) | ||
2697 | { | ||
2698 | NotImplemented("llSetPayPrice"); | ||
2699 | } | ||
2700 | |||
2701 | public LSL_Types.Vector3 llGetCameraPos() | ||
2702 | { | ||
2703 | NotImplemented("llGetCameraPos"); | ||
2704 | return new LSL_Types.Vector3(); | ||
2705 | } | ||
2706 | |||
2707 | public LSL_Types.Quaternion llGetCameraRot() | ||
2708 | { | ||
2709 | NotImplemented("llGetCameraRot"); | ||
2710 | return new LSL_Types.Quaternion(); | ||
2711 | } | ||
2712 | |||
2713 | public void llSetPrimURL() | ||
2714 | { | ||
2715 | NotImplemented("llSetPrimURL"); | ||
2716 | } | ||
2717 | |||
2718 | public void llRefreshPrimURL() | ||
2719 | { | ||
2720 | NotImplemented("llRefreshPrimURL"); | ||
2721 | } | ||
2722 | |||
2723 | public string llEscapeURL(string url) | ||
2724 | { | ||
2725 | try | ||
2726 | { | ||
2727 | return Uri.EscapeUriString(url); | ||
2728 | } | ||
2729 | catch (Exception ex) | ||
2730 | { | ||
2731 | return "llEscapeURL: " + ex.ToString(); | ||
2732 | } | ||
2733 | } | ||
2734 | |||
2735 | public string llUnescapeURL(string url) | ||
2736 | { | ||
2737 | try | ||
2738 | { | ||
2739 | return Uri.UnescapeDataString(url); | ||
2740 | } | ||
2741 | catch (Exception ex) | ||
2742 | { | ||
2743 | return "llUnescapeURL: " + ex.ToString(); | ||
2744 | } | ||
2745 | } | ||
2746 | |||
2747 | public void llMapDestination(string simname, LSL_Types.Vector3 pos, LSL_Types.Vector3 look_at) | ||
2748 | { | ||
2749 | NotImplemented("llMapDestination"); | ||
2750 | } | ||
2751 | |||
2752 | public void llAddToLandBanList(string avatar, double hours) | ||
2753 | { | ||
2754 | NotImplemented("llAddToLandBanList"); | ||
2755 | } | ||
2756 | |||
2757 | public void llRemoveFromLandPassList(string avatar) | ||
2758 | { | ||
2759 | NotImplemented("llRemoveFromLandPassList"); | ||
2760 | } | ||
2761 | |||
2762 | public void llRemoveFromLandBanList(string avatar) | ||
2763 | { | ||
2764 | NotImplemented("llRemoveFromLandBanList"); | ||
2765 | } | ||
2766 | |||
2767 | public void llSetCameraParams(LSL_Types.list rules) | ||
2768 | { | ||
2769 | NotImplemented("llSetCameraParams"); | ||
2770 | } | ||
2771 | |||
2772 | public void llClearCameraParams() | ||
2773 | { | ||
2774 | NotImplemented("llClearCameraParams"); | ||
2775 | } | ||
2776 | |||
2777 | public double llListStatistics(int operation, LSL_Types.list src) | ||
2778 | { | ||
2779 | NotImplemented("llListStatistics"); | ||
2780 | return 0; | ||
2781 | } | ||
2782 | |||
2783 | public int llGetUnixTime() | ||
2784 | { | ||
2785 | return Util.UnixTimeSinceEpoch(); | ||
2786 | } | ||
2787 | |||
2788 | public int llGetParcelFlags(LSL_Types.Vector3 pos) | ||
2789 | { | ||
2790 | NotImplemented("llGetParcelFlags"); | ||
2791 | return 0; | ||
2792 | } | ||
2793 | |||
2794 | public int llGetRegionFlags() | ||
2795 | { | ||
2796 | NotImplemented("llGetRegionFlags"); | ||
2797 | return 0; | ||
2798 | } | ||
2799 | |||
2800 | public string llXorBase64StringsCorrect(string str1, string str2) | ||
2801 | { | ||
2802 | string ret = ""; | ||
2803 | string src1 = llBase64ToString(str1); | ||
2804 | string src2 = llBase64ToString(str2); | ||
2805 | int c = 0; | ||
2806 | for (int i = 0; i < src1.Length; i++) | ||
2807 | { | ||
2808 | ret += src1[i] ^ src2[c]; | ||
2809 | |||
2810 | c++; | ||
2811 | if (c > src2.Length) | ||
2812 | c = 0; | ||
2813 | } | ||
2814 | return llStringToBase64(ret); | ||
2815 | } | ||
2816 | |||
2817 | public string llHTTPRequest(string url, LSL_Types.list parameters, string body) | ||
2818 | { | ||
2819 | IHttpRequests httpScriptMod = | ||
2820 | m_ScriptEngine.World.RequestModuleInterface<IHttpRequests>(); | ||
2821 | List<string> param = new List<string>(); | ||
2822 | foreach (object o in parameters.Data) | ||
2823 | { | ||
2824 | param.Add(o.ToString()); | ||
2825 | } | ||
2826 | LLUUID reqID = httpScriptMod. | ||
2827 | StartHttpRequest(m_localID, m_itemID, url, param, body); | ||
2828 | |||
2829 | if (!reqID.Equals(null)) | ||
2830 | return reqID.ToString(); | ||
2831 | else | ||
2832 | return null; | ||
2833 | } | ||
2834 | |||
2835 | public void llResetLandBanList() | ||
2836 | { | ||
2837 | NotImplemented("llResetLandBanList"); | ||
2838 | } | ||
2839 | |||
2840 | public void llResetLandPassList() | ||
2841 | { | ||
2842 | NotImplemented("llResetLandPassList"); | ||
2843 | } | ||
2844 | |||
2845 | public int llGetParcelPrimCount(LSL_Types.Vector3 pos, int category, int sim_wide) | ||
2846 | { | ||
2847 | NotImplemented("llGetParcelPrimCount"); | ||
2848 | return 0; | ||
2849 | } | ||
2850 | |||
2851 | public LSL_Types.list llGetParcelPrimOwners(LSL_Types.Vector3 pos) | ||
2852 | { | ||
2853 | NotImplemented("llGetParcelPrimOwners"); | ||
2854 | return new LSL_Types.list(); | ||
2855 | } | ||
2856 | |||
2857 | public int llGetObjectPrimCount(string object_id) | ||
2858 | { | ||
2859 | SceneObjectPart part = World.GetSceneObjectPart(new LLUUID(object_id)); | ||
2860 | if (part == null) | ||
2861 | { | ||
2862 | return 0; | ||
2863 | } | ||
2864 | else | ||
2865 | { | ||
2866 | return part.ParentGroup.Children.Count; | ||
2867 | } | ||
2868 | } | ||
2869 | |||
2870 | public int llGetParcelMaxPrims(LSL_Types.Vector3 pos, int sim_wide) | ||
2871 | { | ||
2872 | // Alondria: This currently just is utilizing the normal grid's 0.22 prims/m2 calculation | ||
2873 | // Which probably will be irrelevent in OpenSim.... | ||
2874 | LandData land = World.GetLandData((float)pos.x, (float)pos.y); | ||
2875 | float bonusfactor = World.RegionInfo.EstateSettings.objectBonusFactor; | ||
2876 | if (land == null) | ||
2877 | { | ||
2878 | return 0; | ||
2879 | } | ||
2880 | if (sim_wide == 1) | ||
2881 | { | ||
2882 | decimal v = land.simwideArea * (decimal)(0.22) * (decimal)bonusfactor; | ||
2883 | return (int)v; | ||
2884 | } | ||
2885 | else | ||
2886 | { | ||
2887 | decimal v = land.area * (decimal)(0.22) * (decimal)bonusfactor; | ||
2888 | return (int)v; | ||
2889 | } | ||
2890 | |||
2891 | } | ||
2892 | |||
2893 | public LSL_Types.list llGetParcelDetails(LSL_Types.Vector3 pos, LSL_Types.list param) | ||
2894 | { | ||
2895 | LandData land = World.GetLandData((float)pos.x, (float)pos.y); | ||
2896 | if (land == null) | ||
2897 | { | ||
2898 | return new LSL_Types.list(0); | ||
2899 | } | ||
2900 | LSL_Types.list ret = new LSL_Types.list(); | ||
2901 | foreach (object o in param.Data) | ||
2902 | { | ||
2903 | switch (o.ToString()) | ||
2904 | { | ||
2905 | case "0": | ||
2906 | ret = ret + new LSL_Types.list(land.landName); | ||
2907 | break; | ||
2908 | case "1": | ||
2909 | ret = ret + new LSL_Types.list(land.landDesc); | ||
2910 | break; | ||
2911 | case "2": | ||
2912 | ret = ret + new LSL_Types.list(land.ownerID.ToString()); | ||
2913 | break; | ||
2914 | case "3": | ||
2915 | ret = ret + new LSL_Types.list(land.groupID.ToString()); | ||
2916 | break; | ||
2917 | case "4": | ||
2918 | ret = ret + new LSL_Types.list(land.area); | ||
2919 | break; | ||
2920 | default: | ||
2921 | ret = ret + new LSL_Types.list(0); | ||
2922 | break; | ||
2923 | } | ||
2924 | } | ||
2925 | return ret; | ||
2926 | } | ||
2927 | |||
2928 | // | ||
2929 | // OpenSim functions | ||
2930 | // | ||
2931 | public int osTerrainSetHeight(int x, int y, double val) | ||
2932 | { | ||
2933 | if (x > 255 || x < 0 || y > 255 || y < 0) | ||
2934 | LSLError("osTerrainSetHeight: Coordinate out of bounds"); | ||
2935 | |||
2936 | if (World.PermissionsMngr.CanTerraform(m_host.OwnerID, new LLVector3(x, y, 0))) | ||
2937 | { | ||
2938 | World.Terrain.Set(x, y, val); | ||
2939 | return 1; | ||
2940 | } | ||
2941 | else | ||
2942 | { | ||
2943 | return 0; | ||
2944 | } | ||
2945 | } | ||
2946 | |||
2947 | public double osTerrainGetHeight(int x, int y) | ||
2948 | { | ||
2949 | if (x > 255 || x < 0 || y > 255 || y < 0) | ||
2950 | LSLError("osTerrainGetHeight: Coordinate out of bounds"); | ||
2951 | |||
2952 | return World.Terrain.GetHeight(x, y); | ||
2953 | } | ||
2954 | |||
2955 | public int osRegionRestart(double seconds) | ||
2956 | { | ||
2957 | if (World.PermissionsMngr.CanRestartSim(m_host.OwnerID)) | ||
2958 | { | ||
2959 | World.Restart((float)seconds); | ||
2960 | return 1; | ||
2961 | } | ||
2962 | else | ||
2963 | { | ||
2964 | return 0; | ||
2965 | } | ||
2966 | } | ||
2967 | |||
2968 | public void osRegionNotice(string msg) | ||
2969 | { | ||
2970 | World.SendGeneralAlert(msg); | ||
2971 | } | ||
2972 | |||
2973 | public string osSetDynamicTextureURL(string dynamicID, string contentType, string url, string extraParams, | ||
2974 | int timer) | ||
2975 | { | ||
2976 | if (dynamicID == "") | ||
2977 | { | ||
2978 | IDynamicTextureManager textureManager = World.RequestModuleInterface<IDynamicTextureManager>(); | ||
2979 | LLUUID createdTexture = | ||
2980 | textureManager.AddDynamicTextureURL(World.RegionInfo.RegionID, m_host.UUID, contentType, url, | ||
2981 | extraParams, timer); | ||
2982 | return createdTexture.ToString(); | ||
2983 | } | ||
2984 | else | ||
2985 | { | ||
2986 | //TODO update existing dynamic textures | ||
2987 | } | ||
2988 | |||
2989 | return LLUUID.Zero.ToString(); | ||
2990 | } | ||
2991 | |||
2992 | private void NotImplemented(string Command) | ||
2993 | { | ||
2994 | if (throwErrorOnNotImplemented) | ||
2995 | throw new NotImplementedException("Command not implemented: " + Command); | ||
2996 | } | ||
2997 | |||
2998 | private void LSLError(string msg) | ||
2999 | { | ||
3000 | throw new Exception("LSL Runtime Error: " + msg); | ||
3001 | } | ||
3002 | } | ||
3003 | } \ No newline at end of file | ||
diff --git a/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/AppDomainManager.cs b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/AppDomainManager.cs new file mode 100644 index 0000000..4eea69a --- /dev/null +++ b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/AppDomainManager.cs | |||
@@ -0,0 +1,238 @@ | |||
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; | ||
31 | using System.Collections.Generic; | ||
32 | using System.Reflection; | ||
33 | using OpenSim.Region.ScriptEngine.Common; | ||
34 | |||
35 | namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase | ||
36 | { | ||
37 | public class AppDomainManager | ||
38 | { | ||
39 | |||
40 | // | ||
41 | // This class does AppDomain handling and loading/unloading of scripts in it. | ||
42 | // It is instanced in "ScriptEngine" and controlled from "ScriptManager" | ||
43 | // | ||
44 | // 1. Create a new AppDomain if old one is full (or doesn't exist) | ||
45 | // 2. Load scripts into AppDomain | ||
46 | // 3. Unload scripts from AppDomain (stopping them and marking them as inactive) | ||
47 | // 4. Unload AppDomain completely when all scripts in it has stopped | ||
48 | // | ||
49 | |||
50 | |||
51 | private int maxScriptsPerAppDomain = 1; | ||
52 | |||
53 | /// <summary> | ||
54 | /// Internal list of all AppDomains | ||
55 | /// </summary> | ||
56 | private List<AppDomainStructure> appDomains = new List<AppDomainStructure>(); | ||
57 | |||
58 | /// <summary> | ||
59 | /// Structure to keep track of data around AppDomain | ||
60 | /// </summary> | ||
61 | private class AppDomainStructure | ||
62 | { | ||
63 | /// <summary> | ||
64 | /// The AppDomain itself | ||
65 | /// </summary> | ||
66 | public AppDomain CurrentAppDomain; | ||
67 | |||
68 | /// <summary> | ||
69 | /// Number of scripts loaded into AppDomain | ||
70 | /// </summary> | ||
71 | public int ScriptsLoaded; | ||
72 | |||
73 | /// <summary> | ||
74 | /// Number of dead scripts | ||
75 | /// </summary> | ||
76 | public int ScriptsWaitingUnload; | ||
77 | } | ||
78 | |||
79 | /// <summary> | ||
80 | /// Current AppDomain | ||
81 | /// </summary> | ||
82 | private AppDomainStructure currentAD; | ||
83 | |||
84 | private object getLock = new object(); // Mutex | ||
85 | private object freeLock = new object(); // Mutex | ||
86 | |||
87 | //private ScriptEngine m_scriptEngine; | ||
88 | //public AppDomainManager(ScriptEngine scriptEngine) | ||
89 | public AppDomainManager() | ||
90 | { | ||
91 | //m_scriptEngine = scriptEngine; | ||
92 | } | ||
93 | |||
94 | /// <summary> | ||
95 | /// Find a free AppDomain, creating one if necessary | ||
96 | /// </summary> | ||
97 | /// <returns>Free AppDomain</returns> | ||
98 | private AppDomainStructure GetFreeAppDomain() | ||
99 | { | ||
100 | Console.WriteLine("Finding free AppDomain"); | ||
101 | lock (getLock) | ||
102 | { | ||
103 | // Current full? | ||
104 | if (currentAD != null && currentAD.ScriptsLoaded >= maxScriptsPerAppDomain) | ||
105 | { | ||
106 | // Add it to AppDomains list and empty current | ||
107 | appDomains.Add(currentAD); | ||
108 | currentAD = null; | ||
109 | } | ||
110 | // No current | ||
111 | if (currentAD == null) | ||
112 | { | ||
113 | // Create a new current AppDomain | ||
114 | currentAD = new AppDomainStructure(); | ||
115 | currentAD.CurrentAppDomain = PrepareNewAppDomain(); | ||
116 | } | ||
117 | |||
118 | Console.WriteLine("Scripts loaded in this Appdomain: " + currentAD.ScriptsLoaded); | ||
119 | return currentAD; | ||
120 | } // lock | ||
121 | } | ||
122 | |||
123 | private int AppDomainNameCount; | ||
124 | |||
125 | /// <summary> | ||
126 | /// Create and prepare a new AppDomain for scripts | ||
127 | /// </summary> | ||
128 | /// <returns>The new AppDomain</returns> | ||
129 | private AppDomain PrepareNewAppDomain() | ||
130 | { | ||
131 | // Create and prepare a new AppDomain | ||
132 | AppDomainNameCount++; | ||
133 | // TODO: Currently security match current appdomain | ||
134 | |||
135 | // Construct and initialize settings for a second AppDomain. | ||
136 | AppDomainSetup ads = new AppDomainSetup(); | ||
137 | ads.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory; | ||
138 | ads.DisallowBindingRedirects = false; | ||
139 | ads.DisallowCodeDownload = true; | ||
140 | ads.LoaderOptimization = LoaderOptimization.MultiDomain; // Sounds good ;) | ||
141 | ads.ShadowCopyFiles = "true"; // Enabled shadowing | ||
142 | ads.ConfigurationFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile; | ||
143 | |||
144 | AppDomain AD = AppDomain.CreateDomain("ScriptAppDomain_" + AppDomainNameCount, null, ads); | ||
145 | Console.WriteLine("Loading: " + | ||
146 | AssemblyName.GetAssemblyName("OpenSim.Region.ScriptEngine.Common.dll").ToString()); | ||
147 | AD.Load(AssemblyName.GetAssemblyName("OpenSim.Region.ScriptEngine.Common.dll")); | ||
148 | |||
149 | // Return the new AppDomain | ||
150 | return AD; | ||
151 | } | ||
152 | |||
153 | /// <summary> | ||
154 | /// Unload appdomains that are full and have only dead scripts | ||
155 | /// </summary> | ||
156 | private void UnloadAppDomains() | ||
157 | { | ||
158 | lock (freeLock) | ||
159 | { | ||
160 | // Go through all | ||
161 | foreach (AppDomainStructure ads in new ArrayList(appDomains)) | ||
162 | { | ||
163 | // Don't process current AppDomain | ||
164 | if (ads.CurrentAppDomain != currentAD.CurrentAppDomain) | ||
165 | { | ||
166 | // Not current AppDomain | ||
167 | // Is number of unloaded bigger or equal to number of loaded? | ||
168 | if (ads.ScriptsLoaded <= ads.ScriptsWaitingUnload) | ||
169 | { | ||
170 | Console.WriteLine("Found empty AppDomain, unloading"); | ||
171 | // Remove from internal list | ||
172 | appDomains.Remove(ads); | ||
173 | #if DEBUG | ||
174 | long m = GC.GetTotalMemory(true); | ||
175 | #endif | ||
176 | // Unload | ||
177 | AppDomain.Unload(ads.CurrentAppDomain); | ||
178 | #if DEBUG | ||
179 | Console.WriteLine("AppDomain unload freed " + (m - GC.GetTotalMemory(true)) + | ||
180 | " bytes of memory"); | ||
181 | #endif | ||
182 | } | ||
183 | } | ||
184 | } // foreach | ||
185 | } // lock | ||
186 | } | ||
187 | |||
188 | |||
189 | public IScript LoadScript(string FileName) | ||
190 | { | ||
191 | // Find next available AppDomain to put it in | ||
192 | AppDomainStructure FreeAppDomain = GetFreeAppDomain(); | ||
193 | |||
194 | Console.WriteLine("Loading into AppDomain: " + FileName); | ||
195 | IScript mbrt = | ||
196 | (IScript) | ||
197 | FreeAppDomain.CurrentAppDomain.CreateInstanceFromAndUnwrap(FileName, "SecondLife.Script"); | ||
198 | //Console.WriteLine("ScriptEngine AppDomainManager: is proxy={0}", RemotingServices.IsTransparentProxy(mbrt)); | ||
199 | FreeAppDomain.ScriptsLoaded++; | ||
200 | |||
201 | return mbrt; | ||
202 | } | ||
203 | |||
204 | |||
205 | /// <summary> | ||
206 | /// Increase "dead script" counter for an AppDomain | ||
207 | /// </summary> | ||
208 | /// <param name="ad"></param> | ||
209 | //[Obsolete("Needs fixing, needs a real purpose in life!!!")] | ||
210 | public void StopScript(AppDomain ad) | ||
211 | { | ||
212 | lock (freeLock) | ||
213 | { | ||
214 | Console.WriteLine("Stopping script in AppDomain"); | ||
215 | // Check if it is current AppDomain | ||
216 | if (currentAD.CurrentAppDomain == ad) | ||
217 | { | ||
218 | // Yes - increase | ||
219 | currentAD.ScriptsWaitingUnload++; | ||
220 | return; | ||
221 | } | ||
222 | |||
223 | // Lopp through all AppDomains | ||
224 | foreach (AppDomainStructure ads in new ArrayList(appDomains)) | ||
225 | { | ||
226 | if (ads.CurrentAppDomain == ad) | ||
227 | { | ||
228 | // Found it | ||
229 | ads.ScriptsWaitingUnload++; | ||
230 | break; | ||
231 | } | ||
232 | } // foreach | ||
233 | } // lock | ||
234 | |||
235 | UnloadAppDomains(); // Outsite lock, has its own GetLock | ||
236 | } | ||
237 | } | ||
238 | } \ No newline at end of file | ||
diff --git a/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/Common.cs b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/Common.cs new file mode 100644 index 0000000..00ea078 --- /dev/null +++ b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/Common.cs | |||
@@ -0,0 +1,57 @@ | |||
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 | /* Original code: Tedd Hansen */ | ||
29 | namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase | ||
30 | { | ||
31 | public static class Common | ||
32 | { | ||
33 | public static bool debug = true; | ||
34 | public static ScriptEngine mySE; | ||
35 | |||
36 | // This class just contains some static log stuff used for debugging. | ||
37 | |||
38 | //public delegate void SendToDebugEventDelegate(string Message); | ||
39 | //public delegate void SendToLogEventDelegate(string Message); | ||
40 | //static public event SendToDebugEventDelegate SendToDebugEvent; | ||
41 | //static public event SendToLogEventDelegate SendToLogEvent; | ||
42 | |||
43 | public static void SendToDebug(string Message) | ||
44 | { | ||
45 | //if (Debug == true) | ||
46 | mySE.Log.Verbose("ScriptEngine", "Debug: " + Message); | ||
47 | //SendToDebugEvent("\r\n" + DateTime.Now.ToString("[HH:mm:ss] ") + Message); | ||
48 | } | ||
49 | |||
50 | public static void SendToLog(string Message) | ||
51 | { | ||
52 | //if (Debug == true) | ||
53 | mySE.Log.Verbose("ScriptEngine", "LOG: " + Message); | ||
54 | //SendToLogEvent("\r\n" + DateTime.Now.ToString("[HH:mm:ss] ") + Message); | ||
55 | } | ||
56 | } | ||
57 | } \ No newline at end of file | ||
diff --git a/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventManager.cs b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventManager.cs new file mode 100644 index 0000000..a5ad911 --- /dev/null +++ b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventManager.cs | |||
@@ -0,0 +1,259 @@ | |||
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 | /* Original code: Tedd Hansen */ | ||
29 | using System; | ||
30 | using libsecondlife; | ||
31 | using OpenSim.Framework; | ||
32 | |||
33 | namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase | ||
34 | { | ||
35 | /// <summary> | ||
36 | /// Prepares events so they can be directly executed upon a script by EventQueueManager, then queues it. | ||
37 | /// </summary> | ||
38 | [Serializable] | ||
39 | public class EventManager : OpenSim.Region.ScriptEngine.Common.ScriptServerInterfaces.RemoteEvents | ||
40 | { | ||
41 | |||
42 | // | ||
43 | // Class is instanced in "ScriptEngine" and Uses "EventQueueManager" that is also instanced in "ScriptEngine". | ||
44 | // This class needs a bit of explaining: | ||
45 | // | ||
46 | // This class it the link between an event inside OpenSim and the corresponding event in a user script being executed. | ||
47 | // | ||
48 | // For example when an user touches an object then the "myScriptEngine.World.EventManager.OnObjectGrab" event is fired inside OpenSim. | ||
49 | // We hook up to this event and queue a touch_start in EventQueueManager with the proper LSL parameters. | ||
50 | // It will then be delivered to the script by EventQueueManager. | ||
51 | // | ||
52 | // You can check debug C# dump of an LSL script if you need to verify what exact parameters are needed. | ||
53 | // | ||
54 | |||
55 | |||
56 | private ScriptEngine myScriptEngine; | ||
57 | //public IScriptHost TEMP_OBJECT_ID; | ||
58 | public EventManager(ScriptEngine _ScriptEngine, bool performHookUp) | ||
59 | { | ||
60 | myScriptEngine = _ScriptEngine; | ||
61 | |||
62 | // Hook up to events from OpenSim | ||
63 | // We may not want to do it because someone is controlling us and will deliver events to us | ||
64 | if (performHookUp) | ||
65 | { | ||
66 | myScriptEngine.Log.Verbose("ScriptEngine", "Hooking up to server events"); | ||
67 | myScriptEngine.World.EventManager.OnObjectGrab += touch_start; | ||
68 | myScriptEngine.World.EventManager.OnRezScript += OnRezScript; | ||
69 | myScriptEngine.World.EventManager.OnRemoveScript += OnRemoveScript; | ||
70 | // TODO: HOOK ALL EVENTS UP TO SERVER! | ||
71 | } | ||
72 | } | ||
73 | |||
74 | public void touch_start(uint localID, LLVector3 offsetPos, IClientAPI remoteClient) | ||
75 | { | ||
76 | // Add to queue for all scripts in ObjectID object | ||
77 | myScriptEngine.m_EventQueueManager.AddToObjectQueue(localID, "touch_start", new object[] {(int) 1}); | ||
78 | } | ||
79 | |||
80 | public void OnRezScript(uint localID, LLUUID itemID, string script) | ||
81 | { | ||
82 | Console.WriteLine("OnRezScript localID: " + localID + " LLUID: " + itemID.ToString() + " Size: " + | ||
83 | script.Length); | ||
84 | myScriptEngine.m_ScriptManager.StartScript(localID, itemID, script); | ||
85 | } | ||
86 | |||
87 | public void OnRemoveScript(uint localID, LLUUID itemID) | ||
88 | { | ||
89 | Console.WriteLine("OnRemoveScript localID: " + localID + " LLUID: " + itemID.ToString()); | ||
90 | myScriptEngine.m_ScriptManager.StopScript( | ||
91 | localID, | ||
92 | itemID | ||
93 | ); | ||
94 | } | ||
95 | |||
96 | // TODO: Replace placeholders below | ||
97 | // NOTE! THE PARAMETERS FOR THESE FUNCTIONS ARE NOT CORRECT! | ||
98 | // These needs to be hooked up to OpenSim during init of this class | ||
99 | // then queued in EventQueueManager. | ||
100 | // When queued in EventQueueManager they need to be LSL compatible (name and params) | ||
101 | |||
102 | public void state_exit(uint localID, LLUUID itemID) | ||
103 | { | ||
104 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "state_exit"); | ||
105 | } | ||
106 | |||
107 | public void touch(uint localID, LLUUID itemID) | ||
108 | { | ||
109 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "touch"); | ||
110 | } | ||
111 | |||
112 | public void touch_end(uint localID, LLUUID itemID) | ||
113 | { | ||
114 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "touch_end"); | ||
115 | } | ||
116 | |||
117 | public void collision_start(uint localID, LLUUID itemID) | ||
118 | { | ||
119 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "collision_start"); | ||
120 | } | ||
121 | |||
122 | public void collision(uint localID, LLUUID itemID) | ||
123 | { | ||
124 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "collision"); | ||
125 | } | ||
126 | |||
127 | public void collision_end(uint localID, LLUUID itemID) | ||
128 | { | ||
129 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "collision_end"); | ||
130 | } | ||
131 | |||
132 | public void land_collision_start(uint localID, LLUUID itemID) | ||
133 | { | ||
134 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "land_collision_start"); | ||
135 | } | ||
136 | |||
137 | public void land_collision(uint localID, LLUUID itemID) | ||
138 | { | ||
139 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "land_collision"); | ||
140 | } | ||
141 | |||
142 | public void land_collision_end(uint localID, LLUUID itemID) | ||
143 | { | ||
144 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "land_collision_end"); | ||
145 | } | ||
146 | |||
147 | // Handled by long commands | ||
148 | public void timer(uint localID, LLUUID itemID) | ||
149 | { | ||
150 | //myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, ""); | ||
151 | } | ||
152 | |||
153 | public void listen(uint localID, LLUUID itemID) | ||
154 | { | ||
155 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "listen"); | ||
156 | } | ||
157 | |||
158 | public void on_rez(uint localID, LLUUID itemID) | ||
159 | { | ||
160 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "on_rez"); | ||
161 | } | ||
162 | |||
163 | public void sensor(uint localID, LLUUID itemID) | ||
164 | { | ||
165 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "sensor"); | ||
166 | } | ||
167 | |||
168 | public void no_sensor(uint localID, LLUUID itemID) | ||
169 | { | ||
170 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "no_sensor"); | ||
171 | } | ||
172 | |||
173 | public void control(uint localID, LLUUID itemID) | ||
174 | { | ||
175 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "control"); | ||
176 | } | ||
177 | |||
178 | public void money(uint localID, LLUUID itemID) | ||
179 | { | ||
180 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "money"); | ||
181 | } | ||
182 | |||
183 | public void email(uint localID, LLUUID itemID) | ||
184 | { | ||
185 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "email"); | ||
186 | } | ||
187 | |||
188 | public void at_target(uint localID, LLUUID itemID) | ||
189 | { | ||
190 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "at_target"); | ||
191 | } | ||
192 | |||
193 | public void not_at_target(uint localID, LLUUID itemID) | ||
194 | { | ||
195 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "not_at_target"); | ||
196 | } | ||
197 | |||
198 | public void at_rot_target(uint localID, LLUUID itemID) | ||
199 | { | ||
200 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "at_rot_target"); | ||
201 | } | ||
202 | |||
203 | public void not_at_rot_target(uint localID, LLUUID itemID) | ||
204 | { | ||
205 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "not_at_rot_target"); | ||
206 | } | ||
207 | |||
208 | public void run_time_permissions(uint localID, LLUUID itemID) | ||
209 | { | ||
210 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "run_time_permissions"); | ||
211 | } | ||
212 | |||
213 | public void changed(uint localID, LLUUID itemID) | ||
214 | { | ||
215 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "changed"); | ||
216 | } | ||
217 | |||
218 | public void attach(uint localID, LLUUID itemID) | ||
219 | { | ||
220 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "attach"); | ||
221 | } | ||
222 | |||
223 | public void dataserver(uint localID, LLUUID itemID) | ||
224 | { | ||
225 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "dataserver"); | ||
226 | } | ||
227 | |||
228 | public void link_message(uint localID, LLUUID itemID) | ||
229 | { | ||
230 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "link_message"); | ||
231 | } | ||
232 | |||
233 | public void moving_start(uint localID, LLUUID itemID) | ||
234 | { | ||
235 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "moving_start"); | ||
236 | } | ||
237 | |||
238 | public void moving_end(uint localID, LLUUID itemID) | ||
239 | { | ||
240 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "moving_end"); | ||
241 | } | ||
242 | |||
243 | public void object_rez(uint localID, LLUUID itemID) | ||
244 | { | ||
245 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "object_rez"); | ||
246 | } | ||
247 | |||
248 | public void remote_data(uint localID, LLUUID itemID) | ||
249 | { | ||
250 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "remote_data"); | ||
251 | } | ||
252 | |||
253 | // Handled by long commands | ||
254 | public void http_response(uint localID, LLUUID itemID) | ||
255 | { | ||
256 | // myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "http_response"); | ||
257 | } | ||
258 | } | ||
259 | } \ No newline at end of file | ||
diff --git a/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventQueueManager.cs b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventQueueManager.cs new file mode 100644 index 0000000..62194df --- /dev/null +++ b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventQueueManager.cs | |||
@@ -0,0 +1,363 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSim Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | * | ||
27 | */ | ||
28 | /* Original code: Tedd Hansen */ | ||
29 | using System; | ||
30 | using System.Collections; | ||
31 | using System.Collections.Generic; | ||
32 | using System.Threading; | ||
33 | using libsecondlife; | ||
34 | using OpenSim.Framework; | ||
35 | using OpenSim.Region.Environment.Scenes.Scripting; | ||
36 | |||
37 | namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase | ||
38 | { | ||
39 | /// <summary> | ||
40 | /// EventQueueManager handles event queues | ||
41 | /// Events are queued and executed in separate thread | ||
42 | /// </summary> | ||
43 | [Serializable] | ||
44 | public class EventQueueManager | ||
45 | { | ||
46 | |||
47 | // | ||
48 | // Class is instanced in "ScriptEngine" and used by "EventManager" also instanced in "ScriptEngine". | ||
49 | // | ||
50 | // Class purpose is to queue and execute functions that are received by "EventManager": | ||
51 | // - allowing "EventManager" to release its event thread immediately, thus not interrupting server execution. | ||
52 | // - allowing us to prioritize and control execution of script functions. | ||
53 | // Class can use multiple threads for simultaneous execution. Mutexes are used for thread safety. | ||
54 | // | ||
55 | // 1. Hold an execution queue for scripts | ||
56 | // 2. Use threads to process queue, each thread executes one script function on each pass. | ||
57 | // 3. Catch any script error and process it | ||
58 | // | ||
59 | // | ||
60 | // Notes: | ||
61 | // * Current execution load balancing is optimized for 1 thread, and can cause unfair execute balancing between scripts. | ||
62 | // Not noticeable unless server is under high load. | ||
63 | // * This class contains the number of threads used for script executions. Since we are not microthreading scripts yet, | ||
64 | // increase number of threads to allow more concurrent script executions in OpenSim. | ||
65 | // | ||
66 | |||
67 | |||
68 | /// <summary> | ||
69 | /// List of threads processing event queue | ||
70 | /// </summary> | ||
71 | private List<Thread> eventQueueThreads = new List<Thread>(); | ||
72 | |||
73 | private object queueLock = new object(); // Mutex lock object | ||
74 | |||
75 | /// <summary> | ||
76 | /// How many ms to sleep if queue is empty | ||
77 | /// </summary> | ||
78 | private int nothingToDoSleepms = 50; | ||
79 | |||
80 | /// <summary> | ||
81 | /// How many threads to process queue with | ||
82 | /// </summary> | ||
83 | private int numberOfThreads = 2; | ||
84 | |||
85 | /// <summary> | ||
86 | /// Queue containing events waiting to be executed | ||
87 | /// </summary> | ||
88 | private Queue<QueueItemStruct> eventQueue = new Queue<QueueItemStruct>(); | ||
89 | |||
90 | /// <summary> | ||
91 | /// Queue item structure | ||
92 | /// </summary> | ||
93 | private struct QueueItemStruct | ||
94 | { | ||
95 | public uint localID; | ||
96 | public LLUUID itemID; | ||
97 | public string functionName; | ||
98 | public object[] param; | ||
99 | } | ||
100 | |||
101 | /// <summary> | ||
102 | /// List of localID locks for mutex processing of script events | ||
103 | /// </summary> | ||
104 | private List<uint> objectLocks = new List<uint>(); | ||
105 | |||
106 | private object tryLockLock = new object(); // Mutex lock object | ||
107 | |||
108 | private ScriptEngine m_ScriptEngine; | ||
109 | |||
110 | public EventQueueManager(ScriptEngine _ScriptEngine) | ||
111 | { | ||
112 | m_ScriptEngine = _ScriptEngine; | ||
113 | |||
114 | // | ||
115 | // Start event queue processing threads (worker threads) | ||
116 | // | ||
117 | for (int ThreadCount = 0; ThreadCount <= numberOfThreads; ThreadCount++) | ||
118 | { | ||
119 | Thread EventQueueThread = new Thread(EventQueueThreadLoop); | ||
120 | eventQueueThreads.Add(EventQueueThread); | ||
121 | EventQueueThread.IsBackground = true; | ||
122 | EventQueueThread.Priority = ThreadPriority.BelowNormal; | ||
123 | EventQueueThread.Name = "EventQueueManagerThread_" + ThreadCount; | ||
124 | EventQueueThread.Start(); | ||
125 | } | ||
126 | } | ||
127 | |||
128 | ~EventQueueManager() | ||
129 | { | ||
130 | // Kill worker threads | ||
131 | foreach (Thread EventQueueThread in new ArrayList(eventQueueThreads)) | ||
132 | { | ||
133 | if (EventQueueThread != null && EventQueueThread.IsAlive == true) | ||
134 | { | ||
135 | try | ||
136 | { | ||
137 | EventQueueThread.Abort(); | ||
138 | EventQueueThread.Join(); | ||
139 | } | ||
140 | catch (Exception) | ||
141 | { | ||
142 | //myScriptEngine.Log.Verbose("ScriptEngine", "EventQueueManager Exception killing worker thread: " + e.ToString()); | ||
143 | } | ||
144 | } | ||
145 | } | ||
146 | eventQueueThreads.Clear(); | ||
147 | // Todo: Clean up our queues | ||
148 | eventQueue.Clear(); | ||
149 | } | ||
150 | |||
151 | /// <summary> | ||
152 | /// Queue processing thread loop | ||
153 | /// </summary> | ||
154 | private void EventQueueThreadLoop() | ||
155 | { | ||
156 | //myScriptEngine.m_logger.Verbose("ScriptEngine", "EventQueueManager Worker thread spawned"); | ||
157 | try | ||
158 | { | ||
159 | QueueItemStruct BlankQIS = new QueueItemStruct(); | ||
160 | while (true) | ||
161 | { | ||
162 | try | ||
163 | { | ||
164 | QueueItemStruct QIS = BlankQIS; | ||
165 | bool GotItem = false; | ||
166 | |||
167 | if (eventQueue.Count == 0) | ||
168 | { | ||
169 | // Nothing to do? Sleep a bit waiting for something to do | ||
170 | Thread.Sleep(nothingToDoSleepms); | ||
171 | } | ||
172 | else | ||
173 | { | ||
174 | // Something in queue, process | ||
175 | //myScriptEngine.m_logger.Verbose("ScriptEngine", "Processing event for localID: " + QIS.localID + ", itemID: " + QIS.itemID + ", FunctionName: " + QIS.FunctionName); | ||
176 | |||
177 | // OBJECT BASED LOCK - TWO THREADS WORKING ON SAME OBJECT IS NOT GOOD | ||
178 | lock (queueLock) | ||
179 | { | ||
180 | GotItem = false; | ||
181 | for (int qc = 0; qc < eventQueue.Count; qc++) | ||
182 | { | ||
183 | // Get queue item | ||
184 | QIS = eventQueue.Dequeue(); | ||
185 | |||
186 | // Check if object is being processed by someone else | ||
187 | if (TryLock(QIS.localID) == false) | ||
188 | { | ||
189 | // Object is already being processed, requeue it | ||
190 | eventQueue.Enqueue(QIS); | ||
191 | } | ||
192 | else | ||
193 | { | ||
194 | // We have lock on an object and can process it | ||
195 | GotItem = true; | ||
196 | break; | ||
197 | } | ||
198 | } // go through queue | ||
199 | } // lock | ||
200 | |||
201 | if (GotItem == true) | ||
202 | { | ||
203 | // Execute function | ||
204 | try | ||
205 | { | ||
206 | #if DEBUG | ||
207 | m_ScriptEngine.Log.Debug("ScriptEngine", "Executing event:\r\n" | ||
208 | + "QIS.localID: " + QIS.localID | ||
209 | + ", QIS.itemID: " + QIS.itemID | ||
210 | + ", QIS.functionName: " + QIS.functionName); | ||
211 | #endif | ||
212 | m_ScriptEngine.m_ScriptManager.ExecuteEvent(QIS.localID, QIS.itemID, | ||
213 | QIS.functionName, QIS.param); | ||
214 | } | ||
215 | catch (Exception e) | ||
216 | { | ||
217 | // DISPLAY ERROR INWORLD | ||
218 | string text = "Error executing script function \"" + QIS.functionName + "\":\r\n"; | ||
219 | //if (e.InnerException != null) | ||
220 | //{ | ||
221 | // Send inner exception | ||
222 | text += e.InnerException.Message.ToString(); | ||
223 | //} | ||
224 | //else | ||
225 | //{ | ||
226 | text += "\r\n"; | ||
227 | // Send normal | ||
228 | text += e.Message.ToString(); | ||
229 | //} | ||
230 | try | ||
231 | { | ||
232 | if (text.Length > 1500) | ||
233 | text = text.Substring(0, 1500); | ||
234 | IScriptHost m_host = m_ScriptEngine.World.GetSceneObjectPart(QIS.localID); | ||
235 | //if (m_host != null) | ||
236 | //{ | ||
237 | m_ScriptEngine.World.SimChat(Helpers.StringToField(text), ChatTypeEnum.Say, 0, | ||
238 | m_host.AbsolutePosition, m_host.Name, m_host.UUID); | ||
239 | } | ||
240 | catch | ||
241 | { | ||
242 | //} | ||
243 | //else | ||
244 | //{ | ||
245 | // T oconsole | ||
246 | m_ScriptEngine.Log.Error("ScriptEngine", | ||
247 | "Unable to send text in-world:\r\n" + text); | ||
248 | } | ||
249 | } | ||
250 | finally | ||
251 | { | ||
252 | ReleaseLock(QIS.localID); | ||
253 | } | ||
254 | } | ||
255 | } // Something in queue | ||
256 | } | ||
257 | catch (ThreadAbortException tae) | ||
258 | { | ||
259 | throw tae; | ||
260 | } | ||
261 | catch (Exception e) | ||
262 | { | ||
263 | m_ScriptEngine.Log.Error("ScriptEngine", "Exception in EventQueueThreadLoop: " + e.ToString()); | ||
264 | } | ||
265 | } // while | ||
266 | } // try | ||
267 | catch (ThreadAbortException) | ||
268 | { | ||
269 | //myScriptEngine.Log.Verbose("ScriptEngine", "EventQueueManager Worker thread killed: " + tae.Message); | ||
270 | } | ||
271 | } | ||
272 | |||
273 | /// <summary> | ||
274 | /// Try to get a mutex lock on localID | ||
275 | /// </summary> | ||
276 | /// <param name="localID"></param> | ||
277 | /// <returns></returns> | ||
278 | private bool TryLock(uint localID) | ||
279 | { | ||
280 | lock (tryLockLock) | ||
281 | { | ||
282 | if (objectLocks.Contains(localID) == true) | ||
283 | { | ||
284 | return false; | ||
285 | } | ||
286 | else | ||
287 | { | ||
288 | objectLocks.Add(localID); | ||
289 | return true; | ||
290 | } | ||
291 | } | ||
292 | } | ||
293 | |||
294 | /// <summary> | ||
295 | /// Release mutex lock on localID | ||
296 | /// </summary> | ||
297 | /// <param name="localID"></param> | ||
298 | private void ReleaseLock(uint localID) | ||
299 | { | ||
300 | lock (tryLockLock) | ||
301 | { | ||
302 | if (objectLocks.Contains(localID) == true) | ||
303 | { | ||
304 | objectLocks.Remove(localID); | ||
305 | } | ||
306 | } | ||
307 | } | ||
308 | |||
309 | |||
310 | /// <summary> | ||
311 | /// Add event to event execution queue | ||
312 | /// </summary> | ||
313 | /// <param name="localID"></param> | ||
314 | /// <param name="FunctionName">Name of the function, will be state + "_event_" + FunctionName</param> | ||
315 | /// <param name="param">Array of parameters to match event mask</param> | ||
316 | public void AddToObjectQueue(uint localID, string FunctionName, params object[] param) | ||
317 | { | ||
318 | // Determine all scripts in Object and add to their queue | ||
319 | //myScriptEngine.m_logger.Verbose("ScriptEngine", "EventQueueManager Adding localID: " + localID + ", FunctionName: " + FunctionName); | ||
320 | |||
321 | |||
322 | // Do we have any scripts in this object at all? If not, return | ||
323 | if (m_ScriptEngine.m_ScriptManager.Scripts.ContainsKey(localID) == false) | ||
324 | { | ||
325 | //Console.WriteLine("Event \"" + FunctionName + "\" for localID: " + localID + ". No scripts found on this localID."); | ||
326 | return; | ||
327 | } | ||
328 | |||
329 | Dictionary<LLUUID, IScript>.KeyCollection scriptKeys = | ||
330 | m_ScriptEngine.m_ScriptManager.GetScriptKeys(localID); | ||
331 | |||
332 | foreach (LLUUID itemID in scriptKeys) | ||
333 | { | ||
334 | // Add to each script in that object | ||
335 | // TODO: Some scripts may not subscribe to this event. Should we NOT add it? Does it matter? | ||
336 | AddToScriptQueue(localID, itemID, FunctionName, param); | ||
337 | } | ||
338 | } | ||
339 | |||
340 | /// <summary> | ||
341 | /// Add event to event execution queue | ||
342 | /// </summary> | ||
343 | /// <param name="localID"></param> | ||
344 | /// <param name="itemID"></param> | ||
345 | /// <param name="FunctionName">Name of the function, will be state + "_event_" + FunctionName</param> | ||
346 | /// <param name="param">Array of parameters to match event mask</param> | ||
347 | public void AddToScriptQueue(uint localID, LLUUID itemID, string FunctionName, params object[] param) | ||
348 | { | ||
349 | lock (queueLock) | ||
350 | { | ||
351 | // Create a structure and add data | ||
352 | QueueItemStruct QIS = new QueueItemStruct(); | ||
353 | QIS.localID = localID; | ||
354 | QIS.itemID = itemID; | ||
355 | QIS.functionName = FunctionName; | ||
356 | QIS.param = param; | ||
357 | |||
358 | // Add it to queue | ||
359 | eventQueue.Enqueue(QIS); | ||
360 | } | ||
361 | } | ||
362 | } | ||
363 | } \ No newline at end of file | ||
diff --git a/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/LSLLongCmdHandler.cs b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/LSLLongCmdHandler.cs new file mode 100644 index 0000000..94241eb --- /dev/null +++ b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/LSLLongCmdHandler.cs | |||
@@ -0,0 +1,295 @@ | |||
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.Threading; | ||
32 | using libsecondlife; | ||
33 | using OpenSim.Region.Environment.Interfaces; | ||
34 | using OpenSim.Region.Environment.Modules; | ||
35 | |||
36 | namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase | ||
37 | { | ||
38 | /// <summary> | ||
39 | /// Handles LSL commands that takes long time and returns an event, for example timers, HTTP requests, etc. | ||
40 | /// </summary> | ||
41 | public class LSLLongCmdHandler | ||
42 | { | ||
43 | private Thread cmdHandlerThread; | ||
44 | private int cmdHandlerThreadCycleSleepms = 100; | ||
45 | |||
46 | private ScriptEngine m_ScriptEngine; | ||
47 | |||
48 | public LSLLongCmdHandler(ScriptEngine _ScriptEngine) | ||
49 | { | ||
50 | m_ScriptEngine = _ScriptEngine; | ||
51 | |||
52 | // Start the thread that will be doing the work | ||
53 | cmdHandlerThread = new Thread(CmdHandlerThreadLoop); | ||
54 | cmdHandlerThread.Name = "CmdHandlerThread"; | ||
55 | cmdHandlerThread.Priority = ThreadPriority.BelowNormal; | ||
56 | cmdHandlerThread.IsBackground = true; | ||
57 | cmdHandlerThread.Start(); | ||
58 | } | ||
59 | |||
60 | ~LSLLongCmdHandler() | ||
61 | { | ||
62 | // Shut down thread | ||
63 | try | ||
64 | { | ||
65 | if (cmdHandlerThread != null) | ||
66 | { | ||
67 | if (cmdHandlerThread.IsAlive == true) | ||
68 | { | ||
69 | cmdHandlerThread.Abort(); | ||
70 | cmdHandlerThread.Join(); | ||
71 | } | ||
72 | } | ||
73 | } | ||
74 | catch | ||
75 | { | ||
76 | } | ||
77 | } | ||
78 | |||
79 | private void CmdHandlerThreadLoop() | ||
80 | { | ||
81 | while (true) | ||
82 | { | ||
83 | // Check timers | ||
84 | CheckTimerEvents(); | ||
85 | Thread.Sleep(25); | ||
86 | // Check HttpRequests | ||
87 | CheckHttpRequests(); | ||
88 | Thread.Sleep(25); | ||
89 | // Check XMLRPCRequests | ||
90 | CheckXMLRPCRequests(); | ||
91 | Thread.Sleep(25); | ||
92 | // Check Listeners | ||
93 | CheckListeners(); | ||
94 | Thread.Sleep(25); | ||
95 | |||
96 | // Sleep before next cycle | ||
97 | //Thread.Sleep(cmdHandlerThreadCycleSleepms); | ||
98 | } | ||
99 | } | ||
100 | |||
101 | /// <summary> | ||
102 | /// Remove a specific script (and all its pending commands) | ||
103 | /// </summary> | ||
104 | /// <param name="m_localID"></param> | ||
105 | /// <param name="m_itemID"></param> | ||
106 | public void RemoveScript(uint localID, LLUUID itemID) | ||
107 | { | ||
108 | // Remove a specific script | ||
109 | |||
110 | // Remove from: Timers | ||
111 | UnSetTimerEvents(localID, itemID); | ||
112 | // Remove from: HttpRequest | ||
113 | IHttpRequests iHttpReq = | ||
114 | m_ScriptEngine.World.RequestModuleInterface<IHttpRequests>(); | ||
115 | iHttpReq.StopHttpRequest(localID, itemID); | ||
116 | } | ||
117 | |||
118 | #region TIMER | ||
119 | |||
120 | // | ||
121 | // TIMER | ||
122 | // | ||
123 | private class TimerClass | ||
124 | { | ||
125 | public uint localID; | ||
126 | public LLUUID itemID; | ||
127 | public double interval; | ||
128 | public DateTime next; | ||
129 | } | ||
130 | |||
131 | private List<TimerClass> Timers = new List<TimerClass>(); | ||
132 | private object TimerListLock = new object(); | ||
133 | |||
134 | public void SetTimerEvent(uint m_localID, LLUUID m_itemID, double sec) | ||
135 | { | ||
136 | Console.WriteLine("SetTimerEvent"); | ||
137 | |||
138 | // Always remove first, in case this is a re-set | ||
139 | UnSetTimerEvents(m_localID, m_itemID); | ||
140 | if (sec == 0) // Disabling timer | ||
141 | return; | ||
142 | |||
143 | // Add to timer | ||
144 | TimerClass ts = new TimerClass(); | ||
145 | ts.localID = m_localID; | ||
146 | ts.itemID = m_itemID; | ||
147 | ts.interval = sec; | ||
148 | ts.next = DateTime.Now.ToUniversalTime().AddSeconds(ts.interval); | ||
149 | lock (TimerListLock) | ||
150 | { | ||
151 | Timers.Add(ts); | ||
152 | } | ||
153 | } | ||
154 | |||
155 | public void UnSetTimerEvents(uint m_localID, LLUUID m_itemID) | ||
156 | { | ||
157 | // Remove from timer | ||
158 | lock (TimerListLock) | ||
159 | { | ||
160 | List<TimerClass> NewTimers = new List<TimerClass>(); | ||
161 | foreach (TimerClass ts in Timers) | ||
162 | { | ||
163 | if (ts.localID != m_localID && ts.itemID != m_itemID) | ||
164 | { | ||
165 | NewTimers.Add(ts); | ||
166 | } | ||
167 | } | ||
168 | Timers.Clear(); | ||
169 | Timers = NewTimers; | ||
170 | } | ||
171 | } | ||
172 | |||
173 | public void CheckTimerEvents() | ||
174 | { | ||
175 | // Nothing to do here? | ||
176 | if (Timers.Count == 0) | ||
177 | return; | ||
178 | |||
179 | lock (TimerListLock) | ||
180 | { | ||
181 | // Go through all timers | ||
182 | foreach (TimerClass ts in Timers) | ||
183 | { | ||
184 | // Time has passed? | ||
185 | if (ts.next.ToUniversalTime() < DateTime.Now.ToUniversalTime()) | ||
186 | { | ||
187 | // Add it to queue | ||
188 | m_ScriptEngine.m_EventQueueManager.AddToScriptQueue(ts.localID, ts.itemID, "timer", | ||
189 | new object[] {}); | ||
190 | // set next interval | ||
191 | |||
192 | |||
193 | ts.next = DateTime.Now.ToUniversalTime().AddSeconds(ts.interval); | ||
194 | } | ||
195 | } | ||
196 | } // lock | ||
197 | } | ||
198 | |||
199 | #endregion | ||
200 | |||
201 | #region HTTP REQUEST | ||
202 | |||
203 | public void CheckHttpRequests() | ||
204 | { | ||
205 | if (m_ScriptEngine.World == null) | ||
206 | return; | ||
207 | |||
208 | IHttpRequests iHttpReq = | ||
209 | m_ScriptEngine.World.RequestModuleInterface<IHttpRequests>(); | ||
210 | |||
211 | HttpRequestClass httpInfo = null; | ||
212 | |||
213 | if (iHttpReq != null) | ||
214 | httpInfo = iHttpReq.GetNextCompletedRequest(); | ||
215 | |||
216 | while (httpInfo != null) | ||
217 | { | ||
218 | //Console.WriteLine("PICKED HTTP REQ:" + httpInfo.response_body + httpInfo.status); | ||
219 | |||
220 | // Deliver data to prim's remote_data handler | ||
221 | // | ||
222 | // TODO: Returning null for metadata, since the lsl function | ||
223 | // only returns the byte for HTTP_BODY_TRUNCATED, which is not | ||
224 | // implemented here yet anyway. Should be fixed if/when maxsize | ||
225 | // is supported | ||
226 | |||
227 | object[] resobj = new object[] | ||
228 | { | ||
229 | httpInfo.reqID.ToString(), httpInfo.status, null, httpInfo.response_body | ||
230 | }; | ||
231 | |||
232 | m_ScriptEngine.m_EventQueueManager.AddToScriptQueue( | ||
233 | httpInfo.localID, httpInfo.itemID, "http_response", resobj | ||
234 | ); | ||
235 | |||
236 | httpInfo.Stop(); | ||
237 | httpInfo = null; | ||
238 | |||
239 | httpInfo = iHttpReq.GetNextCompletedRequest(); | ||
240 | } | ||
241 | } | ||
242 | |||
243 | #endregion | ||
244 | |||
245 | public void CheckXMLRPCRequests() | ||
246 | { | ||
247 | if (m_ScriptEngine.World == null) | ||
248 | return; | ||
249 | |||
250 | IXMLRPC xmlrpc = m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>(); | ||
251 | |||
252 | if (xmlrpc != null) | ||
253 | { | ||
254 | while (xmlrpc.hasRequests()) | ||
255 | { | ||
256 | RPCRequestInfo rInfo = xmlrpc.GetNextRequest(); | ||
257 | //Console.WriteLine("PICKED REQUEST"); | ||
258 | |||
259 | //Deliver data to prim's remote_data handler | ||
260 | object[] resobj = new object[] | ||
261 | { | ||
262 | 2, rInfo.GetChannelKey().ToString(), rInfo.GetMessageID().ToString(), "", | ||
263 | rInfo.GetIntValue(), | ||
264 | rInfo.GetStrVal() | ||
265 | }; | ||
266 | m_ScriptEngine.m_EventQueueManager.AddToScriptQueue( | ||
267 | rInfo.GetLocalID(), rInfo.GetItemID(), "remote_data", resobj | ||
268 | ); | ||
269 | } | ||
270 | } | ||
271 | } | ||
272 | |||
273 | public void CheckListeners() | ||
274 | { | ||
275 | if (m_ScriptEngine.World == null) | ||
276 | return; | ||
277 | IWorldComm comms = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); | ||
278 | |||
279 | while (comms.HasMessages()) | ||
280 | { | ||
281 | ListenerInfo lInfo = comms.GetNextMessage(); | ||
282 | |||
283 | //Deliver data to prim's listen handler | ||
284 | object[] resobj = new object[] | ||
285 | { | ||
286 | lInfo.GetChannel(), lInfo.GetName(), lInfo.GetID().ToString(), lInfo.GetMessage() | ||
287 | }; | ||
288 | |||
289 | m_ScriptEngine.m_EventQueueManager.AddToScriptQueue( | ||
290 | lInfo.GetLocalID(), lInfo.GetItemID(), "listen", resobj | ||
291 | ); | ||
292 | } | ||
293 | } | ||
294 | } | ||
295 | } \ No newline at end of file | ||
diff --git a/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/ScriptEngine.cs b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/ScriptEngine.cs new file mode 100644 index 0000000..9637252 --- /dev/null +++ b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/ScriptEngine.cs | |||
@@ -0,0 +1,131 @@ | |||
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 | /* Original code: Tedd Hansen */ | ||
29 | using System; | ||
30 | using Nini.Config; | ||
31 | using OpenSim.Framework.Console; | ||
32 | using OpenSim.Region.Environment.Interfaces; | ||
33 | using OpenSim.Region.Environment.Scenes; | ||
34 | using OpenSim.Region.ScriptEngine.Common; | ||
35 | using OpenSim.Region.ScriptEngine.Common.ScriptEngineBase; | ||
36 | |||
37 | namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase | ||
38 | { | ||
39 | /// <summary> | ||
40 | /// This is the root object for ScriptEngine. Objects access each other trough this class. | ||
41 | /// </summary> | ||
42 | /// | ||
43 | [Serializable] | ||
44 | public abstract class ScriptEngine : IRegionModule, OpenSim.Region.ScriptEngine.Common.ScriptServerInterfaces.ScriptEngine | ||
45 | { | ||
46 | public Scene World; | ||
47 | public EventManager m_EventManager; // Handles and queues incoming events from OpenSim | ||
48 | public EventQueueManager m_EventQueueManager; // Executes events | ||
49 | public ScriptManager m_ScriptManager; // Load, unload and execute scripts | ||
50 | public AppDomainManager m_AppDomainManager; | ||
51 | public LSLLongCmdHandler m_LSLLongCmdHandler; | ||
52 | |||
53 | public ScriptManager GetScriptManager() | ||
54 | { | ||
55 | return _GetScriptManager(); | ||
56 | } | ||
57 | public abstract ScriptManager _GetScriptManager(); | ||
58 | |||
59 | private LogBase m_log; | ||
60 | |||
61 | public ScriptEngine() | ||
62 | { | ||
63 | //Common.SendToDebug("ScriptEngine Object Initialized"); | ||
64 | Common.mySE = this; | ||
65 | } | ||
66 | |||
67 | public LogBase Log | ||
68 | { | ||
69 | get { return m_log; } | ||
70 | } | ||
71 | |||
72 | public void InitializeEngine(Scene Sceneworld, LogBase logger, bool HookUpToServer, ScriptManager newScriptManager) | ||
73 | { | ||
74 | World = Sceneworld; | ||
75 | m_log = logger; | ||
76 | |||
77 | Log.Verbose("ScriptEngine", "DotNet & LSL ScriptEngine initializing"); | ||
78 | |||
79 | //m_logger.Status("ScriptEngine", "InitializeEngine"); | ||
80 | |||
81 | // Create all objects we'll be using | ||
82 | m_EventQueueManager = new EventQueueManager(this); | ||
83 | m_EventManager = new EventManager(this, HookUpToServer); | ||
84 | m_ScriptManager = newScriptManager; | ||
85 | //m_ScriptManager = new ScriptManager(this); | ||
86 | m_AppDomainManager = new AppDomainManager(); | ||
87 | m_LSLLongCmdHandler = new LSLLongCmdHandler(this); | ||
88 | |||
89 | // Should we iterate the region for scripts that needs starting? | ||
90 | // Or can we assume we are loaded before anything else so we can use proper events? | ||
91 | } | ||
92 | |||
93 | public void Shutdown() | ||
94 | { | ||
95 | // We are shutting down | ||
96 | } | ||
97 | |||
98 | ScriptServerInterfaces.RemoteEvents ScriptServerInterfaces.ScriptEngine.EventManager() | ||
99 | { | ||
100 | return this.m_EventManager; | ||
101 | } | ||
102 | |||
103 | |||
104 | #region IRegionModule | ||
105 | |||
106 | public abstract void Initialise(Scene scene, IConfigSource config); | ||
107 | |||
108 | public void PostInitialise() | ||
109 | { | ||
110 | } | ||
111 | |||
112 | public void Close() | ||
113 | { | ||
114 | } | ||
115 | |||
116 | public string Name | ||
117 | { | ||
118 | get { return "DotNetEngine"; } | ||
119 | } | ||
120 | |||
121 | public bool IsSharedModule | ||
122 | { | ||
123 | get { return false; } | ||
124 | } | ||
125 | |||
126 | |||
127 | |||
128 | #endregion | ||
129 | |||
130 | } | ||
131 | } \ No newline at end of file | ||
diff --git a/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/ScriptManager.cs b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/ScriptManager.cs new file mode 100644 index 0000000..55c9545 --- /dev/null +++ b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/ScriptManager.cs | |||
@@ -0,0 +1,347 @@ | |||
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 | /* Original code: Tedd Hansen */ | ||
29 | using System; | ||
30 | using System.Collections.Generic; | ||
31 | using System.IO; | ||
32 | using System.Reflection; | ||
33 | using System.Runtime.Serialization.Formatters.Binary; | ||
34 | using System.Threading; | ||
35 | using libsecondlife; | ||
36 | using OpenSim.Framework; | ||
37 | using OpenSim.Region.Environment.Scenes; | ||
38 | using OpenSim.Region.ScriptEngine.Common; | ||
39 | |||
40 | namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase | ||
41 | { | ||
42 | /// <summary> | ||
43 | /// Loads scripts | ||
44 | /// Compiles them if necessary | ||
45 | /// Execute functions for EventQueueManager (Sends them to script on other AppDomain for execution) | ||
46 | /// </summary> | ||
47 | /// | ||
48 | |||
49 | // This class is as close as you get to the script without being inside script class. It handles all the dirty work for other classes. | ||
50 | // * Keeps track of running scripts | ||
51 | // * Compiles script if necessary (through "Compiler") | ||
52 | // * Loads script (through "AppDomainManager" called from for example "EventQueueManager") | ||
53 | // * Executes functions inside script (called from for example "EventQueueManager" class) | ||
54 | // * Unloads script (through "AppDomainManager" called from for example "EventQueueManager") | ||
55 | // * Dedicated load/unload thread, and queues loading/unloading. | ||
56 | // This so that scripts starting or stopping will not slow down other theads or whole system. | ||
57 | // | ||
58 | [Serializable] | ||
59 | public abstract class ScriptManager | ||
60 | { | ||
61 | #region Declares | ||
62 | |||
63 | private Thread scriptLoadUnloadThread; | ||
64 | private int scriptLoadUnloadThread_IdleSleepms = 100; | ||
65 | private Queue<LUStruct> LUQueue = new Queue<LUStruct>(); | ||
66 | |||
67 | |||
68 | // Load/Unload structure | ||
69 | private struct LUStruct | ||
70 | { | ||
71 | public uint localID; | ||
72 | public LLUUID itemID; | ||
73 | public string script; | ||
74 | public LUType Action; | ||
75 | } | ||
76 | |||
77 | private enum LUType | ||
78 | { | ||
79 | Unknown = 0, | ||
80 | Load = 1, | ||
81 | Unload = 2 | ||
82 | } | ||
83 | |||
84 | // Object<string, Script<string, script>> | ||
85 | // IMPORTANT: Types and MemberInfo-derived objects require a LOT of memory. | ||
86 | // Instead use RuntimeTypeHandle, RuntimeFieldHandle and RunTimeHandle (IntPtr) instead! | ||
87 | public Dictionary<uint, Dictionary<LLUUID, IScript>> Scripts = | ||
88 | new Dictionary<uint, Dictionary<LLUUID, IScript>>(); | ||
89 | |||
90 | public Scene World | ||
91 | { | ||
92 | get { return m_scriptEngine.World; } | ||
93 | } | ||
94 | |||
95 | #endregion | ||
96 | |||
97 | #region Object init/shutdown | ||
98 | |||
99 | public ScriptEngineBase.ScriptEngine m_scriptEngine; | ||
100 | |||
101 | public ScriptManager(ScriptEngineBase.ScriptEngine scriptEngine) | ||
102 | { | ||
103 | m_scriptEngine = scriptEngine; | ||
104 | AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve); | ||
105 | scriptLoadUnloadThread = new Thread(ScriptLoadUnloadThreadLoop); | ||
106 | scriptLoadUnloadThread.Name = "ScriptLoadUnloadThread"; | ||
107 | scriptLoadUnloadThread.IsBackground = true; | ||
108 | scriptLoadUnloadThread.Priority = ThreadPriority.BelowNormal; | ||
109 | scriptLoadUnloadThread.Start(); | ||
110 | } | ||
111 | |||
112 | ~ScriptManager() | ||
113 | { | ||
114 | // Abort load/unload thread | ||
115 | try | ||
116 | { | ||
117 | if (scriptLoadUnloadThread != null) | ||
118 | { | ||
119 | if (scriptLoadUnloadThread.IsAlive == true) | ||
120 | { | ||
121 | scriptLoadUnloadThread.Abort(); | ||
122 | scriptLoadUnloadThread.Join(); | ||
123 | } | ||
124 | } | ||
125 | } | ||
126 | catch | ||
127 | { | ||
128 | } | ||
129 | } | ||
130 | |||
131 | #endregion | ||
132 | |||
133 | #region Load / Unload scripts (Thread loop) | ||
134 | |||
135 | private void ScriptLoadUnloadThreadLoop() | ||
136 | { | ||
137 | try | ||
138 | { | ||
139 | while (true) | ||
140 | { | ||
141 | if (LUQueue.Count == 0) | ||
142 | Thread.Sleep(scriptLoadUnloadThread_IdleSleepms); | ||
143 | if (LUQueue.Count > 0) | ||
144 | { | ||
145 | LUStruct item = LUQueue.Dequeue(); | ||
146 | lock (startStopLock) // Lock so we have only 1 thread working on loading/unloading of scripts | ||
147 | { | ||
148 | if (item.Action == LUType.Unload) | ||
149 | { | ||
150 | _StopScript(item.localID, item.itemID); | ||
151 | } | ||
152 | if (item.Action == LUType.Load) | ||
153 | { | ||
154 | _StartScript(item.localID, item.itemID, item.script); | ||
155 | } | ||
156 | } | ||
157 | } | ||
158 | } | ||
159 | } | ||
160 | catch (ThreadAbortException tae) | ||
161 | { | ||
162 | string a = tae.ToString(); | ||
163 | a = ""; | ||
164 | // Expected | ||
165 | } | ||
166 | } | ||
167 | |||
168 | #endregion | ||
169 | |||
170 | #region Helper functions | ||
171 | |||
172 | private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) | ||
173 | { | ||
174 | //Console.WriteLine("ScriptManager.CurrentDomain_AssemblyResolve: " + args.Name); | ||
175 | return Assembly.GetExecutingAssembly().FullName == args.Name ? Assembly.GetExecutingAssembly() : null; | ||
176 | } | ||
177 | |||
178 | #endregion | ||
179 | |||
180 | |||
181 | |||
182 | #region Start/Stop/Reset script | ||
183 | |||
184 | private readonly Object startStopLock = new Object(); | ||
185 | |||
186 | /// <summary> | ||
187 | /// Fetches, loads and hooks up a script to an objects events | ||
188 | /// </summary> | ||
189 | /// <param name="itemID"></param> | ||
190 | /// <param name="localID"></param> | ||
191 | public void StartScript(uint localID, LLUUID itemID, string Script) | ||
192 | { | ||
193 | LUStruct ls = new LUStruct(); | ||
194 | ls.localID = localID; | ||
195 | ls.itemID = itemID; | ||
196 | ls.script = Script; | ||
197 | ls.Action = LUType.Load; | ||
198 | LUQueue.Enqueue(ls); | ||
199 | } | ||
200 | |||
201 | /// <summary> | ||
202 | /// Disables and unloads a script | ||
203 | /// </summary> | ||
204 | /// <param name="localID"></param> | ||
205 | /// <param name="itemID"></param> | ||
206 | public void StopScript(uint localID, LLUUID itemID) | ||
207 | { | ||
208 | LUStruct ls = new LUStruct(); | ||
209 | ls.localID = localID; | ||
210 | ls.itemID = itemID; | ||
211 | ls.Action = LUType.Unload; | ||
212 | LUQueue.Enqueue(ls); | ||
213 | } | ||
214 | |||
215 | // Create a new instance of the compiler (reuse) | ||
216 | //private Compiler.LSL.Compiler LSLCompiler = new Compiler.LSL.Compiler(); | ||
217 | |||
218 | public abstract void _StartScript(uint localID, LLUUID itemID, string Script); | ||
219 | |||
220 | public abstract void _StopScript(uint localID, LLUUID itemID); | ||
221 | |||
222 | |||
223 | #endregion | ||
224 | |||
225 | #region Perform event execution in script | ||
226 | |||
227 | /// <summary> | ||
228 | /// Execute a LL-event-function in Script | ||
229 | /// </summary> | ||
230 | /// <param name="localID">Object the script is located in</param> | ||
231 | /// <param name="itemID">Script ID</param> | ||
232 | /// <param name="FunctionName">Name of function</param> | ||
233 | /// <param name="args">Arguments to pass to function</param> | ||
234 | internal void ExecuteEvent(uint localID, LLUUID itemID, string FunctionName, object[] args) | ||
235 | { | ||
236 | #if DEBUG | ||
237 | Console.WriteLine("ScriptEngine: Inside ExecuteEvent for event " + FunctionName); | ||
238 | #endif | ||
239 | // Execute a function in the script | ||
240 | //m_scriptEngine.Log.Verbose("ScriptEngine", "Executing Function localID: " + localID + ", itemID: " + itemID + ", FunctionName: " + FunctionName); | ||
241 | //ScriptBaseInterface Script = (ScriptBaseInterface)GetScript(localID, itemID); | ||
242 | IScript Script = GetScript(localID, itemID); | ||
243 | if (Script == null) | ||
244 | return; | ||
245 | #if DEBUG | ||
246 | Console.WriteLine("ScriptEngine: Executing event: " + FunctionName); | ||
247 | #endif | ||
248 | // Must be done in correct AppDomain, so leaving it up to the script itself | ||
249 | Script.Exec.ExecuteEvent(FunctionName, args); | ||
250 | } | ||
251 | |||
252 | #endregion | ||
253 | |||
254 | #region Internal functions to keep track of script | ||
255 | |||
256 | public Dictionary<LLUUID, IScript>.KeyCollection GetScriptKeys(uint localID) | ||
257 | { | ||
258 | if (Scripts.ContainsKey(localID) == false) | ||
259 | return null; | ||
260 | |||
261 | Dictionary<LLUUID, IScript> Obj; | ||
262 | Scripts.TryGetValue(localID, out Obj); | ||
263 | |||
264 | return Obj.Keys; | ||
265 | } | ||
266 | |||
267 | public IScript GetScript(uint localID, LLUUID itemID) | ||
268 | { | ||
269 | if (Scripts.ContainsKey(localID) == false) | ||
270 | return null; | ||
271 | |||
272 | Dictionary<LLUUID, IScript> Obj; | ||
273 | Scripts.TryGetValue(localID, out Obj); | ||
274 | if (Obj.ContainsKey(itemID) == false) | ||
275 | return null; | ||
276 | |||
277 | // Get script | ||
278 | IScript Script; | ||
279 | Obj.TryGetValue(itemID, out Script); | ||
280 | |||
281 | return Script; | ||
282 | } | ||
283 | |||
284 | public void SetScript(uint localID, LLUUID itemID, IScript Script) | ||
285 | { | ||
286 | // Create object if it doesn't exist | ||
287 | if (Scripts.ContainsKey(localID) == false) | ||
288 | { | ||
289 | Scripts.Add(localID, new Dictionary<LLUUID, IScript>()); | ||
290 | } | ||
291 | |||
292 | // Delete script if it exists | ||
293 | Dictionary<LLUUID, IScript> Obj; | ||
294 | Scripts.TryGetValue(localID, out Obj); | ||
295 | if (Obj.ContainsKey(itemID) == true) | ||
296 | Obj.Remove(itemID); | ||
297 | |||
298 | // Add to object | ||
299 | Obj.Add(itemID, Script); | ||
300 | } | ||
301 | |||
302 | public void RemoveScript(uint localID, LLUUID itemID) | ||
303 | { | ||
304 | // Don't have that object? | ||
305 | if (Scripts.ContainsKey(localID) == false) | ||
306 | return; | ||
307 | |||
308 | // Delete script if it exists | ||
309 | Dictionary<LLUUID, IScript> Obj; | ||
310 | Scripts.TryGetValue(localID, out Obj); | ||
311 | if (Obj.ContainsKey(itemID) == true) | ||
312 | Obj.Remove(itemID); | ||
313 | } | ||
314 | |||
315 | #endregion | ||
316 | |||
317 | |||
318 | public void ResetScript(uint localID, LLUUID itemID) | ||
319 | { | ||
320 | string script = GetScript(localID, itemID).Source; | ||
321 | StopScript(localID, itemID); | ||
322 | StartScript(localID, itemID, script); | ||
323 | } | ||
324 | |||
325 | |||
326 | #region Script serialization/deserialization | ||
327 | |||
328 | public void GetSerializedScript(uint localID, LLUUID itemID) | ||
329 | { | ||
330 | // Serialize the script and return it | ||
331 | // Should not be a problem | ||
332 | FileStream fs = File.Create("SERIALIZED_SCRIPT_" + itemID); | ||
333 | BinaryFormatter b = new BinaryFormatter(); | ||
334 | b.Serialize(fs, GetScript(localID, itemID)); | ||
335 | fs.Close(); | ||
336 | } | ||
337 | |||
338 | public void PutSerializedScript(uint localID, LLUUID itemID) | ||
339 | { | ||
340 | // Deserialize the script and inject it into an AppDomain | ||
341 | |||
342 | // How to inject into an AppDomain? | ||
343 | } | ||
344 | |||
345 | #endregion | ||
346 | } | ||
347 | } \ No newline at end of file | ||
diff --git a/OpenSim/Region/ScriptEngine/Common/ScriptServerInterfaces.cs b/OpenSim/Region/ScriptEngine/Common/ScriptServerInterfaces.cs index 23ef126..8a3354f 100644 --- a/OpenSim/Region/ScriptEngine/Common/ScriptServerInterfaces.cs +++ b/OpenSim/Region/ScriptEngine/Common/ScriptServerInterfaces.cs | |||
@@ -2,6 +2,7 @@ | |||
2 | using OpenSim.Framework; | 2 | using OpenSim.Framework; |
3 | using OpenSim.Framework.Console; | 3 | using OpenSim.Framework.Console; |
4 | using OpenSim.Region.Environment.Scenes; | 4 | using OpenSim.Region.Environment.Scenes; |
5 | using OpenSim.Region.ScriptEngine.Common.ScriptEngineBase; | ||
5 | 6 | ||
6 | namespace OpenSim.Region.ScriptEngine.Common | 7 | namespace OpenSim.Region.ScriptEngine.Common |
7 | { | 8 | { |
@@ -44,7 +45,7 @@ namespace OpenSim.Region.ScriptEngine.Common | |||
44 | void remote_data(uint localID, LLUUID itemID); | 45 | void remote_data(uint localID, LLUUID itemID); |
45 | void http_response(uint localID, LLUUID itemID); | 46 | void http_response(uint localID, LLUUID itemID); |
46 | } | 47 | } |
47 | 48 | ||
48 | public interface ServerRemotingObject | 49 | public interface ServerRemotingObject |
49 | { | 50 | { |
50 | RemoteEvents Events(); | 51 | RemoteEvents Events(); |
@@ -52,7 +53,8 @@ namespace OpenSim.Region.ScriptEngine.Common | |||
52 | public interface ScriptEngine | 53 | public interface ScriptEngine |
53 | { | 54 | { |
54 | RemoteEvents EventManager(); | 55 | RemoteEvents EventManager(); |
55 | void InitializeEngine(Scene Sceneworld, LogBase logger, bool DontHookUp); | 56 | void InitializeEngine(Scene Sceneworld, LogBase logger, bool DontHookUp, ScriptManager newScriptManager); |
57 | ScriptManager GetScriptManager(); | ||
56 | } | 58 | } |
57 | 59 | ||
58 | } | 60 | } |