aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/ScriptEngine/Common
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/ScriptEngine/Common')
-rw-r--r--OpenSim/Region/ScriptEngine/Common/IScript.cs2
-rw-r--r--OpenSim/Region/ScriptEngine/Common/LSL_BaseClass.cs2165
-rw-r--r--OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs3003
-rw-r--r--OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/AppDomainManager.cs238
-rw-r--r--OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/Common.cs57
-rw-r--r--OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventManager.cs259
-rw-r--r--OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventQueueManager.cs363
-rw-r--r--OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/LSLLongCmdHandler.cs295
-rw-r--r--OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/ScriptEngine.cs131
-rw-r--r--OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/ScriptManager.cs347
-rw-r--r--OpenSim/Region/ScriptEngine/Common/ScriptServerInterfaces.cs6
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
29using System;
30using System.Collections.Generic;
31using System.Runtime.Remoting.Lifetime;
32using System.Threading;
33using OpenSim.Region.ScriptEngine.Common;
34using integer = System.Int32;
35using key = System.String;
36using vector = OpenSim.Region.ScriptEngine.Common.LSL_Types.Vector3;
37using rotation = OpenSim.Region.ScriptEngine.Common.LSL_Types.Quaternion;
38
39namespace 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
29using System;
30using System.Collections.Generic;
31using System.Runtime.Remoting.Lifetime;
32using System.Text;
33using System.Threading;
34using Axiom.Math;
35using libsecondlife;
36using OpenSim.Framework;
37using OpenSim.Region.Environment.Interfaces;
38using OpenSim.Region.Environment.Scenes;
39using OpenSim.Region.ScriptEngine.Common;
40//using OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL;
41
42namespace 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
29using System;
30using System.Collections;
31using System.Collections.Generic;
32using System.Reflection;
33using OpenSim.Region.ScriptEngine.Common;
34
35namespace 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 */
29namespace 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 */
29using System;
30using libsecondlife;
31using OpenSim.Framework;
32
33namespace 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 */
29using System;
30using System.Collections;
31using System.Collections.Generic;
32using System.Threading;
33using libsecondlife;
34using OpenSim.Framework;
35using OpenSim.Region.Environment.Scenes.Scripting;
36
37namespace 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
29using System;
30using System.Collections.Generic;
31using System.Threading;
32using libsecondlife;
33using OpenSim.Region.Environment.Interfaces;
34using OpenSim.Region.Environment.Modules;
35
36namespace 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 */
29using System;
30using Nini.Config;
31using OpenSim.Framework.Console;
32using OpenSim.Region.Environment.Interfaces;
33using OpenSim.Region.Environment.Scenes;
34using OpenSim.Region.ScriptEngine.Common;
35using OpenSim.Region.ScriptEngine.Common.ScriptEngineBase;
36
37namespace 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 */
29using System;
30using System.Collections.Generic;
31using System.IO;
32using System.Reflection;
33using System.Runtime.Serialization.Formatters.Binary;
34using System.Threading;
35using libsecondlife;
36using OpenSim.Framework;
37using OpenSim.Region.Environment.Scenes;
38using OpenSim.Region.ScriptEngine.Common;
39
40namespace 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 @@
2using OpenSim.Framework; 2using OpenSim.Framework;
3using OpenSim.Framework.Console; 3using OpenSim.Framework.Console;
4using OpenSim.Region.Environment.Scenes; 4using OpenSim.Region.Environment.Scenes;
5using OpenSim.Region.ScriptEngine.Common.ScriptEngineBase;
5 6
6namespace OpenSim.Region.ScriptEngine.Common 7namespace 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 }