diff options
author | Tedd Hansen | 2008-01-12 14:30:22 +0000 |
---|---|---|
committer | Tedd Hansen | 2008-01-12 14:30:22 +0000 |
commit | bacbade369a5244f9bcc611488b59f3bd4c8a564 (patch) | |
tree | 2cd909eff401066a69dba96615cbf736fdd73be5 /OpenSim/Region/ScriptEngine | |
parent | * Trying something to see if it helps teleports and border crossings (diff) | |
download | opensim-SC-bacbade369a5244f9bcc611488b59f3bd4c8a564.zip opensim-SC-bacbade369a5244f9bcc611488b59f3bd4c8a564.tar.gz opensim-SC-bacbade369a5244f9bcc611488b59f3bd4c8a564.tar.bz2 opensim-SC-bacbade369a5244f9bcc611488b59f3bd4c8a564.tar.xz |
Major reorganizing of DotNetEngine. Moved common script engine parts to ScriptEngine.Common, only .Net-specific code in DotNetEngine. AppDomains, event handling, event execution queue and multithreading, script load/unload queue, etc has been moved to ScriptEngine.Common.
Loads of things has been put into interfaces instead of the specific class.
We are now one step closer to ScriptServer, and its very easy to implement new script languages. Just a few lines required to make them a OpenSim script module with all its glory.
Diffstat (limited to 'OpenSim/Region/ScriptEngine')
16 files changed, 6941 insertions, 6894 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/DotNetEngine/Compiler/LSL/LSL_BaseClass.cs b/OpenSim/Region/ScriptEngine/Common/LSL_BaseClass.cs index 7c1d66e..5de9a85 100644 --- a/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/LSL_BaseClass.cs +++ b/OpenSim/Region/ScriptEngine/Common/LSL_BaseClass.cs | |||
@@ -1,2154 +1,2165 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) Contributors, http://opensimulator.org/ | 2 | * Copyright (c) Contributors, http://opensimulator.org/ |
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | 3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. |
4 | * | 4 | * |
5 | * Redistribution and use in source and binary forms, with or without | 5 | * Redistribution and use in source and binary forms, with or without |
6 | * modification, are permitted provided that the following conditions are met: | 6 | * modification, are permitted provided that the following conditions are met: |
7 | * * Redistributions of source code must retain the above copyright | 7 | * * Redistributions of source code must retain the above copyright |
8 | * notice, this list of conditions and the following disclaimer. | 8 | * notice, this list of conditions and the following disclaimer. |
9 | * * Redistributions in binary form must reproduce the above copyright | 9 | * * Redistributions in binary form must reproduce the above copyright |
10 | * notice, this list of conditions and the following disclaimer in the | 10 | * notice, this list of conditions and the following disclaimer in the |
11 | * documentation and/or other materials provided with the distribution. | 11 | * documentation and/or other materials provided with the distribution. |
12 | * * Neither the name of the OpenSim Project nor the | 12 | * * Neither the name of the OpenSim Project nor the |
13 | * names of its contributors may be used to endorse or promote products | 13 | * names of its contributors may be used to endorse or promote products |
14 | * derived from this software without specific prior written permission. | 14 | * derived from this software without specific prior written permission. |
15 | * | 15 | * |
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS AS IS AND ANY | 16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS AS IS AND ANY |
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | 17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | 19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY |
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | 20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 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 | 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 | 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 | 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. | 25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | * | 26 | * |
27 | */ | 27 | */ |
28 | 28 | ||
29 | using System; | 29 | using System; |
30 | using System.Collections.Generic; | 30 | using System.Collections.Generic; |
31 | using System.Runtime.Remoting.Lifetime; | 31 | using System.Runtime.Remoting.Lifetime; |
32 | using System.Threading; | 32 | using System.Threading; |
33 | using OpenSim.Region.ScriptEngine.Common; | 33 | using OpenSim.Region.ScriptEngine.Common; |
34 | using integer = System.Int32; | 34 | using integer = System.Int32; |
35 | using key = System.String; | 35 | using key = System.String; |
36 | using vector = OpenSim.Region.ScriptEngine.Common.LSL_Types.Vector3; | 36 | using vector = OpenSim.Region.ScriptEngine.Common.LSL_Types.Vector3; |
37 | using rotation = OpenSim.Region.ScriptEngine.Common.LSL_Types.Quaternion; | 37 | using rotation = OpenSim.Region.ScriptEngine.Common.LSL_Types.Quaternion; |
38 | 38 | ||
39 | namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL | 39 | namespace OpenSim.Region.ScriptEngine.Common |
40 | { | 40 | { |
41 | //[Serializable] | 41 | public class LSL_BaseClass : MarshalByRefObject, LSL_BuiltIn_Commands_Interface, IScript |
42 | public class LSL_BaseClass : MarshalByRefObject, LSL_BuiltIn_Commands_Interface, IScript | 42 | { |
43 | { | 43 | |
44 | 44 | // | |
45 | // | 45 | // Included as base for any LSL-script that is compiled. |
46 | // 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 | // 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 | // | 48 | // Security note: This script will be running inside an restricted AppDomain. Currently AppDomain is not very restricted. |
49 | // Security note: This script will be running inside an restricted AppDomain. Currently AppDomain is not very restricted.zxs | 49 | // |
50 | // | 50 | |
51 | 51 | // Object never expires | |
52 | // Object never expires | 52 | public override Object InitializeLifetimeService() |
53 | public override Object InitializeLifetimeService() | 53 | { |
54 | { | 54 | //Console.WriteLine("LSL_BaseClass: InitializeLifetimeService()"); |
55 | //Console.WriteLine("LSL_BaseClass: InitializeLifetimeService()"); | 55 | // return null; |
56 | // return null; | 56 | ILease lease = (ILease)base.InitializeLifetimeService(); |
57 | ILease lease = (ILease)base.InitializeLifetimeService(); | 57 | |
58 | 58 | if (lease.CurrentState == LeaseState.Initial) | |
59 | if (lease.CurrentState == LeaseState.Initial) | 59 | { |
60 | { | 60 | lease.InitialLeaseTime = TimeSpan.Zero; // TimeSpan.FromMinutes(1); |
61 | lease.InitialLeaseTime = TimeSpan.Zero; // TimeSpan.FromMinutes(1); | 61 | //lease.SponsorshipTimeout = TimeSpan.FromMinutes(2); |
62 | //lease.SponsorshipTimeout = TimeSpan.FromMinutes(2); | 62 | //lease.RenewOnCallTime = TimeSpan.FromSeconds(2); |
63 | //lease.RenewOnCallTime = TimeSpan.FromSeconds(2); | 63 | } |
64 | } | 64 | return lease; |
65 | return lease; | 65 | } |
66 | } | 66 | |
67 | 67 | ||
68 | 68 | private Executor m_Exec; | |
69 | private Executor m_Exec; | 69 | |
70 | 70 | Executor IScript.Exec | |
71 | public Executor Exec | 71 | { |
72 | { | 72 | get |
73 | get | 73 | { |
74 | { | 74 | if (m_Exec == null) |
75 | if (m_Exec == null) | 75 | m_Exec = new Executor(this); |
76 | m_Exec = new Executor(this); | 76 | return m_Exec; |
77 | return m_Exec; | 77 | } |
78 | } | 78 | } |
79 | } | 79 | |
80 | 80 | ||
81 | public LSL_BuiltIn_Commands_Interface m_LSL_Functions; | 81 | public LSL_BuiltIn_Commands_Interface m_LSL_Functions; |
82 | public string SourceCode = ""; | 82 | private string _Source = ""; |
83 | 83 | public string Source | |
84 | public LSL_BaseClass() | 84 | { |
85 | { | 85 | get |
86 | } | 86 | { |
87 | 87 | return _Source; | |
88 | public string State() | 88 | } |
89 | { | 89 | set { _Source = value; } |
90 | return m_LSL_Functions.State(); | 90 | } |
91 | } | 91 | |
92 | 92 | ||
93 | 93 | public LSL_BaseClass() | |
94 | public void Start(LSL_BuiltIn_Commands_Interface LSL_Functions) | 94 | { |
95 | { | 95 | } |
96 | m_LSL_Functions = LSL_Functions; | 96 | |
97 | 97 | public string State() | |
98 | //MainLog.Instance.Notice("ScriptEngine", "LSL_BaseClass.Start() called."); | 98 | { |
99 | 99 | return m_LSL_Functions.State(); | |
100 | // Get this AppDomain's settings and display some of them. | 100 | } |
101 | AppDomainSetup ads = AppDomain.CurrentDomain.SetupInformation; | 101 | |
102 | Console.WriteLine("AppName={0}, AppBase={1}, ConfigFile={2}", | 102 | |
103 | ads.ApplicationName, | 103 | |
104 | ads.ApplicationBase, | 104 | public void Start(LSL_BuiltIn_Commands_Interface LSL_Functions) |
105 | ads.ConfigurationFile | 105 | { |
106 | ); | 106 | m_LSL_Functions = LSL_Functions; |
107 | 107 | ||
108 | // Display the name of the calling AppDomain and the name | 108 | //MainLog.Instance.Notice("ScriptEngine", "LSL_BaseClass.Start() called."); |
109 | // of the second domain. | 109 | |
110 | // NOTE: The application's thread has transitioned between | 110 | // Get this AppDomain's settings and display some of them. |
111 | // AppDomains. | 111 | AppDomainSetup ads = AppDomain.CurrentDomain.SetupInformation; |
112 | Console.WriteLine("Calling to '{0}'.", | 112 | Console.WriteLine("AppName={0}, AppBase={1}, ConfigFile={2}", |
113 | Thread.GetDomain().FriendlyName | 113 | ads.ApplicationName, |
114 | ); | 114 | ads.ApplicationBase, |
115 | 115 | ads.ConfigurationFile | |
116 | return; | 116 | ); |
117 | } | 117 | |
118 | 118 | // Display the name of the calling AppDomain and the name | |
119 | 119 | // of the second domain. | |
120 | // | 120 | // NOTE: The application's thread has transitioned between |
121 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs | 121 | // AppDomains. |
122 | // | 122 | Console.WriteLine("Calling to '{0}'.", |
123 | // They are only forwarders to LSL_BuiltIn_Commands.cs | 123 | Thread.GetDomain().FriendlyName |
124 | // | 124 | ); |
125 | public double llSin(double f) | 125 | |
126 | { | 126 | return; |
127 | return m_LSL_Functions.llSin(f); | 127 | } |
128 | } | 128 | |
129 | 129 | ||
130 | public double llCos(double f) | 130 | // |
131 | { | 131 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs |
132 | return m_LSL_Functions.llCos(f); | 132 | // |
133 | } | 133 | // They are only forwarders to LSL_BuiltIn_Commands.cs |
134 | 134 | // | |
135 | public double llTan(double f) | 135 | public double llSin(double f) |
136 | { | 136 | { |
137 | return m_LSL_Functions.llTan(f); | 137 | return m_LSL_Functions.llSin(f); |
138 | } | 138 | } |
139 | 139 | ||
140 | public double llAtan2(double x, double y) | 140 | public double llCos(double f) |
141 | { | 141 | { |
142 | return m_LSL_Functions.llAtan2(x, y); | 142 | return m_LSL_Functions.llCos(f); |
143 | } | 143 | } |
144 | 144 | ||
145 | public double llSqrt(double f) | 145 | public double llTan(double f) |
146 | { | 146 | { |
147 | return m_LSL_Functions.llSqrt(f); | 147 | return m_LSL_Functions.llTan(f); |
148 | } | 148 | } |
149 | 149 | ||
150 | public double llPow(double fbase, double fexponent) | 150 | public double llAtan2(double x, double y) |
151 | { | 151 | { |
152 | return m_LSL_Functions.llPow(fbase, fexponent); | 152 | return m_LSL_Functions.llAtan2(x, y); |
153 | } | 153 | } |
154 | 154 | ||
155 | public int llAbs(int i) | 155 | public double llSqrt(double f) |
156 | { | 156 | { |
157 | return m_LSL_Functions.llAbs(i); | 157 | return m_LSL_Functions.llSqrt(f); |
158 | } | 158 | } |
159 | 159 | ||
160 | public double llFabs(double f) | 160 | public double llPow(double fbase, double fexponent) |
161 | { | 161 | { |
162 | return m_LSL_Functions.llFabs(f); | 162 | return m_LSL_Functions.llPow(fbase, fexponent); |
163 | } | 163 | } |
164 | 164 | ||
165 | public double llFrand(double mag) | 165 | public int llAbs(int i) |
166 | { | 166 | { |
167 | return m_LSL_Functions.llFrand(mag); | 167 | return m_LSL_Functions.llAbs(i); |
168 | } | 168 | } |
169 | 169 | ||
170 | public int llFloor(double f) | 170 | public double llFabs(double f) |
171 | { | 171 | { |
172 | return m_LSL_Functions.llFloor(f); | 172 | return m_LSL_Functions.llFabs(f); |
173 | } | 173 | } |
174 | 174 | ||
175 | public int llCeil(double f) | 175 | public double llFrand(double mag) |
176 | { | 176 | { |
177 | return m_LSL_Functions.llCeil(f); | 177 | return m_LSL_Functions.llFrand(mag); |
178 | } | 178 | } |
179 | 179 | ||
180 | public int llRound(double f) | 180 | public int llFloor(double f) |
181 | { | 181 | { |
182 | return m_LSL_Functions.llRound(f); | 182 | return m_LSL_Functions.llFloor(f); |
183 | } | 183 | } |
184 | 184 | ||
185 | public double llVecMag(vector v) | 185 | public int llCeil(double f) |
186 | { | 186 | { |
187 | return m_LSL_Functions.llVecMag(v); | 187 | return m_LSL_Functions.llCeil(f); |
188 | } | 188 | } |
189 | 189 | ||
190 | public vector llVecNorm(vector v) | 190 | public int llRound(double f) |
191 | { | 191 | { |
192 | return m_LSL_Functions.llVecNorm(v); | 192 | return m_LSL_Functions.llRound(f); |
193 | } | 193 | } |
194 | 194 | ||
195 | public double llVecDist(vector a, vector b) | 195 | public double llVecMag(vector v) |
196 | { | 196 | { |
197 | return m_LSL_Functions.llVecDist(a, b); | 197 | return m_LSL_Functions.llVecMag(v); |
198 | } | 198 | } |
199 | 199 | ||
200 | public vector llRot2Euler(rotation r) | 200 | public vector llVecNorm(vector v) |
201 | { | 201 | { |
202 | return m_LSL_Functions.llRot2Euler(r); | 202 | return m_LSL_Functions.llVecNorm(v); |
203 | } | 203 | } |
204 | 204 | ||
205 | public rotation llEuler2Rot(vector v) | 205 | public double llVecDist(vector a, vector b) |
206 | { | 206 | { |
207 | return m_LSL_Functions.llEuler2Rot(v); | 207 | return m_LSL_Functions.llVecDist(a, b); |
208 | } | 208 | } |
209 | 209 | ||
210 | public rotation llAxes2Rot(vector fwd, vector left, vector up) | 210 | public vector llRot2Euler(rotation r) |
211 | { | 211 | { |
212 | return m_LSL_Functions.llAxes2Rot(fwd, left, up); | 212 | return m_LSL_Functions.llRot2Euler(r); |
213 | } | 213 | } |
214 | 214 | ||
215 | public vector llRot2Fwd(rotation r) | 215 | public rotation llEuler2Rot(vector v) |
216 | { | 216 | { |
217 | return m_LSL_Functions.llRot2Fwd(r); | 217 | return m_LSL_Functions.llEuler2Rot(v); |
218 | } | 218 | } |
219 | 219 | ||
220 | public vector llRot2Left(rotation r) | 220 | public rotation llAxes2Rot(vector fwd, vector left, vector up) |
221 | { | 221 | { |
222 | return m_LSL_Functions.llRot2Left(r); | 222 | return m_LSL_Functions.llAxes2Rot(fwd, left, up); |
223 | } | 223 | } |
224 | 224 | ||
225 | public vector llRot2Up(rotation r) | 225 | public vector llRot2Fwd(rotation r) |
226 | { | 226 | { |
227 | return m_LSL_Functions.llRot2Up(r); | 227 | return m_LSL_Functions.llRot2Fwd(r); |
228 | } | 228 | } |
229 | 229 | ||
230 | public rotation llRotBetween(vector start, vector end) | 230 | public vector llRot2Left(rotation r) |
231 | { | 231 | { |
232 | return m_LSL_Functions.llRotBetween(start, end); | 232 | return m_LSL_Functions.llRot2Left(r); |
233 | } | 233 | } |
234 | 234 | ||
235 | public void llWhisper(int channelID, string text) | 235 | public vector llRot2Up(rotation r) |
236 | { | 236 | { |
237 | m_LSL_Functions.llWhisper(channelID, text); | 237 | return m_LSL_Functions.llRot2Up(r); |
238 | } | 238 | } |
239 | 239 | ||
240 | public void llSay(int channelID, string text) | 240 | public rotation llRotBetween(vector start, vector end) |
241 | { | 241 | { |
242 | m_LSL_Functions.llSay(channelID, text); | 242 | return m_LSL_Functions.llRotBetween(start, end); |
243 | } | 243 | } |
244 | 244 | ||
245 | // | 245 | public void llWhisper(int channelID, string text) |
246 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs | 246 | { |
247 | // | 247 | m_LSL_Functions.llWhisper(channelID, text); |
248 | public void llShout(int channelID, string text) | 248 | } |
249 | { | 249 | |
250 | m_LSL_Functions.llShout(channelID, text); | 250 | public void llSay(int channelID, string text) |
251 | } | 251 | { |
252 | 252 | m_LSL_Functions.llSay(channelID, text); | |
253 | public int llListen(int channelID, string name, string ID, string msg) | 253 | } |
254 | { | 254 | |
255 | return m_LSL_Functions.llListen(channelID, name, ID, msg); | 255 | // |
256 | } | 256 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs |
257 | 257 | // | |
258 | public void llListenControl(int number, int active) | 258 | public void llShout(int channelID, string text) |
259 | { | 259 | { |
260 | m_LSL_Functions.llListenControl(number, active); | 260 | m_LSL_Functions.llShout(channelID, text); |
261 | } | 261 | } |
262 | 262 | ||
263 | public void llListenRemove(int number) | 263 | public int llListen(int channelID, string name, string ID, string msg) |
264 | { | 264 | { |
265 | m_LSL_Functions.llListenRemove(number); | 265 | return m_LSL_Functions.llListen(channelID, name, ID, msg); |
266 | } | 266 | } |
267 | 267 | ||
268 | public void llSensor(string name, string id, int type, double range, double arc) | 268 | public void llListenControl(int number, int active) |
269 | { | 269 | { |
270 | m_LSL_Functions.llSensor(name, id, type, range, arc); | 270 | m_LSL_Functions.llListenControl(number, active); |
271 | } | 271 | } |
272 | 272 | ||
273 | public void llSensorRepeat(string name, string id, int type, double range, double arc, double rate) | 273 | public void llListenRemove(int number) |
274 | { | 274 | { |
275 | m_LSL_Functions.llSensorRepeat(name, id, type, range, arc, rate); | 275 | m_LSL_Functions.llListenRemove(number); |
276 | } | 276 | } |
277 | 277 | ||
278 | public void llSensorRemove() | 278 | public void llSensor(string name, string id, int type, double range, double arc) |
279 | { | 279 | { |
280 | m_LSL_Functions.llSensorRemove(); | 280 | m_LSL_Functions.llSensor(name, id, type, range, arc); |
281 | } | 281 | } |
282 | 282 | ||
283 | public string llDetectedName(int number) | 283 | public void llSensorRepeat(string name, string id, int type, double range, double arc, double rate) |
284 | { | 284 | { |
285 | return m_LSL_Functions.llDetectedName(number); | 285 | m_LSL_Functions.llSensorRepeat(name, id, type, range, arc, rate); |
286 | } | 286 | } |
287 | 287 | ||
288 | public string llDetectedKey(int number) | 288 | public void llSensorRemove() |
289 | { | 289 | { |
290 | return m_LSL_Functions.llDetectedKey(number); | 290 | m_LSL_Functions.llSensorRemove(); |
291 | } | 291 | } |
292 | 292 | ||
293 | public string llDetectedOwner(int number) | 293 | public string llDetectedName(int number) |
294 | { | 294 | { |
295 | return m_LSL_Functions.llDetectedOwner(number); | 295 | return m_LSL_Functions.llDetectedName(number); |
296 | } | 296 | } |
297 | 297 | ||
298 | public int llDetectedType(int number) | 298 | public string llDetectedKey(int number) |
299 | { | 299 | { |
300 | return m_LSL_Functions.llDetectedType(number); | 300 | return m_LSL_Functions.llDetectedKey(number); |
301 | } | 301 | } |
302 | 302 | ||
303 | public vector llDetectedPos(int number) | 303 | public string llDetectedOwner(int number) |
304 | { | 304 | { |
305 | return m_LSL_Functions.llDetectedPos(number); | 305 | return m_LSL_Functions.llDetectedOwner(number); |
306 | } | 306 | } |
307 | 307 | ||
308 | public vector llDetectedVel(int number) | 308 | public int llDetectedType(int number) |
309 | { | 309 | { |
310 | return m_LSL_Functions.llDetectedVel(number); | 310 | return m_LSL_Functions.llDetectedType(number); |
311 | } | 311 | } |
312 | 312 | ||
313 | public vector llDetectedGrab(int number) | 313 | public vector llDetectedPos(int number) |
314 | { | 314 | { |
315 | return m_LSL_Functions.llDetectedGrab(number); | 315 | return m_LSL_Functions.llDetectedPos(number); |
316 | } | 316 | } |
317 | 317 | ||
318 | public rotation llDetectedRot(int number) | 318 | public vector llDetectedVel(int number) |
319 | { | 319 | { |
320 | return m_LSL_Functions.llDetectedRot(number); | 320 | return m_LSL_Functions.llDetectedVel(number); |
321 | } | 321 | } |
322 | 322 | ||
323 | public int llDetectedGroup(int number) | 323 | public vector llDetectedGrab(int number) |
324 | { | 324 | { |
325 | return m_LSL_Functions.llDetectedGroup(number); | 325 | return m_LSL_Functions.llDetectedGrab(number); |
326 | } | 326 | } |
327 | 327 | ||
328 | public int llDetectedLinkNumber(int number) | 328 | public rotation llDetectedRot(int number) |
329 | { | 329 | { |
330 | return m_LSL_Functions.llDetectedLinkNumber(number); | 330 | return m_LSL_Functions.llDetectedRot(number); |
331 | } | 331 | } |
332 | 332 | ||
333 | // | 333 | public int llDetectedGroup(int number) |
334 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs | 334 | { |
335 | // | 335 | return m_LSL_Functions.llDetectedGroup(number); |
336 | public void llDie() | 336 | } |
337 | { | 337 | |
338 | m_LSL_Functions.llDie(); | 338 | public int llDetectedLinkNumber(int number) |
339 | } | 339 | { |
340 | 340 | return m_LSL_Functions.llDetectedLinkNumber(number); | |
341 | public double llGround(vector offset) | 341 | } |
342 | { | 342 | |
343 | return m_LSL_Functions.llGround(offset); | 343 | // |
344 | } | 344 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs |
345 | 345 | // | |
346 | public double llCloud(vector offset) | 346 | public void llDie() |
347 | { | 347 | { |
348 | return m_LSL_Functions.llCloud(offset); | 348 | m_LSL_Functions.llDie(); |
349 | } | 349 | } |
350 | 350 | ||
351 | public vector llWind(vector offset) | 351 | public double llGround(vector offset) |
352 | { | 352 | { |
353 | return m_LSL_Functions.llWind(offset); | 353 | return m_LSL_Functions.llGround(offset); |
354 | } | 354 | } |
355 | 355 | ||
356 | public void llSetStatus(int status, int value) | 356 | public double llCloud(vector offset) |
357 | { | 357 | { |
358 | m_LSL_Functions.llSetStatus(status, value); | 358 | return m_LSL_Functions.llCloud(offset); |
359 | } | 359 | } |
360 | 360 | ||
361 | public int llGetStatus(int status) | 361 | public vector llWind(vector offset) |
362 | { | 362 | { |
363 | return m_LSL_Functions.llGetStatus(status); | 363 | return m_LSL_Functions.llWind(offset); |
364 | } | 364 | } |
365 | 365 | ||
366 | public void llSetScale(vector scale) | 366 | public void llSetStatus(int status, int value) |
367 | { | 367 | { |
368 | m_LSL_Functions.llSetScale(scale); | 368 | m_LSL_Functions.llSetStatus(status, value); |
369 | } | 369 | } |
370 | 370 | ||
371 | public vector llGetScale() | 371 | public int llGetStatus(int status) |
372 | { | 372 | { |
373 | return m_LSL_Functions.llGetScale(); | 373 | return m_LSL_Functions.llGetStatus(status); |
374 | } | 374 | } |
375 | 375 | ||
376 | public void llSetColor(vector color, int face) | 376 | public void llSetScale(vector scale) |
377 | { | 377 | { |
378 | m_LSL_Functions.llSetColor(color, face); | 378 | m_LSL_Functions.llSetScale(scale); |
379 | } | 379 | } |
380 | 380 | ||
381 | public double llGetAlpha(int face) | 381 | public vector llGetScale() |
382 | { | 382 | { |
383 | return m_LSL_Functions.llGetAlpha(face); | 383 | return m_LSL_Functions.llGetScale(); |
384 | } | 384 | } |
385 | 385 | ||
386 | public void llSetAlpha(double alpha, int face) | 386 | public void llSetColor(vector color, int face) |
387 | { | 387 | { |
388 | m_LSL_Functions.llSetAlpha(alpha, face); | 388 | m_LSL_Functions.llSetColor(color, face); |
389 | } | 389 | } |
390 | 390 | ||
391 | public vector llGetColor(int face) | 391 | public double llGetAlpha(int face) |
392 | { | 392 | { |
393 | return m_LSL_Functions.llGetColor(face); | 393 | return m_LSL_Functions.llGetAlpha(face); |
394 | } | 394 | } |
395 | 395 | ||
396 | public void llSetTexture(string texture, int face) | 396 | public void llSetAlpha(double alpha, int face) |
397 | { | 397 | { |
398 | m_LSL_Functions.llSetTexture(texture, face); | 398 | m_LSL_Functions.llSetAlpha(alpha, face); |
399 | } | 399 | } |
400 | 400 | ||
401 | public void llScaleTexture(double u, double v, int face) | 401 | public vector llGetColor(int face) |
402 | { | 402 | { |
403 | m_LSL_Functions.llScaleTexture(u, v, face); | 403 | return m_LSL_Functions.llGetColor(face); |
404 | } | 404 | } |
405 | 405 | ||
406 | public void llOffsetTexture(double u, double v, int face) | 406 | public void llSetTexture(string texture, int face) |
407 | { | 407 | { |
408 | m_LSL_Functions.llOffsetTexture(u, v, face); | 408 | m_LSL_Functions.llSetTexture(texture, face); |
409 | } | 409 | } |
410 | 410 | ||
411 | public void llRotateTexture(double rotation, int face) | 411 | public void llScaleTexture(double u, double v, int face) |
412 | { | 412 | { |
413 | m_LSL_Functions.llRotateTexture(rotation, face); | 413 | m_LSL_Functions.llScaleTexture(u, v, face); |
414 | } | 414 | } |
415 | 415 | ||
416 | public string llGetTexture(int face) | 416 | public void llOffsetTexture(double u, double v, int face) |
417 | { | 417 | { |
418 | return m_LSL_Functions.llGetTexture(face); | 418 | m_LSL_Functions.llOffsetTexture(u, v, face); |
419 | } | 419 | } |
420 | 420 | ||
421 | // | 421 | public void llRotateTexture(double rotation, int face) |
422 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs | 422 | { |
423 | // | 423 | m_LSL_Functions.llRotateTexture(rotation, face); |
424 | public void llSetPos(vector pos) | 424 | } |
425 | { | 425 | |
426 | m_LSL_Functions.llSetPos(pos); | 426 | public string llGetTexture(int face) |
427 | } | 427 | { |
428 | 428 | return m_LSL_Functions.llGetTexture(face); | |
429 | public vector llGetPos() | 429 | } |
430 | { | 430 | |
431 | return m_LSL_Functions.llGetPos(); | 431 | // |
432 | } | 432 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs |
433 | 433 | // | |
434 | public vector llGetLocalPos() | 434 | public void llSetPos(vector pos) |
435 | { | 435 | { |
436 | return m_LSL_Functions.llGetLocalPos(); | 436 | m_LSL_Functions.llSetPos(pos); |
437 | } | 437 | } |
438 | 438 | ||
439 | public void llSetRot(rotation rot) | 439 | public vector llGetPos() |
440 | { | 440 | { |
441 | m_LSL_Functions.llSetRot(rot); | 441 | return m_LSL_Functions.llGetPos(); |
442 | } | 442 | } |
443 | 443 | ||
444 | public rotation llGetRot() | 444 | public vector llGetLocalPos() |
445 | { | 445 | { |
446 | return m_LSL_Functions.llGetRot(); | 446 | return m_LSL_Functions.llGetLocalPos(); |
447 | } | 447 | } |
448 | 448 | ||
449 | public rotation llGetLocalRot() | 449 | public void llSetRot(rotation rot) |
450 | { | 450 | { |
451 | return m_LSL_Functions.llGetLocalRot(); | 451 | m_LSL_Functions.llSetRot(rot); |
452 | } | 452 | } |
453 | 453 | ||
454 | public void llSetForce(vector force, int local) | 454 | public rotation llGetRot() |
455 | { | 455 | { |
456 | m_LSL_Functions.llSetForce(force, local); | 456 | return m_LSL_Functions.llGetRot(); |
457 | } | 457 | } |
458 | 458 | ||
459 | public vector llGetForce() | 459 | public rotation llGetLocalRot() |
460 | { | 460 | { |
461 | return m_LSL_Functions.llGetForce(); | 461 | return m_LSL_Functions.llGetLocalRot(); |
462 | } | 462 | } |
463 | 463 | ||
464 | public int llTarget(vector position, double range) | 464 | public void llSetForce(vector force, int local) |
465 | { | 465 | { |
466 | return m_LSL_Functions.llTarget(position, range); | 466 | m_LSL_Functions.llSetForce(force, local); |
467 | } | 467 | } |
468 | 468 | ||
469 | public void llTargetRemove(int number) | 469 | public vector llGetForce() |
470 | { | 470 | { |
471 | m_LSL_Functions.llTargetRemove(number); | 471 | return m_LSL_Functions.llGetForce(); |
472 | } | 472 | } |
473 | 473 | ||
474 | public int llRotTarget(rotation rot, double error) | 474 | public int llTarget(vector position, double range) |
475 | { | 475 | { |
476 | return m_LSL_Functions.llRotTarget(rot, error); | 476 | return m_LSL_Functions.llTarget(position, range); |
477 | } | 477 | } |
478 | 478 | ||
479 | public void llRotTargetRemove(int number) | 479 | public void llTargetRemove(int number) |
480 | { | 480 | { |
481 | m_LSL_Functions.llRotTargetRemove(number); | 481 | m_LSL_Functions.llTargetRemove(number); |
482 | } | 482 | } |
483 | 483 | ||
484 | public void llMoveToTarget(vector target, double tau) | 484 | public int llRotTarget(rotation rot, double error) |
485 | { | 485 | { |
486 | m_LSL_Functions.llMoveToTarget(target, tau); | 486 | return m_LSL_Functions.llRotTarget(rot, error); |
487 | } | 487 | } |
488 | 488 | ||
489 | public void llStopMoveToTarget() | 489 | public void llRotTargetRemove(int number) |
490 | { | 490 | { |
491 | m_LSL_Functions.llStopMoveToTarget(); | 491 | m_LSL_Functions.llRotTargetRemove(number); |
492 | } | 492 | } |
493 | 493 | ||
494 | public void llApplyImpulse(vector force, int local) | 494 | public void llMoveToTarget(vector target, double tau) |
495 | { | 495 | { |
496 | m_LSL_Functions.llApplyImpulse(force, local); | 496 | m_LSL_Functions.llMoveToTarget(target, tau); |
497 | } | 497 | } |
498 | 498 | ||
499 | // | 499 | public void llStopMoveToTarget() |
500 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs | 500 | { |
501 | // | 501 | m_LSL_Functions.llStopMoveToTarget(); |
502 | public void llApplyRotationalImpulse(vector force, int local) | 502 | } |
503 | { | 503 | |
504 | m_LSL_Functions.llApplyRotationalImpulse(force, local); | 504 | public void llApplyImpulse(vector force, int local) |
505 | } | 505 | { |
506 | 506 | m_LSL_Functions.llApplyImpulse(force, local); | |
507 | public void llSetTorque(vector torque, int local) | 507 | } |
508 | { | 508 | |
509 | m_LSL_Functions.llSetTorque(torque, local); | 509 | // |
510 | } | 510 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs |
511 | 511 | // | |
512 | public vector llGetTorque() | 512 | public void llApplyRotationalImpulse(vector force, int local) |
513 | { | 513 | { |
514 | return m_LSL_Functions.llGetTorque(); | 514 | m_LSL_Functions.llApplyRotationalImpulse(force, local); |
515 | } | 515 | } |
516 | 516 | ||
517 | public void llSetForceAndTorque(vector force, vector torque, int local) | 517 | public void llSetTorque(vector torque, int local) |
518 | { | 518 | { |
519 | m_LSL_Functions.llSetForceAndTorque(force, torque, local); | 519 | m_LSL_Functions.llSetTorque(torque, local); |
520 | } | 520 | } |
521 | 521 | ||
522 | public vector llGetVel() | 522 | public vector llGetTorque() |
523 | { | 523 | { |
524 | return m_LSL_Functions.llGetVel(); | 524 | return m_LSL_Functions.llGetTorque(); |
525 | } | 525 | } |
526 | 526 | ||
527 | public vector llGetAccel() | 527 | public void llSetForceAndTorque(vector force, vector torque, int local) |
528 | { | 528 | { |
529 | return m_LSL_Functions.llGetAccel(); | 529 | m_LSL_Functions.llSetForceAndTorque(force, torque, local); |
530 | } | 530 | } |
531 | 531 | ||
532 | public vector llGetOmega() | 532 | public vector llGetVel() |
533 | { | 533 | { |
534 | return m_LSL_Functions.llGetOmega(); | 534 | return m_LSL_Functions.llGetVel(); |
535 | } | 535 | } |
536 | 536 | ||
537 | public double llGetTimeOfDay() | 537 | public vector llGetAccel() |
538 | { | 538 | { |
539 | return m_LSL_Functions.llGetTimeOfDay(); | 539 | return m_LSL_Functions.llGetAccel(); |
540 | } | 540 | } |
541 | 541 | ||
542 | public double llGetWallclock() | 542 | public vector llGetOmega() |
543 | { | 543 | { |
544 | return m_LSL_Functions.llGetWallclock(); | 544 | return m_LSL_Functions.llGetOmega(); |
545 | } | 545 | } |
546 | 546 | ||
547 | public double llGetTime() | 547 | public double llGetTimeOfDay() |
548 | { | 548 | { |
549 | return m_LSL_Functions.llGetTime(); | 549 | return m_LSL_Functions.llGetTimeOfDay(); |
550 | } | 550 | } |
551 | 551 | ||
552 | public void llResetTime() | 552 | public double llGetWallclock() |
553 | { | 553 | { |
554 | m_LSL_Functions.llResetTime(); | 554 | return m_LSL_Functions.llGetWallclock(); |
555 | } | 555 | } |
556 | 556 | ||
557 | public double llGetAndResetTime() | 557 | public double llGetTime() |
558 | { | 558 | { |
559 | return m_LSL_Functions.llGetAndResetTime(); | 559 | return m_LSL_Functions.llGetTime(); |
560 | } | 560 | } |
561 | 561 | ||
562 | public void llSound() | 562 | public void llResetTime() |
563 | { | 563 | { |
564 | m_LSL_Functions.llSound(); | 564 | m_LSL_Functions.llResetTime(); |
565 | } | 565 | } |
566 | 566 | ||
567 | public void llPlaySound(string sound, double volume) | 567 | public double llGetAndResetTime() |
568 | { | 568 | { |
569 | m_LSL_Functions.llPlaySound(sound, volume); | 569 | return m_LSL_Functions.llGetAndResetTime(); |
570 | } | 570 | } |
571 | 571 | ||
572 | public void llLoopSound(string sound, double volume) | 572 | public void llSound() |
573 | { | 573 | { |
574 | m_LSL_Functions.llLoopSound(sound, volume); | 574 | m_LSL_Functions.llSound(); |
575 | } | 575 | } |
576 | 576 | ||
577 | public void llLoopSoundMaster(string sound, double volume) | 577 | public void llPlaySound(string sound, double volume) |
578 | { | 578 | { |
579 | m_LSL_Functions.llLoopSoundMaster(sound, volume); | 579 | m_LSL_Functions.llPlaySound(sound, volume); |
580 | } | 580 | } |
581 | 581 | ||
582 | public void llLoopSoundSlave(string sound, double volume) | 582 | public void llLoopSound(string sound, double volume) |
583 | { | 583 | { |
584 | m_LSL_Functions.llLoopSoundSlave(sound, volume); | 584 | m_LSL_Functions.llLoopSound(sound, volume); |
585 | } | 585 | } |
586 | 586 | ||
587 | public void llPlaySoundSlave(string sound, double volume) | 587 | public void llLoopSoundMaster(string sound, double volume) |
588 | { | 588 | { |
589 | m_LSL_Functions.llPlaySoundSlave(sound, volume); | 589 | m_LSL_Functions.llLoopSoundMaster(sound, volume); |
590 | } | 590 | } |
591 | 591 | ||
592 | // | 592 | public void llLoopSoundSlave(string sound, double volume) |
593 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs | 593 | { |
594 | // | 594 | m_LSL_Functions.llLoopSoundSlave(sound, volume); |
595 | public void llTriggerSound(string sound, double volume) | 595 | } |
596 | { | 596 | |
597 | m_LSL_Functions.llTriggerSound(sound, volume); | 597 | public void llPlaySoundSlave(string sound, double volume) |
598 | } | 598 | { |
599 | 599 | m_LSL_Functions.llPlaySoundSlave(sound, volume); | |
600 | public void llStopSound() | 600 | } |
601 | { | 601 | |
602 | m_LSL_Functions.llStopSound(); | 602 | // |
603 | } | 603 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs |
604 | 604 | // | |
605 | public void llPreloadSound(string sound) | 605 | public void llTriggerSound(string sound, double volume) |
606 | { | 606 | { |
607 | m_LSL_Functions.llPreloadSound(sound); | 607 | m_LSL_Functions.llTriggerSound(sound, volume); |
608 | } | 608 | } |
609 | 609 | ||
610 | public string llGetSubString(string src, int start, int end) | 610 | public void llStopSound() |
611 | { | 611 | { |
612 | return m_LSL_Functions.llGetSubString(src, start, end); | 612 | m_LSL_Functions.llStopSound(); |
613 | } | 613 | } |
614 | 614 | ||
615 | public string llDeleteSubString(string src, int start, int end) | 615 | public void llPreloadSound(string sound) |
616 | { | 616 | { |
617 | return m_LSL_Functions.llDeleteSubString(src, start, end); | 617 | m_LSL_Functions.llPreloadSound(sound); |
618 | } | 618 | } |
619 | 619 | ||
620 | public string llInsertString(string dst, int position, string src) | 620 | public string llGetSubString(string src, int start, int end) |
621 | { | 621 | { |
622 | return m_LSL_Functions.llInsertString(dst, position, src); | 622 | return m_LSL_Functions.llGetSubString(src, start, end); |
623 | } | 623 | } |
624 | 624 | ||
625 | public string llToUpper(string source) | 625 | public string llDeleteSubString(string src, int start, int end) |
626 | { | 626 | { |
627 | return m_LSL_Functions.llToUpper(source); | 627 | return m_LSL_Functions.llDeleteSubString(src, start, end); |
628 | } | 628 | } |
629 | 629 | ||
630 | public string llToLower(string source) | 630 | public string llInsertString(string dst, int position, string src) |
631 | { | 631 | { |
632 | return m_LSL_Functions.llToLower(source); | 632 | return m_LSL_Functions.llInsertString(dst, position, src); |
633 | } | 633 | } |
634 | 634 | ||
635 | public int llGiveMoney(string destination, int amount) | 635 | public string llToUpper(string source) |
636 | { | 636 | { |
637 | return m_LSL_Functions.llGiveMoney(destination, amount); | 637 | return m_LSL_Functions.llToUpper(source); |
638 | } | 638 | } |
639 | 639 | ||
640 | public void llMakeExplosion() | 640 | public string llToLower(string source) |
641 | { | 641 | { |
642 | m_LSL_Functions.llMakeExplosion(); | 642 | return m_LSL_Functions.llToLower(source); |
643 | } | 643 | } |
644 | 644 | ||
645 | public void llMakeFountain() | 645 | public int llGiveMoney(string destination, int amount) |
646 | { | 646 | { |
647 | m_LSL_Functions.llMakeFountain(); | 647 | return m_LSL_Functions.llGiveMoney(destination, amount); |
648 | } | 648 | } |
649 | 649 | ||
650 | public void llMakeSmoke() | 650 | public void llMakeExplosion() |
651 | { | 651 | { |
652 | m_LSL_Functions.llMakeSmoke(); | 652 | m_LSL_Functions.llMakeExplosion(); |
653 | } | 653 | } |
654 | 654 | ||
655 | public void llMakeFire() | 655 | public void llMakeFountain() |
656 | { | 656 | { |
657 | m_LSL_Functions.llMakeFire(); | 657 | m_LSL_Functions.llMakeFountain(); |
658 | } | 658 | } |
659 | 659 | ||
660 | public void llRezObject(string inventory, vector pos, rotation rot, int param) | 660 | public void llMakeSmoke() |
661 | { | 661 | { |
662 | m_LSL_Functions.llRezObject(inventory, pos, rot, param); | 662 | m_LSL_Functions.llMakeSmoke(); |
663 | } | 663 | } |
664 | 664 | ||
665 | public void llLookAt(vector target, double strength, double damping) | 665 | public void llMakeFire() |
666 | { | 666 | { |
667 | m_LSL_Functions.llLookAt(target, strength, damping); | 667 | m_LSL_Functions.llMakeFire(); |
668 | } | 668 | } |
669 | 669 | ||
670 | public void llStopLookAt() | 670 | public void llRezObject(string inventory, vector pos, rotation rot, int param) |
671 | { | 671 | { |
672 | m_LSL_Functions.llStopLookAt(); | 672 | m_LSL_Functions.llRezObject(inventory, pos, rot, param); |
673 | } | 673 | } |
674 | 674 | ||
675 | public void llSetTimerEvent(double sec) | 675 | public void llLookAt(vector target, double strength, double damping) |
676 | { | 676 | { |
677 | m_LSL_Functions.llSetTimerEvent(sec); | 677 | m_LSL_Functions.llLookAt(target, strength, damping); |
678 | } | 678 | } |
679 | 679 | ||
680 | public void llSleep(double sec) | 680 | public void llStopLookAt() |
681 | { | 681 | { |
682 | m_LSL_Functions.llSleep(sec); | 682 | m_LSL_Functions.llStopLookAt(); |
683 | } | 683 | } |
684 | 684 | ||
685 | // | 685 | public void llSetTimerEvent(double sec) |
686 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs | 686 | { |
687 | // | 687 | m_LSL_Functions.llSetTimerEvent(sec); |
688 | public double llGetMass() | 688 | } |
689 | { | 689 | |
690 | return m_LSL_Functions.llGetMass(); | 690 | public void llSleep(double sec) |
691 | } | 691 | { |
692 | 692 | m_LSL_Functions.llSleep(sec); | |
693 | public void llCollisionFilter(string name, string id, int accept) | 693 | } |
694 | { | 694 | |
695 | m_LSL_Functions.llCollisionFilter(name, id, accept); | 695 | // |
696 | } | 696 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs |
697 | 697 | // | |
698 | public void llTakeControls(int controls, int accept, int pass_on) | 698 | public double llGetMass() |
699 | { | 699 | { |
700 | m_LSL_Functions.llTakeControls(controls, accept, pass_on); | 700 | return m_LSL_Functions.llGetMass(); |
701 | } | 701 | } |
702 | 702 | ||
703 | public void llReleaseControls() | 703 | public void llCollisionFilter(string name, string id, int accept) |
704 | { | 704 | { |
705 | m_LSL_Functions.llReleaseControls(); | 705 | m_LSL_Functions.llCollisionFilter(name, id, accept); |
706 | } | 706 | } |
707 | 707 | ||
708 | public void llAttachToAvatar(int attachment) | 708 | public void llTakeControls(int controls, int accept, int pass_on) |
709 | { | 709 | { |
710 | m_LSL_Functions.llAttachToAvatar(attachment); | 710 | m_LSL_Functions.llTakeControls(controls, accept, pass_on); |
711 | } | 711 | } |
712 | 712 | ||
713 | public void llDetachFromAvatar() | 713 | public void llReleaseControls() |
714 | { | 714 | { |
715 | m_LSL_Functions.llDetachFromAvatar(); | 715 | m_LSL_Functions.llReleaseControls(); |
716 | } | 716 | } |
717 | 717 | ||
718 | public void llTakeCamera() | 718 | public void llAttachToAvatar(int attachment) |
719 | { | 719 | { |
720 | m_LSL_Functions.llTakeCamera(); | 720 | m_LSL_Functions.llAttachToAvatar(attachment); |
721 | } | 721 | } |
722 | 722 | ||
723 | public void llReleaseCamera() | 723 | public void llDetachFromAvatar() |
724 | { | 724 | { |
725 | m_LSL_Functions.llReleaseCamera(); | 725 | m_LSL_Functions.llDetachFromAvatar(); |
726 | } | 726 | } |
727 | 727 | ||
728 | public string llGetOwner() | 728 | public void llTakeCamera() |
729 | { | 729 | { |
730 | return m_LSL_Functions.llGetOwner(); | 730 | m_LSL_Functions.llTakeCamera(); |
731 | } | 731 | } |
732 | 732 | ||
733 | public void llInstantMessage(string user, string message) | 733 | public void llReleaseCamera() |
734 | { | 734 | { |
735 | m_LSL_Functions.llInstantMessage(user, message); | 735 | m_LSL_Functions.llReleaseCamera(); |
736 | } | 736 | } |
737 | 737 | ||
738 | public void llEmail(string address, string subject, string message) | 738 | public string llGetOwner() |
739 | { | 739 | { |
740 | m_LSL_Functions.llEmail(address, subject, message); | 740 | return m_LSL_Functions.llGetOwner(); |
741 | } | 741 | } |
742 | 742 | ||
743 | public void llGetNextEmail(string address, string subject) | 743 | public void llInstantMessage(string user, string message) |
744 | { | 744 | { |
745 | m_LSL_Functions.llGetNextEmail(address, subject); | 745 | m_LSL_Functions.llInstantMessage(user, message); |
746 | } | 746 | } |
747 | 747 | ||
748 | public string llGetKey() | 748 | public void llEmail(string address, string subject, string message) |
749 | { | 749 | { |
750 | return m_LSL_Functions.llGetKey(); | 750 | m_LSL_Functions.llEmail(address, subject, message); |
751 | } | 751 | } |
752 | 752 | ||
753 | public void llSetBuoyancy(double buoyancy) | 753 | public void llGetNextEmail(string address, string subject) |
754 | { | 754 | { |
755 | m_LSL_Functions.llSetBuoyancy(buoyancy); | 755 | m_LSL_Functions.llGetNextEmail(address, subject); |
756 | } | 756 | } |
757 | 757 | ||
758 | public void llSetHoverHeight(double height, int water, double tau) | 758 | public string llGetKey() |
759 | { | 759 | { |
760 | m_LSL_Functions.llSetHoverHeight(height, water, tau); | 760 | return m_LSL_Functions.llGetKey(); |
761 | } | 761 | } |
762 | 762 | ||
763 | public void llStopHover() | 763 | public void llSetBuoyancy(double buoyancy) |
764 | { | 764 | { |
765 | m_LSL_Functions.llStopHover(); | 765 | m_LSL_Functions.llSetBuoyancy(buoyancy); |
766 | } | 766 | } |
767 | 767 | ||
768 | public void llMinEventDelay(double delay) | 768 | public void llSetHoverHeight(double height, int water, double tau) |
769 | { | 769 | { |
770 | m_LSL_Functions.llMinEventDelay(delay); | 770 | m_LSL_Functions.llSetHoverHeight(height, water, tau); |
771 | } | 771 | } |
772 | 772 | ||
773 | public void llSoundPreload() | 773 | public void llStopHover() |
774 | { | 774 | { |
775 | m_LSL_Functions.llSoundPreload(); | 775 | m_LSL_Functions.llStopHover(); |
776 | } | 776 | } |
777 | 777 | ||
778 | public void llRotLookAt(rotation target, double strength, double damping) | 778 | public void llMinEventDelay(double delay) |
779 | { | 779 | { |
780 | m_LSL_Functions.llRotLookAt(target, strength, damping); | 780 | m_LSL_Functions.llMinEventDelay(delay); |
781 | } | 781 | } |
782 | 782 | ||
783 | // | 783 | public void llSoundPreload() |
784 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs | 784 | { |
785 | // | 785 | m_LSL_Functions.llSoundPreload(); |
786 | public int llStringLength(string str) | 786 | } |
787 | { | 787 | |
788 | return m_LSL_Functions.llStringLength(str); | 788 | public void llRotLookAt(rotation target, double strength, double damping) |
789 | } | 789 | { |
790 | 790 | m_LSL_Functions.llRotLookAt(target, strength, damping); | |
791 | public void llStartAnimation(string anim) | 791 | } |
792 | { | 792 | |
793 | m_LSL_Functions.llStartAnimation(anim); | 793 | // |
794 | } | 794 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs |
795 | 795 | // | |
796 | public void llStopAnimation(string anim) | 796 | public int llStringLength(string str) |
797 | { | 797 | { |
798 | m_LSL_Functions.llStopAnimation(anim); | 798 | return m_LSL_Functions.llStringLength(str); |
799 | } | 799 | } |
800 | 800 | ||
801 | public void llPointAt() | 801 | public void llStartAnimation(string anim) |
802 | { | 802 | { |
803 | m_LSL_Functions.llPointAt(); | 803 | m_LSL_Functions.llStartAnimation(anim); |
804 | } | 804 | } |
805 | 805 | ||
806 | public void llStopPointAt() | 806 | public void llStopAnimation(string anim) |
807 | { | 807 | { |
808 | m_LSL_Functions.llStopPointAt(); | 808 | m_LSL_Functions.llStopAnimation(anim); |
809 | } | 809 | } |
810 | 810 | ||
811 | public void llTargetOmega(vector axis, double spinrate, double gain) | 811 | public void llPointAt() |
812 | { | 812 | { |
813 | m_LSL_Functions.llTargetOmega(axis, spinrate, gain); | 813 | m_LSL_Functions.llPointAt(); |
814 | } | 814 | } |
815 | 815 | ||
816 | public int llGetStartParameter() | 816 | public void llStopPointAt() |
817 | { | 817 | { |
818 | return m_LSL_Functions.llGetStartParameter(); | 818 | m_LSL_Functions.llStopPointAt(); |
819 | } | 819 | } |
820 | 820 | ||
821 | public void llGodLikeRezObject(string inventory, vector pos) | 821 | public void llTargetOmega(vector axis, double spinrate, double gain) |
822 | { | 822 | { |
823 | m_LSL_Functions.llGodLikeRezObject(inventory, pos); | 823 | m_LSL_Functions.llTargetOmega(axis, spinrate, gain); |
824 | } | 824 | } |
825 | 825 | ||
826 | public void llRequestPermissions(string agent, int perm) | 826 | public int llGetStartParameter() |
827 | { | 827 | { |
828 | m_LSL_Functions.llRequestPermissions(agent, perm); | 828 | return m_LSL_Functions.llGetStartParameter(); |
829 | } | 829 | } |
830 | 830 | ||
831 | public string llGetPermissionsKey() | 831 | public void llGodLikeRezObject(string inventory, vector pos) |
832 | { | 832 | { |
833 | return m_LSL_Functions.llGetPermissionsKey(); | 833 | m_LSL_Functions.llGodLikeRezObject(inventory, pos); |
834 | } | 834 | } |
835 | 835 | ||
836 | public int llGetPermissions() | 836 | public void llRequestPermissions(string agent, int perm) |
837 | { | 837 | { |
838 | return m_LSL_Functions.llGetPermissions(); | 838 | m_LSL_Functions.llRequestPermissions(agent, perm); |
839 | } | 839 | } |
840 | 840 | ||
841 | public int llGetLinkNumber() | 841 | public string llGetPermissionsKey() |
842 | { | 842 | { |
843 | return m_LSL_Functions.llGetLinkNumber(); | 843 | return m_LSL_Functions.llGetPermissionsKey(); |
844 | } | 844 | } |
845 | 845 | ||
846 | public void llSetLinkColor(int linknumber, vector color, int face) | 846 | public int llGetPermissions() |
847 | { | 847 | { |
848 | m_LSL_Functions.llSetLinkColor(linknumber, color, face); | 848 | return m_LSL_Functions.llGetPermissions(); |
849 | } | 849 | } |
850 | 850 | ||
851 | public void llCreateLink(string target, int parent) | 851 | public int llGetLinkNumber() |
852 | { | 852 | { |
853 | m_LSL_Functions.llCreateLink(target, parent); | 853 | return m_LSL_Functions.llGetLinkNumber(); |
854 | } | 854 | } |
855 | 855 | ||
856 | public void llBreakLink(int linknum) | 856 | public void llSetLinkColor(int linknumber, vector color, int face) |
857 | { | 857 | { |
858 | m_LSL_Functions.llBreakLink(linknum); | 858 | m_LSL_Functions.llSetLinkColor(linknumber, color, face); |
859 | } | 859 | } |
860 | 860 | ||
861 | public void llBreakAllLinks() | 861 | public void llCreateLink(string target, int parent) |
862 | { | 862 | { |
863 | m_LSL_Functions.llBreakAllLinks(); | 863 | m_LSL_Functions.llCreateLink(target, parent); |
864 | } | 864 | } |
865 | 865 | ||
866 | public string llGetLinkKey(int linknum) | 866 | public void llBreakLink(int linknum) |
867 | { | 867 | { |
868 | return m_LSL_Functions.llGetLinkKey(linknum); | 868 | m_LSL_Functions.llBreakLink(linknum); |
869 | } | 869 | } |
870 | 870 | ||
871 | public string llGetLinkName(int linknum) | 871 | public void llBreakAllLinks() |
872 | { | 872 | { |
873 | return m_LSL_Functions.llGetLinkName(linknum); | 873 | m_LSL_Functions.llBreakAllLinks(); |
874 | } | 874 | } |
875 | 875 | ||
876 | public int llGetInventoryNumber(int type) | 876 | public string llGetLinkKey(int linknum) |
877 | { | 877 | { |
878 | return m_LSL_Functions.llGetInventoryNumber(type); | 878 | return m_LSL_Functions.llGetLinkKey(linknum); |
879 | } | 879 | } |
880 | 880 | ||
881 | public string llGetInventoryName(int type, int number) | 881 | public string llGetLinkName(int linknum) |
882 | { | 882 | { |
883 | return m_LSL_Functions.llGetInventoryName(type, number); | 883 | return m_LSL_Functions.llGetLinkName(linknum); |
884 | } | 884 | } |
885 | 885 | ||
886 | // | 886 | public int llGetInventoryNumber(int type) |
887 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs | 887 | { |
888 | // | 888 | return m_LSL_Functions.llGetInventoryNumber(type); |
889 | public void llSetScriptState(string name, int run) | 889 | } |
890 | { | 890 | |
891 | m_LSL_Functions.llSetScriptState(name, run); | 891 | public string llGetInventoryName(int type, int number) |
892 | } | 892 | { |
893 | 893 | return m_LSL_Functions.llGetInventoryName(type, number); | |
894 | public double llGetEnergy() | 894 | } |
895 | { | 895 | |
896 | return m_LSL_Functions.llGetEnergy(); | 896 | // |
897 | } | 897 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs |
898 | 898 | // | |
899 | public void llGiveInventory(string destination, string inventory) | 899 | public void llSetScriptState(string name, int run) |
900 | { | 900 | { |
901 | m_LSL_Functions.llGiveInventory(destination, inventory); | 901 | m_LSL_Functions.llSetScriptState(name, run); |
902 | } | 902 | } |
903 | 903 | ||
904 | public void llRemoveInventory(string item) | 904 | public double llGetEnergy() |
905 | { | 905 | { |
906 | m_LSL_Functions.llRemoveInventory(item); | 906 | return m_LSL_Functions.llGetEnergy(); |
907 | } | 907 | } |
908 | 908 | ||
909 | public void llSetText(string text, vector color, double alpha) | 909 | public void llGiveInventory(string destination, string inventory) |
910 | { | 910 | { |
911 | m_LSL_Functions.llSetText(text, color, alpha); | 911 | m_LSL_Functions.llGiveInventory(destination, inventory); |
912 | } | 912 | } |
913 | 913 | ||
914 | public double llWater(vector offset) | 914 | public void llRemoveInventory(string item) |
915 | { | 915 | { |
916 | return m_LSL_Functions.llWater(offset); | 916 | m_LSL_Functions.llRemoveInventory(item); |
917 | } | 917 | } |
918 | 918 | ||
919 | public void llPassTouches(int pass) | 919 | public void llSetText(string text, vector color, double alpha) |
920 | { | 920 | { |
921 | m_LSL_Functions.llPassTouches(pass); | 921 | m_LSL_Functions.llSetText(text, color, alpha); |
922 | } | 922 | } |
923 | 923 | ||
924 | public string llRequestAgentData(string id, int data) | 924 | public double llWater(vector offset) |
925 | { | 925 | { |
926 | return m_LSL_Functions.llRequestAgentData(id, data); | 926 | return m_LSL_Functions.llWater(offset); |
927 | } | 927 | } |
928 | 928 | ||
929 | public string llRequestInventoryData(string name) | 929 | public void llPassTouches(int pass) |
930 | { | 930 | { |
931 | return m_LSL_Functions.llRequestInventoryData(name); | 931 | m_LSL_Functions.llPassTouches(pass); |
932 | } | 932 | } |
933 | 933 | ||
934 | public void llSetDamage(double damage) | 934 | public string llRequestAgentData(string id, int data) |
935 | { | 935 | { |
936 | m_LSL_Functions.llSetDamage(damage); | 936 | return m_LSL_Functions.llRequestAgentData(id, data); |
937 | } | 937 | } |
938 | 938 | ||
939 | public void llTeleportAgentHome(string agent) | 939 | public string llRequestInventoryData(string name) |
940 | { | 940 | { |
941 | m_LSL_Functions.llTeleportAgentHome(agent); | 941 | return m_LSL_Functions.llRequestInventoryData(name); |
942 | } | 942 | } |
943 | 943 | ||
944 | public void llModifyLand(int action, int brush) | 944 | public void llSetDamage(double damage) |
945 | { | 945 | { |
946 | m_LSL_Functions.llModifyLand(action, brush); | 946 | m_LSL_Functions.llSetDamage(damage); |
947 | } | 947 | } |
948 | 948 | ||
949 | public void llCollisionSound(string impact_sound, double impact_volume) | 949 | public void llTeleportAgentHome(string agent) |
950 | { | 950 | { |
951 | m_LSL_Functions.llCollisionSound(impact_sound, impact_volume); | 951 | m_LSL_Functions.llTeleportAgentHome(agent); |
952 | } | 952 | } |
953 | 953 | ||
954 | public void llCollisionSprite(string impact_sprite) | 954 | public void llModifyLand(int action, int brush) |
955 | { | 955 | { |
956 | m_LSL_Functions.llCollisionSprite(impact_sprite); | 956 | m_LSL_Functions.llModifyLand(action, brush); |
957 | } | 957 | } |
958 | 958 | ||
959 | public string llGetAnimation(string id) | 959 | public void llCollisionSound(string impact_sound, double impact_volume) |
960 | { | 960 | { |
961 | return m_LSL_Functions.llGetAnimation(id); | 961 | m_LSL_Functions.llCollisionSound(impact_sound, impact_volume); |
962 | } | 962 | } |
963 | 963 | ||
964 | public void llResetScript() | 964 | public void llCollisionSprite(string impact_sprite) |
965 | { | 965 | { |
966 | m_LSL_Functions.llResetScript(); | 966 | m_LSL_Functions.llCollisionSprite(impact_sprite); |
967 | } | 967 | } |
968 | 968 | ||
969 | public void llMessageLinked(int linknum, int num, string str, string id) | 969 | public string llGetAnimation(string id) |
970 | { | 970 | { |
971 | m_LSL_Functions.llMessageLinked(linknum, num, str, id); | 971 | return m_LSL_Functions.llGetAnimation(id); |
972 | } | 972 | } |
973 | 973 | ||
974 | public void llPushObject(string target, vector impulse, vector ang_impulse, int local) | 974 | public void llResetScript() |
975 | { | 975 | { |
976 | m_LSL_Functions.llPushObject(target, impulse, ang_impulse, local); | 976 | m_LSL_Functions.llResetScript(); |
977 | } | 977 | } |
978 | 978 | ||
979 | public void llPassCollisions(int pass) | 979 | public void llMessageLinked(int linknum, int num, string str, string id) |
980 | { | 980 | { |
981 | m_LSL_Functions.llPassCollisions(pass); | 981 | m_LSL_Functions.llMessageLinked(linknum, num, str, id); |
982 | } | 982 | } |
983 | 983 | ||
984 | public string llGetScriptName() | 984 | public void llPushObject(string target, vector impulse, vector ang_impulse, int local) |
985 | { | 985 | { |
986 | return m_LSL_Functions.llGetScriptName(); | 986 | m_LSL_Functions.llPushObject(target, impulse, ang_impulse, local); |
987 | } | 987 | } |
988 | 988 | ||
989 | public int llGetNumberOfSides() | 989 | public void llPassCollisions(int pass) |
990 | { | 990 | { |
991 | return m_LSL_Functions.llGetNumberOfSides(); | 991 | m_LSL_Functions.llPassCollisions(pass); |
992 | } | 992 | } |
993 | 993 | ||
994 | // | 994 | public string llGetScriptName() |
995 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs | 995 | { |
996 | // | 996 | return m_LSL_Functions.llGetScriptName(); |
997 | public rotation llAxisAngle2Rot(vector axis, double angle) | 997 | } |
998 | { | 998 | |
999 | return m_LSL_Functions.llAxisAngle2Rot(axis, angle); | 999 | public int llGetNumberOfSides() |
1000 | } | 1000 | { |
1001 | 1001 | return m_LSL_Functions.llGetNumberOfSides(); | |
1002 | public vector llRot2Axis(rotation rot) | 1002 | } |
1003 | { | 1003 | |
1004 | return m_LSL_Functions.llRot2Axis(rot); | 1004 | // |
1005 | } | 1005 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs |
1006 | 1006 | // | |
1007 | public void llRot2Angle() | 1007 | public rotation llAxisAngle2Rot(vector axis, double angle) |
1008 | { | 1008 | { |
1009 | m_LSL_Functions.llRot2Angle(); | 1009 | return m_LSL_Functions.llAxisAngle2Rot(axis, angle); |
1010 | } | 1010 | } |
1011 | 1011 | ||
1012 | public double llAcos(double val) | 1012 | public vector llRot2Axis(rotation rot) |
1013 | { | 1013 | { |
1014 | return m_LSL_Functions.llAcos(val); | 1014 | return m_LSL_Functions.llRot2Axis(rot); |
1015 | } | 1015 | } |
1016 | 1016 | ||
1017 | public double llAsin(double val) | 1017 | public void llRot2Angle() |
1018 | { | 1018 | { |
1019 | return m_LSL_Functions.llAsin(val); | 1019 | m_LSL_Functions.llRot2Angle(); |
1020 | } | 1020 | } |
1021 | 1021 | ||
1022 | public double llAngleBetween(rotation a, rotation b) | 1022 | public double llAcos(double val) |
1023 | { | 1023 | { |
1024 | return m_LSL_Functions.llAngleBetween(a, b); | 1024 | return m_LSL_Functions.llAcos(val); |
1025 | } | 1025 | } |
1026 | 1026 | ||
1027 | public string llGetInventoryKey(string name) | 1027 | public double llAsin(double val) |
1028 | { | 1028 | { |
1029 | return m_LSL_Functions.llGetInventoryKey(name); | 1029 | return m_LSL_Functions.llAsin(val); |
1030 | } | 1030 | } |
1031 | 1031 | ||
1032 | public void llAllowInventoryDrop(int add) | 1032 | public double llAngleBetween(rotation a, rotation b) |
1033 | { | 1033 | { |
1034 | m_LSL_Functions.llAllowInventoryDrop(add); | 1034 | return m_LSL_Functions.llAngleBetween(a, b); |
1035 | } | 1035 | } |
1036 | 1036 | ||
1037 | public vector llGetSunDirection() | 1037 | public string llGetInventoryKey(string name) |
1038 | { | 1038 | { |
1039 | return m_LSL_Functions.llGetSunDirection(); | 1039 | return m_LSL_Functions.llGetInventoryKey(name); |
1040 | } | 1040 | } |
1041 | 1041 | ||
1042 | public vector llGetTextureOffset(int face) | 1042 | public void llAllowInventoryDrop(int add) |
1043 | { | 1043 | { |
1044 | return m_LSL_Functions.llGetTextureOffset(face); | 1044 | m_LSL_Functions.llAllowInventoryDrop(add); |
1045 | } | 1045 | } |
1046 | 1046 | ||
1047 | public vector llGetTextureScale(int side) | 1047 | public vector llGetSunDirection() |
1048 | { | 1048 | { |
1049 | return m_LSL_Functions.llGetTextureScale(side); | 1049 | return m_LSL_Functions.llGetSunDirection(); |
1050 | } | 1050 | } |
1051 | 1051 | ||
1052 | public double llGetTextureRot(int side) | 1052 | public vector llGetTextureOffset(int face) |
1053 | { | 1053 | { |
1054 | return m_LSL_Functions.llGetTextureRot(side); | 1054 | return m_LSL_Functions.llGetTextureOffset(face); |
1055 | } | 1055 | } |
1056 | 1056 | ||
1057 | public int llSubStringIndex(string source, string pattern) | 1057 | public vector llGetTextureScale(int side) |
1058 | { | 1058 | { |
1059 | return m_LSL_Functions.llSubStringIndex(source, pattern); | 1059 | return m_LSL_Functions.llGetTextureScale(side); |
1060 | } | 1060 | } |
1061 | 1061 | ||
1062 | public string llGetOwnerKey(string id) | 1062 | public double llGetTextureRot(int side) |
1063 | { | 1063 | { |
1064 | return m_LSL_Functions.llGetOwnerKey(id); | 1064 | return m_LSL_Functions.llGetTextureRot(side); |
1065 | } | 1065 | } |
1066 | 1066 | ||
1067 | public vector llGetCenterOfMass() | 1067 | public int llSubStringIndex(string source, string pattern) |
1068 | { | 1068 | { |
1069 | return m_LSL_Functions.llGetCenterOfMass(); | 1069 | return m_LSL_Functions.llSubStringIndex(source, pattern); |
1070 | } | 1070 | } |
1071 | 1071 | ||
1072 | public LSL_Types.list llListSort(LSL_Types.list src, int stride, int ascending) | 1072 | public string llGetOwnerKey(string id) |
1073 | { | 1073 | { |
1074 | return m_LSL_Functions.llListSort(src, stride, ascending); | 1074 | return m_LSL_Functions.llGetOwnerKey(id); |
1075 | } | 1075 | } |
1076 | 1076 | ||
1077 | public int llGetListLength(LSL_Types.list src) | 1077 | public vector llGetCenterOfMass() |
1078 | { | 1078 | { |
1079 | return m_LSL_Functions.llGetListLength(src); | 1079 | return m_LSL_Functions.llGetCenterOfMass(); |
1080 | } | 1080 | } |
1081 | 1081 | ||
1082 | // | 1082 | public LSL_Types.list llListSort(LSL_Types.list src, int stride, int ascending) |
1083 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs | 1083 | { |
1084 | // | 1084 | return m_LSL_Functions.llListSort(src, stride, ascending); |
1085 | public int llList2Integer(LSL_Types.list src, int index) | 1085 | } |
1086 | { | 1086 | |
1087 | return m_LSL_Functions.llList2Integer(src, index); | 1087 | public int llGetListLength(LSL_Types.list src) |
1088 | } | 1088 | { |
1089 | 1089 | return m_LSL_Functions.llGetListLength(src); | |
1090 | public double osList2Double(LSL_Types.list src, int index) | 1090 | } |
1091 | { | 1091 | |
1092 | return m_LSL_Functions.osList2Double(src, index); | 1092 | // |
1093 | } | 1093 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs |
1094 | 1094 | // | |
1095 | public string llList2String(LSL_Types.list src, int index) | 1095 | public int llList2Integer(LSL_Types.list src, int index) |
1096 | { | 1096 | { |
1097 | return m_LSL_Functions.llList2String(src, index); | 1097 | return m_LSL_Functions.llList2Integer(src, index); |
1098 | } | 1098 | } |
1099 | 1099 | ||
1100 | public string llList2Key(LSL_Types.list src, int index) | 1100 | public double osList2Double(LSL_Types.list src, int index) |
1101 | { | 1101 | { |
1102 | return m_LSL_Functions.llList2Key(src, index); | 1102 | return m_LSL_Functions.osList2Double(src, index); |
1103 | } | 1103 | } |
1104 | 1104 | ||
1105 | public vector llList2Vector(LSL_Types.list src, int index) | 1105 | public string llList2String(LSL_Types.list src, int index) |
1106 | { | 1106 | { |
1107 | return m_LSL_Functions.llList2Vector(src, index); | 1107 | return m_LSL_Functions.llList2String(src, index); |
1108 | } | 1108 | } |
1109 | 1109 | ||
1110 | public rotation llList2Rot(LSL_Types.list src, int index) | 1110 | public string llList2Key(LSL_Types.list src, int index) |
1111 | { | 1111 | { |
1112 | return m_LSL_Functions.llList2Rot(src, index); | 1112 | return m_LSL_Functions.llList2Key(src, index); |
1113 | } | 1113 | } |
1114 | 1114 | ||
1115 | public LSL_Types.list llList2List(LSL_Types.list src, int start, int end) | 1115 | public vector llList2Vector(LSL_Types.list src, int index) |
1116 | { | 1116 | { |
1117 | return m_LSL_Functions.llList2List(src, start, end); | 1117 | return m_LSL_Functions.llList2Vector(src, index); |
1118 | } | 1118 | } |
1119 | 1119 | ||
1120 | public LSL_Types.list llDeleteSubList(LSL_Types.list src, int start, int end) | 1120 | public rotation llList2Rot(LSL_Types.list src, int index) |
1121 | { | 1121 | { |
1122 | return m_LSL_Functions.llDeleteSubList(src, start, end); | 1122 | return m_LSL_Functions.llList2Rot(src, index); |
1123 | } | 1123 | } |
1124 | 1124 | ||
1125 | public int llGetListEntryType(LSL_Types.list src, int index) | 1125 | public LSL_Types.list llList2List(LSL_Types.list src, int start, int end) |
1126 | { | 1126 | { |
1127 | return m_LSL_Functions.llGetListEntryType(src, index); | 1127 | return m_LSL_Functions.llList2List(src, start, end); |
1128 | } | 1128 | } |
1129 | 1129 | ||
1130 | public string llList2CSV(LSL_Types.list src) | 1130 | public LSL_Types.list llDeleteSubList(LSL_Types.list src, int start, int end) |
1131 | { | 1131 | { |
1132 | return m_LSL_Functions.llList2CSV(src); | 1132 | return m_LSL_Functions.llDeleteSubList(src, start, end); |
1133 | } | 1133 | } |
1134 | 1134 | ||
1135 | public LSL_Types.list llCSV2List(string src) | 1135 | public int llGetListEntryType(LSL_Types.list src, int index) |
1136 | { | 1136 | { |
1137 | return m_LSL_Functions.llCSV2List(src); | 1137 | return m_LSL_Functions.llGetListEntryType(src, index); |
1138 | } | 1138 | } |
1139 | 1139 | ||
1140 | public LSL_Types.list llListRandomize(LSL_Types.list src, int stride) | 1140 | public string llList2CSV(LSL_Types.list src) |
1141 | { | 1141 | { |
1142 | return m_LSL_Functions.llListRandomize(src, stride); | 1142 | return m_LSL_Functions.llList2CSV(src); |
1143 | } | 1143 | } |
1144 | 1144 | ||
1145 | public LSL_Types.list llList2ListStrided(LSL_Types.list src, int start, int end, int stride) | 1145 | public LSL_Types.list llCSV2List(string src) |
1146 | { | 1146 | { |
1147 | return m_LSL_Functions.llList2ListStrided(src, start, end, stride); | 1147 | return m_LSL_Functions.llCSV2List(src); |
1148 | } | 1148 | } |
1149 | 1149 | ||
1150 | public vector llGetRegionCorner() | 1150 | public LSL_Types.list llListRandomize(LSL_Types.list src, int stride) |
1151 | { | 1151 | { |
1152 | return m_LSL_Functions.llGetRegionCorner(); | 1152 | return m_LSL_Functions.llListRandomize(src, stride); |
1153 | } | 1153 | } |
1154 | 1154 | ||
1155 | public LSL_Types.list llListInsertList(LSL_Types.list dest, LSL_Types.list src, int start) | 1155 | public LSL_Types.list llList2ListStrided(LSL_Types.list src, int start, int end, int stride) |
1156 | { | 1156 | { |
1157 | return m_LSL_Functions.llListInsertList(dest, src, start); | 1157 | return m_LSL_Functions.llList2ListStrided(src, start, end, stride); |
1158 | } | 1158 | } |
1159 | 1159 | ||
1160 | public int llListFindList(LSL_Types.list src, LSL_Types.list test) | 1160 | public vector llGetRegionCorner() |
1161 | { | 1161 | { |
1162 | return m_LSL_Functions.llListFindList(src, test); | 1162 | return m_LSL_Functions.llGetRegionCorner(); |
1163 | } | 1163 | } |
1164 | 1164 | ||
1165 | public string llGetObjectName() | 1165 | public LSL_Types.list llListInsertList(LSL_Types.list dest, LSL_Types.list src, int start) |
1166 | { | 1166 | { |
1167 | return m_LSL_Functions.llGetObjectName(); | 1167 | return m_LSL_Functions.llListInsertList(dest, src, start); |
1168 | } | 1168 | } |
1169 | 1169 | ||
1170 | public void llSetObjectName(string name) | 1170 | public int llListFindList(LSL_Types.list src, LSL_Types.list test) |
1171 | { | 1171 | { |
1172 | m_LSL_Functions.llSetObjectName(name); | 1172 | return m_LSL_Functions.llListFindList(src, test); |
1173 | } | 1173 | } |
1174 | 1174 | ||
1175 | public string llGetDate() | 1175 | public string llGetObjectName() |
1176 | { | 1176 | { |
1177 | return m_LSL_Functions.llGetDate(); | 1177 | return m_LSL_Functions.llGetObjectName(); |
1178 | } | 1178 | } |
1179 | 1179 | ||
1180 | public int llEdgeOfWorld(vector pos, vector dir) | 1180 | public void llSetObjectName(string name) |
1181 | { | 1181 | { |
1182 | return m_LSL_Functions.llEdgeOfWorld(pos, dir); | 1182 | m_LSL_Functions.llSetObjectName(name); |
1183 | } | 1183 | } |
1184 | 1184 | ||
1185 | public int llGetAgentInfo(string id) | 1185 | public string llGetDate() |
1186 | { | 1186 | { |
1187 | return m_LSL_Functions.llGetAgentInfo(id); | 1187 | return m_LSL_Functions.llGetDate(); |
1188 | } | 1188 | } |
1189 | 1189 | ||
1190 | // | 1190 | public int llEdgeOfWorld(vector pos, vector dir) |
1191 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs | 1191 | { |
1192 | // | 1192 | return m_LSL_Functions.llEdgeOfWorld(pos, dir); |
1193 | public void llAdjustSoundVolume(double volume) | 1193 | } |
1194 | { | 1194 | |
1195 | m_LSL_Functions.llAdjustSoundVolume(volume); | 1195 | public int llGetAgentInfo(string id) |
1196 | } | 1196 | { |
1197 | 1197 | return m_LSL_Functions.llGetAgentInfo(id); | |
1198 | public void llSetSoundQueueing(int queue) | 1198 | } |
1199 | { | 1199 | |
1200 | m_LSL_Functions.llSetSoundQueueing(queue); | 1200 | // |
1201 | } | 1201 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs |
1202 | 1202 | // | |
1203 | public void llSetSoundRadius(double radius) | 1203 | public void llAdjustSoundVolume(double volume) |
1204 | { | 1204 | { |
1205 | m_LSL_Functions.llSetSoundRadius(radius); | 1205 | m_LSL_Functions.llAdjustSoundVolume(volume); |
1206 | } | 1206 | } |
1207 | 1207 | ||
1208 | public string llKey2Name(string id) | 1208 | public void llSetSoundQueueing(int queue) |
1209 | { | 1209 | { |
1210 | return m_LSL_Functions.llKey2Name(id); | 1210 | m_LSL_Functions.llSetSoundQueueing(queue); |
1211 | } | 1211 | } |
1212 | 1212 | ||
1213 | public void llSetTextureAnim(int mode, int face, int sizex, int sizey, double start, double length, double rate) | 1213 | public void llSetSoundRadius(double radius) |
1214 | { | 1214 | { |
1215 | m_LSL_Functions.llSetTextureAnim(mode, face, sizex, sizey, start, length, rate); | 1215 | m_LSL_Functions.llSetSoundRadius(radius); |
1216 | } | 1216 | } |
1217 | 1217 | ||
1218 | public void llTriggerSoundLimited(string sound, double volume, vector top_north_east, vector bottom_south_west) | 1218 | public string llKey2Name(string id) |
1219 | { | 1219 | { |
1220 | m_LSL_Functions.llTriggerSoundLimited(sound, volume, top_north_east, bottom_south_west); | 1220 | return m_LSL_Functions.llKey2Name(id); |
1221 | } | 1221 | } |
1222 | 1222 | ||
1223 | public void llEjectFromLand(string pest) | 1223 | public void llSetTextureAnim(int mode, int face, int sizex, int sizey, double start, double length, double rate) |
1224 | { | 1224 | { |
1225 | m_LSL_Functions.llEjectFromLand(pest); | 1225 | m_LSL_Functions.llSetTextureAnim(mode, face, sizex, sizey, start, length, rate); |
1226 | } | 1226 | } |
1227 | 1227 | ||
1228 | public void llParseString2List() | 1228 | public void llTriggerSoundLimited(string sound, double volume, vector top_north_east, vector bottom_south_west) |
1229 | { | 1229 | { |
1230 | m_LSL_Functions.llParseString2List(); | 1230 | m_LSL_Functions.llTriggerSoundLimited(sound, volume, top_north_east, bottom_south_west); |
1231 | } | 1231 | } |
1232 | 1232 | ||
1233 | public int llOverMyLand(string id) | 1233 | public void llEjectFromLand(string pest) |
1234 | { | 1234 | { |
1235 | return m_LSL_Functions.llOverMyLand(id); | 1235 | m_LSL_Functions.llEjectFromLand(pest); |
1236 | } | 1236 | } |
1237 | 1237 | ||
1238 | public string llGetLandOwnerAt(vector pos) | 1238 | public void llParseString2List() |
1239 | { | 1239 | { |
1240 | return m_LSL_Functions.llGetLandOwnerAt(pos); | 1240 | m_LSL_Functions.llParseString2List(); |
1241 | } | 1241 | } |
1242 | 1242 | ||
1243 | public string llGetNotecardLine(string name, int line) | 1243 | public int llOverMyLand(string id) |
1244 | { | 1244 | { |
1245 | return m_LSL_Functions.llGetNotecardLine(name, line); | 1245 | return m_LSL_Functions.llOverMyLand(id); |
1246 | } | 1246 | } |
1247 | 1247 | ||
1248 | public vector llGetAgentSize(string id) | 1248 | public string llGetLandOwnerAt(vector pos) |
1249 | { | 1249 | { |
1250 | return m_LSL_Functions.llGetAgentSize(id); | 1250 | return m_LSL_Functions.llGetLandOwnerAt(pos); |
1251 | } | 1251 | } |
1252 | 1252 | ||
1253 | public int llSameGroup(string agent) | 1253 | public string llGetNotecardLine(string name, int line) |
1254 | { | 1254 | { |
1255 | return m_LSL_Functions.llSameGroup(agent); | 1255 | return m_LSL_Functions.llGetNotecardLine(name, line); |
1256 | } | 1256 | } |
1257 | 1257 | ||
1258 | public void llUnSit(string id) | 1258 | public vector llGetAgentSize(string id) |
1259 | { | 1259 | { |
1260 | m_LSL_Functions.llUnSit(id); | 1260 | return m_LSL_Functions.llGetAgentSize(id); |
1261 | } | 1261 | } |
1262 | 1262 | ||
1263 | public vector llGroundSlope(vector offset) | 1263 | public int llSameGroup(string agent) |
1264 | { | 1264 | { |
1265 | return m_LSL_Functions.llGroundSlope(offset); | 1265 | return m_LSL_Functions.llSameGroup(agent); |
1266 | } | 1266 | } |
1267 | 1267 | ||
1268 | public vector llGroundNormal(vector offset) | 1268 | public void llUnSit(string id) |
1269 | { | 1269 | { |
1270 | return m_LSL_Functions.llGroundNormal(offset); | 1270 | m_LSL_Functions.llUnSit(id); |
1271 | } | 1271 | } |
1272 | 1272 | ||
1273 | public vector llGroundContour(vector offset) | 1273 | public vector llGroundSlope(vector offset) |
1274 | { | 1274 | { |
1275 | return m_LSL_Functions.llGroundContour(offset); | 1275 | return m_LSL_Functions.llGroundSlope(offset); |
1276 | } | 1276 | } |
1277 | 1277 | ||
1278 | public int llGetAttached() | 1278 | public vector llGroundNormal(vector offset) |
1279 | { | 1279 | { |
1280 | return m_LSL_Functions.llGetAttached(); | 1280 | return m_LSL_Functions.llGroundNormal(offset); |
1281 | } | 1281 | } |
1282 | 1282 | ||
1283 | public int llGetFreeMemory() | 1283 | public vector llGroundContour(vector offset) |
1284 | { | 1284 | { |
1285 | return m_LSL_Functions.llGetFreeMemory(); | 1285 | return m_LSL_Functions.llGroundContour(offset); |
1286 | } | 1286 | } |
1287 | 1287 | ||
1288 | public string llGetRegionName() | 1288 | public int llGetAttached() |
1289 | { | 1289 | { |
1290 | return m_LSL_Functions.llGetRegionName(); | 1290 | return m_LSL_Functions.llGetAttached(); |
1291 | } | 1291 | } |
1292 | 1292 | ||
1293 | public double llGetRegionTimeDilation() | 1293 | public int llGetFreeMemory() |
1294 | { | 1294 | { |
1295 | return m_LSL_Functions.llGetRegionTimeDilation(); | 1295 | return m_LSL_Functions.llGetFreeMemory(); |
1296 | } | 1296 | } |
1297 | 1297 | ||
1298 | public double llGetRegionFPS() | 1298 | public string llGetRegionName() |
1299 | { | 1299 | { |
1300 | return m_LSL_Functions.llGetRegionFPS(); | 1300 | return m_LSL_Functions.llGetRegionName(); |
1301 | } | 1301 | } |
1302 | 1302 | ||
1303 | // | 1303 | public double llGetRegionTimeDilation() |
1304 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs | 1304 | { |
1305 | // | 1305 | return m_LSL_Functions.llGetRegionTimeDilation(); |
1306 | public void llParticleSystem(List<Object> rules) | 1306 | } |
1307 | { | 1307 | |
1308 | m_LSL_Functions.llParticleSystem(rules); | 1308 | public double llGetRegionFPS() |
1309 | } | 1309 | { |
1310 | 1310 | return m_LSL_Functions.llGetRegionFPS(); | |
1311 | public void llGroundRepel(double height, int water, double tau) | 1311 | } |
1312 | { | 1312 | |
1313 | m_LSL_Functions.llGroundRepel(height, water, tau); | 1313 | // |
1314 | } | 1314 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs |
1315 | 1315 | // | |
1316 | public void llGiveInventoryList() | 1316 | public void llParticleSystem(List<Object> rules) |
1317 | { | 1317 | { |
1318 | m_LSL_Functions.llGiveInventoryList(); | 1318 | m_LSL_Functions.llParticleSystem(rules); |
1319 | } | 1319 | } |
1320 | 1320 | ||
1321 | public void llSetVehicleType(int type) | 1321 | public void llGroundRepel(double height, int water, double tau) |
1322 | { | 1322 | { |
1323 | m_LSL_Functions.llSetVehicleType(type); | 1323 | m_LSL_Functions.llGroundRepel(height, water, tau); |
1324 | } | 1324 | } |
1325 | 1325 | ||
1326 | public void llSetVehicledoubleParam(int param, double value) | 1326 | public void llGiveInventoryList() |
1327 | { | 1327 | { |
1328 | m_LSL_Functions.llSetVehicledoubleParam(param, value); | 1328 | m_LSL_Functions.llGiveInventoryList(); |
1329 | } | 1329 | } |
1330 | 1330 | ||
1331 | public void llSetVehicleVectorParam(int param, vector vec) | 1331 | public void llSetVehicleType(int type) |
1332 | { | 1332 | { |
1333 | m_LSL_Functions.llSetVehicleVectorParam(param, vec); | 1333 | m_LSL_Functions.llSetVehicleType(type); |
1334 | } | 1334 | } |
1335 | 1335 | ||
1336 | public void llSetVehicleRotationParam(int param, rotation rot) | 1336 | public void llSetVehicledoubleParam(int param, double value) |
1337 | { | 1337 | { |
1338 | m_LSL_Functions.llSetVehicleRotationParam(param, rot); | 1338 | m_LSL_Functions.llSetVehicledoubleParam(param, value); |
1339 | } | 1339 | } |
1340 | 1340 | ||
1341 | public void llSetVehicleFlags(int flags) | 1341 | public void llSetVehicleVectorParam(int param, vector vec) |
1342 | { | 1342 | { |
1343 | m_LSL_Functions.llSetVehicleFlags(flags); | 1343 | m_LSL_Functions.llSetVehicleVectorParam(param, vec); |
1344 | } | 1344 | } |
1345 | 1345 | ||
1346 | public void llRemoveVehicleFlags(int flags) | 1346 | public void llSetVehicleRotationParam(int param, rotation rot) |
1347 | { | 1347 | { |
1348 | m_LSL_Functions.llRemoveVehicleFlags(flags); | 1348 | m_LSL_Functions.llSetVehicleRotationParam(param, rot); |
1349 | } | 1349 | } |
1350 | 1350 | ||
1351 | public void llSitTarget(vector offset, rotation rot) | 1351 | public void llSetVehicleFlags(int flags) |
1352 | { | 1352 | { |
1353 | m_LSL_Functions.llSitTarget(offset, rot); | 1353 | m_LSL_Functions.llSetVehicleFlags(flags); |
1354 | } | 1354 | } |
1355 | 1355 | ||
1356 | public string llAvatarOnSitTarget() | 1356 | public void llRemoveVehicleFlags(int flags) |
1357 | { | 1357 | { |
1358 | return m_LSL_Functions.llAvatarOnSitTarget(); | 1358 | m_LSL_Functions.llRemoveVehicleFlags(flags); |
1359 | } | 1359 | } |
1360 | 1360 | ||
1361 | public void llAddToLandPassList(string avatar, double hours) | 1361 | public void llSitTarget(vector offset, rotation rot) |
1362 | { | 1362 | { |
1363 | m_LSL_Functions.llAddToLandPassList(avatar, hours); | 1363 | m_LSL_Functions.llSitTarget(offset, rot); |
1364 | } | 1364 | } |
1365 | 1365 | ||
1366 | public void llSetTouchText(string text) | 1366 | public string llAvatarOnSitTarget() |
1367 | { | 1367 | { |
1368 | m_LSL_Functions.llSetTouchText(text); | 1368 | return m_LSL_Functions.llAvatarOnSitTarget(); |
1369 | } | 1369 | } |
1370 | 1370 | ||
1371 | public void llSetSitText(string text) | 1371 | public void llAddToLandPassList(string avatar, double hours) |
1372 | { | 1372 | { |
1373 | m_LSL_Functions.llSetSitText(text); | 1373 | m_LSL_Functions.llAddToLandPassList(avatar, hours); |
1374 | } | 1374 | } |
1375 | 1375 | ||
1376 | public void llSetCameraEyeOffset(vector offset) | 1376 | public void llSetTouchText(string text) |
1377 | { | 1377 | { |
1378 | m_LSL_Functions.llSetCameraEyeOffset(offset); | 1378 | m_LSL_Functions.llSetTouchText(text); |
1379 | } | 1379 | } |
1380 | 1380 | ||
1381 | public void llSetCameraAtOffset(vector offset) | 1381 | public void llSetSitText(string text) |
1382 | { | 1382 | { |
1383 | m_LSL_Functions.llSetCameraAtOffset(offset); | 1383 | m_LSL_Functions.llSetSitText(text); |
1384 | } | 1384 | } |
1385 | 1385 | ||
1386 | public string llDumpList2String(LSL_Types.list src, string seperator) | 1386 | public void llSetCameraEyeOffset(vector offset) |
1387 | { | 1387 | { |
1388 | return m_LSL_Functions.llDumpList2String(src, seperator); | 1388 | m_LSL_Functions.llSetCameraEyeOffset(offset); |
1389 | } | 1389 | } |
1390 | 1390 | ||
1391 | public void llScriptDanger(vector pos) | 1391 | public void llSetCameraAtOffset(vector offset) |
1392 | { | 1392 | { |
1393 | m_LSL_Functions.llScriptDanger(pos); | 1393 | m_LSL_Functions.llSetCameraAtOffset(offset); |
1394 | } | 1394 | } |
1395 | 1395 | ||
1396 | public void llDialog(string avatar, string message, LSL_Types.list buttons, int chat_channel) | 1396 | public string llDumpList2String(LSL_Types.list src, string seperator) |
1397 | { | 1397 | { |
1398 | m_LSL_Functions.llDialog(avatar, message, buttons, chat_channel); | 1398 | return m_LSL_Functions.llDumpList2String(src, seperator); |
1399 | } | 1399 | } |
1400 | 1400 | ||
1401 | public void llVolumeDetect(int detect) | 1401 | public void llScriptDanger(vector pos) |
1402 | { | 1402 | { |
1403 | m_LSL_Functions.llVolumeDetect(detect); | 1403 | m_LSL_Functions.llScriptDanger(pos); |
1404 | } | 1404 | } |
1405 | 1405 | ||
1406 | public void llResetOtherScript(string name) | 1406 | public void llDialog(string avatar, string message, LSL_Types.list buttons, int chat_channel) |
1407 | { | 1407 | { |
1408 | m_LSL_Functions.llResetOtherScript(name); | 1408 | m_LSL_Functions.llDialog(avatar, message, buttons, chat_channel); |
1409 | } | 1409 | } |
1410 | 1410 | ||
1411 | public int llGetScriptState(string name) | 1411 | public void llVolumeDetect(int detect) |
1412 | { | 1412 | { |
1413 | return m_LSL_Functions.llGetScriptState(name); | 1413 | m_LSL_Functions.llVolumeDetect(detect); |
1414 | } | 1414 | } |
1415 | 1415 | ||
1416 | public void llRemoteLoadScript() | 1416 | public void llResetOtherScript(string name) |
1417 | { | 1417 | { |
1418 | m_LSL_Functions.llRemoteLoadScript(); | 1418 | m_LSL_Functions.llResetOtherScript(name); |
1419 | } | 1419 | } |
1420 | 1420 | ||
1421 | public void llSetRemoteScriptAccessPin(int pin) | 1421 | public int llGetScriptState(string name) |
1422 | { | 1422 | { |
1423 | m_LSL_Functions.llSetRemoteScriptAccessPin(pin); | 1423 | return m_LSL_Functions.llGetScriptState(name); |
1424 | } | 1424 | } |
1425 | 1425 | ||
1426 | public void llRemoteLoadScriptPin(string target, string name, int pin, int running, int start_param) | 1426 | public void llRemoteLoadScript() |
1427 | { | 1427 | { |
1428 | m_LSL_Functions.llRemoteLoadScriptPin(target, name, pin, running, start_param); | 1428 | m_LSL_Functions.llRemoteLoadScript(); |
1429 | } | 1429 | } |
1430 | 1430 | ||
1431 | // | 1431 | public void llSetRemoteScriptAccessPin(int pin) |
1432 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs | 1432 | { |
1433 | // | 1433 | m_LSL_Functions.llSetRemoteScriptAccessPin(pin); |
1434 | public void llOpenRemoteDataChannel() | 1434 | } |
1435 | { | 1435 | |
1436 | m_LSL_Functions.llOpenRemoteDataChannel(); | 1436 | public void llRemoteLoadScriptPin(string target, string name, int pin, int running, int start_param) |
1437 | } | 1437 | { |
1438 | 1438 | m_LSL_Functions.llRemoteLoadScriptPin(target, name, pin, running, start_param); | |
1439 | public string llSendRemoteData(string channel, string dest, int idata, string sdata) | 1439 | } |
1440 | { | 1440 | |
1441 | return m_LSL_Functions.llSendRemoteData(channel, dest, idata, sdata); | 1441 | // |
1442 | } | 1442 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs |
1443 | 1443 | // | |
1444 | public void llRemoteDataReply(string channel, string message_id, string sdata, int idata) | 1444 | public void llOpenRemoteDataChannel() |
1445 | { | 1445 | { |
1446 | m_LSL_Functions.llRemoteDataReply(channel, message_id, sdata, idata); | 1446 | m_LSL_Functions.llOpenRemoteDataChannel(); |
1447 | } | 1447 | } |
1448 | 1448 | ||
1449 | public void llCloseRemoteDataChannel(string channel) | 1449 | public string llSendRemoteData(string channel, string dest, int idata, string sdata) |
1450 | { | 1450 | { |
1451 | m_LSL_Functions.llCloseRemoteDataChannel(channel); | 1451 | return m_LSL_Functions.llSendRemoteData(channel, dest, idata, sdata); |
1452 | } | 1452 | } |
1453 | 1453 | ||
1454 | public string llMD5String(string src, int nonce) | 1454 | public void llRemoteDataReply(string channel, string message_id, string sdata, int idata) |
1455 | { | 1455 | { |
1456 | return m_LSL_Functions.llMD5String(src, nonce); | 1456 | m_LSL_Functions.llRemoteDataReply(channel, message_id, sdata, idata); |
1457 | } | 1457 | } |
1458 | 1458 | ||
1459 | public void llSetPrimitiveParams(LSL_Types.list rules) | 1459 | public void llCloseRemoteDataChannel(string channel) |
1460 | { | 1460 | { |
1461 | m_LSL_Functions.llSetPrimitiveParams(rules); | 1461 | m_LSL_Functions.llCloseRemoteDataChannel(channel); |
1462 | } | 1462 | } |
1463 | 1463 | ||
1464 | public string llStringToBase64(string str) | 1464 | public string llMD5String(string src, int nonce) |
1465 | { | 1465 | { |
1466 | return m_LSL_Functions.llStringToBase64(str); | 1466 | return m_LSL_Functions.llMD5String(src, nonce); |
1467 | } | 1467 | } |
1468 | 1468 | ||
1469 | public string llBase64ToString(string str) | 1469 | public void llSetPrimitiveParams(LSL_Types.list rules) |
1470 | { | 1470 | { |
1471 | return m_LSL_Functions.llBase64ToString(str); | 1471 | m_LSL_Functions.llSetPrimitiveParams(rules); |
1472 | } | 1472 | } |
1473 | 1473 | ||
1474 | public void llXorBase64Strings() | 1474 | public string llStringToBase64(string str) |
1475 | { | 1475 | { |
1476 | m_LSL_Functions.llXorBase64Strings(); | 1476 | return m_LSL_Functions.llStringToBase64(str); |
1477 | } | 1477 | } |
1478 | 1478 | ||
1479 | public void llRemoteDataSetRegion() | 1479 | public string llBase64ToString(string str) |
1480 | { | 1480 | { |
1481 | m_LSL_Functions.llRemoteDataSetRegion(); | 1481 | return m_LSL_Functions.llBase64ToString(str); |
1482 | } | 1482 | } |
1483 | 1483 | ||
1484 | public double llLog10(double val) | 1484 | public void llXorBase64Strings() |
1485 | { | 1485 | { |
1486 | return m_LSL_Functions.llLog10(val); | 1486 | m_LSL_Functions.llXorBase64Strings(); |
1487 | } | 1487 | } |
1488 | 1488 | ||
1489 | public double llLog(double val) | 1489 | public void llRemoteDataSetRegion() |
1490 | { | 1490 | { |
1491 | return m_LSL_Functions.llLog(val); | 1491 | m_LSL_Functions.llRemoteDataSetRegion(); |
1492 | } | 1492 | } |
1493 | 1493 | ||
1494 | public LSL_Types.list llGetAnimationList(string id) | 1494 | public double llLog10(double val) |
1495 | { | 1495 | { |
1496 | return m_LSL_Functions.llGetAnimationList(id); | 1496 | return m_LSL_Functions.llLog10(val); |
1497 | } | 1497 | } |
1498 | 1498 | ||
1499 | public void llSetParcelMusicURL(string url) | 1499 | public double llLog(double val) |
1500 | { | 1500 | { |
1501 | m_LSL_Functions.llSetParcelMusicURL(url); | 1501 | return m_LSL_Functions.llLog(val); |
1502 | } | 1502 | } |
1503 | 1503 | ||
1504 | public vector llGetRootPosition() | 1504 | public LSL_Types.list llGetAnimationList(string id) |
1505 | { | 1505 | { |
1506 | return m_LSL_Functions.llGetRootPosition(); | 1506 | return m_LSL_Functions.llGetAnimationList(id); |
1507 | } | 1507 | } |
1508 | 1508 | ||
1509 | public rotation llGetRootRotation() | 1509 | public void llSetParcelMusicURL(string url) |
1510 | { | 1510 | { |
1511 | return m_LSL_Functions.llGetRootRotation(); | 1511 | m_LSL_Functions.llSetParcelMusicURL(url); |
1512 | } | 1512 | } |
1513 | 1513 | ||
1514 | public string llGetObjectDesc() | 1514 | public vector llGetRootPosition() |
1515 | { | 1515 | { |
1516 | return m_LSL_Functions.llGetObjectDesc(); | 1516 | return m_LSL_Functions.llGetRootPosition(); |
1517 | } | 1517 | } |
1518 | 1518 | ||
1519 | public void llSetObjectDesc(string desc) | 1519 | public rotation llGetRootRotation() |
1520 | { | 1520 | { |
1521 | m_LSL_Functions.llSetObjectDesc(desc); | 1521 | return m_LSL_Functions.llGetRootRotation(); |
1522 | } | 1522 | } |
1523 | 1523 | ||
1524 | public string llGetCreator() | 1524 | public string llGetObjectDesc() |
1525 | { | 1525 | { |
1526 | return m_LSL_Functions.llGetCreator(); | 1526 | return m_LSL_Functions.llGetObjectDesc(); |
1527 | } | 1527 | } |
1528 | 1528 | ||
1529 | public string llGetTimestamp() | 1529 | public void llSetObjectDesc(string desc) |
1530 | { | 1530 | { |
1531 | return m_LSL_Functions.llGetTimestamp(); | 1531 | m_LSL_Functions.llSetObjectDesc(desc); |
1532 | } | 1532 | } |
1533 | 1533 | ||
1534 | public void llSetLinkAlpha(int linknumber, double alpha, int face) | 1534 | public string llGetCreator() |
1535 | { | 1535 | { |
1536 | m_LSL_Functions.llSetLinkAlpha(linknumber, alpha, face); | 1536 | return m_LSL_Functions.llGetCreator(); |
1537 | } | 1537 | } |
1538 | 1538 | ||
1539 | public int llGetNumberOfPrims() | 1539 | public string llGetTimestamp() |
1540 | { | 1540 | { |
1541 | return m_LSL_Functions.llGetNumberOfPrims(); | 1541 | return m_LSL_Functions.llGetTimestamp(); |
1542 | } | 1542 | } |
1543 | 1543 | ||
1544 | public string llGetNumberOfNotecardLines(string name) | 1544 | public void llSetLinkAlpha(int linknumber, double alpha, int face) |
1545 | { | 1545 | { |
1546 | return m_LSL_Functions.llGetNumberOfNotecardLines(name); | 1546 | m_LSL_Functions.llSetLinkAlpha(linknumber, alpha, face); |
1547 | } | 1547 | } |
1548 | 1548 | ||
1549 | public LSL_Types.list llGetBoundingBox(string obj) | 1549 | public int llGetNumberOfPrims() |
1550 | { | 1550 | { |
1551 | return m_LSL_Functions.llGetBoundingBox(obj); | 1551 | return m_LSL_Functions.llGetNumberOfPrims(); |
1552 | } | 1552 | } |
1553 | 1553 | ||
1554 | public vector llGetGeometricCenter() | 1554 | public string llGetNumberOfNotecardLines(string name) |
1555 | { | 1555 | { |
1556 | return m_LSL_Functions.llGetGeometricCenter(); | 1556 | return m_LSL_Functions.llGetNumberOfNotecardLines(name); |
1557 | } | 1557 | } |
1558 | 1558 | ||
1559 | public void llGetPrimitiveParams() | 1559 | public LSL_Types.list llGetBoundingBox(string obj) |
1560 | { | 1560 | { |
1561 | m_LSL_Functions.llGetPrimitiveParams(); | 1561 | return m_LSL_Functions.llGetBoundingBox(obj); |
1562 | } | 1562 | } |
1563 | 1563 | ||
1564 | // | 1564 | public vector llGetGeometricCenter() |
1565 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs | 1565 | { |
1566 | // | 1566 | return m_LSL_Functions.llGetGeometricCenter(); |
1567 | public string llIntegerToBase64(int number) | 1567 | } |
1568 | { | 1568 | |
1569 | return m_LSL_Functions.llIntegerToBase64(number); | 1569 | public void llGetPrimitiveParams() |
1570 | } | 1570 | { |
1571 | 1571 | m_LSL_Functions.llGetPrimitiveParams(); | |
1572 | public int llBase64ToInteger(string str) | 1572 | } |
1573 | { | 1573 | |
1574 | return m_LSL_Functions.llBase64ToInteger(str); | 1574 | // |
1575 | } | 1575 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs |
1576 | 1576 | // | |
1577 | public double llGetGMTclock() | 1577 | public string llIntegerToBase64(int number) |
1578 | { | 1578 | { |
1579 | return m_LSL_Functions.llGetGMTclock(); | 1579 | return m_LSL_Functions.llIntegerToBase64(number); |
1580 | } | 1580 | } |
1581 | 1581 | ||
1582 | public string llGetSimulatorHostname() | 1582 | public int llBase64ToInteger(string str) |
1583 | { | 1583 | { |
1584 | return m_LSL_Functions.llGetSimulatorHostname(); | 1584 | return m_LSL_Functions.llBase64ToInteger(str); |
1585 | } | 1585 | } |
1586 | 1586 | ||
1587 | public void llSetLocalRot(rotation rot) | 1587 | public double llGetGMTclock() |
1588 | { | 1588 | { |
1589 | m_LSL_Functions.llSetLocalRot(rot); | 1589 | return m_LSL_Functions.llGetGMTclock(); |
1590 | } | 1590 | } |
1591 | 1591 | ||
1592 | public LSL_Types.list llParseStringKeepNulls(string src, LSL_Types.list seperators, LSL_Types.list spacers) | 1592 | public string llGetSimulatorHostname() |
1593 | { | 1593 | { |
1594 | return m_LSL_Functions.llParseStringKeepNulls(src, seperators, spacers); | 1594 | return m_LSL_Functions.llGetSimulatorHostname(); |
1595 | } | 1595 | } |
1596 | 1596 | ||
1597 | public void llRezAtRoot(string inventory, vector position, vector velocity, rotation rot, int param) | 1597 | public void llSetLocalRot(rotation rot) |
1598 | { | 1598 | { |
1599 | m_LSL_Functions.llRezAtRoot(inventory, position, velocity, rot, param); | 1599 | m_LSL_Functions.llSetLocalRot(rot); |
1600 | } | 1600 | } |
1601 | 1601 | ||
1602 | public int llGetObjectPermMask(int mask) | 1602 | public LSL_Types.list llParseStringKeepNulls(string src, LSL_Types.list seperators, LSL_Types.list spacers) |
1603 | { | 1603 | { |
1604 | return m_LSL_Functions.llGetObjectPermMask(mask); | 1604 | return m_LSL_Functions.llParseStringKeepNulls(src, seperators, spacers); |
1605 | } | 1605 | } |
1606 | 1606 | ||
1607 | public void llSetObjectPermMask(int mask, int value) | 1607 | public void llRezAtRoot(string inventory, vector position, vector velocity, rotation rot, int param) |
1608 | { | 1608 | { |
1609 | m_LSL_Functions.llSetObjectPermMask(mask, value); | 1609 | m_LSL_Functions.llRezAtRoot(inventory, position, velocity, rot, param); |
1610 | } | 1610 | } |
1611 | 1611 | ||
1612 | public void llGetInventoryPermMask(string item, int mask) | 1612 | public int llGetObjectPermMask(int mask) |
1613 | { | 1613 | { |
1614 | m_LSL_Functions.llGetInventoryPermMask(item, mask); | 1614 | return m_LSL_Functions.llGetObjectPermMask(mask); |
1615 | } | 1615 | } |
1616 | 1616 | ||
1617 | public void llSetInventoryPermMask(string item, int mask, int value) | 1617 | public void llSetObjectPermMask(int mask, int value) |
1618 | { | 1618 | { |
1619 | m_LSL_Functions.llSetInventoryPermMask(item, mask, value); | 1619 | m_LSL_Functions.llSetObjectPermMask(mask, value); |
1620 | } | 1620 | } |
1621 | 1621 | ||
1622 | public string llGetInventoryCreator(string item) | 1622 | public void llGetInventoryPermMask(string item, int mask) |
1623 | { | 1623 | { |
1624 | return m_LSL_Functions.llGetInventoryCreator(item); | 1624 | m_LSL_Functions.llGetInventoryPermMask(item, mask); |
1625 | } | 1625 | } |
1626 | 1626 | ||
1627 | public void llOwnerSay(string msg) | 1627 | public void llSetInventoryPermMask(string item, int mask, int value) |
1628 | { | 1628 | { |
1629 | m_LSL_Functions.llOwnerSay(msg); | 1629 | m_LSL_Functions.llSetInventoryPermMask(item, mask, value); |
1630 | } | 1630 | } |
1631 | 1631 | ||
1632 | public void llRequestSimulatorData(string simulator, int data) | 1632 | public string llGetInventoryCreator(string item) |
1633 | { | 1633 | { |
1634 | m_LSL_Functions.llRequestSimulatorData(simulator, data); | 1634 | return m_LSL_Functions.llGetInventoryCreator(item); |
1635 | } | 1635 | } |
1636 | 1636 | ||
1637 | public void llForceMouselook(int mouselook) | 1637 | public void llOwnerSay(string msg) |
1638 | { | 1638 | { |
1639 | m_LSL_Functions.llForceMouselook(mouselook); | 1639 | m_LSL_Functions.llOwnerSay(msg); |
1640 | } | 1640 | } |
1641 | 1641 | ||
1642 | public double llGetObjectMass(string id) | 1642 | public void llRequestSimulatorData(string simulator, int data) |
1643 | { | 1643 | { |
1644 | return m_LSL_Functions.llGetObjectMass(id); | 1644 | m_LSL_Functions.llRequestSimulatorData(simulator, data); |
1645 | } | 1645 | } |
1646 | 1646 | ||
1647 | public LSL_Types.list llListReplaceList(LSL_Types.list dest, LSL_Types.list src, int start, int end) | 1647 | public void llForceMouselook(int mouselook) |
1648 | { | 1648 | { |
1649 | return m_LSL_Functions.llListReplaceList(dest, src, start, end); | 1649 | m_LSL_Functions.llForceMouselook(mouselook); |
1650 | } | 1650 | } |
1651 | 1651 | ||
1652 | public void llLoadURL(string avatar_id, string message, string url) | 1652 | public double llGetObjectMass(string id) |
1653 | { | 1653 | { |
1654 | m_LSL_Functions.llLoadURL(avatar_id, message, url); | 1654 | return m_LSL_Functions.llGetObjectMass(id); |
1655 | } | 1655 | } |
1656 | 1656 | ||
1657 | public void llParcelMediaCommandList(LSL_Types.list commandList) | 1657 | public LSL_Types.list llListReplaceList(LSL_Types.list dest, LSL_Types.list src, int start, int end) |
1658 | { | 1658 | { |
1659 | m_LSL_Functions.llParcelMediaCommandList(commandList); | 1659 | return m_LSL_Functions.llListReplaceList(dest, src, start, end); |
1660 | } | 1660 | } |
1661 | 1661 | ||
1662 | public void llParcelMediaQuery() | 1662 | public void llLoadURL(string avatar_id, string message, string url) |
1663 | { | 1663 | { |
1664 | m_LSL_Functions.llParcelMediaQuery(); | 1664 | m_LSL_Functions.llLoadURL(avatar_id, message, url); |
1665 | } | 1665 | } |
1666 | 1666 | ||
1667 | public int llModPow(int a, int b, int c) | 1667 | public void llParcelMediaCommandList(LSL_Types.list commandList) |
1668 | { | 1668 | { |
1669 | return m_LSL_Functions.llModPow(a, b, c); | 1669 | m_LSL_Functions.llParcelMediaCommandList(commandList); |
1670 | } | 1670 | } |
1671 | 1671 | ||
1672 | // | 1672 | public void llParcelMediaQuery() |
1673 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs | 1673 | { |
1674 | // | 1674 | m_LSL_Functions.llParcelMediaQuery(); |
1675 | public int llGetInventoryType(string name) | 1675 | } |
1676 | { | 1676 | |
1677 | return m_LSL_Functions.llGetInventoryType(name); | 1677 | public int llModPow(int a, int b, int c) |
1678 | } | 1678 | { |
1679 | 1679 | return m_LSL_Functions.llModPow(a, b, c); | |
1680 | public void llSetPayPrice(int price, LSL_Types.list quick_pay_buttons) | 1680 | } |
1681 | { | 1681 | |
1682 | m_LSL_Functions.llSetPayPrice(price, quick_pay_buttons); | 1682 | // |
1683 | } | 1683 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs |
1684 | 1684 | // | |
1685 | public vector llGetCameraPos() | 1685 | public int llGetInventoryType(string name) |
1686 | { | 1686 | { |
1687 | return m_LSL_Functions.llGetCameraPos(); | 1687 | return m_LSL_Functions.llGetInventoryType(name); |
1688 | } | 1688 | } |
1689 | 1689 | ||
1690 | public rotation llGetCameraRot() | 1690 | public void llSetPayPrice(int price, LSL_Types.list quick_pay_buttons) |
1691 | { | 1691 | { |
1692 | return m_LSL_Functions.llGetCameraRot(); | 1692 | m_LSL_Functions.llSetPayPrice(price, quick_pay_buttons); |
1693 | } | 1693 | } |
1694 | 1694 | ||
1695 | public void llSetPrimURL() | 1695 | public vector llGetCameraPos() |
1696 | { | 1696 | { |
1697 | m_LSL_Functions.llSetPrimURL(); | 1697 | return m_LSL_Functions.llGetCameraPos(); |
1698 | } | 1698 | } |
1699 | 1699 | ||
1700 | public void llRefreshPrimURL() | 1700 | public rotation llGetCameraRot() |
1701 | { | 1701 | { |
1702 | m_LSL_Functions.llRefreshPrimURL(); | 1702 | return m_LSL_Functions.llGetCameraRot(); |
1703 | } | 1703 | } |
1704 | 1704 | ||
1705 | public string llEscapeURL(string url) | 1705 | public void llSetPrimURL() |
1706 | { | 1706 | { |
1707 | return m_LSL_Functions.llEscapeURL(url); | 1707 | m_LSL_Functions.llSetPrimURL(); |
1708 | } | 1708 | } |
1709 | 1709 | ||
1710 | public string llUnescapeURL(string url) | 1710 | public void llRefreshPrimURL() |
1711 | { | 1711 | { |
1712 | return m_LSL_Functions.llUnescapeURL(url); | 1712 | m_LSL_Functions.llRefreshPrimURL(); |
1713 | } | 1713 | } |
1714 | 1714 | ||
1715 | public void llMapDestination(string simname, vector pos, vector look_at) | 1715 | public string llEscapeURL(string url) |
1716 | { | 1716 | { |
1717 | m_LSL_Functions.llMapDestination(simname, pos, look_at); | 1717 | return m_LSL_Functions.llEscapeURL(url); |
1718 | } | 1718 | } |
1719 | 1719 | ||
1720 | public void llAddToLandBanList(string avatar, double hours) | 1720 | public string llUnescapeURL(string url) |
1721 | { | 1721 | { |
1722 | m_LSL_Functions.llAddToLandBanList(avatar, hours); | 1722 | return m_LSL_Functions.llUnescapeURL(url); |
1723 | } | 1723 | } |
1724 | 1724 | ||
1725 | public void llRemoveFromLandPassList(string avatar) | 1725 | public void llMapDestination(string simname, vector pos, vector look_at) |
1726 | { | 1726 | { |
1727 | m_LSL_Functions.llRemoveFromLandPassList(avatar); | 1727 | m_LSL_Functions.llMapDestination(simname, pos, look_at); |
1728 | } | 1728 | } |
1729 | 1729 | ||
1730 | public void llRemoveFromLandBanList(string avatar) | 1730 | public void llAddToLandBanList(string avatar, double hours) |
1731 | { | 1731 | { |
1732 | m_LSL_Functions.llRemoveFromLandBanList(avatar); | 1732 | m_LSL_Functions.llAddToLandBanList(avatar, hours); |
1733 | } | 1733 | } |
1734 | 1734 | ||
1735 | public void llSetCameraParams(LSL_Types.list rules) | 1735 | public void llRemoveFromLandPassList(string avatar) |
1736 | { | 1736 | { |
1737 | m_LSL_Functions.llSetCameraParams(rules); | 1737 | m_LSL_Functions.llRemoveFromLandPassList(avatar); |
1738 | } | 1738 | } |
1739 | 1739 | ||
1740 | public void llClearCameraParams() | 1740 | public void llRemoveFromLandBanList(string avatar) |
1741 | { | 1741 | { |
1742 | m_LSL_Functions.llClearCameraParams(); | 1742 | m_LSL_Functions.llRemoveFromLandBanList(avatar); |
1743 | } | 1743 | } |
1744 | 1744 | ||
1745 | public double llListStatistics(int operation, LSL_Types.list src) | 1745 | public void llSetCameraParams(LSL_Types.list rules) |
1746 | { | 1746 | { |
1747 | return m_LSL_Functions.llListStatistics(operation, src); | 1747 | m_LSL_Functions.llSetCameraParams(rules); |
1748 | } | 1748 | } |
1749 | 1749 | ||
1750 | public int llGetUnixTime() | 1750 | public void llClearCameraParams() |
1751 | { | 1751 | { |
1752 | return m_LSL_Functions.llGetUnixTime(); | 1752 | m_LSL_Functions.llClearCameraParams(); |
1753 | } | 1753 | } |
1754 | 1754 | ||
1755 | public int llGetParcelFlags(vector pos) | 1755 | public double llListStatistics(int operation, LSL_Types.list src) |
1756 | { | 1756 | { |
1757 | return m_LSL_Functions.llGetParcelFlags(pos); | 1757 | return m_LSL_Functions.llListStatistics(operation, src); |
1758 | } | 1758 | } |
1759 | 1759 | ||
1760 | public int llGetRegionFlags() | 1760 | public int llGetUnixTime() |
1761 | { | 1761 | { |
1762 | return m_LSL_Functions.llGetRegionFlags(); | 1762 | return m_LSL_Functions.llGetUnixTime(); |
1763 | } | 1763 | } |
1764 | 1764 | ||
1765 | public string llXorBase64StringsCorrect(string str1, string str2) | 1765 | public int llGetParcelFlags(vector pos) |
1766 | { | 1766 | { |
1767 | return m_LSL_Functions.llXorBase64StringsCorrect(str1, str2); | 1767 | return m_LSL_Functions.llGetParcelFlags(pos); |
1768 | } | 1768 | } |
1769 | 1769 | ||
1770 | public string llHTTPRequest(string url, LSL_Types.list parameters, string body) | 1770 | public int llGetRegionFlags() |
1771 | { | 1771 | { |
1772 | return m_LSL_Functions.llHTTPRequest(url, parameters, body); | 1772 | return m_LSL_Functions.llGetRegionFlags(); |
1773 | } | 1773 | } |
1774 | 1774 | ||
1775 | public void llResetLandBanList() | 1775 | public string llXorBase64StringsCorrect(string str1, string str2) |
1776 | { | 1776 | { |
1777 | m_LSL_Functions.llResetLandBanList(); | 1777 | return m_LSL_Functions.llXorBase64StringsCorrect(str1, str2); |
1778 | } | 1778 | } |
1779 | 1779 | ||
1780 | public void llResetLandPassList() | 1780 | public string llHTTPRequest(string url, LSL_Types.list parameters, string body) |
1781 | { | 1781 | { |
1782 | m_LSL_Functions.llResetLandPassList(); | 1782 | return m_LSL_Functions.llHTTPRequest(url, parameters, body); |
1783 | } | 1783 | } |
1784 | 1784 | ||
1785 | public int llGetParcelPrimCount(vector pos, int category, int sim_wide) | 1785 | public void llResetLandBanList() |
1786 | { | 1786 | { |
1787 | return m_LSL_Functions.llGetParcelPrimCount(pos, category, sim_wide); | 1787 | m_LSL_Functions.llResetLandBanList(); |
1788 | } | 1788 | } |
1789 | 1789 | ||
1790 | public LSL_Types.list llGetParcelPrimOwners(vector pos) | 1790 | public void llResetLandPassList() |
1791 | { | 1791 | { |
1792 | return m_LSL_Functions.llGetParcelPrimOwners(pos); | 1792 | m_LSL_Functions.llResetLandPassList(); |
1793 | } | 1793 | } |
1794 | 1794 | ||
1795 | public int llGetObjectPrimCount(string object_id) | 1795 | public int llGetParcelPrimCount(vector pos, int category, int sim_wide) |
1796 | { | 1796 | { |
1797 | return m_LSL_Functions.llGetObjectPrimCount(object_id); | 1797 | return m_LSL_Functions.llGetParcelPrimCount(pos, category, sim_wide); |
1798 | } | 1798 | } |
1799 | 1799 | ||
1800 | // | 1800 | public LSL_Types.list llGetParcelPrimOwners(vector pos) |
1801 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs | 1801 | { |
1802 | // | 1802 | return m_LSL_Functions.llGetParcelPrimOwners(pos); |
1803 | public int llGetParcelMaxPrims(vector pos, int sim_wide) | 1803 | } |
1804 | { | 1804 | |
1805 | return m_LSL_Functions.llGetParcelMaxPrims(pos, sim_wide); | 1805 | public int llGetObjectPrimCount(string object_id) |
1806 | } | 1806 | { |
1807 | 1807 | return m_LSL_Functions.llGetObjectPrimCount(object_id); | |
1808 | public LSL_Types.list llGetParcelDetails(vector pos, LSL_Types.list param) | 1808 | } |
1809 | { | 1809 | |
1810 | return m_LSL_Functions.llGetParcelDetails(pos, param); | 1810 | // |
1811 | } | 1811 | // DO NOT MODIFY HERE: MODIFY IN LSL_BuiltIn_Commands.cs |
1812 | 1812 | // | |
1813 | // | 1813 | public int llGetParcelMaxPrims(vector pos, int sim_wide) |
1814 | // OpenSim Functions | 1814 | { |
1815 | // | 1815 | return m_LSL_Functions.llGetParcelMaxPrims(pos, sim_wide); |
1816 | public string osSetDynamicTextureURL(string dynamicID, string contentType, string url, string extraParams, | 1816 | } |
1817 | int timer) | 1817 | |
1818 | { | 1818 | public LSL_Types.list llGetParcelDetails(vector pos, LSL_Types.list param) |
1819 | return m_LSL_Functions.osSetDynamicTextureURL(dynamicID, contentType, url, extraParams, timer); | 1819 | { |
1820 | } | 1820 | return m_LSL_Functions.llGetParcelDetails(pos, param); |
1821 | 1821 | } | |
1822 | public double osTerrainGetHeight(int x, int y) | 1822 | |
1823 | { | 1823 | // |
1824 | return m_LSL_Functions.osTerrainGetHeight(x, y); | 1824 | // OpenSim Functions |
1825 | } | 1825 | // |
1826 | 1826 | public string osSetDynamicTextureURL(string dynamicID, string contentType, string url, string extraParams, | |
1827 | public int osTerrainSetHeight(int x, int y, double val) | 1827 | int timer) |
1828 | { | 1828 | { |
1829 | return m_LSL_Functions.osTerrainSetHeight(x, y, val); | 1829 | return m_LSL_Functions.osSetDynamicTextureURL(dynamicID, contentType, url, extraParams, timer); |
1830 | } | 1830 | } |
1831 | 1831 | ||
1832 | public int osRegionRestart(double seconds) | 1832 | public double osTerrainGetHeight(int x, int y) |
1833 | { | 1833 | { |
1834 | return m_LSL_Functions.osRegionRestart(seconds); | 1834 | return m_LSL_Functions.osTerrainGetHeight(x, y); |
1835 | } | 1835 | } |
1836 | 1836 | ||
1837 | // LSL CONSTANTS | 1837 | public int osTerrainSetHeight(int x, int y, double val) |
1838 | public const int TRUE = 1; | 1838 | { |
1839 | public const int FALSE = 0; | 1839 | return m_LSL_Functions.osTerrainSetHeight(x, y, val); |
1840 | public const int STATUS_PHYSICS = 1; | 1840 | } |
1841 | public const int STATUS_ROTATE_X = 2; | 1841 | |
1842 | public const int STATUS_ROTATE_Y = 4; | 1842 | public int osRegionRestart(double seconds) |
1843 | public const int STATUS_ROTATE_Z = 8; | 1843 | { |
1844 | public const int STATUS_PHANTOM = 16; | 1844 | return m_LSL_Functions.osRegionRestart(seconds); |
1845 | public const int STATUS_SANDBOX = 32; | 1845 | } |
1846 | public const int STATUS_BLOCK_GRAB = 64; | 1846 | |
1847 | public const int STATUS_DIE_AT_EDGE = 128; | 1847 | // LSL CONSTANTS |
1848 | public const int STATUS_RETURN_AT_EDGE = 256; | 1848 | public const int TRUE = 1; |
1849 | public const int AGENT = 1; | 1849 | public const int FALSE = 0; |
1850 | public const int ACTIVE = 2; | 1850 | public const int STATUS_PHYSICS = 1; |
1851 | public const int PASSIVE = 4; | 1851 | public const int STATUS_ROTATE_X = 2; |
1852 | public const int SCRIPTED = 8; | 1852 | public const int STATUS_ROTATE_Y = 4; |
1853 | public const int CONTROL_FWD = 1; | 1853 | public const int STATUS_ROTATE_Z = 8; |
1854 | public const int CONTROL_BACK = 2; | 1854 | public const int STATUS_PHANTOM = 16; |
1855 | public const int CONTROL_LEFT = 4; | 1855 | public const int STATUS_SANDBOX = 32; |
1856 | public const int CONTROL_RIGHT = 8; | 1856 | public const int STATUS_BLOCK_GRAB = 64; |
1857 | public const int CONTROL_UP = 16; | 1857 | public const int STATUS_DIE_AT_EDGE = 128; |
1858 | public const int CONTROL_DOWN = 32; | 1858 | public const int STATUS_RETURN_AT_EDGE = 256; |
1859 | public const int CONTROL_ROT_LEFT = 256; | 1859 | public const int AGENT = 1; |
1860 | public const int CONTROL_ROT_RIGHT = 512; | 1860 | public const int ACTIVE = 2; |
1861 | public const int CONTROL_LBUTTON = 268435456; | 1861 | public const int PASSIVE = 4; |
1862 | public const int CONTROL_ML_LBUTTON = 1073741824; | 1862 | public const int SCRIPTED = 8; |
1863 | public const int PERMISSION_DEBIT = 2; | 1863 | public const int CONTROL_FWD = 1; |
1864 | public const int PERMISSION_TAKE_CONTROLS = 4; | 1864 | public const int CONTROL_BACK = 2; |
1865 | public const int PERMISSION_REMAP_CONTROLS = 8; | 1865 | public const int CONTROL_LEFT = 4; |
1866 | public const int PERMISSION_TRIGGER_ANIMATION = 16; | 1866 | public const int CONTROL_RIGHT = 8; |
1867 | public const int PERMISSION_ATTACH = 32; | 1867 | public const int CONTROL_UP = 16; |
1868 | public const int PERMISSION_RELEASE_OWNERSHIP = 64; | 1868 | public const int CONTROL_DOWN = 32; |
1869 | public const int PERMISSION_CHANGE_LINKS = 128; | 1869 | public const int CONTROL_ROT_LEFT = 256; |
1870 | public const int PERMISSION_CHANGE_JOINTS = 256; | 1870 | public const int CONTROL_ROT_RIGHT = 512; |
1871 | public const int PERMISSION_CHANGE_PERMISSIONS = 512; | 1871 | public const int CONTROL_LBUTTON = 268435456; |
1872 | public const int PERMISSION_TRACK_CAMERA = 1024; | 1872 | public const int CONTROL_ML_LBUTTON = 1073741824; |
1873 | public const int AGENT_FLYING = 1; | 1873 | public const int PERMISSION_DEBIT = 2; |
1874 | public const int AGENT_ATTACHMENTS = 2; | 1874 | public const int PERMISSION_TAKE_CONTROLS = 4; |
1875 | public const int AGENT_SCRIPTED = 4; | 1875 | public const int PERMISSION_REMAP_CONTROLS = 8; |
1876 | public const int AGENT_MOUSELOOK = 8; | 1876 | public const int PERMISSION_TRIGGER_ANIMATION = 16; |
1877 | public const int AGENT_SITTING = 16; | 1877 | public const int PERMISSION_ATTACH = 32; |
1878 | public const int AGENT_ON_OBJECT = 32; | 1878 | public const int PERMISSION_RELEASE_OWNERSHIP = 64; |
1879 | public const int AGENT_AWAY = 64; | 1879 | public const int PERMISSION_CHANGE_LINKS = 128; |
1880 | public const int AGENT_WALKING = 128; | 1880 | public const int PERMISSION_CHANGE_JOINTS = 256; |
1881 | public const int AGENT_IN_AIR = 256; | 1881 | public const int PERMISSION_CHANGE_PERMISSIONS = 512; |
1882 | public const int AGENT_TYPING = 512; | 1882 | public const int PERMISSION_TRACK_CAMERA = 1024; |
1883 | public const int AGENT_CROUCHING = 1024; | 1883 | public const int AGENT_FLYING = 1; |
1884 | public const int AGENT_BUSY = 2048; | 1884 | public const int AGENT_ATTACHMENTS = 2; |
1885 | public const int AGENT_ALWAYS_RUN = 4096; | 1885 | public const int AGENT_SCRIPTED = 4; |
1886 | public const int PSYS_PART_INTERP_COLOR_MASK = 1; | 1886 | public const int AGENT_MOUSELOOK = 8; |
1887 | public const int PSYS_PART_INTERP_SCALE_MASK = 2; | 1887 | public const int AGENT_SITTING = 16; |
1888 | public const int PSYS_PART_BOUNCE_MASK = 4; | 1888 | public const int AGENT_ON_OBJECT = 32; |
1889 | public const int PSYS_PART_WIND_MASK = 8; | 1889 | public const int AGENT_AWAY = 64; |
1890 | public const int PSYS_PART_FOLLOW_SRC_MASK = 16; | 1890 | public const int AGENT_WALKING = 128; |
1891 | public const int PSYS_PART_FOLLOW_VELOCITY_MASK = 32; | 1891 | public const int AGENT_IN_AIR = 256; |
1892 | public const int PSYS_PART_TARGET_POS_MASK = 64; | 1892 | public const int AGENT_TYPING = 512; |
1893 | public const int PSYS_PART_TARGET_LINEAR_MASK = 128; | 1893 | public const int AGENT_CROUCHING = 1024; |
1894 | public const int PSYS_PART_EMISSIVE_MASK = 256; | 1894 | public const int AGENT_BUSY = 2048; |
1895 | public const int PSYS_PART_FLAGS = 0; | 1895 | public const int AGENT_ALWAYS_RUN = 4096; |
1896 | public const int PSYS_PART_START_COLOR = 1; | 1896 | public const int PSYS_PART_INTERP_COLOR_MASK = 1; |
1897 | public const int PSYS_PART_START_ALPHA = 2; | 1897 | public const int PSYS_PART_INTERP_SCALE_MASK = 2; |
1898 | public const int PSYS_PART_END_COLOR = 3; | 1898 | public const int PSYS_PART_BOUNCE_MASK = 4; |
1899 | public const int PSYS_PART_END_ALPHA = 4; | 1899 | public const int PSYS_PART_WIND_MASK = 8; |
1900 | public const int PSYS_PART_START_SCALE = 5; | 1900 | public const int PSYS_PART_FOLLOW_SRC_MASK = 16; |
1901 | public const int PSYS_PART_END_SCALE = 6; | 1901 | public const int PSYS_PART_FOLLOW_VELOCITY_MASK = 32; |
1902 | public const int PSYS_PART_MAX_AGE = 7; | 1902 | public const int PSYS_PART_TARGET_POS_MASK = 64; |
1903 | public const int PSYS_SRC_ACCEL = 8; | 1903 | public const int PSYS_PART_TARGET_LINEAR_MASK = 128; |
1904 | public const int PSYS_SRC_PATTERN = 9; | 1904 | public const int PSYS_PART_EMISSIVE_MASK = 256; |
1905 | public const int PSYS_SRC_INNERANGLE = 10; | 1905 | public const int PSYS_PART_FLAGS = 0; |
1906 | public const int PSYS_SRC_OUTERANGLE = 11; | 1906 | public const int PSYS_PART_START_COLOR = 1; |
1907 | public const int PSYS_SRC_TEXTURE = 12; | 1907 | public const int PSYS_PART_START_ALPHA = 2; |
1908 | public const int PSYS_SRC_BURST_RATE = 13; | 1908 | public const int PSYS_PART_END_COLOR = 3; |
1909 | public const int PSYS_SRC_BURST_PART_COUNT = 15; | 1909 | public const int PSYS_PART_END_ALPHA = 4; |
1910 | public const int PSYS_SRC_BURST_RADIUS = 16; | 1910 | public const int PSYS_PART_START_SCALE = 5; |
1911 | public const int PSYS_SRC_BURST_SPEED_MIN = 17; | 1911 | public const int PSYS_PART_END_SCALE = 6; |
1912 | public const int PSYS_SRC_BURST_SPEED_MAX = 18; | 1912 | public const int PSYS_PART_MAX_AGE = 7; |
1913 | public const int PSYS_SRC_MAX_AGE = 19; | 1913 | public const int PSYS_SRC_ACCEL = 8; |
1914 | public const int PSYS_SRC_TARGET_KEY = 20; | 1914 | public const int PSYS_SRC_PATTERN = 9; |
1915 | public const int PSYS_SRC_OMEGA = 21; | 1915 | public const int PSYS_SRC_INNERANGLE = 10; |
1916 | public const int PSYS_SRC_ANGLE_BEGIN = 22; | 1916 | public const int PSYS_SRC_OUTERANGLE = 11; |
1917 | public const int PSYS_SRC_ANGLE_END = 23; | 1917 | public const int PSYS_SRC_TEXTURE = 12; |
1918 | public const int PSYS_SRC_PATTERN_DROP = 1; | 1918 | public const int PSYS_SRC_BURST_RATE = 13; |
1919 | public const int PSYS_SRC_PATTERN_EXPLODE = 2; | 1919 | public const int PSYS_SRC_BURST_PART_COUNT = 15; |
1920 | public const int PSYS_SRC_PATTERN_ANGLE = 4; | 1920 | public const int PSYS_SRC_BURST_RADIUS = 16; |
1921 | public const int PSYS_SRC_PATTERN_ANGLE_CONE = 8; | 1921 | public const int PSYS_SRC_BURST_SPEED_MIN = 17; |
1922 | public const int PSYS_SRC_PATTERN_ANGLE_CONE_EMPTY = 16; | 1922 | public const int PSYS_SRC_BURST_SPEED_MAX = 18; |
1923 | public const int VEHICLE_TYPE_NONE = 0; | 1923 | public const int PSYS_SRC_MAX_AGE = 19; |
1924 | public const int VEHICLE_TYPE_SLED = 1; | 1924 | public const int PSYS_SRC_TARGET_KEY = 20; |
1925 | public const int VEHICLE_TYPE_CAR = 2; | 1925 | public const int PSYS_SRC_OMEGA = 21; |
1926 | public const int VEHICLE_TYPE_BOAT = 3; | 1926 | public const int PSYS_SRC_ANGLE_BEGIN = 22; |
1927 | public const int VEHICLE_TYPE_AIRPLANE = 4; | 1927 | public const int PSYS_SRC_ANGLE_END = 23; |
1928 | public const int VEHICLE_TYPE_BALLOON = 5; | 1928 | public const int PSYS_SRC_PATTERN_DROP = 1; |
1929 | public const int VEHICLE_LINEAR_FRICTION_TIMESCALE = 16; | 1929 | public const int PSYS_SRC_PATTERN_EXPLODE = 2; |
1930 | public const int VEHICLE_ANGULAR_FRICTION_TIMESCALE = 17; | 1930 | public const int PSYS_SRC_PATTERN_ANGLE = 4; |
1931 | public const int VEHICLE_LINEAR_MOTOR_DIRECTION = 18; | 1931 | public const int PSYS_SRC_PATTERN_ANGLE_CONE = 8; |
1932 | public const int VEHICLE_LINEAR_MOTOR_OFFSET = 20; | 1932 | public const int PSYS_SRC_PATTERN_ANGLE_CONE_EMPTY = 16; |
1933 | public const int VEHICLE_ANGULAR_MOTOR_DIRECTION = 19; | 1933 | public const int VEHICLE_TYPE_NONE = 0; |
1934 | public const int VEHICLE_HOVER_HEIGHT = 24; | 1934 | public const int VEHICLE_TYPE_SLED = 1; |
1935 | public const int VEHICLE_HOVER_EFFICIENCY = 25; | 1935 | public const int VEHICLE_TYPE_CAR = 2; |
1936 | public const int VEHICLE_HOVER_TIMESCALE = 26; | 1936 | public const int VEHICLE_TYPE_BOAT = 3; |
1937 | public const int VEHICLE_BUOYANCY = 27; | 1937 | public const int VEHICLE_TYPE_AIRPLANE = 4; |
1938 | public const int VEHICLE_LINEAR_DEFLECTION_EFFICIENCY = 28; | 1938 | public const int VEHICLE_TYPE_BALLOON = 5; |
1939 | public const int VEHICLE_LINEAR_DEFLECTION_TIMESCALE = 29; | 1939 | public const int VEHICLE_LINEAR_FRICTION_TIMESCALE = 16; |
1940 | public const int VEHICLE_LINEAR_MOTOR_TIMESCALE = 30; | 1940 | public const int VEHICLE_ANGULAR_FRICTION_TIMESCALE = 17; |
1941 | public const int VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE = 31; | 1941 | public const int VEHICLE_LINEAR_MOTOR_DIRECTION = 18; |
1942 | public const int VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY = 32; | 1942 | public const int VEHICLE_LINEAR_MOTOR_OFFSET = 20; |
1943 | public const int VEHICLE_ANGULAR_DEFLECTION_TIMESCALE = 33; | 1943 | public const int VEHICLE_ANGULAR_MOTOR_DIRECTION = 19; |
1944 | public const int VEHICLE_ANGULAR_MOTOR_TIMESCALE = 34; | 1944 | public const int VEHICLE_HOVER_HEIGHT = 24; |
1945 | public const int VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE = 35; | 1945 | public const int VEHICLE_HOVER_EFFICIENCY = 25; |
1946 | public const int VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY = 36; | 1946 | public const int VEHICLE_HOVER_TIMESCALE = 26; |
1947 | public const int VEHICLE_VERTICAL_ATTRACTION_TIMESCALE = 37; | 1947 | public const int VEHICLE_BUOYANCY = 27; |
1948 | public const int VEHICLE_BANKING_EFFICIENCY = 38; | 1948 | public const int VEHICLE_LINEAR_DEFLECTION_EFFICIENCY = 28; |
1949 | public const int VEHICLE_BANKING_MIX = 39; | 1949 | public const int VEHICLE_LINEAR_DEFLECTION_TIMESCALE = 29; |
1950 | public const int VEHICLE_BANKING_TIMESCALE = 40; | 1950 | public const int VEHICLE_LINEAR_MOTOR_TIMESCALE = 30; |
1951 | public const int VEHICLE_REFERENCE_FRAME = 44; | 1951 | public const int VEHICLE_LINEAR_MOTOR_DECAY_TIMESCALE = 31; |
1952 | public const int VEHICLE_FLAG_NO_DEFLECTION_UP = 1; | 1952 | public const int VEHICLE_ANGULAR_DEFLECTION_EFFICIENCY = 32; |
1953 | public const int VEHICLE_FLAG_LIMIT_ROLL_ONLY = 2; | 1953 | public const int VEHICLE_ANGULAR_DEFLECTION_TIMESCALE = 33; |
1954 | public const int VEHICLE_FLAG_HOVER_WATER_ONLY = 4; | 1954 | public const int VEHICLE_ANGULAR_MOTOR_TIMESCALE = 34; |
1955 | public const int VEHICLE_FLAG_HOVER_TERRAIN_ONLY = 8; | 1955 | public const int VEHICLE_ANGULAR_MOTOR_DECAY_TIMESCALE = 35; |
1956 | public const int VEHICLE_FLAG_HOVER_GLOBAL_HEIGHT = 16; | 1956 | public const int VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY = 36; |
1957 | public const int VEHICLE_FLAG_HOVER_UP_ONLY = 32; | 1957 | public const int VEHICLE_VERTICAL_ATTRACTION_TIMESCALE = 37; |
1958 | public const int VEHICLE_FLAG_LIMIT_MOTOR_UP = 64; | 1958 | public const int VEHICLE_BANKING_EFFICIENCY = 38; |
1959 | public const int VEHICLE_FLAG_MOUSELOOK_STEER = 128; | 1959 | public const int VEHICLE_BANKING_MIX = 39; |
1960 | public const int VEHICLE_FLAG_MOUSELOOK_BANK = 256; | 1960 | public const int VEHICLE_BANKING_TIMESCALE = 40; |
1961 | public const int VEHICLE_FLAG_CAMERA_DECOUPLED = 512; | 1961 | public const int VEHICLE_REFERENCE_FRAME = 44; |
1962 | public const int INVENTORY_ALL = -1; | 1962 | public const int VEHICLE_FLAG_NO_DEFLECTION_UP = 1; |
1963 | public const int INVENTORY_NONE = -1; | 1963 | public const int VEHICLE_FLAG_LIMIT_ROLL_ONLY = 2; |
1964 | public const int INVENTORY_TEXTURE = 0; | 1964 | public const int VEHICLE_FLAG_HOVER_WATER_ONLY = 4; |
1965 | public const int INVENTORY_SOUND = 1; | 1965 | public const int VEHICLE_FLAG_HOVER_TERRAIN_ONLY = 8; |
1966 | public const int INVENTORY_LANDMARK = 3; | 1966 | public const int VEHICLE_FLAG_HOVER_GLOBAL_HEIGHT = 16; |
1967 | public const int INVENTORY_CLOTHING = 5; | 1967 | public const int VEHICLE_FLAG_HOVER_UP_ONLY = 32; |
1968 | public const int INVENTORY_OBJECT = 6; | 1968 | public const int VEHICLE_FLAG_LIMIT_MOTOR_UP = 64; |
1969 | public const int INVENTORY_NOTECARD = 7; | 1969 | public const int VEHICLE_FLAG_MOUSELOOK_STEER = 128; |
1970 | public const int INVENTORY_SCRIPT = 10; | 1970 | public const int VEHICLE_FLAG_MOUSELOOK_BANK = 256; |
1971 | public const int INVENTORY_BODYPART = 13; | 1971 | public const int VEHICLE_FLAG_CAMERA_DECOUPLED = 512; |
1972 | public const int INVENTORY_ANIMATION = 20; | 1972 | public const int INVENTORY_ALL = -1; |
1973 | public const int INVENTORY_GESTURE = 21; | 1973 | public const int INVENTORY_NONE = -1; |
1974 | public const int ATTACH_CHEST = 1; | 1974 | public const int INVENTORY_TEXTURE = 0; |
1975 | public const int ATTACH_HEAD = 2; | 1975 | public const int INVENTORY_SOUND = 1; |
1976 | public const int ATTACH_LSHOULDER = 3; | 1976 | public const int INVENTORY_LANDMARK = 3; |
1977 | public const int ATTACH_RSHOULDER = 4; | 1977 | public const int INVENTORY_CLOTHING = 5; |
1978 | public const int ATTACH_LHAND = 5; | 1978 | public const int INVENTORY_OBJECT = 6; |
1979 | public const int ATTACH_RHAND = 6; | 1979 | public const int INVENTORY_NOTECARD = 7; |
1980 | public const int ATTACH_LFOOT = 7; | 1980 | public const int INVENTORY_SCRIPT = 10; |
1981 | public const int ATTACH_RFOOT = 8; | 1981 | public const int INVENTORY_BODYPART = 13; |
1982 | public const int ATTACH_BACK = 9; | 1982 | public const int INVENTORY_ANIMATION = 20; |
1983 | public const int ATTACH_PELVIS = 10; | 1983 | public const int INVENTORY_GESTURE = 21; |
1984 | public const int ATTACH_MOUTH = 11; | 1984 | public const int ATTACH_CHEST = 1; |
1985 | public const int ATTACH_CHIN = 12; | 1985 | public const int ATTACH_HEAD = 2; |
1986 | public const int ATTACH_LEAR = 13; | 1986 | public const int ATTACH_LSHOULDER = 3; |
1987 | public const int ATTACH_REAR = 14; | 1987 | public const int ATTACH_RSHOULDER = 4; |
1988 | public const int ATTACH_LEYE = 15; | 1988 | public const int ATTACH_LHAND = 5; |
1989 | public const int ATTACH_REYE = 16; | 1989 | public const int ATTACH_RHAND = 6; |
1990 | public const int ATTACH_NOSE = 17; | 1990 | public const int ATTACH_LFOOT = 7; |
1991 | public const int ATTACH_RUARM = 18; | 1991 | public const int ATTACH_RFOOT = 8; |
1992 | public const int ATTACH_RLARM = 19; | 1992 | public const int ATTACH_BACK = 9; |
1993 | public const int ATTACH_LUARM = 20; | 1993 | public const int ATTACH_PELVIS = 10; |
1994 | public const int ATTACH_LLARM = 21; | 1994 | public const int ATTACH_MOUTH = 11; |
1995 | public const int ATTACH_RHIP = 22; | 1995 | public const int ATTACH_CHIN = 12; |
1996 | public const int ATTACH_RULEG = 23; | 1996 | public const int ATTACH_LEAR = 13; |
1997 | public const int ATTACH_RLLEG = 24; | 1997 | public const int ATTACH_REAR = 14; |
1998 | public const int ATTACH_LHIP = 25; | 1998 | public const int ATTACH_LEYE = 15; |
1999 | public const int ATTACH_LULEG = 26; | 1999 | public const int ATTACH_REYE = 16; |
2000 | public const int ATTACH_LLLEG = 27; | 2000 | public const int ATTACH_NOSE = 17; |
2001 | public const int ATTACH_BELLY = 28; | 2001 | public const int ATTACH_RUARM = 18; |
2002 | public const int ATTACH_RPEC = 29; | 2002 | public const int ATTACH_RLARM = 19; |
2003 | public const int ATTACH_LPEC = 30; | 2003 | public const int ATTACH_LUARM = 20; |
2004 | public const int LAND_LEVEL = 0; | 2004 | public const int ATTACH_LLARM = 21; |
2005 | public const int LAND_RAISE = 1; | 2005 | public const int ATTACH_RHIP = 22; |
2006 | public const int LAND_LOWER = 2; | 2006 | public const int ATTACH_RULEG = 23; |
2007 | public const int LAND_SMOOTH = 3; | 2007 | public const int ATTACH_RLLEG = 24; |
2008 | public const int LAND_NOISE = 4; | 2008 | public const int ATTACH_LHIP = 25; |
2009 | public const int LAND_REVERT = 5; | 2009 | public const int ATTACH_LULEG = 26; |
2010 | public const int LAND_SMALL_BRUSH = 1; | 2010 | public const int ATTACH_LLLEG = 27; |
2011 | public const int LAND_MEDIUM_BRUSH = 2; | 2011 | public const int ATTACH_BELLY = 28; |
2012 | public const int LAND_LARGE_BRUSH = 3; | 2012 | public const int ATTACH_RPEC = 29; |
2013 | public const int DATA_ONLINE = 1; | 2013 | public const int ATTACH_LPEC = 30; |
2014 | public const int DATA_NAME = 2; | 2014 | public const int LAND_LEVEL = 0; |
2015 | public const int DATA_BORN = 3; | 2015 | public const int LAND_RAISE = 1; |
2016 | public const int DATA_RATING = 4; | 2016 | public const int LAND_LOWER = 2; |
2017 | public const int DATA_SIM_POS = 5; | 2017 | public const int LAND_SMOOTH = 3; |
2018 | public const int DATA_SIM_STATUS = 6; | 2018 | public const int LAND_NOISE = 4; |
2019 | public const int DATA_SIM_RATING = 7; | 2019 | public const int LAND_REVERT = 5; |
2020 | public const int ANIM_ON = 1; | 2020 | public const int LAND_SMALL_BRUSH = 1; |
2021 | public const int LOOP = 2; | 2021 | public const int LAND_MEDIUM_BRUSH = 2; |
2022 | public const int REVERSE = 4; | 2022 | public const int LAND_LARGE_BRUSH = 3; |
2023 | public const int PING_PONG = 8; | 2023 | public const int DATA_ONLINE = 1; |
2024 | public const int SMOOTH = 16; | 2024 | public const int DATA_NAME = 2; |
2025 | public const int ROTATE = 32; | 2025 | public const int DATA_BORN = 3; |
2026 | public const int SCALE = 64; | 2026 | public const int DATA_RATING = 4; |
2027 | public const int ALL_SIDES = -1; | 2027 | public const int DATA_SIM_POS = 5; |
2028 | public const int LINK_SET = -1; | 2028 | public const int DATA_SIM_STATUS = 6; |
2029 | public const int LINK_ROOT = 1; | 2029 | public const int DATA_SIM_RATING = 7; |
2030 | public const int LINK_ALL_OTHERS = -2; | 2030 | public const int ANIM_ON = 1; |
2031 | public const int LINK_ALL_CHILDREN = -3; | 2031 | public const int LOOP = 2; |
2032 | public const int LINK_THIS = -4; | 2032 | public const int REVERSE = 4; |
2033 | public const int CHANGED_INVENTORY = 1; | 2033 | public const int PING_PONG = 8; |
2034 | public const int CHANGED_COLOR = 2; | 2034 | public const int SMOOTH = 16; |
2035 | public const int CHANGED_SHAPE = 4; | 2035 | public const int ROTATE = 32; |
2036 | public const int CHANGED_SCALE = 8; | 2036 | public const int SCALE = 64; |
2037 | public const int CHANGED_TEXTURE = 16; | 2037 | public const int ALL_SIDES = -1; |
2038 | public const int CHANGED_LINK = 32; | 2038 | public const int LINK_SET = -1; |
2039 | public const int CHANGED_ALLOWED_DROP = 64; | 2039 | public const int LINK_ROOT = 1; |
2040 | public const int CHANGED_OWNER = 128; | 2040 | public const int LINK_ALL_OTHERS = -2; |
2041 | public const int TYPE_INVALID = 0; | 2041 | public const int LINK_ALL_CHILDREN = -3; |
2042 | public const int TYPE_INTEGER = 1; | 2042 | public const int LINK_THIS = -4; |
2043 | public const int TYPE_double = 2; | 2043 | public const int CHANGED_INVENTORY = 1; |
2044 | public const int TYPE_STRING = 3; | 2044 | public const int CHANGED_COLOR = 2; |
2045 | public const int TYPE_KEY = 4; | 2045 | public const int CHANGED_SHAPE = 4; |
2046 | public const int TYPE_VECTOR = 5; | 2046 | public const int CHANGED_SCALE = 8; |
2047 | public const int TYPE_ROTATION = 6; | 2047 | public const int CHANGED_TEXTURE = 16; |
2048 | public const int REMOTE_DATA_CHANNEL = 1; | 2048 | public const int CHANGED_LINK = 32; |
2049 | public const int REMOTE_DATA_REQUEST = 2; | 2049 | public const int CHANGED_ALLOWED_DROP = 64; |
2050 | public const int REMOTE_DATA_REPLY = 3; | 2050 | public const int CHANGED_OWNER = 128; |
2051 | 2051 | public const int TYPE_INVALID = 0; | |
2052 | public const int PRIM_MATERIAL = 2; | 2052 | public const int TYPE_INTEGER = 1; |
2053 | public const int PRIM_PHYSICS = 3; | 2053 | public const int TYPE_double = 2; |
2054 | public const int PRIM_TEMP_ON_REZ = 4; | 2054 | public const int TYPE_STRING = 3; |
2055 | public const int PRIM_PHANTOM = 5; | 2055 | public const int TYPE_KEY = 4; |
2056 | public const int PRIM_POSITION = 6; | 2056 | public const int TYPE_VECTOR = 5; |
2057 | public const int PRIM_SIZE = 7; | 2057 | public const int TYPE_ROTATION = 6; |
2058 | public const int PRIM_ROTATION = 8; | 2058 | public const int REMOTE_DATA_CHANNEL = 1; |
2059 | public const int PRIM_TYPE = 9; | 2059 | public const int REMOTE_DATA_REQUEST = 2; |
2060 | public const int PRIM_TEXTURE = 17; | 2060 | public const int REMOTE_DATA_REPLY = 3; |
2061 | public const int PRIM_COLOR = 18; | 2061 | |
2062 | public const int PRIM_BUMP_SHINY = 19; | 2062 | public const int PRIM_MATERIAL = 2; |
2063 | public const int PRIM_FULLBRIGHT = 20; | 2063 | public const int PRIM_PHYSICS = 3; |
2064 | public const int PRIM_FLEXIBLE = 21; | 2064 | public const int PRIM_TEMP_ON_REZ = 4; |
2065 | public const int PRIM_TEXGEN = 22; | 2065 | public const int PRIM_PHANTOM = 5; |
2066 | public const int PRIM_CAST_SHADOWS = 24; // Not implemented, here for completeness sake | 2066 | public const int PRIM_POSITION = 6; |
2067 | public const int PRIM_POINT_LIGHT = 23; // Huh? | 2067 | public const int PRIM_SIZE = 7; |
2068 | public const int PRIM_TEXGEN_DEFAULT = 0; | 2068 | public const int PRIM_ROTATION = 8; |
2069 | public const int PRIM_TEXGEN_PLANAR = 1; | 2069 | public const int PRIM_TYPE = 9; |
2070 | public const int PRIM_TYPE_BOX = 0; | 2070 | public const int PRIM_TEXTURE = 17; |
2071 | public const int PRIM_TYPE_CYLINDER = 1; | 2071 | public const int PRIM_COLOR = 18; |
2072 | public const int PRIM_TYPE_PRISM = 2; | 2072 | public const int PRIM_BUMP_SHINY = 19; |
2073 | public const int PRIM_TYPE_SPHERE = 3; | 2073 | public const int PRIM_FULLBRIGHT = 20; |
2074 | public const int PRIM_TYPE_TORUS = 4; | 2074 | public const int PRIM_FLEXIBLE = 21; |
2075 | public const int PRIM_TYPE_TUBE = 5; | 2075 | public const int PRIM_TEXGEN = 22; |
2076 | public const int PRIM_TYPE_RING = 6; | 2076 | public const int PRIM_CAST_SHADOWS = 24; // Not implemented, here for completeness sake |
2077 | public const int PRIM_TYPE_SCULPT = 7; | 2077 | public const int PRIM_POINT_LIGHT = 23; // Huh? |
2078 | public const int PRIM_HOLE_DEFAULT = 0; | 2078 | public const int PRIM_TEXGEN_DEFAULT = 0; |
2079 | public const int PRIM_HOLE_CIRCLE = 16; | 2079 | public const int PRIM_TEXGEN_PLANAR = 1; |
2080 | public const int PRIM_HOLE_SQUARE = 32; | 2080 | public const int PRIM_TYPE_BOX = 0; |
2081 | public const int PRIM_HOLE_TRIANGLE = 48; | 2081 | public const int PRIM_TYPE_CYLINDER = 1; |
2082 | public const int PRIM_MATERIAL_STONE = 0; | 2082 | public const int PRIM_TYPE_PRISM = 2; |
2083 | public const int PRIM_MATERIAL_METAL = 1; | 2083 | public const int PRIM_TYPE_SPHERE = 3; |
2084 | public const int PRIM_MATERIAL_GLASS = 2; | 2084 | public const int PRIM_TYPE_TORUS = 4; |
2085 | public const int PRIM_MATERIAL_WOOD = 3; | 2085 | public const int PRIM_TYPE_TUBE = 5; |
2086 | public const int PRIM_MATERIAL_FLESH = 4; | 2086 | public const int PRIM_TYPE_RING = 6; |
2087 | public const int PRIM_MATERIAL_PLASTIC = 5; | 2087 | public const int PRIM_TYPE_SCULPT = 7; |
2088 | public const int PRIM_MATERIAL_RUBBER = 6; | 2088 | public const int PRIM_HOLE_DEFAULT = 0; |
2089 | public const int PRIM_MATERIAL_LIGHT = 7; | 2089 | public const int PRIM_HOLE_CIRCLE = 16; |
2090 | public const int PRIM_SHINY_NONE = 0; | 2090 | public const int PRIM_HOLE_SQUARE = 32; |
2091 | public const int PRIM_SHINY_LOW = 1; | 2091 | public const int PRIM_HOLE_TRIANGLE = 48; |
2092 | public const int PRIM_SHINY_MEDIUM = 2; | 2092 | public const int PRIM_MATERIAL_STONE = 0; |
2093 | public const int PRIM_SHINY_HIGH = 3; | 2093 | public const int PRIM_MATERIAL_METAL = 1; |
2094 | public const int PRIM_BUMP_NONE = 0; | 2094 | public const int PRIM_MATERIAL_GLASS = 2; |
2095 | public const int PRIM_BUMP_BRIGHT = 1; | 2095 | public const int PRIM_MATERIAL_WOOD = 3; |
2096 | public const int PRIM_BUMP_DARK = 2; | 2096 | public const int PRIM_MATERIAL_FLESH = 4; |
2097 | public const int PRIM_BUMP_WOOD = 3; | 2097 | public const int PRIM_MATERIAL_PLASTIC = 5; |
2098 | public const int PRIM_BUMP_BARK = 4; | 2098 | public const int PRIM_MATERIAL_RUBBER = 6; |
2099 | public const int PRIM_BUMP_BRICKS = 5; | 2099 | public const int PRIM_MATERIAL_LIGHT = 7; |
2100 | public const int PRIM_BUMP_CHECKER = 6; | 2100 | public const int PRIM_SHINY_NONE = 0; |
2101 | public const int PRIM_BUMP_CONCRETE = 7; | 2101 | public const int PRIM_SHINY_LOW = 1; |
2102 | public const int PRIM_BUMP_TILE = 8; | 2102 | public const int PRIM_SHINY_MEDIUM = 2; |
2103 | public const int PRIM_BUMP_STONE = 9; | 2103 | public const int PRIM_SHINY_HIGH = 3; |
2104 | public const int PRIM_BUMP_DISKS = 10; | 2104 | public const int PRIM_BUMP_NONE = 0; |
2105 | public const int PRIM_BUMP_GRAVEL = 11; | 2105 | public const int PRIM_BUMP_BRIGHT = 1; |
2106 | public const int PRIM_BUMP_BLOBS = 12; | 2106 | public const int PRIM_BUMP_DARK = 2; |
2107 | public const int PRIM_BUMP_SIDING = 13; | 2107 | public const int PRIM_BUMP_WOOD = 3; |
2108 | public const int PRIM_BUMP_LARGETILE = 14; | 2108 | public const int PRIM_BUMP_BARK = 4; |
2109 | public const int PRIM_BUMP_STUCCO = 15; | 2109 | public const int PRIM_BUMP_BRICKS = 5; |
2110 | public const int PRIM_BUMP_SUCTION = 16; | 2110 | public const int PRIM_BUMP_CHECKER = 6; |
2111 | public const int PRIM_BUMP_WEAVE = 17; | 2111 | public const int PRIM_BUMP_CONCRETE = 7; |
2112 | 2112 | public const int PRIM_BUMP_TILE = 8; | |
2113 | public const int PRIM_SCULPT_TYPE_SPHERE = 1; | 2113 | public const int PRIM_BUMP_STONE = 9; |
2114 | public const int PRIM_SCULPT_TYPE_TORUS = 2; | 2114 | public const int PRIM_BUMP_DISKS = 10; |
2115 | public const int PRIM_SCULPT_TYPE_PLANE = 3; | 2115 | public const int PRIM_BUMP_GRAVEL = 11; |
2116 | public const int PRIM_SCULPT_TYPE_CYLINDER = 4; | 2116 | public const int PRIM_BUMP_BLOBS = 12; |
2117 | 2117 | public const int PRIM_BUMP_SIDING = 13; | |
2118 | 2118 | public const int PRIM_BUMP_LARGETILE = 14; | |
2119 | public const int MASK_BASE = 0; | 2119 | public const int PRIM_BUMP_STUCCO = 15; |
2120 | public const int MASK_OWNER = 1; | 2120 | public const int PRIM_BUMP_SUCTION = 16; |
2121 | public const int MASK_GROUP = 2; | 2121 | public const int PRIM_BUMP_WEAVE = 17; |
2122 | public const int MASK_EVERYONE = 3; | 2122 | |
2123 | public const int MASK_NEXT = 4; | 2123 | public const int PRIM_SCULPT_TYPE_SPHERE = 1; |
2124 | public const int PERM_TRANSFER = 8192; | 2124 | public const int PRIM_SCULPT_TYPE_TORUS = 2; |
2125 | public const int PERM_MODIFY = 16384; | 2125 | public const int PRIM_SCULPT_TYPE_PLANE = 3; |
2126 | public const int PERM_COPY = 32768; | 2126 | public const int PRIM_SCULPT_TYPE_CYLINDER = 4; |
2127 | public const int PERM_MOVE = 524288; | 2127 | |
2128 | public const int PERM_ALL = 2147483647; | 2128 | |
2129 | public const int PARCEL_MEDIA_COMMAND_STOP = 0; | 2129 | public const int MASK_BASE = 0; |
2130 | public const int PARCEL_MEDIA_COMMAND_PAUSE = 1; | 2130 | public const int MASK_OWNER = 1; |
2131 | public const int PARCEL_MEDIA_COMMAND_PLAY = 2; | 2131 | public const int MASK_GROUP = 2; |
2132 | public const int PARCEL_MEDIA_COMMAND_LOOP = 3; | 2132 | public const int MASK_EVERYONE = 3; |
2133 | public const int PARCEL_MEDIA_COMMAND_TEXTURE = 4; | 2133 | public const int MASK_NEXT = 4; |
2134 | public const int PARCEL_MEDIA_COMMAND_URL = 5; | 2134 | public const int PERM_TRANSFER = 8192; |
2135 | public const int PARCEL_MEDIA_COMMAND_TIME = 6; | 2135 | public const int PERM_MODIFY = 16384; |
2136 | public const int PARCEL_MEDIA_COMMAND_AGENT = 7; | 2136 | public const int PERM_COPY = 32768; |
2137 | public const int PARCEL_MEDIA_COMMAND_UNLOAD = 8; | 2137 | public const int PERM_MOVE = 524288; |
2138 | public const int PARCEL_MEDIA_COMMAND_AUTO_ALIGN = 9; | 2138 | public const int PERM_ALL = 2147483647; |
2139 | public const int PAY_HIDE = -1; | 2139 | public const int PARCEL_MEDIA_COMMAND_STOP = 0; |
2140 | public const int PAY_DEFAULT = -2; | 2140 | public const int PARCEL_MEDIA_COMMAND_PAUSE = 1; |
2141 | public const string NULL_KEY = "00000000-0000-0000-0000-000000000000"; | 2141 | public const int PARCEL_MEDIA_COMMAND_PLAY = 2; |
2142 | public const string EOF = "\n\n\n"; | 2142 | public const int PARCEL_MEDIA_COMMAND_LOOP = 3; |
2143 | public const double PI = 3.14159274f; | 2143 | public const int PARCEL_MEDIA_COMMAND_TEXTURE = 4; |
2144 | public const double TWO_PI = 6.28318548f; | 2144 | public const int PARCEL_MEDIA_COMMAND_URL = 5; |
2145 | public const double PI_BY_TWO = 1.57079637f; | 2145 | public const int PARCEL_MEDIA_COMMAND_TIME = 6; |
2146 | public const double DEG_TO_RAD = 0.01745329238f; | 2146 | public const int PARCEL_MEDIA_COMMAND_AGENT = 7; |
2147 | public const double RAD_TO_DEG = 57.29578f; | 2147 | public const int PARCEL_MEDIA_COMMAND_UNLOAD = 8; |
2148 | public const double SQRT2 = 1.414213538f; | 2148 | public const int PARCEL_MEDIA_COMMAND_AUTO_ALIGN = 9; |
2149 | 2149 | public const int PAY_HIDE = -1; | |
2150 | // Can not be public const? | 2150 | public const int PAY_DEFAULT = -2; |
2151 | public vector ZERO_VECTOR = new vector(0, 0, 0); | 2151 | public const string NULL_KEY = "00000000-0000-0000-0000-000000000000"; |
2152 | public rotation ZERO_ROTATION = new rotation(0, 0, 0, 0); | 2152 | public const string EOF = "\n\n\n"; |
2153 | } | 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 | } | ||
2154 | } \ No newline at end of file | 2165 | } \ No newline at end of file |
diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/Server_API/LSL_BuiltIn_Commands.cs b/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs index 1d9ca96..f4a1a00 100644 --- a/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/Server_API/LSL_BuiltIn_Commands.cs +++ b/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs | |||
@@ -1,3015 +1,3003 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) Contributors, http://opensimulator.org/ | 2 | * Copyright (c) Contributors, http://opensimulator.org/ |
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | 3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. |
4 | * | 4 | * |
5 | * Redistribution and use in source and binary forms, with or without | 5 | * Redistribution and use in source and binary forms, with or without |
6 | * modification, are permitted provided that the following conditions are met: | 6 | * modification, are permitted provided that the following conditions are met: |
7 | * * Redistributions of source code must retain the above copyright | 7 | * * Redistributions of source code must retain the above copyright |
8 | * notice, this list of conditions and the following disclaimer. | 8 | * notice, this list of conditions and the following disclaimer. |
9 | * * Redistributions in binary form must reproduce the above copyright | 9 | * * Redistributions in binary form must reproduce the above copyright |
10 | * notice, this list of conditions and the following disclaimer in the | 10 | * notice, this list of conditions and the following disclaimer in the |
11 | * documentation and/or other materials provided with the distribution. | 11 | * documentation and/or other materials provided with the distribution. |
12 | * * Neither the name of the OpenSim Project nor the | 12 | * * Neither the name of the OpenSim Project nor the |
13 | * names of its contributors may be used to endorse or promote products | 13 | * names of its contributors may be used to endorse or promote products |
14 | * derived from this software without specific prior written permission. | 14 | * derived from this software without specific prior written permission. |
15 | * | 15 | * |
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS AS IS AND ANY | 16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS AS IS AND ANY |
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | 17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | 19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY |
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | 20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 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 | 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 | 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 | 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. | 25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | * | 26 | * |
27 | */ | 27 | */ |
28 | 28 | ||
29 | using System; | 29 | using System; |
30 | using System.Collections.Generic; | 30 | using System.Collections.Generic; |
31 | using System.Runtime.Remoting.Lifetime; | 31 | using System.Runtime.Remoting.Lifetime; |
32 | using System.Text; | 32 | using System.Text; |
33 | using System.Threading; | 33 | using System.Threading; |
34 | using Axiom.Math; | 34 | using Axiom.Math; |
35 | using libsecondlife; | 35 | using libsecondlife; |
36 | using OpenSim.Framework; | 36 | using OpenSim.Framework; |
37 | using OpenSim.Region.Environment.Interfaces; | 37 | using OpenSim.Region.Environment.Interfaces; |
38 | using OpenSim.Region.Environment.Scenes; | 38 | using OpenSim.Region.Environment.Scenes; |
39 | using OpenSim.Region.ScriptEngine.Common; | 39 | using OpenSim.Region.ScriptEngine.Common; |
40 | using OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL; | 40 | //using OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL; |
41 | 41 | ||
42 | namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler | 42 | namespace OpenSim.Region.ScriptEngine.Common |
43 | { | 43 | { |
44 | // | 44 | /// <summary> |
45 | // !!!IMPORTANT!!! | 45 | /// Contains all LSL ll-functions. This class will be in Default AppDomain. |
46 | // | 46 | /// </summary> |
47 | // REMEMBER TO UPDATE http://opensimulator.org/wiki/LlFunction_implementation_status | 47 | public class LSL_BuiltIn_Commands : MarshalByRefObject, LSL_BuiltIn_Commands_Interface |
48 | // | 48 | { |
49 | 49 | private ASCIIEncoding enc = new ASCIIEncoding(); | |
50 | // Notes: | 50 | private ScriptEngineBase.ScriptEngine m_ScriptEngine; |
51 | // * If any function here needs to execute a LSL event in the script, use instance of "EventQueueManager" in "ScriptEngine". | 51 | private SceneObjectPart m_host; |
52 | // * If any function here needs to do some more advanced stuff like waiting for IO callbacks or similar that takes a long time then use "llSetTimerEvent" function as example. | 52 | private uint m_localID; |
53 | // There is a class called "LSLLongCmdHandler" that is used for long LSL commands. | 53 | private LLUUID m_itemID; |
54 | 54 | private bool throwErrorOnNotImplemented = true; | |
55 | 55 | ||
56 | /// <summary> | 56 | public LSL_BuiltIn_Commands(ScriptEngineBase.ScriptEngine ScriptEngine, SceneObjectPart host, uint localID, LLUUID itemID) |
57 | /// Contains all LSL ll-functions. This class will be in Default AppDomain. | 57 | { |
58 | /// </summary> | 58 | m_ScriptEngine = ScriptEngine; |
59 | public class LSL_BuiltIn_Commands : MarshalByRefObject, LSL_BuiltIn_Commands_Interface | 59 | m_host = host; |
60 | { | 60 | m_localID = localID; |
61 | private ASCIIEncoding enc = new ASCIIEncoding(); | 61 | m_itemID = itemID; |
62 | private ScriptEngine m_ScriptEngine; | 62 | |
63 | private SceneObjectPart m_host; | 63 | //MainLog.Instance.Notice("ScriptEngine", "LSL_BaseClass.Start() called. Hosted by [" + m_host.Name + ":" + m_host.UUID + "@" + m_host.AbsolutePosition + "]"); |
64 | private uint m_localID; | 64 | } |
65 | private LLUUID m_itemID; | 65 | |
66 | private bool throwErrorOnNotImplemented = true; | 66 | private DateTime m_timer = DateTime.Now; |
67 | 67 | private string m_state = "default"; | |
68 | public LSL_BuiltIn_Commands(ScriptEngine ScriptEngine, SceneObjectPart host, uint localID, LLUUID itemID) | 68 | |
69 | { | 69 | public string State() |
70 | m_ScriptEngine = ScriptEngine; | 70 | { |
71 | m_host = host; | 71 | return m_state; |
72 | m_localID = localID; | 72 | } |
73 | m_itemID = itemID; | 73 | |
74 | 74 | // Object never expires | |
75 | //MainLog.Instance.Notice("ScriptEngine", "LSL_BaseClass.Start() called. Hosted by [" + m_host.Name + ":" + m_host.UUID + "@" + m_host.AbsolutePosition + "]"); | 75 | public override Object InitializeLifetimeService() |
76 | } | 76 | { |
77 | 77 | //Console.WriteLine("LSL_BuiltIn_Commands: InitializeLifetimeService()"); | |
78 | private DateTime m_timer = DateTime.Now; | 78 | // return null; |
79 | private string m_state = "default"; | 79 | ILease lease = (ILease)base.InitializeLifetimeService(); |
80 | 80 | ||
81 | public string State() | 81 | if (lease.CurrentState == LeaseState.Initial) |
82 | { | 82 | { |
83 | return m_state; | 83 | lease.InitialLeaseTime = TimeSpan.Zero; // TimeSpan.FromMinutes(1); |
84 | } | 84 | // lease.SponsorshipTimeout = TimeSpan.FromMinutes(2); |
85 | 85 | // lease.RenewOnCallTime = TimeSpan.FromSeconds(2); | |
86 | // Object never expires | 86 | } |
87 | public override Object InitializeLifetimeService() | 87 | return lease; |
88 | { | 88 | } |
89 | //Console.WriteLine("LSL_BuiltIn_Commands: InitializeLifetimeService()"); | 89 | |
90 | // return null; | 90 | public Scene World |
91 | ILease lease = (ILease)base.InitializeLifetimeService(); | 91 | { |
92 | 92 | get { return m_ScriptEngine.World; } | |
93 | if (lease.CurrentState == LeaseState.Initial) | 93 | } |
94 | { | 94 | |
95 | lease.InitialLeaseTime = TimeSpan.Zero; // TimeSpan.FromMinutes(1); | 95 | //These are the implementations of the various ll-functions used by the LSL scripts. |
96 | // lease.SponsorshipTimeout = TimeSpan.FromMinutes(2); | 96 | //starting out, we use the System.Math library for trig functions. - ckrinke 8-14-07 |
97 | // lease.RenewOnCallTime = TimeSpan.FromSeconds(2); | 97 | public double llSin(double f) |
98 | } | 98 | { |
99 | return lease; | 99 | |
100 | } | 100 | return (double)Math.Sin(f); |
101 | 101 | } | |
102 | public Scene World | 102 | |
103 | { | 103 | public double llCos(double f) |
104 | get { return m_ScriptEngine.World; } | 104 | { |
105 | } | 105 | return (double)Math.Cos(f); |
106 | 106 | } | |
107 | //These are the implementations of the various ll-functions used by the LSL scripts. | 107 | |
108 | //starting out, we use the System.Math library for trig functions. - ckrinke 8-14-07 | 108 | public double llTan(double f) |
109 | public double llSin(double f) | 109 | { |
110 | { | 110 | return (double)Math.Tan(f); |
111 | 111 | } | |
112 | return (double)Math.Sin(f); | 112 | |
113 | } | 113 | public double llAtan2(double x, double y) |
114 | 114 | { | |
115 | public double llCos(double f) | 115 | return (double)Math.Atan2(y, x); |
116 | { | 116 | } |
117 | return (double)Math.Cos(f); | 117 | |
118 | } | 118 | public double llSqrt(double f) |
119 | 119 | { | |
120 | public double llTan(double f) | 120 | return (double)Math.Sqrt(f); |
121 | { | 121 | } |
122 | return (double)Math.Tan(f); | 122 | |
123 | } | 123 | public double llPow(double fbase, double fexponent) |
124 | 124 | { | |
125 | public double llAtan2(double x, double y) | 125 | return (double)Math.Pow(fbase, fexponent); |
126 | { | 126 | } |
127 | return (double)Math.Atan2(y, x); | 127 | |
128 | } | 128 | public int llAbs(int i) |
129 | 129 | { | |
130 | public double llSqrt(double f) | 130 | return (int)Math.Abs(i); |
131 | { | 131 | } |
132 | return (double)Math.Sqrt(f); | 132 | |
133 | } | 133 | public double llFabs(double f) |
134 | 134 | { | |
135 | public double llPow(double fbase, double fexponent) | 135 | return (double)Math.Abs(f); |
136 | { | 136 | } |
137 | return (double)Math.Pow(fbase, fexponent); | 137 | |
138 | } | 138 | public double llFrand(double mag) |
139 | 139 | { | |
140 | public int llAbs(int i) | 140 | lock (Util.RandomClass) |
141 | { | 141 | { |
142 | return (int)Math.Abs(i); | 142 | return Util.RandomClass.NextDouble() * mag; |
143 | } | 143 | } |
144 | 144 | } | |
145 | public double llFabs(double f) | 145 | |
146 | { | 146 | public int llFloor(double f) |
147 | return (double)Math.Abs(f); | 147 | { |
148 | } | 148 | return (int)Math.Floor(f); |
149 | 149 | } | |
150 | public double llFrand(double mag) | 150 | |
151 | { | 151 | public int llCeil(double f) |
152 | lock (Util.RandomClass) | 152 | { |
153 | { | 153 | return (int)Math.Ceiling(f); |
154 | return Util.RandomClass.NextDouble() * mag; | 154 | } |
155 | } | 155 | |
156 | } | 156 | public int llRound(double f) |
157 | 157 | { | |
158 | public int llFloor(double f) | 158 | return (int)Math.Round(f, 0); |
159 | { | 159 | } |
160 | return (int)Math.Floor(f); | 160 | |
161 | } | 161 | //This next group are vector operations involving squaring and square root. ckrinke |
162 | 162 | public double llVecMag(LSL_Types.Vector3 v) | |
163 | public int llCeil(double f) | 163 | { |
164 | { | 164 | return (v.x * v.x + v.y * v.y + v.z * v.z); |
165 | return (int)Math.Ceiling(f); | 165 | } |
166 | } | 166 | |
167 | 167 | public LSL_Types.Vector3 llVecNorm(LSL_Types.Vector3 v) | |
168 | public int llRound(double f) | 168 | { |
169 | { | 169 | double mag = v.x * v.x + v.y * v.y + v.z * v.z; |
170 | return (int)Math.Round(f, 0); | 170 | LSL_Types.Vector3 nor = new LSL_Types.Vector3(); |
171 | } | 171 | nor.x = v.x / mag; |
172 | 172 | nor.y = v.y / mag; | |
173 | //This next group are vector operations involving squaring and square root. ckrinke | 173 | nor.z = v.z / mag; |
174 | public double llVecMag(LSL_Types.Vector3 v) | 174 | return nor; |
175 | { | 175 | } |
176 | return (v.x * v.x + v.y * v.y + v.z * v.z); | 176 | |
177 | } | 177 | public double llVecDist(LSL_Types.Vector3 a, LSL_Types.Vector3 b) |
178 | 178 | { | |
179 | public LSL_Types.Vector3 llVecNorm(LSL_Types.Vector3 v) | 179 | double dx = a.x - b.x; |
180 | { | 180 | double dy = a.y - b.y; |
181 | double mag = v.x * v.x + v.y * v.y + v.z * v.z; | 181 | double dz = a.z - b.z; |
182 | LSL_Types.Vector3 nor = new LSL_Types.Vector3(); | 182 | return Math.Sqrt(dx * dx + dy * dy + dz * dz); |
183 | nor.x = v.x / mag; | 183 | } |
184 | nor.y = v.y / mag; | 184 | |
185 | nor.z = v.z / mag; | 185 | //Now we start getting into quaternions which means sin/cos, matrices and vectors. ckrinke |
186 | return nor; | 186 | public LSL_Types.Vector3 llRot2Euler(LSL_Types.Quaternion r) |
187 | } | 187 | { |
188 | 188 | //This implementation is from http://lslwiki.net/lslwiki/wakka.php?wakka=LibraryRotationFunctions. ckrinke | |
189 | public double llVecDist(LSL_Types.Vector3 a, LSL_Types.Vector3 b) | 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 | { | 190 | double m = (t.x + t.y + t.z + t.s); |
191 | double dx = a.x - b.x; | 191 | if (m == 0) return new LSL_Types.Vector3(); |
192 | double dy = a.y - b.y; | 192 | double n = 2 * (r.y * r.s + r.x * r.z); |
193 | double dz = a.z - b.z; | 193 | double p = m * m - n * n; |
194 | return Math.Sqrt(dx * dx + dy * dy + dz * dz); | 194 | if (p > 0) |
195 | } | 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 | 196 | Math.Atan2(n, Math.Sqrt(p)), | |
197 | //Now we start getting into quaternions which means sin/cos, matrices and vectors. ckrinke | 197 | Math.Atan2(2.0 * (r.z * r.s - r.x * r.y), (t.x - t.y - t.z + t.s))); |
198 | public LSL_Types.Vector3 llRot2Euler(LSL_Types.Quaternion r) | 198 | else if (n > 0) |
199 | { | 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 | //This implementation is from http://lslwiki.net/lslwiki/wakka.php?wakka=LibraryRotationFunctions. ckrinke | 200 | else |
201 | LSL_Types.Quaternion t = new LSL_Types.Quaternion(r.x * r.x, r.y * r.y, r.z * r.z, r.s * r.s); | 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 | double m = (t.x + t.y + t.z + t.s); | 202 | } |
203 | if (m == 0) return new LSL_Types.Vector3(); | 203 | |
204 | double n = 2 * (r.y * r.s + r.x * r.z); | 204 | public LSL_Types.Quaternion llEuler2Rot(LSL_Types.Vector3 v) |
205 | double p = m * m - n * n; | 205 | { |
206 | if (p > 0) | 206 | //this comes from from http://lslwiki.net/lslwiki/wakka.php?wakka=LibraryRotationFunctions but is incomplete as of 8/19/07 |
207 | return new LSL_Types.Vector3(Math.Atan2(2.0 * (r.x * r.s - r.y * r.z), (-t.x - t.y + t.z + t.s)), | 207 | float err = 0.00001f; |
208 | Math.Atan2(n, Math.Sqrt(p)), | 208 | double ax = Math.Sin(v.x / 2); |
209 | Math.Atan2(2.0 * (r.z * r.s - r.x * r.y), (t.x - t.y - t.z + t.s))); | 209 | double aw = Math.Cos(v.x / 2); |
210 | else if (n > 0) | 210 | double by = Math.Sin(v.y / 2); |
211 | return new LSL_Types.Vector3(0.0, Math.PI / 2, Math.Atan2((r.z * r.s + r.x * r.y), 0.5 - t.x - t.z)); | 211 | double bw = Math.Cos(v.y / 2); |
212 | else | 212 | double cz = Math.Sin(v.z / 2); |
213 | return new LSL_Types.Vector3(0.0, -Math.PI / 2, Math.Atan2((r.z * r.s + r.x * r.y), 0.5 - t.x - t.z)); | 213 | double cw = Math.Cos(v.z / 2); |
214 | } | 214 | LSL_Types.Quaternion a1 = new LSL_Types.Quaternion(0.0, 0.0, cz, cw); |
215 | 215 | LSL_Types.Quaternion a2 = new LSL_Types.Quaternion(0.0, by, 0.0, bw); | |
216 | public LSL_Types.Quaternion llEuler2Rot(LSL_Types.Vector3 v) | 216 | LSL_Types.Quaternion a3 = new LSL_Types.Quaternion(ax, 0.0, 0.0, aw); |
217 | { | 217 | LSL_Types.Quaternion a = (a1 * a2) * a3; |
218 | //this comes from from http://lslwiki.net/lslwiki/wakka.php?wakka=LibraryRotationFunctions but is incomplete as of 8/19/07 | 218 | //This multiplication doesnt compile, yet. a = a1 * a2 * a3; |
219 | float err = 0.00001f; | 219 | LSL_Types.Quaternion b = new LSL_Types.Quaternion(ax * bw * cw + aw * by * cz, |
220 | double ax = Math.Sin(v.x / 2); | 220 | aw * by * cw - ax * bw * cz, aw * bw * cz + ax * by * cw, |
221 | double aw = Math.Cos(v.x / 2); | 221 | aw * bw * cw - ax * by * cz); |
222 | double by = Math.Sin(v.y / 2); | 222 | LSL_Types.Quaternion c = new LSL_Types.Quaternion(); |
223 | double bw = Math.Cos(v.y / 2); | 223 | //This addition doesnt compile yet c = a + b; |
224 | double cz = Math.Sin(v.z / 2); | 224 | LSL_Types.Quaternion d = new LSL_Types.Quaternion(); |
225 | double cw = Math.Cos(v.z / 2); | 225 | //This addition doesnt compile yet d = a - b; |
226 | LSL_Types.Quaternion a1 = new LSL_Types.Quaternion(0.0, 0.0, cz, cw); | 226 | if ((Math.Abs(c.x) > err && Math.Abs(d.x) > err) || |
227 | LSL_Types.Quaternion a2 = new LSL_Types.Quaternion(0.0, by, 0.0, bw); | 227 | (Math.Abs(c.y) > err && Math.Abs(d.y) > err) || |
228 | LSL_Types.Quaternion a3 = new LSL_Types.Quaternion(ax, 0.0, 0.0, aw); | 228 | (Math.Abs(c.z) > err && Math.Abs(d.z) > err) || |
229 | LSL_Types.Quaternion a = (a1 * a2) * a3; | 229 | (Math.Abs(c.s) > err && Math.Abs(d.s) > err)) |
230 | //This multiplication doesnt compile, yet. a = a1 * a2 * a3; | 230 | { |
231 | LSL_Types.Quaternion b = new LSL_Types.Quaternion(ax * bw * cw + aw * by * cz, | 231 | return b; |
232 | aw * by * cw - ax * bw * cz, aw * bw * cz + ax * by * cw, | 232 | //return a new Quaternion that is null until I figure this out |
233 | aw * bw * cw - ax * by * cz); | 233 | // return b; |
234 | LSL_Types.Quaternion c = new LSL_Types.Quaternion(); | 234 | // return a; |
235 | //This addition doesnt compile yet c = a + b; | 235 | } |
236 | LSL_Types.Quaternion d = new LSL_Types.Quaternion(); | 236 | return a; |
237 | //This addition doesnt compile yet d = a - b; | 237 | } |
238 | if ((Math.Abs(c.x) > err && Math.Abs(d.x) > err) || | 238 | |
239 | (Math.Abs(c.y) > err && Math.Abs(d.y) > err) || | 239 | public LSL_Types.Quaternion llAxes2Rot(LSL_Types.Vector3 fwd, LSL_Types.Vector3 left, LSL_Types.Vector3 up) |
240 | (Math.Abs(c.z) > err && Math.Abs(d.z) > err) || | 240 | { |
241 | (Math.Abs(c.s) > err && Math.Abs(d.s) > err)) | 241 | return new LSL_Types.Quaternion(); |
242 | { | 242 | } |
243 | return b; | 243 | |
244 | //return a new Quaternion that is null until I figure this out | 244 | public LSL_Types.Vector3 llRot2Fwd(LSL_Types.Quaternion r) |
245 | // return b; | 245 | { |
246 | // return a; | 246 | return new LSL_Types.Vector3(); |
247 | } | 247 | } |
248 | return a; | 248 | |
249 | } | 249 | public LSL_Types.Vector3 llRot2Left(LSL_Types.Quaternion r) |
250 | 250 | { | |
251 | public LSL_Types.Quaternion llAxes2Rot(LSL_Types.Vector3 fwd, LSL_Types.Vector3 left, LSL_Types.Vector3 up) | 251 | return new LSL_Types.Vector3(); |
252 | { | 252 | } |
253 | return new LSL_Types.Quaternion(); | 253 | |
254 | } | 254 | public LSL_Types.Vector3 llRot2Up(LSL_Types.Quaternion r) |
255 | 255 | { | |
256 | public LSL_Types.Vector3 llRot2Fwd(LSL_Types.Quaternion r) | 256 | return new LSL_Types.Vector3(); |
257 | { | 257 | } |
258 | return new LSL_Types.Vector3(); | 258 | public LSL_Types.Quaternion llRotBetween(LSL_Types.Vector3 a, LSL_Types.Vector3 b) |
259 | } | 259 | { |
260 | 260 | //A and B should both be normalized | |
261 | public LSL_Types.Vector3 llRot2Left(LSL_Types.Quaternion r) | 261 | |
262 | { | 262 | double dotProduct = LSL_Types.Vector3.Dot(a, b); |
263 | return new LSL_Types.Vector3(); | 263 | LSL_Types.Vector3 crossProduct = LSL_Types.Vector3.Cross(a, b); |
264 | } | 264 | double magProduct = LSL_Types.Vector3.Mag(a) * LSL_Types.Vector3.Mag(b); |
265 | 265 | double angle = Math.Acos(dotProduct / magProduct); | |
266 | public LSL_Types.Vector3 llRot2Up(LSL_Types.Quaternion r) | 266 | LSL_Types.Vector3 axis = LSL_Types.Vector3.Norm(crossProduct); |
267 | { | 267 | double s = Math.Sin(angle / 2); |
268 | return new LSL_Types.Vector3(); | 268 | |
269 | } | 269 | return new LSL_Types.Quaternion(axis.x * s, axis.y * s, axis.z * s, (float)Math.Cos(angle / 2)); |
270 | public LSL_Types.Quaternion llRotBetween(LSL_Types.Vector3 a, LSL_Types.Vector3 b) | 270 | } |
271 | { | 271 | public void llWhisper(int channelID, string text) |
272 | //A and B should both be normalized | 272 | { |
273 | 273 | World.SimChat(Helpers.StringToField(text), | |
274 | double dotProduct = LSL_Types.Vector3.Dot(a, b); | 274 | ChatTypeEnum.Whisper, channelID, m_host.AbsolutePosition, m_host.Name, m_host.UUID); |
275 | LSL_Types.Vector3 crossProduct = LSL_Types.Vector3.Cross(a, b); | 275 | |
276 | double magProduct = LSL_Types.Vector3.Mag(a) * LSL_Types.Vector3.Mag(b); | 276 | IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); |
277 | double angle = Math.Acos(dotProduct / magProduct); | 277 | wComm.DeliverMessage(m_host.UUID.ToString(), ChatTypeEnum.Whisper, channelID, m_host.Name, text); |
278 | LSL_Types.Vector3 axis = LSL_Types.Vector3.Norm(crossProduct); | 278 | } |
279 | double s = Math.Sin(angle / 2); | 279 | |
280 | 280 | public void llSay(int channelID, string text) | |
281 | return new LSL_Types.Quaternion(axis.x * s, axis.y * s, axis.z * s, (float)Math.Cos(angle / 2)); | 281 | { |
282 | } | 282 | World.SimChat(Helpers.StringToField(text), |
283 | public void llWhisper(int channelID, string text) | 283 | ChatTypeEnum.Say, channelID, m_host.AbsolutePosition, m_host.Name, m_host.UUID); |
284 | { | 284 | |
285 | World.SimChat(Helpers.StringToField(text), | 285 | IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); |
286 | ChatTypeEnum.Whisper, channelID, m_host.AbsolutePosition, m_host.Name, m_host.UUID); | 286 | wComm.DeliverMessage(m_host.UUID.ToString(), ChatTypeEnum.Say, channelID, m_host.Name, text); |
287 | 287 | } | |
288 | IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); | 288 | |
289 | wComm.DeliverMessage(m_host.UUID.ToString(), ChatTypeEnum.Whisper, channelID, m_host.Name, text); | 289 | public void llShout(int channelID, string text) |
290 | } | 290 | { |
291 | 291 | World.SimChat(Helpers.StringToField(text), | |
292 | public void llSay(int channelID, string text) | 292 | ChatTypeEnum.Shout, channelID, m_host.AbsolutePosition, m_host.Name, m_host.UUID); |
293 | { | 293 | |
294 | World.SimChat(Helpers.StringToField(text), | 294 | IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); |
295 | ChatTypeEnum.Say, channelID, m_host.AbsolutePosition, m_host.Name, m_host.UUID); | 295 | wComm.DeliverMessage(m_host.UUID.ToString(), ChatTypeEnum.Shout, channelID, m_host.Name, text); |
296 | 296 | } | |
297 | IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); | 297 | |
298 | wComm.DeliverMessage(m_host.UUID.ToString(), ChatTypeEnum.Say, channelID, m_host.Name, text); | 298 | public int llListen(int channelID, string name, string ID, string msg) |
299 | } | 299 | { |
300 | 300 | if (ID == "") | |
301 | public void llShout(int channelID, string text) | 301 | { |
302 | { | 302 | ID = LLUUID.Zero.ToString(); |
303 | World.SimChat(Helpers.StringToField(text), | 303 | } |
304 | ChatTypeEnum.Shout, channelID, m_host.AbsolutePosition, m_host.Name, m_host.UUID); | 304 | IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); |
305 | 305 | return wComm.Listen(m_localID, m_itemID, m_host.UUID, channelID, name, ID, msg); | |
306 | IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); | 306 | } |
307 | wComm.DeliverMessage(m_host.UUID.ToString(), ChatTypeEnum.Shout, channelID, m_host.Name, text); | 307 | |
308 | } | 308 | public void llListenControl(int number, int active) |
309 | 309 | { | |
310 | public int llListen(int channelID, string name, string ID, string msg) | 310 | IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); |
311 | { | 311 | wComm.ListenControl(number, active); |
312 | if (ID == "") | 312 | } |
313 | { | 313 | |
314 | ID = LLUUID.Zero.ToString(); | 314 | public void llListenRemove(int number) |
315 | } | 315 | { |
316 | IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); | 316 | IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); |
317 | return wComm.Listen(m_localID, m_itemID, m_host.UUID, channelID, name, ID, msg); | 317 | wComm.ListenRemove(number); |
318 | } | 318 | } |
319 | 319 | ||
320 | public void llListenControl(int number, int active) | 320 | public void llSensor(string name, string id, int type, double range, double arc) |
321 | { | 321 | { |
322 | IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); | 322 | NotImplemented("llSensor"); |
323 | wComm.ListenControl(number, active); | 323 | return; |
324 | } | 324 | } |
325 | 325 | ||
326 | public void llListenRemove(int number) | 326 | public void llSensorRepeat(string name, string id, int type, double range, double arc, double rate) |
327 | { | 327 | { |
328 | IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); | 328 | NotImplemented("llSensorRepeat"); |
329 | wComm.ListenRemove(number); | 329 | return; |
330 | } | 330 | } |
331 | 331 | ||
332 | public void llSensor(string name, string id, int type, double range, double arc) | 332 | public void llSensorRemove() |
333 | { | 333 | { |
334 | NotImplemented("llSensor"); | 334 | NotImplemented("llSensorRemove"); |
335 | return; | 335 | return; |
336 | } | 336 | } |
337 | 337 | ||
338 | public void llSensorRepeat(string name, string id, int type, double range, double arc, double rate) | 338 | public string llDetectedName(int number) |
339 | { | 339 | { |
340 | NotImplemented("llSensorRepeat"); | 340 | NotImplemented("llDetectedName"); |
341 | return; | 341 | return ""; |
342 | } | 342 | } |
343 | 343 | ||
344 | public void llSensorRemove() | 344 | public string llDetectedKey(int number) |
345 | { | 345 | { |
346 | NotImplemented("llSensorRemove"); | 346 | NotImplemented("llDetectedKey"); |
347 | return; | 347 | return ""; |
348 | } | 348 | } |
349 | 349 | ||
350 | public string llDetectedName(int number) | 350 | public string llDetectedOwner(int number) |
351 | { | 351 | { |
352 | NotImplemented("llDetectedName"); | 352 | NotImplemented("llDetectedOwner"); |
353 | return ""; | 353 | return ""; |
354 | } | 354 | } |
355 | 355 | ||
356 | public string llDetectedKey(int number) | 356 | public int llDetectedType(int number) |
357 | { | 357 | { |
358 | NotImplemented("llDetectedKey"); | 358 | NotImplemented("llDetectedType"); |
359 | return ""; | 359 | return 0; |
360 | } | 360 | } |
361 | 361 | ||
362 | public string llDetectedOwner(int number) | 362 | public LSL_Types.Vector3 llDetectedPos(int number) |
363 | { | 363 | { |
364 | NotImplemented("llDetectedOwner"); | 364 | NotImplemented("llDetectedPos"); |
365 | return ""; | 365 | return new LSL_Types.Vector3(); |
366 | } | 366 | } |
367 | 367 | ||
368 | public int llDetectedType(int number) | 368 | public LSL_Types.Vector3 llDetectedVel(int number) |
369 | { | 369 | { |
370 | NotImplemented("llDetectedType"); | 370 | NotImplemented("llDetectedVel"); |
371 | return 0; | 371 | return new LSL_Types.Vector3(); |
372 | } | 372 | } |
373 | 373 | ||
374 | public LSL_Types.Vector3 llDetectedPos(int number) | 374 | public LSL_Types.Vector3 llDetectedGrab(int number) |
375 | { | 375 | { |
376 | NotImplemented("llDetectedPos"); | 376 | NotImplemented("llDetectedGrab"); |
377 | return new LSL_Types.Vector3(); | 377 | return new LSL_Types.Vector3(); |
378 | } | 378 | } |
379 | 379 | ||
380 | public LSL_Types.Vector3 llDetectedVel(int number) | 380 | public LSL_Types.Quaternion llDetectedRot(int number) |
381 | { | 381 | { |
382 | NotImplemented("llDetectedVel"); | 382 | NotImplemented("llDetectedRot"); |
383 | return new LSL_Types.Vector3(); | 383 | return new LSL_Types.Quaternion(); |
384 | } | 384 | } |
385 | 385 | ||
386 | public LSL_Types.Vector3 llDetectedGrab(int number) | 386 | public int llDetectedGroup(int number) |
387 | { | 387 | { |
388 | NotImplemented("llDetectedGrab"); | 388 | NotImplemented("llDetectedGroup"); |
389 | return new LSL_Types.Vector3(); | 389 | return 0; |
390 | } | 390 | } |
391 | 391 | ||
392 | public LSL_Types.Quaternion llDetectedRot(int number) | 392 | public int llDetectedLinkNumber(int number) |
393 | { | 393 | { |
394 | NotImplemented("llDetectedRot"); | 394 | NotImplemented("llDetectedLinkNumber"); |
395 | return new LSL_Types.Quaternion(); | 395 | return 0; |
396 | } | 396 | } |
397 | 397 | ||
398 | public int llDetectedGroup(int number) | 398 | public void llDie() |
399 | { | 399 | { |
400 | NotImplemented("llDetectedGroup"); | 400 | World.DeleteSceneObjectGroup(m_host.ParentGroup); |
401 | return 0; | 401 | return; |
402 | } | 402 | } |
403 | 403 | ||
404 | public int llDetectedLinkNumber(int number) | 404 | public double llGround(LSL_Types.Vector3 offset) |
405 | { | 405 | { |
406 | NotImplemented("llDetectedLinkNumber"); | 406 | int x = (int)(m_host.AbsolutePosition.X + offset.x); |
407 | return 0; | 407 | int y = (int)(m_host.AbsolutePosition.Y + offset.y); |
408 | } | 408 | return World.GetLandHeight(x, y); |
409 | 409 | } | |
410 | public void llDie() | 410 | |
411 | { | 411 | public double llCloud(LSL_Types.Vector3 offset) |
412 | World.DeleteSceneObjectGroup(m_host.ParentGroup); | 412 | { |
413 | return; | 413 | NotImplemented("llCloud"); |
414 | } | 414 | return 0; |
415 | 415 | } | |
416 | public double llGround(LSL_Types.Vector3 offset) | 416 | |
417 | { | 417 | public LSL_Types.Vector3 llWind(LSL_Types.Vector3 offset) |
418 | int x = (int)(m_host.AbsolutePosition.X + offset.x); | 418 | { |
419 | int y = (int)(m_host.AbsolutePosition.Y + offset.y); | 419 | NotImplemented("llWind"); |
420 | return World.GetLandHeight(x, y); | 420 | return new LSL_Types.Vector3(); |
421 | } | 421 | } |
422 | 422 | ||
423 | public double llCloud(LSL_Types.Vector3 offset) | 423 | public void llSetStatus(int status, int value) |
424 | { | 424 | { |
425 | NotImplemented("llCloud"); | 425 | NotImplemented("llSetStatus"); |
426 | return 0; | 426 | return; |
427 | } | 427 | } |
428 | 428 | ||
429 | public LSL_Types.Vector3 llWind(LSL_Types.Vector3 offset) | 429 | public int llGetStatus(int status) |
430 | { | 430 | { |
431 | NotImplemented("llWind"); | 431 | NotImplemented("llGetStatus"); |
432 | return new LSL_Types.Vector3(); | 432 | return 0; |
433 | } | 433 | } |
434 | 434 | ||
435 | public void llSetStatus(int status, int value) | 435 | public void llSetScale(LSL_Types.Vector3 scale) |
436 | { | 436 | { |
437 | NotImplemented("llSetStatus"); | 437 | // TODO: this needs to trigger a persistance save as well |
438 | return; | 438 | LLVector3 tmp = m_host.Scale; |
439 | } | 439 | tmp.X = (float)scale.x; |
440 | 440 | tmp.Y = (float)scale.y; | |
441 | public int llGetStatus(int status) | 441 | tmp.Z = (float)scale.z; |
442 | { | 442 | m_host.Scale = tmp; |
443 | NotImplemented("llGetStatus"); | 443 | m_host.SendFullUpdateToAllClients(); |
444 | return 0; | 444 | return; |
445 | } | 445 | } |
446 | 446 | ||
447 | public void llSetScale(LSL_Types.Vector3 scale) | 447 | public LSL_Types.Vector3 llGetScale() |
448 | { | 448 | { |
449 | // TODO: this needs to trigger a persistance save as well | 449 | return new LSL_Types.Vector3(m_host.Scale.X, m_host.Scale.Y, m_host.Scale.Z); |
450 | LLVector3 tmp = m_host.Scale; | 450 | } |
451 | tmp.X = (float)scale.x; | 451 | |
452 | tmp.Y = (float)scale.y; | 452 | public void llSetColor(LSL_Types.Vector3 color, int face) |
453 | tmp.Z = (float)scale.z; | 453 | { |
454 | m_host.Scale = tmp; | 454 | LLObject.TextureEntry tex = m_host.Shape.Textures; |
455 | m_host.SendFullUpdateToAllClients(); | 455 | LLColor texcolor; |
456 | return; | 456 | if (face > -1) |
457 | } | 457 | { |
458 | 458 | texcolor = tex.CreateFace((uint)face).RGBA; | |
459 | public LSL_Types.Vector3 llGetScale() | 459 | texcolor.R = (float)Math.Abs(color.x - 1); |
460 | { | 460 | texcolor.G = (float)Math.Abs(color.y - 1); |
461 | return new LSL_Types.Vector3(m_host.Scale.X, m_host.Scale.Y, m_host.Scale.Z); | 461 | texcolor.B = (float)Math.Abs(color.z - 1); |
462 | } | 462 | tex.FaceTextures[face].RGBA = texcolor; |
463 | 463 | m_host.UpdateTexture(tex); | |
464 | public void llSetColor(LSL_Types.Vector3 color, int face) | 464 | return; |
465 | { | 465 | } |
466 | LLObject.TextureEntry tex = m_host.Shape.Textures; | 466 | else if (face == -1) |
467 | LLColor texcolor; | 467 | { |
468 | if (face > -1) | 468 | for (uint i = 0; i < 32; i++) |
469 | { | 469 | { |
470 | texcolor = tex.CreateFace((uint)face).RGBA; | 470 | if (tex.FaceTextures[i] != null) |
471 | texcolor.R = (float)Math.Abs(color.x - 1); | 471 | { |
472 | texcolor.G = (float)Math.Abs(color.y - 1); | 472 | texcolor = tex.FaceTextures[i].RGBA; |
473 | texcolor.B = (float)Math.Abs(color.z - 1); | 473 | texcolor.R = (float)Math.Abs(color.x - 1); |
474 | tex.FaceTextures[face].RGBA = texcolor; | 474 | texcolor.G = (float)Math.Abs(color.y - 1); |
475 | m_host.UpdateTexture(tex); | 475 | texcolor.B = (float)Math.Abs(color.z - 1); |
476 | return; | 476 | tex.FaceTextures[i].RGBA = texcolor; |
477 | } | 477 | } |
478 | else if (face == -1) | 478 | texcolor = tex.DefaultTexture.RGBA; |
479 | { | 479 | texcolor.R = (float)Math.Abs(color.x - 1); |
480 | for (uint i = 0; i < 32; i++) | 480 | texcolor.G = (float)Math.Abs(color.y - 1); |
481 | { | 481 | texcolor.B = (float)Math.Abs(color.z - 1); |
482 | if (tex.FaceTextures[i] != null) | 482 | tex.DefaultTexture.RGBA = texcolor; |
483 | { | 483 | } |
484 | texcolor = tex.FaceTextures[i].RGBA; | 484 | m_host.UpdateTexture(tex); |
485 | texcolor.R = (float)Math.Abs(color.x - 1); | 485 | return; |
486 | texcolor.G = (float)Math.Abs(color.y - 1); | 486 | } |
487 | texcolor.B = (float)Math.Abs(color.z - 1); | 487 | NotImplemented("llSetColor"); |
488 | tex.FaceTextures[i].RGBA = texcolor; | 488 | return; |
489 | } | 489 | } |
490 | texcolor = tex.DefaultTexture.RGBA; | 490 | |
491 | texcolor.R = (float)Math.Abs(color.x - 1); | 491 | public double llGetAlpha(int face) |
492 | texcolor.G = (float)Math.Abs(color.y - 1); | 492 | { |
493 | texcolor.B = (float)Math.Abs(color.z - 1); | 493 | LLObject.TextureEntry tex = m_host.Shape.Textures; |
494 | tex.DefaultTexture.RGBA = texcolor; | 494 | if (face == -1) // TMP: Until we can determine number of sides, ALL_SIDES (-1) will return default color |
495 | } | 495 | { |
496 | m_host.UpdateTexture(tex); | 496 | return (double)((tex.DefaultTexture.RGBA.A * 255) / 255); |
497 | return; | 497 | } |
498 | } | 498 | if (face > -1) |
499 | NotImplemented("llSetColor"); | 499 | { |
500 | return; | 500 | return (double)((tex.GetFace((uint)face).RGBA.A * 255) / 255); |
501 | } | 501 | } |
502 | 502 | return 0; | |
503 | public double llGetAlpha(int face) | 503 | } |
504 | { | 504 | |
505 | LLObject.TextureEntry tex = m_host.Shape.Textures; | 505 | public void llSetAlpha(double alpha, int face) |
506 | if (face == -1) // TMP: Until we can determine number of sides, ALL_SIDES (-1) will return default color | 506 | { |
507 | { | 507 | LLObject.TextureEntry tex = m_host.Shape.Textures; |
508 | return (double)((tex.DefaultTexture.RGBA.A * 255) / 255); | 508 | LLColor texcolor; |
509 | } | 509 | if (face > -1) |
510 | if (face > -1) | 510 | { |
511 | { | 511 | texcolor = tex.CreateFace((uint)face).RGBA; |
512 | return (double)((tex.GetFace((uint)face).RGBA.A * 255) / 255); | 512 | texcolor.A = (float)Math.Abs(alpha - 1); |
513 | } | 513 | tex.FaceTextures[face].RGBA = texcolor; |
514 | return 0; | 514 | m_host.UpdateTexture(tex); |
515 | } | 515 | return; |
516 | 516 | } | |
517 | public void llSetAlpha(double alpha, int face) | 517 | else if (face == -1) |
518 | { | 518 | { |
519 | LLObject.TextureEntry tex = m_host.Shape.Textures; | 519 | for (int i = 0; i < 32; i++) |
520 | LLColor texcolor; | 520 | { |
521 | if (face > -1) | 521 | if (tex.FaceTextures[i] != null) |
522 | { | 522 | { |
523 | texcolor = tex.CreateFace((uint)face).RGBA; | 523 | texcolor = tex.FaceTextures[i].RGBA; |
524 | texcolor.A = (float)Math.Abs(alpha - 1); | 524 | texcolor.A = (float)Math.Abs(alpha - 1); |
525 | tex.FaceTextures[face].RGBA = texcolor; | 525 | tex.FaceTextures[i].RGBA = texcolor; |
526 | m_host.UpdateTexture(tex); | 526 | } |
527 | return; | 527 | } |
528 | } | 528 | texcolor = tex.DefaultTexture.RGBA; |
529 | else if (face == -1) | 529 | texcolor.A = (float)Math.Abs(alpha - 1); |
530 | { | 530 | tex.DefaultTexture.RGBA = texcolor; |
531 | for (int i = 0; i < 32; i++) | 531 | m_host.UpdateTexture(tex); |
532 | { | 532 | return; |
533 | if (tex.FaceTextures[i] != null) | 533 | } |
534 | { | 534 | NotImplemented("llSetAlpha"); |
535 | texcolor = tex.FaceTextures[i].RGBA; | 535 | return; |
536 | texcolor.A = (float)Math.Abs(alpha - 1); | 536 | } |
537 | tex.FaceTextures[i].RGBA = texcolor; | 537 | |
538 | } | 538 | public LSL_Types.Vector3 llGetColor(int face) |
539 | } | 539 | { |
540 | texcolor = tex.DefaultTexture.RGBA; | 540 | LLObject.TextureEntry tex = m_host.Shape.Textures; |
541 | texcolor.A = (float)Math.Abs(alpha - 1); | 541 | LLColor texcolor; |
542 | tex.DefaultTexture.RGBA = texcolor; | 542 | LSL_Types.Vector3 rgb; |
543 | m_host.UpdateTexture(tex); | 543 | if (face == -1) // TMP: Until we can determine number of sides, ALL_SIDES (-1) will return default color |
544 | return; | 544 | { |
545 | } | 545 | texcolor = tex.DefaultTexture.RGBA; |
546 | NotImplemented("llSetAlpha"); | 546 | rgb.x = (255 - (texcolor.R * 255)) / 255; |
547 | return; | 547 | rgb.y = (255 - (texcolor.G * 255)) / 255; |
548 | } | 548 | rgb.z = (255 - (texcolor.B * 255)) / 255; |
549 | 549 | return rgb; | |
550 | public LSL_Types.Vector3 llGetColor(int face) | 550 | } |
551 | { | 551 | if (face > -1) |
552 | LLObject.TextureEntry tex = m_host.Shape.Textures; | 552 | { |
553 | LLColor texcolor; | 553 | texcolor = tex.GetFace((uint)face).RGBA; |
554 | LSL_Types.Vector3 rgb; | 554 | rgb.x = (255 - (texcolor.R * 255)) / 255; |
555 | if (face == -1) // TMP: Until we can determine number of sides, ALL_SIDES (-1) will return default color | 555 | rgb.y = (255 - (texcolor.G * 255)) / 255; |
556 | { | 556 | rgb.z = (255 - (texcolor.B * 255)) / 255; |
557 | texcolor = tex.DefaultTexture.RGBA; | 557 | return rgb; |
558 | rgb.x = (255 - (texcolor.R * 255)) / 255; | 558 | } |
559 | rgb.y = (255 - (texcolor.G * 255)) / 255; | 559 | NotImplemented("llGetColor"); |
560 | rgb.z = (255 - (texcolor.B * 255)) / 255; | 560 | return new LSL_Types.Vector3(); |
561 | return rgb; | 561 | } |
562 | } | 562 | |
563 | if (face > -1) | 563 | public void llSetTexture(string texture, int face) |
564 | { | 564 | { |
565 | texcolor = tex.GetFace((uint)face).RGBA; | 565 | LLObject.TextureEntry tex = m_host.Shape.Textures; |
566 | rgb.x = (255 - (texcolor.R * 255)) / 255; | 566 | |
567 | rgb.y = (255 - (texcolor.G * 255)) / 255; | 567 | if (face > -1) |
568 | rgb.z = (255 - (texcolor.B * 255)) / 255; | 568 | { |
569 | return rgb; | 569 | LLObject.TextureEntryFace texface = tex.CreateFace((uint)face); |
570 | } | 570 | texface.TextureID = new LLUUID(texture); |
571 | NotImplemented("llGetColor"); | 571 | tex.FaceTextures[face] = texface; |
572 | return new LSL_Types.Vector3(); | 572 | m_host.UpdateTexture(tex); |
573 | } | 573 | return; |
574 | 574 | } | |
575 | public void llSetTexture(string texture, int face) | 575 | else if (face == -1) |
576 | { | 576 | { |
577 | LLObject.TextureEntry tex = m_host.Shape.Textures; | 577 | for (uint i = 0; i < 32; i++) |
578 | 578 | { | |
579 | if (face > -1) | 579 | if (tex.FaceTextures[i] != null) |
580 | { | 580 | { |
581 | LLObject.TextureEntryFace texface = tex.CreateFace((uint)face); | 581 | tex.FaceTextures[i].TextureID = new LLUUID(texture); |
582 | texface.TextureID = new LLUUID(texture); | 582 | } |
583 | tex.FaceTextures[face] = texface; | 583 | } |
584 | m_host.UpdateTexture(tex); | 584 | tex.DefaultTexture.TextureID = new LLUUID(texture); |
585 | return; | 585 | m_host.UpdateTexture(tex); |
586 | } | 586 | return; |
587 | else if (face == -1) | 587 | } |
588 | { | 588 | NotImplemented("llSetTexture"); |
589 | for (uint i = 0; i < 32; i++) | 589 | return; |
590 | { | 590 | } |
591 | if (tex.FaceTextures[i] != null) | 591 | |
592 | { | 592 | public void llScaleTexture(double u, double v, int face) |
593 | tex.FaceTextures[i].TextureID = new LLUUID(texture); | 593 | { |
594 | } | 594 | LLObject.TextureEntry tex = m_host.Shape.Textures; |
595 | } | 595 | if (face > -1) |
596 | tex.DefaultTexture.TextureID = new LLUUID(texture); | 596 | { |
597 | m_host.UpdateTexture(tex); | 597 | LLObject.TextureEntryFace texface = tex.CreateFace((uint)face); |
598 | return; | 598 | texface.RepeatU = (float)u; |
599 | } | 599 | texface.RepeatV = (float)v; |
600 | NotImplemented("llSetTexture"); | 600 | tex.FaceTextures[face] = texface; |
601 | return; | 601 | m_host.UpdateTexture(tex); |
602 | } | 602 | return; |
603 | 603 | } | |
604 | public void llScaleTexture(double u, double v, int face) | 604 | if (face == -1) |
605 | { | 605 | { |
606 | LLObject.TextureEntry tex = m_host.Shape.Textures; | 606 | for (int i = 0; i < 32; i++) |
607 | if (face > -1) | 607 | { |
608 | { | 608 | if (tex.FaceTextures[i] != null) |
609 | LLObject.TextureEntryFace texface = tex.CreateFace((uint)face); | 609 | { |
610 | texface.RepeatU = (float)u; | 610 | tex.FaceTextures[i].RepeatU = (float)u; |
611 | texface.RepeatV = (float)v; | 611 | tex.FaceTextures[i].RepeatV = (float)v; |
612 | tex.FaceTextures[face] = texface; | 612 | } |
613 | m_host.UpdateTexture(tex); | 613 | } |
614 | return; | 614 | tex.DefaultTexture.RepeatU = (float)u; |
615 | } | 615 | tex.DefaultTexture.RepeatV = (float)v; |
616 | if (face == -1) | 616 | m_host.UpdateTexture(tex); |
617 | { | 617 | return; |
618 | for (int i = 0; i < 32; i++) | 618 | } |
619 | { | 619 | NotImplemented("llScaleTexture"); |
620 | if (tex.FaceTextures[i] != null) | 620 | return; |
621 | { | 621 | } |
622 | tex.FaceTextures[i].RepeatU = (float)u; | 622 | |
623 | tex.FaceTextures[i].RepeatV = (float)v; | 623 | public void llOffsetTexture(double u, double v, int face) |
624 | } | 624 | { |
625 | } | 625 | LLObject.TextureEntry tex = m_host.Shape.Textures; |
626 | tex.DefaultTexture.RepeatU = (float)u; | 626 | if (face > -1) |
627 | tex.DefaultTexture.RepeatV = (float)v; | 627 | { |
628 | m_host.UpdateTexture(tex); | 628 | LLObject.TextureEntryFace texface = tex.CreateFace((uint)face); |
629 | return; | 629 | texface.OffsetU = (float)u; |
630 | } | 630 | texface.OffsetV = (float)v; |
631 | NotImplemented("llScaleTexture"); | 631 | tex.FaceTextures[face] = texface; |
632 | return; | 632 | m_host.UpdateTexture(tex); |
633 | } | 633 | return; |
634 | 634 | } | |
635 | public void llOffsetTexture(double u, double v, int face) | 635 | if (face == -1) |
636 | { | 636 | { |
637 | LLObject.TextureEntry tex = m_host.Shape.Textures; | 637 | for (int i = 0; i < 32; i++) |
638 | if (face > -1) | 638 | { |
639 | { | 639 | if (tex.FaceTextures[i] != null) |
640 | LLObject.TextureEntryFace texface = tex.CreateFace((uint)face); | 640 | { |
641 | texface.OffsetU = (float)u; | 641 | tex.FaceTextures[i].OffsetU = (float)u; |
642 | texface.OffsetV = (float)v; | 642 | tex.FaceTextures[i].OffsetV = (float)v; |
643 | tex.FaceTextures[face] = texface; | 643 | } |
644 | m_host.UpdateTexture(tex); | 644 | } |
645 | return; | 645 | tex.DefaultTexture.OffsetU = (float)u; |
646 | } | 646 | tex.DefaultTexture.OffsetV = (float)v; |
647 | if (face == -1) | 647 | m_host.UpdateTexture(tex); |
648 | { | 648 | return; |
649 | for (int i = 0; i < 32; i++) | 649 | } |
650 | { | 650 | NotImplemented("llOffsetTexture"); |
651 | if (tex.FaceTextures[i] != null) | 651 | return; |
652 | { | 652 | } |
653 | tex.FaceTextures[i].OffsetU = (float)u; | 653 | |
654 | tex.FaceTextures[i].OffsetV = (float)v; | 654 | public void llRotateTexture(double rotation, int face) |
655 | } | 655 | { |
656 | } | 656 | LLObject.TextureEntry tex = m_host.Shape.Textures; |
657 | tex.DefaultTexture.OffsetU = (float)u; | 657 | if (face > -1) |
658 | tex.DefaultTexture.OffsetV = (float)v; | 658 | { |
659 | m_host.UpdateTexture(tex); | 659 | LLObject.TextureEntryFace texface = tex.CreateFace((uint)face); |
660 | return; | 660 | texface.Rotation = (float)rotation; |
661 | } | 661 | tex.FaceTextures[face] = texface; |
662 | NotImplemented("llOffsetTexture"); | 662 | m_host.UpdateTexture(tex); |
663 | return; | 663 | return; |
664 | } | 664 | } |
665 | 665 | if (face == -1) | |
666 | public void llRotateTexture(double rotation, int face) | 666 | { |
667 | { | 667 | for (int i = 0; i < 32; i++) |
668 | LLObject.TextureEntry tex = m_host.Shape.Textures; | 668 | { |
669 | if (face > -1) | 669 | if (tex.FaceTextures[i] != null) |
670 | { | 670 | { |
671 | LLObject.TextureEntryFace texface = tex.CreateFace((uint)face); | 671 | tex.FaceTextures[i].Rotation = (float)rotation; |
672 | texface.Rotation = (float)rotation; | 672 | } |
673 | tex.FaceTextures[face] = texface; | 673 | } |
674 | m_host.UpdateTexture(tex); | 674 | tex.DefaultTexture.Rotation = (float)rotation; |
675 | return; | 675 | m_host.UpdateTexture(tex); |
676 | } | 676 | return; |
677 | if (face == -1) | 677 | } |
678 | { | 678 | NotImplemented("llRotateTexture"); |
679 | for (int i = 0; i < 32; i++) | 679 | return; |
680 | { | 680 | } |
681 | if (tex.FaceTextures[i] != null) | 681 | |
682 | { | 682 | public string llGetTexture(int face) |
683 | tex.FaceTextures[i].Rotation = (float)rotation; | 683 | { |
684 | } | 684 | LLObject.TextureEntry tex = m_host.Shape.Textures; |
685 | } | 685 | if (face == -1) |
686 | tex.DefaultTexture.Rotation = (float)rotation; | 686 | { |
687 | m_host.UpdateTexture(tex); | 687 | face = 0; |
688 | return; | 688 | } |
689 | } | 689 | if (face > -1) |
690 | NotImplemented("llRotateTexture"); | 690 | { |
691 | return; | 691 | LLObject.TextureEntryFace texface; |
692 | } | 692 | texface = tex.GetFace((uint)face); |
693 | 693 | return texface.TextureID.ToString(); | |
694 | public string llGetTexture(int face) | 694 | } |
695 | { | 695 | NotImplemented("llGetTexture"); |
696 | LLObject.TextureEntry tex = m_host.Shape.Textures; | 696 | return ""; |
697 | if (face == -1) | 697 | } |
698 | { | 698 | |
699 | face = 0; | 699 | public void llSetPos(LSL_Types.Vector3 pos) |
700 | } | 700 | { |
701 | if (face > -1) | 701 | if (m_host.ParentID != 0) |
702 | { | 702 | { |
703 | LLObject.TextureEntryFace texface; | 703 | m_host.UpdateOffSet(new LLVector3((float)pos.x, (float)pos.y, (float)pos.z)); |
704 | texface = tex.GetFace((uint)face); | 704 | } |
705 | return texface.TextureID.ToString(); | 705 | else |
706 | } | 706 | { |
707 | NotImplemented("llGetTexture"); | 707 | m_host.UpdateGroupPosition(new LLVector3((float)pos.x, (float)pos.y, (float)pos.z)); |
708 | return ""; | 708 | } |
709 | } | 709 | } |
710 | 710 | ||
711 | public void llSetPos(LSL_Types.Vector3 pos) | 711 | public LSL_Types.Vector3 llGetPos() |
712 | { | 712 | { |
713 | if (m_host.ParentID != 0) | 713 | return new LSL_Types.Vector3(m_host.AbsolutePosition.X, |
714 | { | 714 | m_host.AbsolutePosition.Y, |
715 | m_host.UpdateOffSet(new LLVector3((float)pos.x, (float)pos.y, (float)pos.z)); | 715 | m_host.AbsolutePosition.Z); |
716 | } | 716 | } |
717 | else | 717 | |
718 | { | 718 | public LSL_Types.Vector3 llGetLocalPos() |
719 | m_host.UpdateGroupPosition(new LLVector3((float)pos.x, (float)pos.y, (float)pos.z)); | 719 | { |
720 | } | 720 | if (m_host.ParentID != 0) |
721 | } | 721 | { |
722 | 722 | return new LSL_Types.Vector3(m_host.OffsetPosition.X, | |
723 | public LSL_Types.Vector3 llGetPos() | 723 | m_host.OffsetPosition.Y, |
724 | { | 724 | m_host.OffsetPosition.Z); |
725 | return new LSL_Types.Vector3(m_host.AbsolutePosition.X, | 725 | } |
726 | m_host.AbsolutePosition.Y, | 726 | else |
727 | m_host.AbsolutePosition.Z); | 727 | { |
728 | } | 728 | return new LSL_Types.Vector3(m_host.AbsolutePosition.X, |
729 | 729 | m_host.AbsolutePosition.Y, | |
730 | public LSL_Types.Vector3 llGetLocalPos() | 730 | m_host.AbsolutePosition.Z); |
731 | { | 731 | } |
732 | if (m_host.ParentID != 0) | 732 | } |
733 | { | 733 | |
734 | return new LSL_Types.Vector3(m_host.OffsetPosition.X, | 734 | public void llSetRot(LSL_Types.Quaternion rot) |
735 | m_host.OffsetPosition.Y, | 735 | { |
736 | m_host.OffsetPosition.Z); | 736 | m_host.UpdateRotation(new LLQuaternion((float)rot.x, (float)rot.y, (float)rot.z, (float)rot.s)); |
737 | } | 737 | } |
738 | else | 738 | |
739 | { | 739 | public LSL_Types.Quaternion llGetRot() |
740 | return new LSL_Types.Vector3(m_host.AbsolutePosition.X, | 740 | { |
741 | m_host.AbsolutePosition.Y, | 741 | LLQuaternion q = m_host.RotationOffset; |
742 | m_host.AbsolutePosition.Z); | 742 | return new LSL_Types.Quaternion(q.X, q.Y, q.Z, q.W); |
743 | } | 743 | } |
744 | } | 744 | |
745 | 745 | public LSL_Types.Quaternion llGetLocalRot() | |
746 | public void llSetRot(LSL_Types.Quaternion rot) | 746 | { |
747 | { | 747 | return new LSL_Types.Quaternion(m_host.RotationOffset.X, m_host.RotationOffset.Y, m_host.RotationOffset.Z, m_host.RotationOffset.W); |
748 | m_host.UpdateRotation(new LLQuaternion((float)rot.x, (float)rot.y, (float)rot.z, (float)rot.s)); | 748 | } |
749 | } | 749 | |
750 | 750 | public void llSetForce(LSL_Types.Vector3 force, int local) | |
751 | public LSL_Types.Quaternion llGetRot() | 751 | { |
752 | { | 752 | NotImplemented("llSetForce"); |
753 | LLQuaternion q = m_host.RotationOffset; | 753 | } |
754 | return new LSL_Types.Quaternion(q.X, q.Y, q.Z, q.W); | 754 | |
755 | } | 755 | public LSL_Types.Vector3 llGetForce() |
756 | 756 | { | |
757 | public LSL_Types.Quaternion llGetLocalRot() | 757 | NotImplemented("llGetForce"); |
758 | { | 758 | return new LSL_Types.Vector3(); |
759 | return new LSL_Types.Quaternion(m_host.RotationOffset.X, m_host.RotationOffset.Y, m_host.RotationOffset.Z, m_host.RotationOffset.W); | 759 | } |
760 | } | 760 | |
761 | 761 | public int llTarget(LSL_Types.Vector3 position, double range) | |
762 | public void llSetForce(LSL_Types.Vector3 force, int local) | 762 | { |
763 | { | 763 | NotImplemented("llTarget"); |
764 | NotImplemented("llSetForce"); | 764 | return 0; |
765 | } | 765 | } |
766 | 766 | ||
767 | public LSL_Types.Vector3 llGetForce() | 767 | public void llTargetRemove(int number) |
768 | { | 768 | { |
769 | NotImplemented("llGetForce"); | 769 | NotImplemented("llTargetRemove"); |
770 | return new LSL_Types.Vector3(); | 770 | } |
771 | } | 771 | |
772 | 772 | public int llRotTarget(LSL_Types.Quaternion rot, double error) | |
773 | public int llTarget(LSL_Types.Vector3 position, double range) | 773 | { |
774 | { | 774 | NotImplemented("llRotTarget"); |
775 | NotImplemented("llTarget"); | 775 | return 0; |
776 | return 0; | 776 | } |
777 | } | 777 | |
778 | 778 | public void llRotTargetRemove(int number) | |
779 | public void llTargetRemove(int number) | 779 | { |
780 | { | 780 | NotImplemented("llRotTargetRemove"); |
781 | NotImplemented("llTargetRemove"); | 781 | } |
782 | } | 782 | |
783 | 783 | public void llMoveToTarget(LSL_Types.Vector3 target, double tau) | |
784 | public int llRotTarget(LSL_Types.Quaternion rot, double error) | 784 | { |
785 | { | 785 | NotImplemented("llMoveToTarget"); |
786 | NotImplemented("llRotTarget"); | 786 | } |
787 | return 0; | 787 | |
788 | } | 788 | public void llStopMoveToTarget() |
789 | 789 | { | |
790 | public void llRotTargetRemove(int number) | 790 | NotImplemented("llStopMoveToTarget"); |
791 | { | 791 | } |
792 | NotImplemented("llRotTargetRemove"); | 792 | |
793 | } | 793 | public void llApplyImpulse(LSL_Types.Vector3 force, int local) |
794 | 794 | { | |
795 | public void llMoveToTarget(LSL_Types.Vector3 target, double tau) | 795 | NotImplemented("llApplyImpulse"); |
796 | { | 796 | } |
797 | NotImplemented("llMoveToTarget"); | 797 | |
798 | } | 798 | public void llApplyRotationalImpulse(LSL_Types.Vector3 force, int local) |
799 | 799 | { | |
800 | public void llStopMoveToTarget() | 800 | NotImplemented("llApplyRotationalImpulse"); |
801 | { | 801 | } |
802 | NotImplemented("llStopMoveToTarget"); | 802 | |
803 | } | 803 | public void llSetTorque(LSL_Types.Vector3 torque, int local) |
804 | 804 | { | |
805 | public void llApplyImpulse(LSL_Types.Vector3 force, int local) | 805 | NotImplemented("llSetTorque"); |
806 | { | 806 | } |
807 | NotImplemented("llApplyImpulse"); | 807 | |
808 | } | 808 | public LSL_Types.Vector3 llGetTorque() |
809 | 809 | { | |
810 | public void llApplyRotationalImpulse(LSL_Types.Vector3 force, int local) | 810 | NotImplemented("llGetTorque"); |
811 | { | 811 | return new LSL_Types.Vector3(); |
812 | NotImplemented("llApplyRotationalImpulse"); | 812 | } |
813 | } | 813 | |
814 | 814 | public void llSetForceAndTorque(LSL_Types.Vector3 force, LSL_Types.Vector3 torque, int local) | |
815 | public void llSetTorque(LSL_Types.Vector3 torque, int local) | 815 | { |
816 | { | 816 | NotImplemented("llSetForceAndTorque"); |
817 | NotImplemented("llSetTorque"); | 817 | } |
818 | } | 818 | |
819 | 819 | public LSL_Types.Vector3 llGetVel() | |
820 | public LSL_Types.Vector3 llGetTorque() | 820 | { |
821 | { | 821 | return new LSL_Types.Vector3(m_host.Velocity.X, m_host.Velocity.Y, m_host.Velocity.Z); |
822 | NotImplemented("llGetTorque"); | 822 | } |
823 | return new LSL_Types.Vector3(); | 823 | |
824 | } | 824 | public LSL_Types.Vector3 llGetAccel() |
825 | 825 | { | |
826 | public void llSetForceAndTorque(LSL_Types.Vector3 force, LSL_Types.Vector3 torque, int local) | 826 | return new LSL_Types.Vector3(m_host.Acceleration.X, m_host.Acceleration.Y, m_host.Acceleration.Z); |
827 | { | 827 | } |
828 | NotImplemented("llSetForceAndTorque"); | 828 | |
829 | } | 829 | public LSL_Types.Vector3 llGetOmega() |
830 | 830 | { | |
831 | public LSL_Types.Vector3 llGetVel() | 831 | NotImplemented("llGetOmega"); |
832 | { | 832 | return new LSL_Types.Vector3(); |
833 | return new LSL_Types.Vector3(m_host.Velocity.X, m_host.Velocity.Y, m_host.Velocity.Z); | 833 | } |
834 | } | 834 | |
835 | 835 | public double llGetTimeOfDay() | |
836 | public LSL_Types.Vector3 llGetAccel() | 836 | { |
837 | { | 837 | NotImplemented("llGetTimeOfDay"); |
838 | return new LSL_Types.Vector3(m_host.Acceleration.X, m_host.Acceleration.Y, m_host.Acceleration.Z); | 838 | return 0; |
839 | } | 839 | } |
840 | 840 | ||
841 | public LSL_Types.Vector3 llGetOmega() | 841 | public double llGetWallclock() |
842 | { | 842 | { |
843 | NotImplemented("llGetOmega"); | 843 | return DateTime.Now.TimeOfDay.TotalSeconds; |
844 | return new LSL_Types.Vector3(); | 844 | } |
845 | } | 845 | |
846 | 846 | public double llGetTime() | |
847 | public double llGetTimeOfDay() | 847 | { |
848 | { | 848 | TimeSpan ScriptTime = DateTime.Now - m_timer; |
849 | NotImplemented("llGetTimeOfDay"); | 849 | return (double)(ScriptTime.TotalMilliseconds / 1000); |
850 | return 0; | 850 | } |
851 | } | 851 | |
852 | 852 | public void llResetTime() | |
853 | public double llGetWallclock() | 853 | { |
854 | { | 854 | m_timer = DateTime.Now; |
855 | return DateTime.Now.TimeOfDay.TotalSeconds; | 855 | } |
856 | } | 856 | |
857 | 857 | public double llGetAndResetTime() | |
858 | public double llGetTime() | 858 | { |
859 | { | 859 | TimeSpan ScriptTime = DateTime.Now - m_timer; |
860 | TimeSpan ScriptTime = DateTime.Now - m_timer; | 860 | m_timer = DateTime.Now; |
861 | return (double)(ScriptTime.TotalMilliseconds / 1000); | 861 | return (double)(ScriptTime.TotalMilliseconds / 1000); |
862 | } | 862 | } |
863 | 863 | ||
864 | public void llResetTime() | 864 | public void llSound() |
865 | { | 865 | { |
866 | m_timer = DateTime.Now; | 866 | NotImplemented("llSound"); |
867 | } | 867 | } |
868 | 868 | ||
869 | public double llGetAndResetTime() | 869 | public void llPlaySound(string sound, double volume) |
870 | { | 870 | { |
871 | TimeSpan ScriptTime = DateTime.Now - m_timer; | 871 | NotImplemented("llPlaySound"); |
872 | m_timer = DateTime.Now; | 872 | } |
873 | return (double)(ScriptTime.TotalMilliseconds / 1000); | 873 | |
874 | } | 874 | public void llLoopSound(string sound, double volume) |
875 | 875 | { | |
876 | public void llSound() | 876 | NotImplemented("llLoopSound"); |
877 | { | 877 | } |
878 | NotImplemented("llSound"); | 878 | |
879 | } | 879 | public void llLoopSoundMaster(string sound, double volume) |
880 | 880 | { | |
881 | public void llPlaySound(string sound, double volume) | 881 | NotImplemented("llLoopSoundMaster"); |
882 | { | 882 | } |
883 | NotImplemented("llPlaySound"); | 883 | |
884 | } | 884 | public void llLoopSoundSlave(string sound, double volume) |
885 | 885 | { | |
886 | public void llLoopSound(string sound, double volume) | 886 | NotImplemented("llLoopSoundSlave"); |
887 | { | 887 | } |
888 | NotImplemented("llLoopSound"); | 888 | |
889 | } | 889 | public void llPlaySoundSlave(string sound, double volume) |
890 | 890 | { | |
891 | public void llLoopSoundMaster(string sound, double volume) | 891 | NotImplemented("llPlaySoundSlave"); |
892 | { | 892 | } |
893 | NotImplemented("llLoopSoundMaster"); | 893 | |
894 | } | 894 | public void llTriggerSound(string sound, double volume) |
895 | 895 | { | |
896 | public void llLoopSoundSlave(string sound, double volume) | 896 | NotImplemented("llTriggerSound"); |
897 | { | 897 | } |
898 | NotImplemented("llLoopSoundSlave"); | 898 | |
899 | } | 899 | public void llStopSound() |
900 | 900 | { | |
901 | public void llPlaySoundSlave(string sound, double volume) | 901 | NotImplemented("llStopSound"); |
902 | { | 902 | } |
903 | NotImplemented("llPlaySoundSlave"); | 903 | |
904 | } | 904 | public void llPreloadSound(string sound) |
905 | 905 | { | |
906 | public void llTriggerSound(string sound, double volume) | 906 | NotImplemented("llPreloadSound"); |
907 | { | 907 | } |
908 | NotImplemented("llTriggerSound"); | 908 | |
909 | } | 909 | public string llGetSubString(string src, int start, int end) |
910 | 910 | { | |
911 | public void llStopSound() | 911 | return src.Substring(start, end); |
912 | { | 912 | } |
913 | NotImplemented("llStopSound"); | 913 | |
914 | } | 914 | public string llDeleteSubString(string src, int start, int end) |
915 | 915 | { | |
916 | public void llPreloadSound(string sound) | 916 | return src.Remove(start, end - start); |
917 | { | 917 | } |
918 | NotImplemented("llPreloadSound"); | 918 | |
919 | } | 919 | public string llInsertString(string dst, int position, string src) |
920 | 920 | { | |
921 | public string llGetSubString(string src, int start, int end) | 921 | return dst.Insert(position, src); |
922 | { | 922 | } |
923 | return src.Substring(start, end); | 923 | |
924 | } | 924 | public string llToUpper(string src) |
925 | 925 | { | |
926 | public string llDeleteSubString(string src, int start, int end) | 926 | return src.ToUpper(); |
927 | { | 927 | } |
928 | return src.Remove(start, end - start); | 928 | |
929 | } | 929 | public string llToLower(string src) |
930 | 930 | { | |
931 | public string llInsertString(string dst, int position, string src) | 931 | return src.ToLower(); |
932 | { | 932 | } |
933 | return dst.Insert(position, src); | 933 | |
934 | } | 934 | public int llGiveMoney(string destination, int amount) |
935 | 935 | { | |
936 | public string llToUpper(string src) | 936 | NotImplemented("llGiveMoney"); |
937 | { | 937 | return 0; |
938 | return src.ToUpper(); | 938 | } |
939 | } | 939 | |
940 | 940 | public void llMakeExplosion() | |
941 | public string llToLower(string src) | 941 | { |
942 | { | 942 | NotImplemented("llMakeExplosion"); |
943 | return src.ToLower(); | 943 | } |
944 | } | 944 | |
945 | 945 | public void llMakeFountain() | |
946 | public int llGiveMoney(string destination, int amount) | 946 | { |
947 | { | 947 | NotImplemented("llMakeFountain"); |
948 | NotImplemented("llGiveMoney"); | 948 | } |
949 | return 0; | 949 | |
950 | } | 950 | public void llMakeSmoke() |
951 | 951 | { | |
952 | public void llMakeExplosion() | 952 | NotImplemented("llMakeSmoke"); |
953 | { | 953 | } |
954 | NotImplemented("llMakeExplosion"); | 954 | |
955 | } | 955 | public void llMakeFire() |
956 | 956 | { | |
957 | public void llMakeFountain() | 957 | NotImplemented("llMakeFire"); |
958 | { | 958 | } |
959 | NotImplemented("llMakeFountain"); | 959 | |
960 | } | 960 | public void llRezObject(string inventory, LSL_Types.Vector3 pos, LSL_Types.Quaternion rot, int param) |
961 | 961 | { | |
962 | public void llMakeSmoke() | 962 | NotImplemented("llRezObject"); |
963 | { | 963 | } |
964 | NotImplemented("llMakeSmoke"); | 964 | |
965 | } | 965 | public void llLookAt(LSL_Types.Vector3 target, double strength, double damping) |
966 | 966 | { | |
967 | public void llMakeFire() | 967 | NotImplemented("llLookAt"); |
968 | { | 968 | } |
969 | NotImplemented("llMakeFire"); | 969 | |
970 | } | 970 | public void llStopLookAt() |
971 | 971 | { | |
972 | public void llRezObject(string inventory, LSL_Types.Vector3 pos, LSL_Types.Quaternion rot, int param) | 972 | NotImplemented("llStopLookAt"); |
973 | { | 973 | } |
974 | NotImplemented("llRezObject"); | 974 | |
975 | } | 975 | public void llSetTimerEvent(double sec) |
976 | 976 | { | |
977 | public void llLookAt(LSL_Types.Vector3 target, double strength, double damping) | 977 | // Setting timer repeat |
978 | { | 978 | m_ScriptEngine.m_LSLLongCmdHandler.SetTimerEvent(m_localID, m_itemID, sec); |
979 | NotImplemented("llLookAt"); | 979 | } |
980 | } | 980 | |
981 | 981 | public void llSleep(double sec) | |
982 | public void llStopLookAt() | 982 | { |
983 | { | 983 | Thread.Sleep((int)(sec * 1000)); |
984 | NotImplemented("llStopLookAt"); | 984 | } |
985 | } | 985 | |
986 | 986 | public double llGetMass() | |
987 | public void llSetTimerEvent(double sec) | 987 | { |
988 | { | 988 | return m_host.GetMass(); |
989 | // Setting timer repeat | 989 | } |
990 | m_ScriptEngine.m_LSLLongCmdHandler.SetTimerEvent(m_localID, m_itemID, sec); | 990 | |
991 | } | 991 | public void llCollisionFilter(string name, string id, int accept) |
992 | 992 | { | |
993 | public void llSleep(double sec) | 993 | NotImplemented("llCollisionFilter"); |
994 | { | 994 | } |
995 | Thread.Sleep((int)(sec * 1000)); | 995 | |
996 | } | 996 | public void llTakeControls(int controls, int accept, int pass_on) |
997 | 997 | { | |
998 | public double llGetMass() | 998 | NotImplemented("llTakeControls"); |
999 | { | 999 | } |
1000 | return m_host.GetMass(); | 1000 | |
1001 | } | 1001 | public void llReleaseControls() |
1002 | 1002 | { | |
1003 | public void llCollisionFilter(string name, string id, int accept) | 1003 | NotImplemented("llReleaseControls"); |
1004 | { | 1004 | } |
1005 | NotImplemented("llCollisionFilter"); | 1005 | |
1006 | } | 1006 | public void llAttachToAvatar(int attachment) |
1007 | 1007 | { | |
1008 | public void llTakeControls(int controls, int accept, int pass_on) | 1008 | NotImplemented("llAttachToAvatar"); |
1009 | { | 1009 | } |
1010 | NotImplemented("llTakeControls"); | 1010 | |
1011 | } | 1011 | public void llDetachFromAvatar() |
1012 | 1012 | { | |
1013 | public void llReleaseControls() | 1013 | NotImplemented("llDetachFromAvatar"); |
1014 | { | 1014 | } |
1015 | NotImplemented("llReleaseControls"); | 1015 | |
1016 | } | 1016 | public void llTakeCamera() |
1017 | 1017 | { | |
1018 | public void llAttachToAvatar(int attachment) | 1018 | NotImplemented("llTakeCamera"); |
1019 | { | 1019 | } |
1020 | NotImplemented("llAttachToAvatar"); | 1020 | |
1021 | } | 1021 | public void llReleaseCamera() |
1022 | 1022 | { | |
1023 | public void llDetachFromAvatar() | 1023 | NotImplemented("llReleaseCamera"); |
1024 | { | 1024 | } |
1025 | NotImplemented("llDetachFromAvatar"); | 1025 | |
1026 | } | 1026 | public string llGetOwner() |
1027 | 1027 | { | |
1028 | public void llTakeCamera() | 1028 | return m_host.ObjectOwner.ToString(); |
1029 | { | 1029 | } |
1030 | NotImplemented("llTakeCamera"); | 1030 | |
1031 | } | 1031 | public void llInstantMessage(string user, string message) |
1032 | 1032 | { | |
1033 | public void llReleaseCamera() | 1033 | NotImplemented("llInstantMessage"); |
1034 | { | 1034 | |
1035 | NotImplemented("llReleaseCamera"); | 1035 | // We may be able to use ClientView.SendInstantMessage here, but we need a client instance. |
1036 | } | 1036 | // InstantMessageModule.OnInstantMessage searches through a list of scenes for a client matching the toAgent, |
1037 | 1037 | // but I don't think we have a list of scenes available from here. | |
1038 | public string llGetOwner() | 1038 | // (We also don't want to duplicate the code in OnInstantMessage if we can avoid it.) |
1039 | { | 1039 | |
1040 | return m_host.ObjectOwner.ToString(); | 1040 | // TODO: figure out values for client, fromSession, and imSessionID |
1041 | } | 1041 | // client.SendInstantMessage(m_host.UUID, fromSession, message, user, imSessionID, m_host.Name, AgentManager.InstantMessageDialog.MessageFromAgent, (uint)Util.UnixTimeSinceEpoch()); |
1042 | 1042 | } | |
1043 | public void llInstantMessage(string user, string message) | 1043 | |
1044 | { | 1044 | public void llEmail(string address, string subject, string message) |
1045 | NotImplemented("llInstantMessage"); | 1045 | { |
1046 | 1046 | NotImplemented("llEmail"); | |
1047 | // We may be able to use ClientView.SendInstantMessage here, but we need a client instance. | 1047 | } |
1048 | // InstantMessageModule.OnInstantMessage searches through a list of scenes for a client matching the toAgent, | 1048 | |
1049 | // but I don't think we have a list of scenes available from here. | 1049 | public void llGetNextEmail(string address, string subject) |
1050 | // (We also don't want to duplicate the code in OnInstantMessage if we can avoid it.) | 1050 | { |
1051 | 1051 | NotImplemented("llGetNextEmail"); | |
1052 | // TODO: figure out values for client, fromSession, and imSessionID | 1052 | } |
1053 | // client.SendInstantMessage(m_host.UUID, fromSession, message, user, imSessionID, m_host.Name, AgentManager.InstantMessageDialog.MessageFromAgent, (uint)Util.UnixTimeSinceEpoch()); | 1053 | |
1054 | } | 1054 | public string llGetKey() |
1055 | 1055 | { | |
1056 | public void llEmail(string address, string subject, string message) | 1056 | return m_host.UUID.ToString(); |
1057 | { | 1057 | } |
1058 | NotImplemented("llEmail"); | 1058 | |
1059 | } | 1059 | public void llSetBuoyancy(double buoyancy) |
1060 | 1060 | { | |
1061 | public void llGetNextEmail(string address, string subject) | 1061 | NotImplemented("llSetBuoyancy"); |
1062 | { | 1062 | } |
1063 | NotImplemented("llGetNextEmail"); | 1063 | |
1064 | } | 1064 | public void llSetHoverHeight(double height, int water, double tau) |
1065 | 1065 | { | |
1066 | public string llGetKey() | 1066 | NotImplemented("llSetHoverHeight"); |
1067 | { | 1067 | } |
1068 | return m_host.UUID.ToString(); | 1068 | |
1069 | } | 1069 | public void llStopHover() |
1070 | 1070 | { | |
1071 | public void llSetBuoyancy(double buoyancy) | 1071 | NotImplemented("llStopHover"); |
1072 | { | 1072 | } |
1073 | NotImplemented("llSetBuoyancy"); | 1073 | |
1074 | } | 1074 | public void llMinEventDelay(double delay) |
1075 | 1075 | { | |
1076 | public void llSetHoverHeight(double height, int water, double tau) | 1076 | NotImplemented("llMinEventDelay"); |
1077 | { | 1077 | } |
1078 | NotImplemented("llSetHoverHeight"); | 1078 | |
1079 | } | 1079 | public void llSoundPreload() |
1080 | 1080 | { | |
1081 | public void llStopHover() | 1081 | NotImplemented("llSoundPreload"); |
1082 | { | 1082 | } |
1083 | NotImplemented("llStopHover"); | 1083 | |
1084 | } | 1084 | public void llRotLookAt(LSL_Types.Quaternion target, double strength, double damping) |
1085 | 1085 | { | |
1086 | public void llMinEventDelay(double delay) | 1086 | NotImplemented("llRotLookAt"); |
1087 | { | 1087 | } |
1088 | NotImplemented("llMinEventDelay"); | 1088 | |
1089 | } | 1089 | public int llStringLength(string str) |
1090 | 1090 | { | |
1091 | public void llSoundPreload() | 1091 | if (str.Length > 0) |
1092 | { | 1092 | { |
1093 | NotImplemented("llSoundPreload"); | 1093 | return str.Length; |
1094 | } | 1094 | } |
1095 | 1095 | else | |
1096 | public void llRotLookAt(LSL_Types.Quaternion target, double strength, double damping) | 1096 | { |
1097 | { | 1097 | return 0; |
1098 | NotImplemented("llRotLookAt"); | 1098 | } |
1099 | } | 1099 | } |
1100 | 1100 | ||
1101 | public int llStringLength(string str) | 1101 | public void llStartAnimation(string anim) |
1102 | { | 1102 | { |
1103 | if (str.Length > 0) | 1103 | NotImplemented("llStartAnimation"); |
1104 | { | 1104 | } |
1105 | return str.Length; | 1105 | |
1106 | } | 1106 | public void llStopAnimation(string anim) |
1107 | else | 1107 | { |
1108 | { | 1108 | NotImplemented("llStopAnimation"); |
1109 | return 0; | 1109 | } |
1110 | } | 1110 | |
1111 | } | 1111 | public void llPointAt() |
1112 | 1112 | { | |
1113 | public void llStartAnimation(string anim) | 1113 | NotImplemented("llPointAt"); |
1114 | { | 1114 | } |
1115 | NotImplemented("llStartAnimation"); | 1115 | |
1116 | } | 1116 | public void llStopPointAt() |
1117 | 1117 | { | |
1118 | public void llStopAnimation(string anim) | 1118 | NotImplemented("llStopPointAt"); |
1119 | { | 1119 | } |
1120 | NotImplemented("llStopAnimation"); | 1120 | |
1121 | } | 1121 | public void llTargetOmega(LSL_Types.Vector3 axis, double spinrate, double gain) |
1122 | 1122 | { | |
1123 | public void llPointAt() | 1123 | m_host.RotationalVelocity = new LLVector3((float)(axis.x * spinrate), (float)(axis.y * spinrate), (float)(axis.z * spinrate)); |
1124 | { | 1124 | m_host.AngularVelocity = new LLVector3((float)(axis.x * spinrate), (float)(axis.y * spinrate), (float)(axis.z * spinrate)); |
1125 | NotImplemented("llPointAt"); | 1125 | m_host.ScheduleTerseUpdate(); |
1126 | } | 1126 | m_host.SendTerseUpdateToAllClients(); |
1127 | 1127 | //NotImplemented("llTargetOmega"); | |
1128 | public void llStopPointAt() | 1128 | } |
1129 | { | 1129 | |
1130 | NotImplemented("llStopPointAt"); | 1130 | public int llGetStartParameter() |
1131 | } | 1131 | { |
1132 | 1132 | NotImplemented("llGetStartParameter"); | |
1133 | public void llTargetOmega(LSL_Types.Vector3 axis, double spinrate, double gain) | 1133 | return 0; |
1134 | { | 1134 | } |
1135 | m_host.RotationalVelocity = new LLVector3((float)(axis.x * spinrate), (float)(axis.y * spinrate), (float)(axis.z * spinrate)); | 1135 | |
1136 | m_host.AngularVelocity = new LLVector3((float)(axis.x * spinrate), (float)(axis.y * spinrate), (float)(axis.z * spinrate)); | 1136 | public void llGodLikeRezObject(string inventory, LSL_Types.Vector3 pos) |
1137 | m_host.ScheduleTerseUpdate(); | 1137 | { |
1138 | m_host.SendTerseUpdateToAllClients(); | 1138 | NotImplemented("llGodLikeRezObject"); |
1139 | //NotImplemented("llTargetOmega"); | 1139 | } |
1140 | } | 1140 | |
1141 | 1141 | public void llRequestPermissions(string agent, int perm) | |
1142 | public int llGetStartParameter() | 1142 | { |
1143 | { | 1143 | NotImplemented("llRequestPermissions"); |
1144 | NotImplemented("llGetStartParameter"); | 1144 | } |
1145 | return 0; | 1145 | |
1146 | } | 1146 | public string llGetPermissionsKey() |
1147 | 1147 | { | |
1148 | public void llGodLikeRezObject(string inventory, LSL_Types.Vector3 pos) | 1148 | NotImplemented("llGetPermissionsKey"); |
1149 | { | 1149 | return ""; |
1150 | NotImplemented("llGodLikeRezObject"); | 1150 | } |
1151 | } | 1151 | |
1152 | 1152 | public int llGetPermissions() | |
1153 | public void llRequestPermissions(string agent, int perm) | 1153 | { |
1154 | { | 1154 | NotImplemented("llGetPermissions"); |
1155 | NotImplemented("llRequestPermissions"); | 1155 | return 0; |
1156 | } | 1156 | } |
1157 | 1157 | ||
1158 | public string llGetPermissionsKey() | 1158 | public int llGetLinkNumber() |
1159 | { | 1159 | { |
1160 | NotImplemented("llGetPermissionsKey"); | 1160 | return m_host.LinkNum; |
1161 | return ""; | 1161 | } |
1162 | } | 1162 | |
1163 | 1163 | public void llSetLinkColor(int linknumber, LSL_Types.Vector3 color, int face) | |
1164 | public int llGetPermissions() | 1164 | { |
1165 | { | 1165 | SceneObjectPart part = m_host.ParentGroup.GetLinkNumPart(linknumber); |
1166 | NotImplemented("llGetPermissions"); | 1166 | if (linknumber > -1) |
1167 | return 0; | 1167 | { |
1168 | } | 1168 | LLObject.TextureEntry tex = part.Shape.Textures; |
1169 | 1169 | LLColor texcolor; | |
1170 | public int llGetLinkNumber() | 1170 | if (face > -1) |
1171 | { | 1171 | { |
1172 | return m_host.LinkNum; | 1172 | texcolor = tex.CreateFace((uint)face).RGBA; |
1173 | } | 1173 | texcolor.R = (float)Math.Abs(color.x - 1); |
1174 | 1174 | texcolor.G = (float)Math.Abs(color.y - 1); | |
1175 | public void llSetLinkColor(int linknumber, LSL_Types.Vector3 color, int face) | 1175 | texcolor.B = (float)Math.Abs(color.z - 1); |
1176 | { | 1176 | tex.FaceTextures[face].RGBA = texcolor; |
1177 | SceneObjectPart part = m_host.ParentGroup.GetLinkNumPart(linknumber); | 1177 | part.UpdateTexture(tex); |
1178 | if (linknumber > -1) | 1178 | return; |
1179 | { | 1179 | } |
1180 | LLObject.TextureEntry tex = part.Shape.Textures; | 1180 | else if (face == -1) |
1181 | LLColor texcolor; | 1181 | { |
1182 | if (face > -1) | 1182 | texcolor = tex.DefaultTexture.RGBA; |
1183 | { | 1183 | texcolor.R = (float)Math.Abs(color.x - 1); |
1184 | texcolor = tex.CreateFace((uint)face).RGBA; | 1184 | texcolor.G = (float)Math.Abs(color.y - 1); |
1185 | texcolor.R = (float)Math.Abs(color.x - 1); | 1185 | texcolor.B = (float)Math.Abs(color.z - 1); |
1186 | texcolor.G = (float)Math.Abs(color.y - 1); | 1186 | tex.DefaultTexture.RGBA = texcolor; |
1187 | texcolor.B = (float)Math.Abs(color.z - 1); | 1187 | for (uint i = 0; i < 32; i++) |
1188 | tex.FaceTextures[face].RGBA = texcolor; | 1188 | { |
1189 | part.UpdateTexture(tex); | 1189 | if (tex.FaceTextures[i] != null) |
1190 | return; | 1190 | { |
1191 | } | 1191 | texcolor = tex.FaceTextures[i].RGBA; |
1192 | else if (face == -1) | 1192 | texcolor.R = (float)Math.Abs(color.x - 1); |
1193 | { | 1193 | texcolor.G = (float)Math.Abs(color.y - 1); |
1194 | texcolor = tex.DefaultTexture.RGBA; | 1194 | texcolor.B = (float)Math.Abs(color.z - 1); |
1195 | texcolor.R = (float)Math.Abs(color.x - 1); | 1195 | tex.FaceTextures[i].RGBA = texcolor; |
1196 | texcolor.G = (float)Math.Abs(color.y - 1); | 1196 | } |
1197 | texcolor.B = (float)Math.Abs(color.z - 1); | 1197 | } |
1198 | tex.DefaultTexture.RGBA = texcolor; | 1198 | texcolor = tex.DefaultTexture.RGBA; |
1199 | for (uint i = 0; i < 32; i++) | 1199 | texcolor.R = (float)Math.Abs(color.x - 1); |
1200 | { | 1200 | texcolor.G = (float)Math.Abs(color.y - 1); |
1201 | if (tex.FaceTextures[i] != null) | 1201 | texcolor.B = (float)Math.Abs(color.z - 1); |
1202 | { | 1202 | tex.DefaultTexture.RGBA = texcolor; |
1203 | texcolor = tex.FaceTextures[i].RGBA; | 1203 | part.UpdateTexture(tex); |
1204 | texcolor.R = (float)Math.Abs(color.x - 1); | 1204 | return; |
1205 | texcolor.G = (float)Math.Abs(color.y - 1); | 1205 | } |
1206 | texcolor.B = (float)Math.Abs(color.z - 1); | 1206 | return; |
1207 | tex.FaceTextures[i].RGBA = texcolor; | 1207 | } |
1208 | } | 1208 | else if (linknumber == -1) |
1209 | } | 1209 | { |
1210 | texcolor = tex.DefaultTexture.RGBA; | 1210 | int num = m_host.ParentGroup.PrimCount; |
1211 | texcolor.R = (float)Math.Abs(color.x - 1); | 1211 | for (int w = 0; w < num; w++) |
1212 | texcolor.G = (float)Math.Abs(color.y - 1); | 1212 | { |
1213 | texcolor.B = (float)Math.Abs(color.z - 1); | 1213 | linknumber = w; |
1214 | tex.DefaultTexture.RGBA = texcolor; | 1214 | part = m_host.ParentGroup.GetLinkNumPart(linknumber); |
1215 | part.UpdateTexture(tex); | 1215 | LLObject.TextureEntry tex = part.Shape.Textures; |
1216 | return; | 1216 | LLColor texcolor; |
1217 | } | 1217 | if (face > -1) |
1218 | return; | 1218 | { |
1219 | } | 1219 | texcolor = tex.CreateFace((uint)face).RGBA; |
1220 | else if (linknumber == -1) | 1220 | texcolor.R = (float)Math.Abs(color.x - 1); |
1221 | { | 1221 | texcolor.G = (float)Math.Abs(color.y - 1); |
1222 | int num = m_host.ParentGroup.PrimCount; | 1222 | texcolor.B = (float)Math.Abs(color.z - 1); |
1223 | for (int w = 0; w < num; w++) | 1223 | tex.FaceTextures[face].RGBA = texcolor; |
1224 | { | 1224 | part.UpdateTexture(tex); |
1225 | linknumber = w; | 1225 | } |
1226 | part = m_host.ParentGroup.GetLinkNumPart(linknumber); | 1226 | else if (face == -1) |
1227 | LLObject.TextureEntry tex = part.Shape.Textures; | 1227 | { |
1228 | LLColor texcolor; | 1228 | texcolor = tex.DefaultTexture.RGBA; |
1229 | if (face > -1) | 1229 | texcolor.R = (float)Math.Abs(color.x - 1); |
1230 | { | 1230 | texcolor.G = (float)Math.Abs(color.y - 1); |
1231 | texcolor = tex.CreateFace((uint)face).RGBA; | 1231 | texcolor.B = (float)Math.Abs(color.z - 1); |
1232 | texcolor.R = (float)Math.Abs(color.x - 1); | 1232 | tex.DefaultTexture.RGBA = texcolor; |
1233 | texcolor.G = (float)Math.Abs(color.y - 1); | 1233 | for (uint i = 0; i < 32; i++) |
1234 | texcolor.B = (float)Math.Abs(color.z - 1); | 1234 | { |
1235 | tex.FaceTextures[face].RGBA = texcolor; | 1235 | if (tex.FaceTextures[i] != null) |
1236 | part.UpdateTexture(tex); | 1236 | { |
1237 | } | 1237 | texcolor = tex.FaceTextures[i].RGBA; |
1238 | else if (face == -1) | 1238 | texcolor.R = (float)Math.Abs(color.x - 1); |
1239 | { | 1239 | texcolor.G = (float)Math.Abs(color.y - 1); |
1240 | texcolor = tex.DefaultTexture.RGBA; | 1240 | texcolor.B = (float)Math.Abs(color.z - 1); |
1241 | texcolor.R = (float)Math.Abs(color.x - 1); | 1241 | tex.FaceTextures[i].RGBA = texcolor; |
1242 | texcolor.G = (float)Math.Abs(color.y - 1); | 1242 | } |
1243 | texcolor.B = (float)Math.Abs(color.z - 1); | 1243 | } |
1244 | tex.DefaultTexture.RGBA = texcolor; | 1244 | texcolor = tex.DefaultTexture.RGBA; |
1245 | for (uint i = 0; i < 32; i++) | 1245 | texcolor.R = (float)Math.Abs(color.x - 1); |
1246 | { | 1246 | texcolor.G = (float)Math.Abs(color.y - 1); |
1247 | if (tex.FaceTextures[i] != null) | 1247 | texcolor.B = (float)Math.Abs(color.z - 1); |
1248 | { | 1248 | tex.DefaultTexture.RGBA = texcolor; |
1249 | texcolor = tex.FaceTextures[i].RGBA; | 1249 | part.UpdateTexture(tex); |
1250 | texcolor.R = (float)Math.Abs(color.x - 1); | 1250 | } |
1251 | texcolor.G = (float)Math.Abs(color.y - 1); | 1251 | } |
1252 | texcolor.B = (float)Math.Abs(color.z - 1); | 1252 | return; |
1253 | tex.FaceTextures[i].RGBA = texcolor; | 1253 | } |
1254 | } | 1254 | else |
1255 | } | 1255 | { |
1256 | texcolor = tex.DefaultTexture.RGBA; | 1256 | NotImplemented("llSetLinkColor"); |
1257 | texcolor.R = (float)Math.Abs(color.x - 1); | 1257 | } |
1258 | texcolor.G = (float)Math.Abs(color.y - 1); | 1258 | } |
1259 | texcolor.B = (float)Math.Abs(color.z - 1); | 1259 | |
1260 | tex.DefaultTexture.RGBA = texcolor; | 1260 | public void llCreateLink(string target, int parent) |
1261 | part.UpdateTexture(tex); | 1261 | { |
1262 | } | 1262 | NotImplemented("llCreateLink"); |
1263 | } | 1263 | } |
1264 | return; | 1264 | |
1265 | } | 1265 | public void llBreakLink(int linknum) |
1266 | else | 1266 | { |
1267 | { | 1267 | NotImplemented("llBreakLink"); |
1268 | NotImplemented("llSetLinkColor"); | 1268 | } |
1269 | } | 1269 | |
1270 | } | 1270 | public void llBreakAllLinks() |
1271 | 1271 | { | |
1272 | public void llCreateLink(string target, int parent) | 1272 | NotImplemented("llBreakAllLinks"); |
1273 | { | 1273 | } |
1274 | NotImplemented("llCreateLink"); | 1274 | |
1275 | } | 1275 | public string llGetLinkKey(int linknum) |
1276 | 1276 | { | |
1277 | public void llBreakLink(int linknum) | 1277 | SceneObjectPart part = m_host.ParentGroup.GetLinkNumPart(linknum); |
1278 | { | 1278 | if (part != null) |
1279 | NotImplemented("llBreakLink"); | 1279 | { |
1280 | } | 1280 | return part.UUID.ToString(); |
1281 | 1281 | } | |
1282 | public void llBreakAllLinks() | 1282 | else |
1283 | { | 1283 | { |
1284 | NotImplemented("llBreakAllLinks"); | 1284 | return "00000000-0000-0000-0000-000000000000"; |
1285 | } | 1285 | } |
1286 | 1286 | } | |
1287 | public string llGetLinkKey(int linknum) | 1287 | |
1288 | { | 1288 | public string llGetLinkName(int linknum) |
1289 | SceneObjectPart part = m_host.ParentGroup.GetLinkNumPart(linknum); | 1289 | { |
1290 | if (part != null) | 1290 | SceneObjectPart part = m_host.ParentGroup.GetLinkNumPart(linknum); |
1291 | { | 1291 | if (part != null) |
1292 | return part.UUID.ToString(); | 1292 | { |
1293 | } | 1293 | return part.Name; |
1294 | else | 1294 | } |
1295 | { | 1295 | else |
1296 | return "00000000-0000-0000-0000-000000000000"; | 1296 | { |
1297 | } | 1297 | return "00000000-0000-0000-0000-000000000000"; |
1298 | } | 1298 | } |
1299 | 1299 | } | |
1300 | public string llGetLinkName(int linknum) | 1300 | |
1301 | { | 1301 | public int llGetInventoryNumber(int type) |
1302 | SceneObjectPart part = m_host.ParentGroup.GetLinkNumPart(linknum); | 1302 | { |
1303 | if (part != null) | 1303 | NotImplemented("llGetInventoryNumber"); |
1304 | { | 1304 | return 0; |
1305 | return part.Name; | 1305 | } |
1306 | } | 1306 | |
1307 | else | 1307 | public string llGetInventoryName(int type, int number) |
1308 | { | 1308 | { |
1309 | return "00000000-0000-0000-0000-000000000000"; | 1309 | NotImplemented("llGetInventoryName"); |
1310 | } | 1310 | return ""; |
1311 | } | 1311 | } |
1312 | 1312 | ||
1313 | public int llGetInventoryNumber(int type) | 1313 | public void llSetScriptState(string name, int run) |
1314 | { | 1314 | { |
1315 | NotImplemented("llGetInventoryNumber"); | 1315 | NotImplemented("llSetScriptState"); |
1316 | return 0; | 1316 | } |
1317 | } | 1317 | |
1318 | 1318 | public double llGetEnergy() | |
1319 | public string llGetInventoryName(int type, int number) | 1319 | { |
1320 | { | 1320 | return 1.0f; |
1321 | NotImplemented("llGetInventoryName"); | 1321 | } |
1322 | return ""; | 1322 | |
1323 | } | 1323 | public void llGiveInventory(string destination, string inventory) |
1324 | 1324 | { | |
1325 | public void llSetScriptState(string name, int run) | 1325 | NotImplemented("llGiveInventory"); |
1326 | { | 1326 | } |
1327 | NotImplemented("llSetScriptState"); | 1327 | |
1328 | } | 1328 | public void llRemoveInventory(string item) |
1329 | 1329 | { | |
1330 | public double llGetEnergy() | 1330 | NotImplemented("llRemoveInventory"); |
1331 | { | 1331 | } |
1332 | return 1.0f; | 1332 | |
1333 | } | 1333 | public void llSetText(string text, LSL_Types.Vector3 color, double alpha) |
1334 | 1334 | { | |
1335 | public void llGiveInventory(string destination, string inventory) | 1335 | Vector3 av3 = new Vector3((float)color.x, (float)color.y, (float)color.z); |
1336 | { | 1336 | m_host.SetText(text, av3, alpha); |
1337 | NotImplemented("llGiveInventory"); | 1337 | } |
1338 | } | 1338 | |
1339 | 1339 | public double llWater(LSL_Types.Vector3 offset) | |
1340 | public void llRemoveInventory(string item) | 1340 | { |
1341 | { | 1341 | return World.RegionInfo.EstateSettings.waterHeight; |
1342 | NotImplemented("llRemoveInventory"); | 1342 | } |
1343 | } | 1343 | |
1344 | 1344 | public void llPassTouches(int pass) | |
1345 | public void llSetText(string text, LSL_Types.Vector3 color, double alpha) | 1345 | { |
1346 | { | 1346 | NotImplemented("llPassTouches"); |
1347 | Vector3 av3 = new Vector3((float)color.x, (float)color.y, (float)color.z); | 1347 | } |
1348 | m_host.SetText(text, av3, alpha); | 1348 | |
1349 | } | 1349 | public string llRequestAgentData(string id, int data) |
1350 | 1350 | { | |
1351 | public double llWater(LSL_Types.Vector3 offset) | 1351 | NotImplemented("llRequestAgentData"); |
1352 | { | 1352 | return ""; |
1353 | return World.RegionInfo.EstateSettings.waterHeight; | 1353 | } |
1354 | } | 1354 | |
1355 | 1355 | public string llRequestInventoryData(string name) | |
1356 | public void llPassTouches(int pass) | 1356 | { |
1357 | { | 1357 | NotImplemented("llRequestInventoryData"); |
1358 | NotImplemented("llPassTouches"); | 1358 | return ""; |
1359 | } | 1359 | } |
1360 | 1360 | ||
1361 | public string llRequestAgentData(string id, int data) | 1361 | public void llSetDamage(double damage) |
1362 | { | 1362 | { |
1363 | NotImplemented("llRequestAgentData"); | 1363 | NotImplemented("llSetDamage"); |
1364 | return ""; | 1364 | } |
1365 | } | 1365 | |
1366 | 1366 | public void llTeleportAgentHome(string agent) | |
1367 | public string llRequestInventoryData(string name) | 1367 | { |
1368 | { | 1368 | NotImplemented("llTeleportAgentHome"); |
1369 | NotImplemented("llRequestInventoryData"); | 1369 | } |
1370 | return ""; | 1370 | |
1371 | } | 1371 | public void llModifyLand(int action, int brush) |
1372 | 1372 | { | |
1373 | public void llSetDamage(double damage) | 1373 | double dsize; |
1374 | { | 1374 | if (World.PermissionsMngr.CanTerraform(m_host.OwnerID, new LLVector3(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y, 0))) |
1375 | NotImplemented("llSetDamage"); | 1375 | { |
1376 | } | 1376 | switch (brush) |
1377 | 1377 | { | |
1378 | public void llTeleportAgentHome(string agent) | 1378 | case 1: |
1379 | { | 1379 | dsize = 2; |
1380 | NotImplemented("llTeleportAgentHome"); | 1380 | break; |
1381 | } | 1381 | case 2: |
1382 | 1382 | dsize = 4; | |
1383 | public void llModifyLand(int action, int brush) | 1383 | break; |
1384 | { | 1384 | case 3: |
1385 | double dsize; | 1385 | dsize = 8; |
1386 | if (World.PermissionsMngr.CanTerraform(m_host.OwnerID, new LLVector3(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y, 0))) | 1386 | break; |
1387 | { | 1387 | default: |
1388 | switch (brush) | 1388 | if (brush < 0) |
1389 | { | 1389 | { |
1390 | case 1: | 1390 | dsize = (double)(-1 * brush); |
1391 | dsize = 2; | 1391 | } |
1392 | break; | 1392 | else |
1393 | case 2: | 1393 | { |
1394 | dsize = 4; | 1394 | LSLError("Invalid brush size"); |
1395 | break; | 1395 | dsize = 0; // Should cease execution, but get unassigned local variable dsize on compile. |
1396 | case 3: | 1396 | } |
1397 | dsize = 8; | 1397 | break; |
1398 | break; | 1398 | } |
1399 | default: | 1399 | switch (action) |
1400 | if (brush < 0) | 1400 | { |
1401 | { | 1401 | case 0: |
1402 | dsize = (double)(-1 * brush); | 1402 | if (World.Terrain.GetHeight((int)m_host.AbsolutePosition.X, (int)m_host.AbsolutePosition.Y) < m_host.AbsolutePosition.Z) |
1403 | } | 1403 | { |
1404 | else | 1404 | World.Terrain.FlattenTerrain(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y, dsize, 1); |
1405 | { | 1405 | } |
1406 | LSLError("Invalid brush size"); | 1406 | break; |
1407 | dsize = 0; // Should cease execution, but get unassigned local variable dsize on compile. | 1407 | case 1: |
1408 | } | 1408 | if (World.Terrain.GetHeight((int)m_host.AbsolutePosition.X, (int)m_host.AbsolutePosition.Y) < (double)m_host.AbsolutePosition.Z) |
1409 | break; | 1409 | { |
1410 | } | 1410 | World.Terrain.RaiseTerrain(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y, dsize, 0.1); |
1411 | switch (action) | 1411 | } |
1412 | { | 1412 | break; |
1413 | case 0: | 1413 | case 2: |
1414 | if (World.Terrain.GetHeight((int)m_host.AbsolutePosition.X, (int)m_host.AbsolutePosition.Y) < m_host.AbsolutePosition.Z) | 1414 | if (World.Terrain.GetHeight((int)m_host.AbsolutePosition.X, (int)m_host.AbsolutePosition.Y) > 0) |
1415 | { | 1415 | { |
1416 | World.Terrain.FlattenTerrain(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y, dsize, 1); | 1416 | World.Terrain.LowerTerrain(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y, dsize, 1); |
1417 | } | 1417 | } |
1418 | break; | 1418 | break; |
1419 | case 1: | 1419 | case 3: |
1420 | if (World.Terrain.GetHeight((int)m_host.AbsolutePosition.X, (int)m_host.AbsolutePosition.Y) < (double)m_host.AbsolutePosition.Z) | 1420 | World.Terrain.SmoothTerrain(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y, dsize, 1); |
1421 | { | 1421 | break; |
1422 | World.Terrain.RaiseTerrain(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y, dsize, 0.1); | 1422 | case 4: |
1423 | } | 1423 | World.Terrain.NoiseTerrain(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y, dsize, 1); |
1424 | break; | 1424 | break; |
1425 | case 2: | 1425 | case 5: |
1426 | if (World.Terrain.GetHeight((int)m_host.AbsolutePosition.X, (int)m_host.AbsolutePosition.Y) > 0) | 1426 | World.Terrain.RevertTerrain(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y, dsize, 1); |
1427 | { | 1427 | break; |
1428 | World.Terrain.LowerTerrain(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y, dsize, 1); | 1428 | default: |
1429 | } | 1429 | break; |
1430 | break; | 1430 | } |
1431 | case 3: | 1431 | } |
1432 | World.Terrain.SmoothTerrain(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y, dsize, 1); | 1432 | } |
1433 | break; | 1433 | |
1434 | case 4: | 1434 | public void llCollisionSound(string impact_sound, double impact_volume) |
1435 | World.Terrain.NoiseTerrain(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y, dsize, 1); | 1435 | { |
1436 | break; | 1436 | NotImplemented("llCollisionSound"); |
1437 | case 5: | 1437 | } |
1438 | World.Terrain.RevertTerrain(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y, dsize, 1); | 1438 | |
1439 | break; | 1439 | public void llCollisionSprite(string impact_sprite) |
1440 | default: | 1440 | { |
1441 | break; | 1441 | NotImplemented("llCollisionSprite"); |
1442 | } | 1442 | } |
1443 | } | 1443 | |
1444 | } | 1444 | public string llGetAnimation(string id) |
1445 | 1445 | { | |
1446 | public void llCollisionSound(string impact_sound, double impact_volume) | 1446 | NotImplemented("llGetAnimation"); |
1447 | { | 1447 | return ""; |
1448 | NotImplemented("llCollisionSound"); | 1448 | } |
1449 | } | 1449 | |
1450 | 1450 | public void llResetScript() | |
1451 | public void llCollisionSprite(string impact_sprite) | 1451 | { |
1452 | { | 1452 | m_ScriptEngine.m_ScriptManager.ResetScript(m_localID, m_itemID); |
1453 | NotImplemented("llCollisionSprite"); | 1453 | } |
1454 | } | 1454 | |
1455 | 1455 | public void llMessageLinked(int linknum, int num, string str, string id) | |
1456 | public string llGetAnimation(string id) | 1456 | { |
1457 | { | 1457 | } |
1458 | NotImplemented("llGetAnimation"); | 1458 | |
1459 | return ""; | 1459 | public void llPushObject(string target, LSL_Types.Vector3 impulse, LSL_Types.Vector3 ang_impulse, int local) |
1460 | } | 1460 | { |
1461 | 1461 | } | |
1462 | public void llResetScript() | 1462 | |
1463 | { | 1463 | public void llPassCollisions(int pass) |
1464 | m_ScriptEngine.m_ScriptManager.ResetScript(m_localID, m_itemID); | 1464 | { |
1465 | } | 1465 | } |
1466 | 1466 | ||
1467 | public void llMessageLinked(int linknum, int num, string str, string id) | 1467 | public string llGetScriptName() |
1468 | { | 1468 | { |
1469 | } | 1469 | return ""; |
1470 | 1470 | } | |
1471 | public void llPushObject(string target, LSL_Types.Vector3 impulse, LSL_Types.Vector3 ang_impulse, int local) | 1471 | |
1472 | { | 1472 | public int llGetNumberOfSides() |
1473 | } | 1473 | { |
1474 | 1474 | return 0; | |
1475 | public void llPassCollisions(int pass) | 1475 | } |
1476 | { | 1476 | |
1477 | } | 1477 | public LSL_Types.Quaternion llAxisAngle2Rot(LSL_Types.Vector3 axis, double angle) |
1478 | 1478 | { | |
1479 | public string llGetScriptName() | 1479 | return new LSL_Types.Quaternion(); |
1480 | { | 1480 | } |
1481 | return ""; | 1481 | |
1482 | } | 1482 | public LSL_Types.Vector3 llRot2Axis(LSL_Types.Quaternion rot) |
1483 | 1483 | { | |
1484 | public int llGetNumberOfSides() | 1484 | return new LSL_Types.Vector3(); |
1485 | { | 1485 | } |
1486 | return 0; | 1486 | |
1487 | } | 1487 | public void llRot2Angle() |
1488 | 1488 | { | |
1489 | public LSL_Types.Quaternion llAxisAngle2Rot(LSL_Types.Vector3 axis, double angle) | 1489 | } |
1490 | { | 1490 | |
1491 | return new LSL_Types.Quaternion(); | 1491 | public double llAcos(double val) |
1492 | } | 1492 | { |
1493 | 1493 | return (double)Math.Acos(val); | |
1494 | public LSL_Types.Vector3 llRot2Axis(LSL_Types.Quaternion rot) | 1494 | } |
1495 | { | 1495 | |
1496 | return new LSL_Types.Vector3(); | 1496 | public double llAsin(double val) |
1497 | } | 1497 | { |
1498 | 1498 | return (double)Math.Asin(val); | |
1499 | public void llRot2Angle() | 1499 | } |
1500 | { | 1500 | |
1501 | } | 1501 | public double llAngleBetween(LSL_Types.Quaternion a, LSL_Types.Quaternion b) |
1502 | 1502 | { | |
1503 | public double llAcos(double val) | 1503 | return 0; |
1504 | { | 1504 | } |
1505 | return (double)Math.Acos(val); | 1505 | |
1506 | } | 1506 | public string llGetInventoryKey(string name) |
1507 | 1507 | { | |
1508 | public double llAsin(double val) | 1508 | return ""; |
1509 | { | 1509 | } |
1510 | return (double)Math.Asin(val); | 1510 | |
1511 | } | 1511 | public void llAllowInventoryDrop(int add) |
1512 | 1512 | { | |
1513 | public double llAngleBetween(LSL_Types.Quaternion a, LSL_Types.Quaternion b) | 1513 | } |
1514 | { | 1514 | |
1515 | return 0; | 1515 | public LSL_Types.Vector3 llGetSunDirection() |
1516 | } | 1516 | { |
1517 | 1517 | return new LSL_Types.Vector3(); | |
1518 | public string llGetInventoryKey(string name) | 1518 | } |
1519 | { | 1519 | |
1520 | return ""; | 1520 | public LSL_Types.Vector3 llGetTextureOffset(int face) |
1521 | } | 1521 | { |
1522 | 1522 | LLObject.TextureEntry tex = m_host.Shape.Textures; | |
1523 | public void llAllowInventoryDrop(int add) | 1523 | LSL_Types.Vector3 offset; |
1524 | { | 1524 | if (face == -1) |
1525 | } | 1525 | { |
1526 | 1526 | face = 0; | |
1527 | public LSL_Types.Vector3 llGetSunDirection() | 1527 | } |
1528 | { | 1528 | offset.x = tex.GetFace((uint)face).OffsetU; |
1529 | return new LSL_Types.Vector3(); | 1529 | offset.y = tex.GetFace((uint)face).OffsetV; |
1530 | } | 1530 | offset.z = 0.0; |
1531 | 1531 | return offset; | |
1532 | public LSL_Types.Vector3 llGetTextureOffset(int face) | 1532 | } |
1533 | { | 1533 | |
1534 | LLObject.TextureEntry tex = m_host.Shape.Textures; | 1534 | public LSL_Types.Vector3 llGetTextureScale(int side) |
1535 | LSL_Types.Vector3 offset; | 1535 | { |
1536 | if (face == -1) | 1536 | LLObject.TextureEntry tex = m_host.Shape.Textures; |
1537 | { | 1537 | LSL_Types.Vector3 scale; |
1538 | face = 0; | 1538 | if (side == -1) |
1539 | } | 1539 | { |
1540 | offset.x = tex.GetFace((uint)face).OffsetU; | 1540 | side = 0; |
1541 | offset.y = tex.GetFace((uint)face).OffsetV; | 1541 | } |
1542 | offset.z = 0.0; | 1542 | scale.x = tex.GetFace((uint)side).RepeatU; |
1543 | return offset; | 1543 | scale.y = tex.GetFace((uint)side).RepeatV; |
1544 | } | 1544 | scale.z = 0.0; |
1545 | 1545 | return scale; | |
1546 | public LSL_Types.Vector3 llGetTextureScale(int side) | 1546 | } |
1547 | { | 1547 | |
1548 | LLObject.TextureEntry tex = m_host.Shape.Textures; | 1548 | public double llGetTextureRot(int face) |
1549 | LSL_Types.Vector3 scale; | 1549 | { |
1550 | if (side == -1) | 1550 | LLObject.TextureEntry tex = m_host.Shape.Textures; |
1551 | { | 1551 | if (face == -1) |
1552 | side = 0; | 1552 | { |
1553 | } | 1553 | face = 0; |
1554 | scale.x = tex.GetFace((uint)side).RepeatU; | 1554 | } |
1555 | scale.y = tex.GetFace((uint)side).RepeatV; | 1555 | return tex.GetFace((uint)face).Rotation; |
1556 | scale.z = 0.0; | 1556 | } |
1557 | return scale; | 1557 | |
1558 | } | 1558 | public int llSubStringIndex(string source, string pattern) |
1559 | 1559 | { | |
1560 | public double llGetTextureRot(int face) | 1560 | return source.IndexOf(pattern); |
1561 | { | 1561 | } |
1562 | LLObject.TextureEntry tex = m_host.Shape.Textures; | 1562 | |
1563 | if (face == -1) | 1563 | public string llGetOwnerKey(string id) |
1564 | { | 1564 | { |
1565 | face = 0; | 1565 | NotImplemented("llGetOwnerKey"); |
1566 | } | 1566 | return ""; |
1567 | return tex.GetFace((uint)face).Rotation; | 1567 | } |
1568 | } | 1568 | |
1569 | 1569 | public LSL_Types.Vector3 llGetCenterOfMass() | |
1570 | public int llSubStringIndex(string source, string pattern) | 1570 | { |
1571 | { | 1571 | NotImplemented("llGetCenterOfMass"); |
1572 | return source.IndexOf(pattern); | 1572 | return new LSL_Types.Vector3(); |
1573 | } | 1573 | } |
1574 | 1574 | ||
1575 | public string llGetOwnerKey(string id) | 1575 | public LSL_Types.list llListSort(LSL_Types.list src, int stride, int ascending) |
1576 | { | 1576 | { |
1577 | NotImplemented("llGetOwnerKey"); | 1577 | // SortedList<string, LSL_Types.list> sorted = new SortedList<string, LSL_Types.list>(); |
1578 | return ""; | 1578 | // Add chunks to an array |
1579 | } | 1579 | //int s = stride; |
1580 | 1580 | //if (s < 1) | |
1581 | public LSL_Types.Vector3 llGetCenterOfMass() | 1581 | // s = 1; |
1582 | { | 1582 | //int c = 0; |
1583 | NotImplemented("llGetCenterOfMass"); | 1583 | //LSL_Types.list chunk = new LSL_Types.list(); |
1584 | return new LSL_Types.Vector3(); | 1584 | //string chunkString = ""; |
1585 | } | 1585 | //foreach (string element in src) |
1586 | 1586 | //{ | |
1587 | public LSL_Types.list llListSort(LSL_Types.list src, int stride, int ascending) | 1587 | // c++; |
1588 | { | 1588 | // if (c > s) |
1589 | // SortedList<string, LSL_Types.list> sorted = new SortedList<string, LSL_Types.list>(); | 1589 | // { |
1590 | // Add chunks to an array | 1590 | // sorted.Add(chunkString, chunk); |
1591 | //int s = stride; | 1591 | // chunkString = ""; |
1592 | //if (s < 1) | 1592 | // chunk = new LSL_Types.list(); |
1593 | // s = 1; | 1593 | // c = 0; |
1594 | //int c = 0; | 1594 | // } |
1595 | //LSL_Types.list chunk = new LSL_Types.list(); | 1595 | // chunk.Add(element); |
1596 | //string chunkString = ""; | 1596 | // chunkString += element.ToString(); |
1597 | //foreach (string element in src) | 1597 | //} |
1598 | //{ | 1598 | //if (chunk.Count > 0) |
1599 | // c++; | 1599 | // sorted.Add(chunkString, chunk); |
1600 | // if (c > s) | 1600 | |
1601 | // { | 1601 | //LSL_Types.list ret = new LSL_Types.list(); |
1602 | // sorted.Add(chunkString, chunk); | 1602 | //foreach (LSL_Types.list ls in sorted.Values) |
1603 | // chunkString = ""; | 1603 | //{ |
1604 | // chunk = new LSL_Types.list(); | 1604 | // ret.AddRange(ls); |
1605 | // c = 0; | 1605 | //} |
1606 | // } | 1606 | |
1607 | // chunk.Add(element); | 1607 | //if (ascending == LSL_BaseClass.TRUE) |
1608 | // chunkString += element.ToString(); | 1608 | // return ret; |
1609 | //} | 1609 | //ret.Reverse(); |
1610 | //if (chunk.Count > 0) | 1610 | //return ret; |
1611 | // sorted.Add(chunkString, chunk); | 1611 | NotImplemented("llListSort"); |
1612 | 1612 | return new LSL_Types.list(); | |
1613 | //LSL_Types.list ret = new LSL_Types.list(); | 1613 | } |
1614 | //foreach (LSL_Types.list ls in sorted.Values) | 1614 | |
1615 | //{ | 1615 | public int llGetListLength(LSL_Types.list src) |
1616 | // ret.AddRange(ls); | 1616 | { |
1617 | //} | 1617 | return src.Length; |
1618 | 1618 | } | |
1619 | //if (ascending == LSL_BaseClass.TRUE) | 1619 | |
1620 | // return ret; | 1620 | public int llList2Integer(LSL_Types.list src, int index) |
1621 | //ret.Reverse(); | 1621 | { |
1622 | //return ret; | 1622 | if (index < 0) |
1623 | NotImplemented("llListSort"); | 1623 | { |
1624 | return new LSL_Types.list(); | 1624 | index = src.Length + index; |
1625 | } | 1625 | } |
1626 | 1626 | if (index >= src.Length) | |
1627 | public int llGetListLength(LSL_Types.list src) | 1627 | { |
1628 | { | 1628 | return 0; |
1629 | return src.Length; | 1629 | } |
1630 | } | 1630 | return Convert.ToInt32(src.Data[index]); |
1631 | 1631 | } | |
1632 | public int llList2Integer(LSL_Types.list src, int index) | 1632 | |
1633 | { | 1633 | public double osList2Double(LSL_Types.list src, int index) |
1634 | if (index < 0) | 1634 | { |
1635 | { | 1635 | if (index < 0) |
1636 | index = src.Length + index; | 1636 | { |
1637 | } | 1637 | index = src.Length + index; |
1638 | if (index >= src.Length) | 1638 | } |
1639 | { | 1639 | if (index >= src.Length) |
1640 | return 0; | 1640 | { |
1641 | } | 1641 | return 0.0; |
1642 | return Convert.ToInt32(src.Data[index]); | 1642 | } |
1643 | } | 1643 | return Convert.ToDouble(src.Data[index]); |
1644 | 1644 | } | |
1645 | public double osList2Double(LSL_Types.list src, int index) | 1645 | |
1646 | { | 1646 | public double llList2Float(LSL_Types.list src, int index) |
1647 | if (index < 0) | 1647 | { |
1648 | { | 1648 | if (index < 0) |
1649 | index = src.Length + index; | 1649 | { |
1650 | } | 1650 | index = src.Length + index; |
1651 | if (index >= src.Length) | 1651 | } |
1652 | { | 1652 | if (index >= src.Length) |
1653 | return 0.0; | 1653 | { |
1654 | } | 1654 | return 0.0; |
1655 | return Convert.ToDouble(src.Data[index]); | 1655 | } |
1656 | } | 1656 | return Convert.ToSingle(src.Data[index]); |
1657 | 1657 | } | |
1658 | public double llList2Float(LSL_Types.list src, int index) | 1658 | |
1659 | { | 1659 | public string llList2String(LSL_Types.list src, int index) |
1660 | if (index < 0) | 1660 | { |
1661 | { | 1661 | if (index < 0) |
1662 | index = src.Length + index; | 1662 | { |
1663 | } | 1663 | index = src.Length + index; |
1664 | if (index >= src.Length) | 1664 | } |
1665 | { | 1665 | if (index >= src.Length) |
1666 | return 0.0; | 1666 | { |
1667 | } | 1667 | return ""; |
1668 | return Convert.ToSingle(src.Data[index]); | 1668 | } |
1669 | } | 1669 | return src.Data[index].ToString(); |
1670 | 1670 | } | |
1671 | public string llList2String(LSL_Types.list src, int index) | 1671 | |
1672 | { | 1672 | public string llList2Key(LSL_Types.list src, int index) |
1673 | if (index < 0) | 1673 | { |
1674 | { | 1674 | if (index < 0) |
1675 | index = src.Length + index; | 1675 | { |
1676 | } | 1676 | index = src.Length + index; |
1677 | if (index >= src.Length) | 1677 | } |
1678 | { | 1678 | if (index >= src.Length) |
1679 | return ""; | 1679 | { |
1680 | } | 1680 | return "00000000-0000-0000-0000-000000000000"; |
1681 | return src.Data[index].ToString(); | 1681 | } |
1682 | } | 1682 | //return OpenSim.Framework.ToString(src[index]); |
1683 | 1683 | LLUUID tmpkey; | |
1684 | public string llList2Key(LSL_Types.list src, int index) | 1684 | if (LLUUID.TryParse(src.Data[index].ToString(), out tmpkey)) |
1685 | { | 1685 | { |
1686 | if (index < 0) | 1686 | return tmpkey.ToString(); |
1687 | { | 1687 | } |
1688 | index = src.Length + index; | 1688 | else |
1689 | } | 1689 | { |
1690 | if (index >= src.Length) | 1690 | return "00000000-0000-0000-0000-000000000000"; |
1691 | { | 1691 | } |
1692 | return "00000000-0000-0000-0000-000000000000"; | 1692 | } |
1693 | } | 1693 | |
1694 | //return OpenSim.Framework.ToString(src[index]); | 1694 | public LSL_Types.Vector3 llList2Vector(LSL_Types.list src, int index) |
1695 | LLUUID tmpkey; | 1695 | { |
1696 | if (LLUUID.TryParse(src.Data[index].ToString(), out tmpkey)) | 1696 | if (index < 0) |
1697 | { | 1697 | { |
1698 | return tmpkey.ToString(); | 1698 | index = src.Length + index; |
1699 | } | 1699 | } |
1700 | else | 1700 | if (index >= src.Length) |
1701 | { | 1701 | { |
1702 | return "00000000-0000-0000-0000-000000000000"; | 1702 | return new LSL_Types.Vector3(0, 0, 0); |
1703 | } | 1703 | } |
1704 | } | 1704 | if (src.Data[index].GetType() == typeof(OpenSim.Region.ScriptEngine.Common.LSL_Types.Vector3)) |
1705 | 1705 | { | |
1706 | public LSL_Types.Vector3 llList2Vector(LSL_Types.list src, int index) | 1706 | return (LSL_Types.Vector3)src.Data[index]; |
1707 | { | 1707 | } |
1708 | if (index < 0) | 1708 | else |
1709 | { | 1709 | { |
1710 | index = src.Length + index; | 1710 | return new LSL_Types.Vector3(0, 0, 0); |
1711 | } | 1711 | } |
1712 | if (index >= src.Length) | 1712 | } |
1713 | { | 1713 | |
1714 | return new LSL_Types.Vector3(0, 0, 0); | 1714 | public LSL_Types.Quaternion llList2Rot(LSL_Types.list src, int index) |
1715 | } | 1715 | { |
1716 | if (src.Data[index].GetType() == typeof(OpenSim.Region.ScriptEngine.Common.LSL_Types.Vector3)) | 1716 | if (index < 0) |
1717 | { | 1717 | { |
1718 | return (LSL_Types.Vector3)src.Data[index]; | 1718 | index = src.Length + index; |
1719 | } | 1719 | } |
1720 | else | 1720 | if (index >= src.Length) |
1721 | { | 1721 | { |
1722 | return new LSL_Types.Vector3(0, 0, 0); | 1722 | return new LSL_Types.Quaternion(0, 0, 0, 1); |
1723 | } | 1723 | } |
1724 | } | 1724 | if (src.Data[index].GetType() == typeof(OpenSim.Region.ScriptEngine.Common.LSL_Types.Quaternion)) |
1725 | 1725 | { | |
1726 | public LSL_Types.Quaternion llList2Rot(LSL_Types.list src, int index) | 1726 | return (LSL_Types.Quaternion)src.Data[index]; |
1727 | { | 1727 | } |
1728 | if (index < 0) | 1728 | else |
1729 | { | 1729 | { |
1730 | index = src.Length + index; | 1730 | return new LSL_Types.Quaternion(0, 0, 0, 1); |
1731 | } | 1731 | } |
1732 | if (index >= src.Length) | 1732 | } |
1733 | { | 1733 | |
1734 | return new LSL_Types.Quaternion(0, 0, 0, 1); | 1734 | public LSL_Types.list llList2List(LSL_Types.list src, int start, int end) |
1735 | } | 1735 | { |
1736 | if (src.Data[index].GetType() == typeof(OpenSim.Region.ScriptEngine.Common.LSL_Types.Quaternion)) | 1736 | return src.GetSublist(start, end); |
1737 | { | 1737 | } |
1738 | return (LSL_Types.Quaternion)src.Data[index]; | 1738 | |
1739 | } | 1739 | public LSL_Types.list llDeleteSubList(LSL_Types.list src, int start, int end) |
1740 | else | 1740 | { |
1741 | { | 1741 | //LSL_Types.list ret = new LSL_Types.list(src); |
1742 | return new LSL_Types.Quaternion(0, 0, 0, 1); | 1742 | //ret.RemoveRange(start, end - start); |
1743 | } | 1743 | //return ret; |
1744 | } | 1744 | |
1745 | 1745 | // Just a hunch - needs testing | |
1746 | public LSL_Types.list llList2List(LSL_Types.list src, int start, int end) | 1746 | return src.GetSublist(end, start); |
1747 | { | 1747 | } |
1748 | return src.GetSublist(start, end); | 1748 | |
1749 | } | 1749 | public int llGetListEntryType(LSL_Types.list src, int index) |
1750 | 1750 | { | |
1751 | public LSL_Types.list llDeleteSubList(LSL_Types.list src, int start, int end) | 1751 | if (index < 0) |
1752 | { | 1752 | { |
1753 | //LSL_Types.list ret = new LSL_Types.list(src); | 1753 | index = src.Length + index; |
1754 | //ret.RemoveRange(start, end - start); | 1754 | } |
1755 | //return ret; | 1755 | if (index >= src.Length) |
1756 | 1756 | { | |
1757 | // Just a hunch - needs testing | 1757 | return 0; |
1758 | return src.GetSublist(end, start); | 1758 | } |
1759 | } | 1759 | |
1760 | 1760 | if (src.Data[index] is System.Int32) | |
1761 | public int llGetListEntryType(LSL_Types.list src, int index) | 1761 | return 1; |
1762 | { | 1762 | if (src.Data[index] is System.Double) |
1763 | if (index < 0) | 1763 | return 2; |
1764 | { | 1764 | if (src.Data[index] is System.String) |
1765 | index = src.Length + index; | 1765 | { |
1766 | } | 1766 | LLUUID tuuid; |
1767 | if (index >= src.Length) | 1767 | if (LLUUID.TryParse(src.Data[index].ToString(), out tuuid)) |
1768 | { | 1768 | { |
1769 | return 0; | 1769 | return 3; |
1770 | } | 1770 | } |
1771 | 1771 | else | |
1772 | if (src.Data[index] is System.Int32) | 1772 | { |
1773 | return 1; | 1773 | return 4; |
1774 | if (src.Data[index] is System.Double) | 1774 | } |
1775 | return 2; | 1775 | } |
1776 | if (src.Data[index] is System.String) | 1776 | if (src.Data[index] is OpenSim.Region.ScriptEngine.Common.LSL_Types.Vector3) |
1777 | { | 1777 | return 5; |
1778 | LLUUID tuuid; | 1778 | if (src.Data[index] is OpenSim.Region.ScriptEngine.Common.LSL_Types.Quaternion) |
1779 | if (LLUUID.TryParse(src.Data[index].ToString(), out tuuid)) | 1779 | return 6; |
1780 | { | 1780 | if (src.Data[index] is OpenSim.Region.ScriptEngine.Common.LSL_Types.list) |
1781 | return 3; | 1781 | return 7; |
1782 | } | 1782 | return 0; |
1783 | else | 1783 | |
1784 | { | 1784 | } |
1785 | return 4; | 1785 | |
1786 | } | 1786 | public string llList2CSV(LSL_Types.list src) |
1787 | } | 1787 | { |
1788 | if (src.Data[index] is OpenSim.Region.ScriptEngine.Common.LSL_Types.Vector3) | 1788 | string ret = ""; |
1789 | return 5; | 1789 | foreach (object o in src.Data) |
1790 | if (src.Data[index] is OpenSim.Region.ScriptEngine.Common.LSL_Types.Quaternion) | 1790 | { |
1791 | return 6; | 1791 | ret = ret + o.ToString() + ","; |
1792 | if (src.Data[index] is OpenSim.Region.ScriptEngine.Common.LSL_Types.list) | 1792 | } |
1793 | return 7; | 1793 | ret = ret.Substring(0, ret.Length - 2); |
1794 | return 0; | 1794 | return ret; |
1795 | 1795 | } | |
1796 | } | 1796 | |
1797 | 1797 | public LSL_Types.list llCSV2List(string src) | |
1798 | public string llList2CSV(LSL_Types.list src) | 1798 | { |
1799 | { | 1799 | return new LSL_Types.list(src.Split(",".ToCharArray())); |
1800 | string ret = ""; | 1800 | } |
1801 | foreach (object o in src.Data) | 1801 | |
1802 | { | 1802 | public LSL_Types.list llListRandomize(LSL_Types.list src, int stride) |
1803 | ret = ret + o.ToString() + ","; | 1803 | { |
1804 | } | 1804 | //int s = stride; |
1805 | ret = ret.Substring(0, ret.Length - 2); | 1805 | //if (s < 1) |
1806 | return ret; | 1806 | // s = 1; |
1807 | } | 1807 | |
1808 | 1808 | // This is a cowardly way of doing it ;) | |
1809 | public LSL_Types.list llCSV2List(string src) | 1809 | // TODO: Instead, randomize and check if random is mod stride or if it can not be, then array.removerange |
1810 | { | 1810 | //List<LSL_Types.list> tmp = new List<LSL_Types.list>(); |
1811 | return new LSL_Types.list(src.Split(",".ToCharArray())); | 1811 | |
1812 | } | 1812 | // Add chunks to an array |
1813 | 1813 | //int c = 0; | |
1814 | public LSL_Types.list llListRandomize(LSL_Types.list src, int stride) | 1814 | //LSL_Types.list chunk = new LSL_Types.list(); |
1815 | { | 1815 | //foreach (string element in src) |
1816 | //int s = stride; | 1816 | //{ |
1817 | //if (s < 1) | 1817 | // c++; |
1818 | // s = 1; | 1818 | // if (c > s) |
1819 | 1819 | // { | |
1820 | // This is a cowardly way of doing it ;) | 1820 | // tmp.Add(chunk); |
1821 | // TODO: Instead, randomize and check if random is mod stride or if it can not be, then array.removerange | 1821 | // chunk = new LSL_Types.list(); |
1822 | //List<LSL_Types.list> tmp = new List<LSL_Types.list>(); | 1822 | // c = 0; |
1823 | 1823 | // } | |
1824 | // Add chunks to an array | 1824 | // chunk.Add(element); |
1825 | //int c = 0; | 1825 | //} |
1826 | //LSL_Types.list chunk = new LSL_Types.list(); | 1826 | //if (chunk.Count > 0) |
1827 | //foreach (string element in src) | 1827 | // tmp.Add(chunk); |
1828 | //{ | 1828 | |
1829 | // c++; | 1829 | // Decreate (<- what kind of word is that? :D ) array back into a list |
1830 | // if (c > s) | 1830 | //int rnd; |
1831 | // { | 1831 | //LSL_Types.list ret = new LSL_Types.list(); |
1832 | // tmp.Add(chunk); | 1832 | //while (tmp.Count > 0) |
1833 | // chunk = new LSL_Types.list(); | 1833 | //{ |
1834 | // c = 0; | 1834 | // rnd = Util.RandomClass.Next(tmp.Count); |
1835 | // } | 1835 | // foreach (string str in tmp[rnd]) |
1836 | // chunk.Add(element); | 1836 | // { |
1837 | //} | 1837 | // ret.Add(str); |
1838 | //if (chunk.Count > 0) | 1838 | // } |
1839 | // tmp.Add(chunk); | 1839 | // tmp.RemoveAt(rnd); |
1840 | 1840 | //} | |
1841 | // Decreate (<- what kind of word is that? :D ) array back into a list | 1841 | |
1842 | //int rnd; | 1842 | //return ret; |
1843 | //LSL_Types.list ret = new LSL_Types.list(); | 1843 | NotImplemented("llListRandomize"); |
1844 | //while (tmp.Count > 0) | 1844 | return new LSL_Types.list(); |
1845 | //{ | 1845 | } |
1846 | // rnd = Util.RandomClass.Next(tmp.Count); | 1846 | |
1847 | // foreach (string str in tmp[rnd]) | 1847 | public LSL_Types.list llList2ListStrided(LSL_Types.list src, int start, int end, int stride) |
1848 | // { | 1848 | { |
1849 | // ret.Add(str); | 1849 | LSL_Types.list ret = new LSL_Types.list(); |
1850 | // } | 1850 | //int s = stride; |
1851 | // tmp.RemoveAt(rnd); | 1851 | //if (s < 1) |
1852 | //} | 1852 | // s = 1; |
1853 | 1853 | ||
1854 | //return ret; | 1854 | //int sc = s; |
1855 | NotImplemented("llListRandomize"); | 1855 | //for (int i = start; i < src.Count; i++) |
1856 | return new LSL_Types.list(); | 1856 | //{ |
1857 | } | 1857 | // sc--; |
1858 | 1858 | // if (sc == 0) | |
1859 | public LSL_Types.list llList2ListStrided(LSL_Types.list src, int start, int end, int stride) | 1859 | // { |
1860 | { | 1860 | // sc = s; |
1861 | LSL_Types.list ret = new LSL_Types.list(); | 1861 | // // Addthis |
1862 | //int s = stride; | 1862 | // ret.Add(src[i]); |
1863 | //if (s < 1) | 1863 | // } |
1864 | // s = 1; | 1864 | // if (i == end) |
1865 | 1865 | // break; | |
1866 | //int sc = s; | 1866 | //} |
1867 | //for (int i = start; i < src.Count; i++) | 1867 | NotImplemented("llList2ListStrided"); |
1868 | //{ | 1868 | return ret; |
1869 | // sc--; | 1869 | } |
1870 | // if (sc == 0) | 1870 | |
1871 | // { | 1871 | public LSL_Types.Vector3 llGetRegionCorner() |
1872 | // sc = s; | 1872 | { |
1873 | // // Addthis | 1873 | return new LSL_Types.Vector3(World.RegionInfo.RegionLocX * 256, World.RegionInfo.RegionLocY * 256, 0); |
1874 | // ret.Add(src[i]); | 1874 | } |
1875 | // } | 1875 | |
1876 | // if (i == end) | 1876 | public LSL_Types.list llListInsertList(LSL_Types.list dest, LSL_Types.list src, int start) |
1877 | // break; | 1877 | { |
1878 | //} | 1878 | return dest.GetSublist(0, start - 1) + src + dest.GetSublist(start, -1); |
1879 | NotImplemented("llList2ListStrided"); | 1879 | } |
1880 | return ret; | 1880 | |
1881 | } | 1881 | public int llListFindList(LSL_Types.list src, LSL_Types.list test) |
1882 | 1882 | { | |
1883 | public LSL_Types.Vector3 llGetRegionCorner() | 1883 | //foreach (string s in test) |
1884 | { | 1884 | //{ |
1885 | return new LSL_Types.Vector3(World.RegionInfo.RegionLocX * 256, World.RegionInfo.RegionLocY * 256, 0); | 1885 | // for (int ci = 0; ci < src.Count; ci++) |
1886 | } | 1886 | // { |
1887 | 1887 | // if (s == src[ci]) | |
1888 | public LSL_Types.list llListInsertList(LSL_Types.list dest, LSL_Types.list src, int start) | 1888 | // return ci; |
1889 | { | 1889 | // } |
1890 | return dest.GetSublist(0, start - 1) + src + dest.GetSublist(start, -1); | 1890 | //} |
1891 | } | 1891 | NotImplemented("llListFindList"); |
1892 | 1892 | return -1; | |
1893 | public int llListFindList(LSL_Types.list src, LSL_Types.list test) | 1893 | } |
1894 | { | 1894 | |
1895 | //foreach (string s in test) | 1895 | public string llGetObjectName() |
1896 | //{ | 1896 | { |
1897 | // for (int ci = 0; ci < src.Count; ci++) | 1897 | return m_host.Name; |
1898 | // { | 1898 | } |
1899 | // if (s == src[ci]) | 1899 | |
1900 | // return ci; | 1900 | public void llSetObjectName(string name) |
1901 | // } | 1901 | { |
1902 | //} | 1902 | m_host.Name = name; |
1903 | NotImplemented("llListFindList"); | 1903 | } |
1904 | return -1; | 1904 | |
1905 | } | 1905 | public string llGetDate() |
1906 | 1906 | { | |
1907 | public string llGetObjectName() | 1907 | DateTime date = DateTime.Now.ToUniversalTime(); |
1908 | { | 1908 | string result = date.ToString("yyyy-MM-dd"); |
1909 | return m_host.Name; | 1909 | return result; |
1910 | } | 1910 | } |
1911 | 1911 | ||
1912 | public void llSetObjectName(string name) | 1912 | public int llEdgeOfWorld(LSL_Types.Vector3 pos, LSL_Types.Vector3 dir) |
1913 | { | 1913 | { |
1914 | m_host.Name = name; | 1914 | NotImplemented("llEdgeOfWorld"); |
1915 | } | 1915 | return 0; |
1916 | 1916 | } | |
1917 | public string llGetDate() | 1917 | |
1918 | { | 1918 | public int llGetAgentInfo(string id) |
1919 | DateTime date = DateTime.Now.ToUniversalTime(); | 1919 | { |
1920 | string result = date.ToString("yyyy-MM-dd"); | 1920 | NotImplemented("llGetAgentInfo"); |
1921 | return result; | 1921 | return 0; |
1922 | } | 1922 | } |
1923 | 1923 | ||
1924 | public int llEdgeOfWorld(LSL_Types.Vector3 pos, LSL_Types.Vector3 dir) | 1924 | public void llAdjustSoundVolume(double volume) |
1925 | { | 1925 | { |
1926 | NotImplemented("llEdgeOfWorld"); | 1926 | NotImplemented("llAdjustSoundVolume"); |
1927 | return 0; | 1927 | } |
1928 | } | 1928 | |
1929 | 1929 | public void llSetSoundQueueing(int queue) | |
1930 | public int llGetAgentInfo(string id) | 1930 | { |
1931 | { | 1931 | NotImplemented("llSetSoundQueueing"); |
1932 | NotImplemented("llGetAgentInfo"); | 1932 | } |
1933 | return 0; | 1933 | |
1934 | } | 1934 | public void llSetSoundRadius(double radius) |
1935 | 1935 | { | |
1936 | public void llAdjustSoundVolume(double volume) | 1936 | NotImplemented("llSetSoundRadius"); |
1937 | { | 1937 | } |
1938 | NotImplemented("llAdjustSoundVolume"); | 1938 | |
1939 | } | 1939 | public string llKey2Name(string id) |
1940 | 1940 | { | |
1941 | public void llSetSoundQueueing(int queue) | 1941 | NotImplemented("llKey2Name"); |
1942 | { | 1942 | return ""; |
1943 | NotImplemented("llSetSoundQueueing"); | 1943 | } |
1944 | } | 1944 | |
1945 | 1945 | public void llSetTextureAnim(int mode, int face, int sizex, int sizey, double start, double length, double rate) | |
1946 | public void llSetSoundRadius(double radius) | 1946 | { |
1947 | { | 1947 | NotImplemented("llSetTextureAnim"); |
1948 | NotImplemented("llSetSoundRadius"); | 1948 | } |
1949 | } | 1949 | |
1950 | 1950 | public void llTriggerSoundLimited(string sound, double volume, LSL_Types.Vector3 top_north_east, | |
1951 | public string llKey2Name(string id) | 1951 | LSL_Types.Vector3 bottom_south_west) |
1952 | { | 1952 | { |
1953 | NotImplemented("llKey2Name"); | 1953 | NotImplemented("llTriggerSoundLimited"); |
1954 | return ""; | 1954 | } |
1955 | } | 1955 | |
1956 | 1956 | public void llEjectFromLand(string pest) | |
1957 | public void llSetTextureAnim(int mode, int face, int sizex, int sizey, double start, double length, double rate) | 1957 | { |
1958 | { | 1958 | NotImplemented("llEjectFromLand"); |
1959 | NotImplemented("llSetTextureAnim"); | 1959 | } |
1960 | } | 1960 | |
1961 | 1961 | public void llParseString2List() | |
1962 | public void llTriggerSoundLimited(string sound, double volume, LSL_Types.Vector3 top_north_east, | 1962 | { |
1963 | LSL_Types.Vector3 bottom_south_west) | 1963 | NotImplemented("llParseString2List"); |
1964 | { | 1964 | } |
1965 | NotImplemented("llTriggerSoundLimited"); | 1965 | |
1966 | } | 1966 | public int llOverMyLand(string id) |
1967 | 1967 | { | |
1968 | public void llEjectFromLand(string pest) | 1968 | NotImplemented("llOverMyLand"); |
1969 | { | 1969 | return 0; |
1970 | NotImplemented("llEjectFromLand"); | 1970 | } |
1971 | } | 1971 | |
1972 | 1972 | public string llGetLandOwnerAt(LSL_Types.Vector3 pos) | |
1973 | public void llParseString2List() | 1973 | { |
1974 | { | 1974 | return World.GetLandOwner((float)pos.x, (float)pos.y).ToString(); |
1975 | NotImplemented("llParseString2List"); | 1975 | } |
1976 | } | 1976 | |
1977 | 1977 | public string llGetNotecardLine(string name, int line) | |
1978 | public int llOverMyLand(string id) | 1978 | { |
1979 | { | 1979 | NotImplemented("llGetNotecardLine"); |
1980 | NotImplemented("llOverMyLand"); | 1980 | return ""; |
1981 | return 0; | 1981 | } |
1982 | } | 1982 | |
1983 | 1983 | public LSL_Types.Vector3 llGetAgentSize(string id) | |
1984 | public string llGetLandOwnerAt(LSL_Types.Vector3 pos) | 1984 | { |
1985 | { | 1985 | NotImplemented("llGetAgentSize"); |
1986 | return World.GetLandOwner((float)pos.x, (float)pos.y).ToString(); | 1986 | return new LSL_Types.Vector3(); |
1987 | } | 1987 | } |
1988 | 1988 | ||
1989 | public string llGetNotecardLine(string name, int line) | 1989 | public int llSameGroup(string agent) |
1990 | { | 1990 | { |
1991 | NotImplemented("llGetNotecardLine"); | 1991 | NotImplemented("llSameGroup"); |
1992 | return ""; | 1992 | return 0; |
1993 | } | 1993 | } |
1994 | 1994 | ||
1995 | public LSL_Types.Vector3 llGetAgentSize(string id) | 1995 | public void llUnSit(string id) |
1996 | { | 1996 | { |
1997 | NotImplemented("llGetAgentSize"); | 1997 | NotImplemented("llUnSit"); |
1998 | return new LSL_Types.Vector3(); | 1998 | } |
1999 | } | 1999 | |
2000 | 2000 | public LSL_Types.Vector3 llGroundSlope(LSL_Types.Vector3 offset) | |
2001 | public int llSameGroup(string agent) | 2001 | { |
2002 | { | 2002 | NotImplemented("llGroundSlope"); |
2003 | NotImplemented("llSameGroup"); | 2003 | return new LSL_Types.Vector3(); |
2004 | return 0; | 2004 | } |
2005 | } | 2005 | |
2006 | 2006 | public LSL_Types.Vector3 llGroundNormal(LSL_Types.Vector3 offset) | |
2007 | public void llUnSit(string id) | 2007 | { |
2008 | { | 2008 | NotImplemented("llGroundNormal"); |
2009 | NotImplemented("llUnSit"); | 2009 | return new LSL_Types.Vector3(); |
2010 | } | 2010 | } |
2011 | 2011 | ||
2012 | public LSL_Types.Vector3 llGroundSlope(LSL_Types.Vector3 offset) | 2012 | public LSL_Types.Vector3 llGroundContour(LSL_Types.Vector3 offset) |
2013 | { | 2013 | { |
2014 | NotImplemented("llGroundSlope"); | 2014 | NotImplemented("llGroundContour"); |
2015 | return new LSL_Types.Vector3(); | 2015 | return new LSL_Types.Vector3(); |
2016 | } | 2016 | } |
2017 | 2017 | ||
2018 | public LSL_Types.Vector3 llGroundNormal(LSL_Types.Vector3 offset) | 2018 | public int llGetAttached() |
2019 | { | 2019 | { |
2020 | NotImplemented("llGroundNormal"); | 2020 | NotImplemented("llGetAttached"); |
2021 | return new LSL_Types.Vector3(); | 2021 | return 0; |
2022 | } | 2022 | } |
2023 | 2023 | ||
2024 | public LSL_Types.Vector3 llGroundContour(LSL_Types.Vector3 offset) | 2024 | public int llGetFreeMemory() |
2025 | { | 2025 | { |
2026 | NotImplemented("llGroundContour"); | 2026 | NotImplemented("llGetFreeMemory"); |
2027 | return new LSL_Types.Vector3(); | 2027 | return 0; |
2028 | } | 2028 | } |
2029 | 2029 | ||
2030 | public int llGetAttached() | 2030 | public string llGetRegionName() |
2031 | { | 2031 | { |
2032 | NotImplemented("llGetAttached"); | 2032 | return World.RegionInfo.RegionName; |
2033 | return 0; | 2033 | } |
2034 | } | 2034 | |
2035 | 2035 | public double llGetRegionTimeDilation() | |
2036 | public int llGetFreeMemory() | 2036 | { |
2037 | { | 2037 | return (double)World.TimeDilation; |
2038 | NotImplemented("llGetFreeMemory"); | 2038 | } |
2039 | return 0; | 2039 | |
2040 | } | 2040 | public double llGetRegionFPS() |
2041 | 2041 | { | |
2042 | public string llGetRegionName() | 2042 | return 10.0f; |
2043 | { | 2043 | } |
2044 | return World.RegionInfo.RegionName; | 2044 | |
2045 | } | 2045 | /* particle system rules should be coming into this routine as doubles, that is |
2046 | 2046 | rule[0] should be an integer from this list and rule[1] should be the arg | |
2047 | public double llGetRegionTimeDilation() | 2047 | for the same integer. wiki.secondlife.com has most of this mapping, but some |
2048 | { | 2048 | came from http://www.caligari-designs.com/p4u2 |
2049 | return (double)World.TimeDilation; | 2049 | |
2050 | } | 2050 | We iterate through the list for 'Count' elements, incrementing by two for each |
2051 | 2051 | iteration and set the members of Primitive.ParticleSystem, one at a time. | |
2052 | public double llGetRegionFPS() | 2052 | */ |
2053 | { | 2053 | |
2054 | return 10.0f; | 2054 | public enum PrimitiveRule : int |
2055 | } | 2055 | { |
2056 | 2056 | PSYS_PART_FLAGS = 0, | |
2057 | /* particle system rules should be coming into this routine as doubles, that is | 2057 | PSYS_PART_START_COLOR = 1, |
2058 | rule[0] should be an integer from this list and rule[1] should be the arg | 2058 | PSYS_PART_START_ALPHA = 2, |
2059 | for the same integer. wiki.secondlife.com has most of this mapping, but some | 2059 | PSYS_PART_END_COLOR = 3, |
2060 | came from http://www.caligari-designs.com/p4u2 | 2060 | PSYS_PART_END_ALPHA = 4, |
2061 | 2061 | PSYS_PART_START_SCALE = 5, | |
2062 | We iterate through the list for 'Count' elements, incrementing by two for each | 2062 | PSYS_PART_END_SCALE = 6, |
2063 | iteration and set the members of Primitive.ParticleSystem, one at a time. | 2063 | PSYS_PART_MAX_AGE = 7, |
2064 | */ | 2064 | PSYS_SRC_ACCEL = 8, |
2065 | 2065 | PSYS_SRC_PATTERN = 9, | |
2066 | public enum PrimitiveRule : int | 2066 | PSYS_SRC_TEXTURE = 12, |
2067 | { | 2067 | PSYS_SRC_BURST_RATE = 13, |
2068 | PSYS_PART_FLAGS = 0, | 2068 | PSYS_SRC_BURST_PART_COUNT = 15, |
2069 | PSYS_PART_START_COLOR = 1, | 2069 | PSYS_SRC_BURST_RADIUS = 16, |
2070 | PSYS_PART_START_ALPHA = 2, | 2070 | PSYS_SRC_BURST_SPEED_MIN = 17, |
2071 | PSYS_PART_END_COLOR = 3, | 2071 | PSYS_SRC_BURST_SPEED_MAX = 18, |
2072 | PSYS_PART_END_ALPHA = 4, | 2072 | PSYS_SRC_MAX_AGE = 19, |
2073 | PSYS_PART_START_SCALE = 5, | 2073 | PSYS_SRC_TARGET_KEY = 20, |
2074 | PSYS_PART_END_SCALE = 6, | 2074 | PSYS_SRC_OMEGA = 21, |
2075 | PSYS_PART_MAX_AGE = 7, | 2075 | PSYS_SRC_ANGLE_BEGIN = 22, |
2076 | PSYS_SRC_ACCEL = 8, | 2076 | PSYS_SRC_ANGLE_END = 23 |
2077 | PSYS_SRC_PATTERN = 9, | 2077 | } |
2078 | PSYS_SRC_TEXTURE = 12, | 2078 | |
2079 | PSYS_SRC_BURST_RATE = 13, | 2079 | public void llParticleSystem(List<Object> rules) |
2080 | PSYS_SRC_BURST_PART_COUNT = 15, | 2080 | { |
2081 | PSYS_SRC_BURST_RADIUS = 16, | 2081 | Primitive.ParticleSystem prules = new Primitive.ParticleSystem(); |
2082 | PSYS_SRC_BURST_SPEED_MIN = 17, | 2082 | for (int i = 0; i < rules.Count; i += 2) |
2083 | PSYS_SRC_BURST_SPEED_MAX = 18, | 2083 | { |
2084 | PSYS_SRC_MAX_AGE = 19, | 2084 | switch ((int)rules[i]) |
2085 | PSYS_SRC_TARGET_KEY = 20, | 2085 | { |
2086 | PSYS_SRC_OMEGA = 21, | 2086 | case (int)LSL_BaseClass.PSYS_PART_FLAGS: |
2087 | PSYS_SRC_ANGLE_BEGIN = 22, | 2087 | prules.PartFlags = (uint)rules[i + 1]; |
2088 | PSYS_SRC_ANGLE_END = 23 | 2088 | break; |
2089 | } | 2089 | |
2090 | 2090 | case (int)LSL_BaseClass.PSYS_PART_START_COLOR: | |
2091 | public void llParticleSystem(List<Object> rules) | 2091 | prules.PartStartColor = (LLColor)rules[i + 1]; |
2092 | { | 2092 | break; |
2093 | Primitive.ParticleSystem prules = new Primitive.ParticleSystem(); | 2093 | |
2094 | for (int i = 0; i < rules.Count; i += 2) | 2094 | case (int)LSL_BaseClass.PSYS_PART_START_ALPHA: |
2095 | { | 2095 | //what is the cast? prules.PartStartColor = (LSL_Types.Vec)rules[i + 1]; |
2096 | switch ((int)rules[i]) | 2096 | break; |
2097 | { | 2097 | |
2098 | case (int)LSL_BaseClass.PSYS_PART_FLAGS: | 2098 | case (int)LSL_BaseClass.PSYS_PART_END_COLOR: |
2099 | prules.PartFlags = (uint)rules[i + 1]; | 2099 | prules.PartEndColor = (LLColor)rules[i + 1]; |
2100 | break; | 2100 | break; |
2101 | 2101 | ||
2102 | case (int)LSL_BaseClass.PSYS_PART_START_COLOR: | 2102 | case (int)LSL_BaseClass.PSYS_PART_END_ALPHA: |
2103 | prules.PartStartColor = (LLColor)rules[i + 1]; | 2103 | //what is the cast? prules.PartStartColor = (LLColor)rules[i + 1]; |
2104 | break; | 2104 | break; |
2105 | 2105 | ||
2106 | case (int)LSL_BaseClass.PSYS_PART_START_ALPHA: | 2106 | case (int)LSL_BaseClass.PSYS_PART_START_SCALE: |
2107 | //what is the cast? prules.PartStartColor = (LSL_Types.Vec)rules[i + 1]; | 2107 | //what is the cast? prules.PartStartColor = (LLColor)rules[i + 1]; |
2108 | break; | 2108 | break; |
2109 | 2109 | ||
2110 | case (int)LSL_BaseClass.PSYS_PART_END_COLOR: | 2110 | case (int)LSL_BaseClass.PSYS_PART_END_SCALE: |
2111 | prules.PartEndColor = (LLColor)rules[i + 1]; | 2111 | //what is the cast? prules.PartStartColor = (LLColor)rules[i + 1]; |
2112 | break; | 2112 | break; |
2113 | 2113 | ||
2114 | case (int)LSL_BaseClass.PSYS_PART_END_ALPHA: | 2114 | case (int)LSL_BaseClass.PSYS_PART_MAX_AGE: |
2115 | //what is the cast? prules.PartStartColor = (LLColor)rules[i + 1]; | 2115 | prules.MaxAge = (float)rules[i + 1]; |
2116 | break; | 2116 | break; |
2117 | 2117 | ||
2118 | case (int)LSL_BaseClass.PSYS_PART_START_SCALE: | 2118 | case (int)LSL_BaseClass.PSYS_SRC_ACCEL: |
2119 | //what is the cast? prules.PartStartColor = (LLColor)rules[i + 1]; | 2119 | //what is the cast? prules.PartStartColor = (LLColor)rules[i + 1]; |
2120 | break; | 2120 | break; |
2121 | 2121 | ||
2122 | case (int)LSL_BaseClass.PSYS_PART_END_SCALE: | 2122 | case (int)LSL_BaseClass.PSYS_SRC_PATTERN: |
2123 | //what is the cast? prules.PartStartColor = (LLColor)rules[i + 1]; | 2123 | //what is the cast? prules.PartStartColor = (LLColor)rules[i + 1]; |
2124 | break; | 2124 | break; |
2125 | 2125 | ||
2126 | case (int)LSL_BaseClass.PSYS_PART_MAX_AGE: | 2126 | case (int)LSL_BaseClass.PSYS_SRC_TEXTURE: |
2127 | prules.MaxAge = (float)rules[i + 1]; | 2127 | prules.Texture = (LLUUID)rules[i + 1]; |
2128 | break; | 2128 | break; |
2129 | 2129 | ||
2130 | case (int)LSL_BaseClass.PSYS_SRC_ACCEL: | 2130 | case (int)LSL_BaseClass.PSYS_SRC_BURST_RATE: |
2131 | //what is the cast? prules.PartStartColor = (LLColor)rules[i + 1]; | 2131 | prules.BurstRate = (float)rules[i + 1]; |
2132 | break; | 2132 | break; |
2133 | 2133 | ||
2134 | case (int)LSL_BaseClass.PSYS_SRC_PATTERN: | 2134 | case (int)LSL_BaseClass.PSYS_SRC_BURST_PART_COUNT: |
2135 | //what is the cast? prules.PartStartColor = (LLColor)rules[i + 1]; | 2135 | prules.BurstPartCount = (byte)rules[i + 1]; |
2136 | break; | 2136 | break; |
2137 | 2137 | ||
2138 | case (int)LSL_BaseClass.PSYS_SRC_TEXTURE: | 2138 | case (int)LSL_BaseClass.PSYS_SRC_BURST_RADIUS: |
2139 | prules.Texture = (LLUUID)rules[i + 1]; | 2139 | prules.BurstRadius = (float)rules[i + 1]; |
2140 | break; | 2140 | break; |
2141 | 2141 | ||
2142 | case (int)LSL_BaseClass.PSYS_SRC_BURST_RATE: | 2142 | case (int)LSL_BaseClass.PSYS_SRC_BURST_SPEED_MIN: |
2143 | prules.BurstRate = (float)rules[i + 1]; | 2143 | prules.BurstSpeedMin = (float)rules[i + 1]; |
2144 | break; | 2144 | break; |
2145 | 2145 | ||
2146 | case (int)LSL_BaseClass.PSYS_SRC_BURST_PART_COUNT: | 2146 | case (int)LSL_BaseClass.PSYS_SRC_BURST_SPEED_MAX: |
2147 | prules.BurstPartCount = (byte)rules[i + 1]; | 2147 | prules.BurstSpeedMax = (float)rules[i + 1]; |
2148 | break; | 2148 | break; |
2149 | 2149 | ||
2150 | case (int)LSL_BaseClass.PSYS_SRC_BURST_RADIUS: | 2150 | case (int)LSL_BaseClass.PSYS_SRC_MAX_AGE: |
2151 | prules.BurstRadius = (float)rules[i + 1]; | 2151 | prules.MaxAge = (float)rules[i + 1]; |
2152 | break; | 2152 | break; |
2153 | 2153 | ||
2154 | case (int)LSL_BaseClass.PSYS_SRC_BURST_SPEED_MIN: | 2154 | case (int)LSL_BaseClass.PSYS_SRC_TARGET_KEY: |
2155 | prules.BurstSpeedMin = (float)rules[i + 1]; | 2155 | prules.Target = (LLUUID)rules[i + 1]; |
2156 | break; | 2156 | break; |
2157 | 2157 | ||
2158 | case (int)LSL_BaseClass.PSYS_SRC_BURST_SPEED_MAX: | 2158 | case (int)LSL_BaseClass.PSYS_SRC_OMEGA: |
2159 | prules.BurstSpeedMax = (float)rules[i + 1]; | 2159 | //cast?? prules.MaxAge = (float)rules[i + 1]; |
2160 | break; | 2160 | break; |
2161 | 2161 | ||
2162 | case (int)LSL_BaseClass.PSYS_SRC_MAX_AGE: | 2162 | case (int)LSL_BaseClass.PSYS_SRC_ANGLE_BEGIN: |
2163 | prules.MaxAge = (float)rules[i + 1]; | 2163 | prules.InnerAngle = (float)rules[i + 1]; |
2164 | break; | 2164 | break; |
2165 | 2165 | ||
2166 | case (int)LSL_BaseClass.PSYS_SRC_TARGET_KEY: | 2166 | case (int)LSL_BaseClass.PSYS_SRC_ANGLE_END: |
2167 | prules.Target = (LLUUID)rules[i + 1]; | 2167 | prules.OuterAngle = (float)rules[i + 1]; |
2168 | break; | 2168 | break; |
2169 | 2169 | } | |
2170 | case (int)LSL_BaseClass.PSYS_SRC_OMEGA: | 2170 | } |
2171 | //cast?? prules.MaxAge = (float)rules[i + 1]; | 2171 | |
2172 | break; | 2172 | m_host.AddNewParticleSystem(prules); |
2173 | 2173 | } | |
2174 | case (int)LSL_BaseClass.PSYS_SRC_ANGLE_BEGIN: | 2174 | |
2175 | prules.InnerAngle = (float)rules[i + 1]; | 2175 | public void llGroundRepel(double height, int water, double tau) |
2176 | break; | 2176 | { |
2177 | 2177 | NotImplemented("llGroundRepel"); | |
2178 | case (int)LSL_BaseClass.PSYS_SRC_ANGLE_END: | 2178 | } |
2179 | prules.OuterAngle = (float)rules[i + 1]; | 2179 | |
2180 | break; | 2180 | public void llGiveInventoryList() |
2181 | } | 2181 | { |
2182 | } | 2182 | NotImplemented("llGiveInventoryList"); |
2183 | 2183 | } | |
2184 | m_host.AddNewParticleSystem(prules); | 2184 | |
2185 | } | 2185 | public void llSetVehicleType(int type) |
2186 | 2186 | { | |
2187 | public void llGroundRepel(double height, int water, double tau) | 2187 | NotImplemented("llSetVehicleType"); |
2188 | { | 2188 | } |
2189 | NotImplemented("llGroundRepel"); | 2189 | |
2190 | } | 2190 | public void llSetVehicledoubleParam(int param, double value) |
2191 | 2191 | { | |
2192 | public void llGiveInventoryList() | 2192 | NotImplemented("llSetVehicledoubleParam"); |
2193 | { | 2193 | } |
2194 | NotImplemented("llGiveInventoryList"); | 2194 | |
2195 | } | 2195 | public void llSetVehicleVectorParam(int param, LSL_Types.Vector3 vec) |
2196 | 2196 | { | |
2197 | public void llSetVehicleType(int type) | 2197 | NotImplemented("llSetVehicleVectorParam"); |
2198 | { | 2198 | } |
2199 | NotImplemented("llSetVehicleType"); | 2199 | |
2200 | } | 2200 | public void llSetVehicleRotationParam(int param, LSL_Types.Quaternion rot) |
2201 | 2201 | { | |
2202 | public void llSetVehicledoubleParam(int param, double value) | 2202 | NotImplemented("llSetVehicleRotationParam"); |
2203 | { | 2203 | } |
2204 | NotImplemented("llSetVehicledoubleParam"); | 2204 | |
2205 | } | 2205 | public void llSetVehicleFlags(int flags) |
2206 | 2206 | { | |
2207 | public void llSetVehicleVectorParam(int param, LSL_Types.Vector3 vec) | 2207 | NotImplemented("llSetVehicleFlags"); |
2208 | { | 2208 | } |
2209 | NotImplemented("llSetVehicleVectorParam"); | 2209 | |
2210 | } | 2210 | public void llRemoveVehicleFlags(int flags) |
2211 | 2211 | { | |
2212 | public void llSetVehicleRotationParam(int param, LSL_Types.Quaternion rot) | 2212 | NotImplemented("llRemoveVehicleFlags"); |
2213 | { | 2213 | } |
2214 | NotImplemented("llSetVehicleRotationParam"); | 2214 | |
2215 | } | 2215 | public void llSitTarget(LSL_Types.Vector3 offset, LSL_Types.Quaternion rot) |
2216 | 2216 | { | |
2217 | public void llSetVehicleFlags(int flags) | 2217 | // LSL quaternions can normalize to 0, normal Quaternions can't. |
2218 | { | 2218 | if (rot.s == 0 && rot.x == 0 && rot.y == 0 && rot.z == 0) |
2219 | NotImplemented("llSetVehicleFlags"); | 2219 | rot.z = 1; // ZERO_ROTATION = 0,0,0,1 |
2220 | } | 2220 | |
2221 | 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 | public void llRemoveVehicleFlags(int flags) | 2222 | } |
2223 | { | 2223 | |
2224 | NotImplemented("llRemoveVehicleFlags"); | 2224 | public string llAvatarOnSitTarget() |
2225 | } | 2225 | { |
2226 | 2226 | LLUUID AVID = m_host.GetAvatarOnSitTarget(); | |
2227 | public void llSitTarget(LSL_Types.Vector3 offset, LSL_Types.Quaternion rot) | 2227 | |
2228 | { | 2228 | if (AVID != LLUUID.Zero) |
2229 | // LSL quaternions can normalize to 0, normal Quaternions can't. | 2229 | return AVID.ToString(); |
2230 | if (rot.s == 0 && rot.x == 0 && rot.y == 0 && rot.z == 0) | 2230 | else |
2231 | rot.z = 1; // ZERO_ROTATION = 0,0,0,1 | 2231 | return ""; |
2232 | 2232 | } | |
2233 | m_host.SetSitTarget(new Vector3((float)offset.x, (float)offset.y, (float)offset.z), new Quaternion((float)rot.s, (float)rot.x, (float)rot.y, (float)rot.z)); | 2233 | |
2234 | } | 2234 | public void llAddToLandPassList(string avatar, double hours) |
2235 | 2235 | { | |
2236 | public string llAvatarOnSitTarget() | 2236 | NotImplemented("llAddToLandPassList"); |
2237 | { | 2237 | } |
2238 | LLUUID AVID = m_host.GetAvatarOnSitTarget(); | 2238 | |
2239 | 2239 | public void llSetTouchText(string text) | |
2240 | if (AVID != LLUUID.Zero) | 2240 | { |
2241 | return AVID.ToString(); | 2241 | m_host.TouchName = text; |
2242 | else | 2242 | } |
2243 | return ""; | 2243 | |
2244 | } | 2244 | public void llSetSitText(string text) |
2245 | 2245 | { | |
2246 | public void llAddToLandPassList(string avatar, double hours) | 2246 | m_host.SitName = text; |
2247 | { | 2247 | } |
2248 | NotImplemented("llAddToLandPassList"); | 2248 | |
2249 | } | 2249 | public void llSetCameraEyeOffset(LSL_Types.Vector3 offset) |
2250 | 2250 | { | |
2251 | public void llSetTouchText(string text) | 2251 | NotImplemented("llSetCameraEyeOffset"); |
2252 | { | 2252 | } |
2253 | m_host.TouchName = text; | 2253 | |
2254 | } | 2254 | public void llSetCameraAtOffset(LSL_Types.Vector3 offset) |
2255 | 2255 | { | |
2256 | public void llSetSitText(string text) | 2256 | NotImplemented("llSetCameraAtOffset"); |
2257 | { | 2257 | } |
2258 | m_host.SitName = text; | 2258 | |
2259 | } | 2259 | public string llDumpList2String(LSL_Types.list src, string seperator) |
2260 | 2260 | { | |
2261 | public void llSetCameraEyeOffset(LSL_Types.Vector3 offset) | 2261 | if (src.Length == 0) |
2262 | { | 2262 | { |
2263 | NotImplemented("llSetCameraEyeOffset"); | 2263 | return ""; |
2264 | } | 2264 | } |
2265 | 2265 | string ret = ""; | |
2266 | public void llSetCameraAtOffset(LSL_Types.Vector3 offset) | 2266 | foreach (object o in src.Data) |
2267 | { | 2267 | { |
2268 | NotImplemented("llSetCameraAtOffset"); | 2268 | ret = ret + o.ToString() + seperator; |
2269 | } | 2269 | } |
2270 | 2270 | ret = ret.Substring(0, ret.Length - seperator.Length); | |
2271 | public string llDumpList2String(LSL_Types.list src, string seperator) | 2271 | return ret; |
2272 | { | 2272 | } |
2273 | if (src.Length == 0) | 2273 | |
2274 | { | 2274 | public void llScriptDanger(LSL_Types.Vector3 pos) |
2275 | return ""; | 2275 | { |
2276 | } | 2276 | NotImplemented("llScriptDanger"); |
2277 | string ret = ""; | 2277 | } |
2278 | foreach (object o in src.Data) | 2278 | |
2279 | { | 2279 | public void llDialog(string avatar, string message, LSL_Types.list buttons, int chat_channel) |
2280 | ret = ret + o.ToString() + seperator; | 2280 | { |
2281 | } | 2281 | NotImplemented("llDialog"); |
2282 | ret = ret.Substring(0, ret.Length - seperator.Length); | 2282 | } |
2283 | return ret; | 2283 | |
2284 | } | 2284 | public void llVolumeDetect(int detect) |
2285 | 2285 | { | |
2286 | public void llScriptDanger(LSL_Types.Vector3 pos) | 2286 | NotImplemented("llVolumeDetect"); |
2287 | { | 2287 | } |
2288 | NotImplemented("llScriptDanger"); | 2288 | |
2289 | } | 2289 | public void llResetOtherScript(string name) |
2290 | 2290 | { | |
2291 | public void llDialog(string avatar, string message, LSL_Types.list buttons, int chat_channel) | 2291 | NotImplemented("llResetOtherScript"); |
2292 | { | 2292 | } |
2293 | NotImplemented("llDialog"); | 2293 | |
2294 | } | 2294 | public int llGetScriptState(string name) |
2295 | 2295 | { | |
2296 | public void llVolumeDetect(int detect) | 2296 | NotImplemented("llGetScriptState"); |
2297 | { | 2297 | return 0; |
2298 | NotImplemented("llVolumeDetect"); | 2298 | } |
2299 | } | 2299 | |
2300 | 2300 | public void llRemoteLoadScript() | |
2301 | public void llResetOtherScript(string name) | 2301 | { |
2302 | { | 2302 | NotImplemented("llRemoteLoadScript"); |
2303 | NotImplemented("llResetOtherScript"); | 2303 | } |
2304 | } | 2304 | |
2305 | 2305 | public void llSetRemoteScriptAccessPin(int pin) | |
2306 | public int llGetScriptState(string name) | 2306 | { |
2307 | { | 2307 | NotImplemented("llSetRemoteScriptAccessPin"); |
2308 | NotImplemented("llGetScriptState"); | 2308 | } |
2309 | return 0; | 2309 | |
2310 | } | 2310 | public void llRemoteLoadScriptPin(string target, string name, int pin, int running, int start_param) |
2311 | 2311 | { | |
2312 | public void llRemoteLoadScript() | 2312 | NotImplemented("llRemoteLoadScriptPin"); |
2313 | { | 2313 | } |
2314 | NotImplemented("llRemoteLoadScript"); | 2314 | |
2315 | } | 2315 | // remote_data(integer type, key channel, key message_id, string sender, integer ival, string sval) |
2316 | 2316 | // Not sure where these constants should live: | |
2317 | public void llSetRemoteScriptAccessPin(int pin) | 2317 | // REMOTE_DATA_CHANNEL = 1 |
2318 | { | 2318 | // REMOTE_DATA_REQUEST = 2 |
2319 | NotImplemented("llSetRemoteScriptAccessPin"); | 2319 | // REMOTE_DATA_REPLY = 3 |
2320 | } | 2320 | public void llOpenRemoteDataChannel() |
2321 | 2321 | { | |
2322 | public void llRemoteLoadScriptPin(string target, string name, int pin, int running, int start_param) | 2322 | IXMLRPC xmlrpcMod = m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>(); |
2323 | { | 2323 | if (xmlrpcMod.IsEnabled()) |
2324 | NotImplemented("llRemoteLoadScriptPin"); | 2324 | { |
2325 | } | 2325 | LLUUID channelID = xmlrpcMod.OpenXMLRPCChannel(m_localID, m_itemID); |
2326 | 2326 | object[] resobj = new object[] { 1, channelID.ToString(), LLUUID.Zero.ToString(), "", 0, "" }; | |
2327 | // remote_data(integer type, key channel, key message_id, string sender, integer ival, string sval) | 2327 | m_ScriptEngine.m_EventQueueManager.AddToScriptQueue(m_localID, m_itemID, "remote_data", resobj); |
2328 | // Not sure where these constants should live: | 2328 | } |
2329 | // REMOTE_DATA_CHANNEL = 1 | 2329 | } |
2330 | // REMOTE_DATA_REQUEST = 2 | 2330 | |
2331 | // REMOTE_DATA_REPLY = 3 | 2331 | public string llSendRemoteData(string channel, string dest, int idata, string sdata) |
2332 | public void llOpenRemoteDataChannel() | 2332 | { |
2333 | { | 2333 | NotImplemented("llSendRemoteData"); |
2334 | IXMLRPC xmlrpcMod = m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>(); | 2334 | return ""; |
2335 | if (xmlrpcMod.IsEnabled()) | 2335 | } |
2336 | { | 2336 | |
2337 | LLUUID channelID = xmlrpcMod.OpenXMLRPCChannel(m_localID, m_itemID); | 2337 | public void llRemoteDataReply(string channel, string message_id, string sdata, int idata) |
2338 | object[] resobj = new object[] { 1, channelID.ToString(), LLUUID.Zero.ToString(), "", 0, "" }; | 2338 | { |
2339 | m_ScriptEngine.m_EventQueueManager.AddToScriptQueue(m_localID, m_itemID, "remote_data", resobj); | 2339 | IXMLRPC xmlrpcMod = m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>(); |
2340 | } | 2340 | xmlrpcMod.RemoteDataReply(channel, message_id, sdata, idata); |
2341 | } | 2341 | } |
2342 | 2342 | ||
2343 | public string llSendRemoteData(string channel, string dest, int idata, string sdata) | 2343 | public void llCloseRemoteDataChannel(string channel) |
2344 | { | 2344 | { |
2345 | NotImplemented("llSendRemoteData"); | 2345 | IXMLRPC xmlrpcMod = m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>(); |
2346 | return ""; | 2346 | xmlrpcMod.CloseXMLRPCChannel(channel); |
2347 | } | 2347 | } |
2348 | 2348 | ||
2349 | public void llRemoteDataReply(string channel, string message_id, string sdata, int idata) | 2349 | public string llMD5String(string src, int nonce) |
2350 | { | 2350 | { |
2351 | IXMLRPC xmlrpcMod = m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>(); | 2351 | return Util.Md5Hash(src + ":" + nonce.ToString()); |
2352 | xmlrpcMod.RemoteDataReply(channel, message_id, sdata, idata); | 2352 | } |
2353 | } | 2353 | |
2354 | 2354 | public void llSetPrimitiveParams(LSL_Types.list rules) | |
2355 | public void llCloseRemoteDataChannel(string channel) | 2355 | { |
2356 | { | 2356 | NotImplemented("llSetPrimitiveParams"); |
2357 | IXMLRPC xmlrpcMod = m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>(); | 2357 | } |
2358 | xmlrpcMod.CloseXMLRPCChannel(channel); | 2358 | |
2359 | } | 2359 | public string llStringToBase64(string str) |
2360 | 2360 | { | |
2361 | public string llMD5String(string src, int nonce) | 2361 | try |
2362 | { | 2362 | { |
2363 | return Util.Md5Hash(src + ":" + nonce.ToString()); | 2363 | byte[] encData_byte = new byte[str.Length]; |
2364 | } | 2364 | encData_byte = Encoding.UTF8.GetBytes(str); |
2365 | 2365 | string encodedData = Convert.ToBase64String(encData_byte); | |
2366 | public void llSetPrimitiveParams(LSL_Types.list rules) | 2366 | return encodedData; |
2367 | { | 2367 | } |
2368 | NotImplemented("llSetPrimitiveParams"); | 2368 | catch (Exception e) |
2369 | } | 2369 | { |
2370 | 2370 | throw new Exception("Error in base64Encode" + e.Message); | |
2371 | public string llStringToBase64(string str) | 2371 | } |
2372 | { | 2372 | } |
2373 | try | 2373 | |
2374 | { | 2374 | public string llBase64ToString(string str) |
2375 | byte[] encData_byte = new byte[str.Length]; | 2375 | { |
2376 | encData_byte = Encoding.UTF8.GetBytes(str); | 2376 | UTF8Encoding encoder = new UTF8Encoding(); |
2377 | string encodedData = Convert.ToBase64String(encData_byte); | 2377 | Decoder utf8Decode = encoder.GetDecoder(); |
2378 | return encodedData; | 2378 | try |
2379 | } | 2379 | { |
2380 | catch (Exception e) | 2380 | byte[] todecode_byte = Convert.FromBase64String(str); |
2381 | { | 2381 | int charCount = utf8Decode.GetCharCount(todecode_byte, 0, todecode_byte.Length); |
2382 | throw new Exception("Error in base64Encode" + e.Message); | 2382 | char[] decoded_char = new char[charCount]; |
2383 | } | 2383 | utf8Decode.GetChars(todecode_byte, 0, todecode_byte.Length, decoded_char, 0); |
2384 | } | 2384 | string result = new String(decoded_char); |
2385 | 2385 | return result; | |
2386 | public string llBase64ToString(string str) | 2386 | } |
2387 | { | 2387 | catch (Exception e) |
2388 | UTF8Encoding encoder = new UTF8Encoding(); | 2388 | { |
2389 | Decoder utf8Decode = encoder.GetDecoder(); | 2389 | throw new Exception("Error in base64Decode" + e.Message); |
2390 | try | 2390 | } |
2391 | { | 2391 | } |
2392 | byte[] todecode_byte = Convert.FromBase64String(str); | 2392 | |
2393 | int charCount = utf8Decode.GetCharCount(todecode_byte, 0, todecode_byte.Length); | 2393 | public void llXorBase64Strings() |
2394 | char[] decoded_char = new char[charCount]; | 2394 | { |
2395 | utf8Decode.GetChars(todecode_byte, 0, todecode_byte.Length, decoded_char, 0); | 2395 | throw new Exception("Command deprecated! Use llXorBase64StringsCorrect instead."); |
2396 | string result = new String(decoded_char); | 2396 | } |
2397 | return result; | 2397 | |
2398 | } | 2398 | public void llRemoteDataSetRegion() |
2399 | catch (Exception e) | 2399 | { |
2400 | { | 2400 | NotImplemented("llRemoteDataSetRegion"); |
2401 | throw new Exception("Error in base64Decode" + e.Message); | 2401 | } |
2402 | } | 2402 | |
2403 | } | 2403 | public double llLog10(double val) |
2404 | 2404 | { | |
2405 | public void llXorBase64Strings() | 2405 | return (double)Math.Log10(val); |
2406 | { | 2406 | } |
2407 | throw new Exception("Command deprecated! Use llXorBase64StringsCorrect instead."); | 2407 | |
2408 | } | 2408 | public double llLog(double val) |
2409 | 2409 | { | |
2410 | public void llRemoteDataSetRegion() | 2410 | return (double)Math.Log(val); |
2411 | { | 2411 | } |
2412 | NotImplemented("llRemoteDataSetRegion"); | 2412 | |
2413 | } | 2413 | public LSL_Types.list llGetAnimationList(string id) |
2414 | 2414 | { | |
2415 | public double llLog10(double val) | 2415 | NotImplemented("llGetAnimationList"); |
2416 | { | 2416 | return new LSL_Types.list(); |
2417 | return (double)Math.Log10(val); | 2417 | } |
2418 | } | 2418 | |
2419 | 2419 | public void llSetParcelMusicURL(string url) | |
2420 | public double llLog(double val) | 2420 | { |
2421 | { | 2421 | LLUUID landowner = World.GetLandOwner(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y); |
2422 | return (double)Math.Log(val); | 2422 | if (landowner.Equals(null)) |
2423 | } | 2423 | { |
2424 | 2424 | return; | |
2425 | public LSL_Types.list llGetAnimationList(string id) | 2425 | } |
2426 | { | 2426 | if (landowner != m_host.ObjectOwner) |
2427 | NotImplemented("llGetAnimationList"); | 2427 | { |
2428 | return new LSL_Types.list(); | 2428 | return; |
2429 | } | 2429 | } |
2430 | 2430 | World.SetLandMusicURL(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y, url); | |
2431 | public void llSetParcelMusicURL(string url) | 2431 | } |
2432 | { | 2432 | |
2433 | LLUUID landowner = World.GetLandOwner(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y); | 2433 | public LSL_Types.Vector3 llGetRootPosition() |
2434 | if (landowner.Equals(null)) | 2434 | { |
2435 | { | 2435 | return new LSL_Types.Vector3(m_host.ParentGroup.AbsolutePosition.X, m_host.ParentGroup.AbsolutePosition.Y, m_host.ParentGroup.AbsolutePosition.Z); |
2436 | return; | 2436 | } |
2437 | } | 2437 | |
2438 | if (landowner != m_host.ObjectOwner) | 2438 | public LSL_Types.Quaternion llGetRootRotation() |
2439 | { | 2439 | { |
2440 | return; | 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 | } | 2441 | } |
2442 | World.SetLandMusicURL(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y, url); | 2442 | |
2443 | } | 2443 | public string llGetObjectDesc() |
2444 | 2444 | { | |
2445 | public LSL_Types.Vector3 llGetRootPosition() | 2445 | return m_host.Description; |
2446 | { | 2446 | } |
2447 | return new LSL_Types.Vector3(m_host.ParentGroup.AbsolutePosition.X, m_host.ParentGroup.AbsolutePosition.Y, m_host.ParentGroup.AbsolutePosition.Z); | 2447 | |
2448 | } | 2448 | public void llSetObjectDesc(string desc) |
2449 | 2449 | { | |
2450 | public LSL_Types.Quaternion llGetRootRotation() | 2450 | m_host.Description = desc; |
2451 | { | 2451 | } |
2452 | return new LSL_Types.Quaternion(m_host.ParentGroup.GroupRotation.X, m_host.ParentGroup.GroupRotation.Y, m_host.ParentGroup.GroupRotation.Z, m_host.ParentGroup.GroupRotation.W); | 2452 | |
2453 | } | 2453 | public string llGetCreator() |
2454 | 2454 | { | |
2455 | public string llGetObjectDesc() | 2455 | return m_host.ObjectCreator.ToString(); |
2456 | { | 2456 | } |
2457 | return m_host.Description; | 2457 | |
2458 | } | 2458 | public string llGetTimestamp() |
2459 | 2459 | { | |
2460 | public void llSetObjectDesc(string desc) | 2460 | return DateTime.Now.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss.fffffffZ"); |
2461 | { | 2461 | } |
2462 | m_host.Description = desc; | 2462 | |
2463 | } | 2463 | public void llSetLinkAlpha(int linknumber, double alpha, int face) |
2464 | 2464 | { | |
2465 | public string llGetCreator() | 2465 | SceneObjectPart part = m_host.ParentGroup.GetLinkNumPart(linknumber); |
2466 | { | 2466 | if (linknumber > -1) |
2467 | return m_host.ObjectCreator.ToString(); | 2467 | { |
2468 | } | 2468 | LLObject.TextureEntry tex = part.Shape.Textures; |
2469 | 2469 | LLColor texcolor; | |
2470 | public string llGetTimestamp() | 2470 | if (face > -1) |
2471 | { | 2471 | { |
2472 | return DateTime.Now.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss.fffffffZ"); | 2472 | texcolor = tex.CreateFace((uint)face).RGBA; |
2473 | } | 2473 | texcolor.A = (float)Math.Abs(alpha - 1); |
2474 | 2474 | tex.FaceTextures[face].RGBA = texcolor; | |
2475 | public void llSetLinkAlpha(int linknumber, double alpha, int face) | 2475 | part.UpdateTexture(tex); |
2476 | { | 2476 | return; |
2477 | SceneObjectPart part = m_host.ParentGroup.GetLinkNumPart(linknumber); | 2477 | } |
2478 | if (linknumber > -1) | 2478 | else if (face == -1) |
2479 | { | 2479 | { |
2480 | LLObject.TextureEntry tex = part.Shape.Textures; | 2480 | texcolor = tex.DefaultTexture.RGBA; |
2481 | LLColor texcolor; | 2481 | texcolor.A = (float)Math.Abs(alpha - 1); |
2482 | if (face > -1) | 2482 | tex.DefaultTexture.RGBA = texcolor; |
2483 | { | 2483 | for (uint i = 0; i < 32; i++) |
2484 | texcolor = tex.CreateFace((uint)face).RGBA; | 2484 | { |
2485 | texcolor.A = (float)Math.Abs(alpha - 1); | 2485 | if (tex.FaceTextures[i] != null) |
2486 | tex.FaceTextures[face].RGBA = texcolor; | 2486 | { |
2487 | part.UpdateTexture(tex); | 2487 | texcolor = tex.FaceTextures[i].RGBA; |
2488 | return; | 2488 | texcolor.A = (float)Math.Abs(alpha - 1); |
2489 | } | 2489 | tex.FaceTextures[i].RGBA = texcolor; |
2490 | else if (face == -1) | 2490 | } |
2491 | { | 2491 | } |
2492 | texcolor = tex.DefaultTexture.RGBA; | 2492 | texcolor = tex.DefaultTexture.RGBA; |
2493 | texcolor.A = (float)Math.Abs(alpha - 1); | 2493 | texcolor.A = (float)Math.Abs(alpha - 1); |
2494 | tex.DefaultTexture.RGBA = texcolor; | 2494 | tex.DefaultTexture.RGBA = texcolor; |
2495 | for (uint i = 0; i < 32; i++) | 2495 | part.UpdateTexture(tex); |
2496 | { | 2496 | return; |
2497 | if (tex.FaceTextures[i] != null) | 2497 | } |
2498 | { | 2498 | return; |
2499 | texcolor = tex.FaceTextures[i].RGBA; | 2499 | } |
2500 | texcolor.A = (float)Math.Abs(alpha - 1); | 2500 | else if (linknumber == -1) |
2501 | tex.FaceTextures[i].RGBA = texcolor; | 2501 | { |
2502 | } | 2502 | int num = m_host.ParentGroup.PrimCount; |
2503 | } | 2503 | for (int w = 0; w < num; w++) |
2504 | texcolor = tex.DefaultTexture.RGBA; | 2504 | { |
2505 | texcolor.A = (float)Math.Abs(alpha - 1); | 2505 | linknumber = w; |
2506 | tex.DefaultTexture.RGBA = texcolor; | 2506 | part = m_host.ParentGroup.GetLinkNumPart(linknumber); |
2507 | part.UpdateTexture(tex); | 2507 | LLObject.TextureEntry tex = part.Shape.Textures; |
2508 | return; | 2508 | LLColor texcolor; |
2509 | } | 2509 | if (face > -1) |
2510 | return; | 2510 | { |
2511 | } | 2511 | texcolor = tex.CreateFace((uint)face).RGBA; |
2512 | else if (linknumber == -1) | 2512 | texcolor.A = (float)Math.Abs(alpha - 1); |
2513 | { | 2513 | tex.FaceTextures[face].RGBA = texcolor; |
2514 | int num = m_host.ParentGroup.PrimCount; | 2514 | part.UpdateTexture(tex); |
2515 | for (int w = 0; w < num; w++) | 2515 | } |
2516 | { | 2516 | else if (face == -1) |
2517 | linknumber = w; | 2517 | { |
2518 | part = m_host.ParentGroup.GetLinkNumPart(linknumber); | 2518 | texcolor = tex.DefaultTexture.RGBA; |
2519 | LLObject.TextureEntry tex = part.Shape.Textures; | 2519 | texcolor.A = (float)Math.Abs(alpha - 1); |
2520 | LLColor texcolor; | 2520 | tex.DefaultTexture.RGBA = texcolor; |
2521 | if (face > -1) | 2521 | for (uint i = 0; i < 32; i++) |
2522 | { | 2522 | { |
2523 | texcolor = tex.CreateFace((uint)face).RGBA; | 2523 | if (tex.FaceTextures[i] != null) |
2524 | texcolor.A = (float)Math.Abs(alpha - 1); | 2524 | { |
2525 | tex.FaceTextures[face].RGBA = texcolor; | 2525 | texcolor = tex.FaceTextures[i].RGBA; |
2526 | part.UpdateTexture(tex); | 2526 | texcolor.A = (float)Math.Abs(alpha - 1); |
2527 | } | 2527 | tex.FaceTextures[i].RGBA = texcolor; |
2528 | else if (face == -1) | 2528 | } |
2529 | { | 2529 | } |
2530 | texcolor = tex.DefaultTexture.RGBA; | 2530 | texcolor = tex.DefaultTexture.RGBA; |
2531 | texcolor.A = (float)Math.Abs(alpha - 1); | 2531 | texcolor.A = (float)Math.Abs(alpha - 1); |
2532 | tex.DefaultTexture.RGBA = texcolor; | 2532 | tex.DefaultTexture.RGBA = texcolor; |
2533 | for (uint i = 0; i < 32; i++) | 2533 | part.UpdateTexture(tex); |
2534 | { | 2534 | } |
2535 | if (tex.FaceTextures[i] != null) | 2535 | } |
2536 | { | 2536 | return; |
2537 | texcolor = tex.FaceTextures[i].RGBA; | 2537 | } |
2538 | texcolor.A = (float)Math.Abs(alpha - 1); | 2538 | else |
2539 | tex.FaceTextures[i].RGBA = texcolor; | 2539 | { |
2540 | } | 2540 | NotImplemented("llSetLinkAlpha"); |
2541 | } | 2541 | } |
2542 | texcolor = tex.DefaultTexture.RGBA; | 2542 | } |
2543 | texcolor.A = (float)Math.Abs(alpha - 1); | 2543 | |
2544 | tex.DefaultTexture.RGBA = texcolor; | 2544 | public int llGetNumberOfPrims() |
2545 | part.UpdateTexture(tex); | 2545 | { |
2546 | } | 2546 | return m_host.ParentGroup.PrimCount; |
2547 | } | 2547 | } |
2548 | return; | 2548 | |
2549 | } | 2549 | public string llGetNumberOfNotecardLines(string name) |
2550 | else | 2550 | { |
2551 | { | 2551 | NotImplemented("llGetNumberOfNotecardLines"); |
2552 | NotImplemented("llSetLinkAlpha"); | 2552 | return ""; |
2553 | } | 2553 | } |
2554 | } | 2554 | |
2555 | 2555 | public LSL_Types.list llGetBoundingBox(string obj) | |
2556 | public int llGetNumberOfPrims() | 2556 | { |
2557 | { | 2557 | NotImplemented("llGetBoundingBox"); |
2558 | return m_host.ParentGroup.PrimCount; | 2558 | return new LSL_Types.list(); |
2559 | } | 2559 | } |
2560 | 2560 | ||
2561 | public string llGetNumberOfNotecardLines(string name) | 2561 | public LSL_Types.Vector3 llGetGeometricCenter() |
2562 | { | 2562 | { |
2563 | NotImplemented("llGetNumberOfNotecardLines"); | 2563 | return new LSL_Types.Vector3(m_host.GetGeometricCenter().X, m_host.GetGeometricCenter().Y, m_host.GetGeometricCenter().Z); |
2564 | return ""; | 2564 | } |
2565 | } | 2565 | |
2566 | 2566 | public void llGetPrimitiveParams() | |
2567 | public LSL_Types.list llGetBoundingBox(string obj) | 2567 | { |
2568 | { | 2568 | NotImplemented("llGetPrimitiveParams"); |
2569 | NotImplemented("llGetBoundingBox"); | 2569 | } |
2570 | return new LSL_Types.list(); | 2570 | |
2571 | } | 2571 | public string llIntegerToBase64(int number) |
2572 | 2572 | { | |
2573 | public LSL_Types.Vector3 llGetGeometricCenter() | 2573 | NotImplemented("llIntegerToBase64"); |
2574 | { | 2574 | return ""; |
2575 | return new LSL_Types.Vector3(m_host.GetGeometricCenter().X, m_host.GetGeometricCenter().Y, m_host.GetGeometricCenter().Z); | 2575 | } |
2576 | } | 2576 | |
2577 | 2577 | public int llBase64ToInteger(string str) | |
2578 | public void llGetPrimitiveParams() | 2578 | { |
2579 | { | 2579 | NotImplemented("llBase64ToInteger"); |
2580 | NotImplemented("llGetPrimitiveParams"); | 2580 | return 0; |
2581 | } | 2581 | } |
2582 | 2582 | ||
2583 | public string llIntegerToBase64(int number) | 2583 | public double llGetGMTclock() |
2584 | { | 2584 | { |
2585 | NotImplemented("llIntegerToBase64"); | 2585 | return DateTime.UtcNow.TimeOfDay.TotalSeconds; |
2586 | return ""; | 2586 | } |
2587 | } | 2587 | |
2588 | 2588 | public string llGetSimulatorHostname() | |
2589 | public int llBase64ToInteger(string str) | 2589 | { |
2590 | { | 2590 | return System.Environment.MachineName; |
2591 | NotImplemented("llBase64ToInteger"); | 2591 | } |
2592 | return 0; | 2592 | |
2593 | } | 2593 | public void llSetLocalRot(LSL_Types.Quaternion rot) |
2594 | 2594 | { | |
2595 | public double llGetGMTclock() | 2595 | m_host.RotationOffset = new LLQuaternion((float)rot.x, (float)rot.y, (float)rot.z, (float)rot.s); |
2596 | { | 2596 | } |
2597 | return DateTime.UtcNow.TimeOfDay.TotalSeconds; | 2597 | |
2598 | } | 2598 | public LSL_Types.list llParseStringKeepNulls(string src, LSL_Types.list seperators, LSL_Types.list spacers) |
2599 | 2599 | { | |
2600 | public string llGetSimulatorHostname() | 2600 | NotImplemented("llParseStringKeepNulls"); |
2601 | { | 2601 | return new LSL_Types.list(); |
2602 | return System.Environment.MachineName; | 2602 | } |
2603 | } | 2603 | |
2604 | 2604 | public void llRezAtRoot(string inventory, LSL_Types.Vector3 position, LSL_Types.Vector3 velocity, | |
2605 | public void llSetLocalRot(LSL_Types.Quaternion rot) | 2605 | LSL_Types.Quaternion rot, int param) |
2606 | { | 2606 | { |
2607 | m_host.RotationOffset = new LLQuaternion((float)rot.x, (float)rot.y, (float)rot.z, (float)rot.s); | 2607 | NotImplemented("llRezAtRoot"); |
2608 | } | 2608 | } |
2609 | 2609 | ||
2610 | public LSL_Types.list llParseStringKeepNulls(string src, LSL_Types.list seperators, LSL_Types.list spacers) | 2610 | public int llGetObjectPermMask(int mask) |
2611 | { | 2611 | { |
2612 | NotImplemented("llParseStringKeepNulls"); | 2612 | NotImplemented("llGetObjectPermMask"); |
2613 | return new LSL_Types.list(); | 2613 | return 0; |
2614 | } | 2614 | } |
2615 | 2615 | ||
2616 | public void llRezAtRoot(string inventory, LSL_Types.Vector3 position, LSL_Types.Vector3 velocity, | 2616 | public void llSetObjectPermMask(int mask, int value) |
2617 | LSL_Types.Quaternion rot, int param) | 2617 | { |
2618 | { | 2618 | NotImplemented("llSetObjectPermMask"); |
2619 | NotImplemented("llRezAtRoot"); | 2619 | } |
2620 | } | 2620 | |
2621 | 2621 | public void llGetInventoryPermMask(string item, int mask) | |
2622 | public int llGetObjectPermMask(int mask) | 2622 | { |
2623 | { | 2623 | NotImplemented("llGetInventoryPermMask"); |
2624 | NotImplemented("llGetObjectPermMask"); | 2624 | } |
2625 | return 0; | 2625 | |
2626 | } | 2626 | public void llSetInventoryPermMask(string item, int mask, int value) |
2627 | 2627 | { | |
2628 | public void llSetObjectPermMask(int mask, int value) | 2628 | NotImplemented("llSetInventoryPermMask"); |
2629 | { | 2629 | } |
2630 | NotImplemented("llSetObjectPermMask"); | 2630 | |
2631 | } | 2631 | public string llGetInventoryCreator(string item) |
2632 | 2632 | { | |
2633 | public void llGetInventoryPermMask(string item, int mask) | 2633 | NotImplemented("llGetInventoryCreator"); |
2634 | { | 2634 | return ""; |
2635 | NotImplemented("llGetInventoryPermMask"); | 2635 | } |
2636 | } | 2636 | |
2637 | 2637 | public void llOwnerSay(string msg) | |
2638 | public void llSetInventoryPermMask(string item, int mask, int value) | 2638 | { |
2639 | { | 2639 | //temp fix so that lsl wiki examples aren't annoying to use to test other functions |
2640 | NotImplemented("llSetInventoryPermMask"); | 2640 | World.SimChat(Helpers.StringToField(msg), ChatTypeEnum.Say, 0, m_host.AbsolutePosition, m_host.Name, m_host.UUID); |
2641 | } | 2641 | IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); |
2642 | 2642 | wComm.DeliverMessage(m_host.UUID.ToString(), ChatTypeEnum.Say, 0, m_host.Name, msg); | |
2643 | public string llGetInventoryCreator(string item) | 2643 | } |
2644 | { | 2644 | |
2645 | NotImplemented("llGetInventoryCreator"); | 2645 | public void llRequestSimulatorData(string simulator, int data) |
2646 | return ""; | 2646 | { |
2647 | } | 2647 | NotImplemented("llRequestSimulatorData"); |
2648 | 2648 | } | |
2649 | public void llOwnerSay(string msg) | 2649 | |
2650 | { | 2650 | public void llForceMouselook(int mouselook) |
2651 | //temp fix so that lsl wiki examples aren't annoying to use to test other functions | 2651 | { |
2652 | World.SimChat(Helpers.StringToField(msg), ChatTypeEnum.Say, 0, m_host.AbsolutePosition, m_host.Name, m_host.UUID); | 2652 | NotImplemented("llForceMouselook"); |
2653 | IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); | 2653 | } |
2654 | wComm.DeliverMessage(m_host.UUID.ToString(), ChatTypeEnum.Say, 0, m_host.Name, msg); | 2654 | |
2655 | } | 2655 | public double llGetObjectMass(string id) |
2656 | 2656 | { | |
2657 | public void llRequestSimulatorData(string simulator, int data) | 2657 | NotImplemented("llGetObjectMass"); |
2658 | { | 2658 | return 0; |
2659 | NotImplemented("llRequestSimulatorData"); | 2659 | } |
2660 | } | 2660 | |
2661 | 2661 | public LSL_Types.list llListReplaceList(LSL_Types.list dest, LSL_Types.list src, int start, int end) | |
2662 | public void llForceMouselook(int mouselook) | 2662 | { |
2663 | { | 2663 | return dest.GetSublist(0, start - 1) + src + dest.GetSublist(end + 1, -1); |
2664 | NotImplemented("llForceMouselook"); | 2664 | } |
2665 | } | 2665 | |
2666 | 2666 | public void llLoadURL(string avatar_id, string message, string url) | |
2667 | public double llGetObjectMass(string id) | 2667 | { |
2668 | { | 2668 | LLUUID avatarId = new LLUUID(avatar_id); |
2669 | NotImplemented("llGetObjectMass"); | 2669 | m_ScriptEngine.World.SendUrlToUser(avatarId, m_host.Name, m_host.UUID, m_host.ObjectOwner, false, message, |
2670 | return 0; | 2670 | url); |
2671 | } | 2671 | } |
2672 | 2672 | ||
2673 | public LSL_Types.list llListReplaceList(LSL_Types.list dest, LSL_Types.list src, int start, int end) | 2673 | public void llParcelMediaCommandList(LSL_Types.list commandList) |
2674 | { | 2674 | { |
2675 | return dest.GetSublist(0, start - 1) + src + dest.GetSublist(end + 1, -1); | 2675 | NotImplemented("llParcelMediaCommandList"); |
2676 | } | 2676 | } |
2677 | 2677 | ||
2678 | public void llLoadURL(string avatar_id, string message, string url) | 2678 | public void llParcelMediaQuery() |
2679 | { | 2679 | { |
2680 | LLUUID avatarId = new LLUUID(avatar_id); | 2680 | NotImplemented("llParcelMediaQuery"); |
2681 | m_ScriptEngine.World.SendUrlToUser(avatarId, m_host.Name, m_host.UUID, m_host.ObjectOwner, false, message, | 2681 | } |
2682 | url); | 2682 | |
2683 | } | 2683 | public int llModPow(int a, int b, int c) |
2684 | 2684 | { | |
2685 | public void llParcelMediaCommandList(LSL_Types.list commandList) | 2685 | Int64 tmp = 0; |
2686 | { | 2686 | Int64 val = Math.DivRem(Convert.ToInt64(Math.Pow(a, b)), c, out tmp); |
2687 | NotImplemented("llParcelMediaCommandList"); | 2687 | return Convert.ToInt32(tmp); |
2688 | } | 2688 | } |
2689 | 2689 | ||
2690 | public void llParcelMediaQuery() | 2690 | public int llGetInventoryType(string name) |
2691 | { | 2691 | { |
2692 | NotImplemented("llParcelMediaQuery"); | 2692 | NotImplemented("llGetInventoryType"); |
2693 | } | 2693 | return 0; |
2694 | 2694 | } | |
2695 | public int llModPow(int a, int b, int c) | 2695 | |
2696 | { | 2696 | public void llSetPayPrice(int price, LSL_Types.list quick_pay_buttons) |
2697 | Int64 tmp = 0; | 2697 | { |
2698 | Int64 val = Math.DivRem(Convert.ToInt64(Math.Pow(a, b)), c, out tmp); | 2698 | NotImplemented("llSetPayPrice"); |
2699 | return Convert.ToInt32(tmp); | 2699 | } |
2700 | } | 2700 | |
2701 | 2701 | public LSL_Types.Vector3 llGetCameraPos() | |
2702 | public int llGetInventoryType(string name) | 2702 | { |
2703 | { | 2703 | NotImplemented("llGetCameraPos"); |
2704 | NotImplemented("llGetInventoryType"); | 2704 | return new LSL_Types.Vector3(); |
2705 | return 0; | 2705 | } |
2706 | } | 2706 | |
2707 | 2707 | public LSL_Types.Quaternion llGetCameraRot() | |
2708 | public void llSetPayPrice(int price, LSL_Types.list quick_pay_buttons) | 2708 | { |
2709 | { | 2709 | NotImplemented("llGetCameraRot"); |
2710 | NotImplemented("llSetPayPrice"); | 2710 | return new LSL_Types.Quaternion(); |
2711 | } | 2711 | } |
2712 | 2712 | ||
2713 | public LSL_Types.Vector3 llGetCameraPos() | 2713 | public void llSetPrimURL() |
2714 | { | 2714 | { |
2715 | NotImplemented("llGetCameraPos"); | 2715 | NotImplemented("llSetPrimURL"); |
2716 | return new LSL_Types.Vector3(); | 2716 | } |
2717 | } | 2717 | |
2718 | 2718 | public void llRefreshPrimURL() | |
2719 | public LSL_Types.Quaternion llGetCameraRot() | 2719 | { |
2720 | { | 2720 | NotImplemented("llRefreshPrimURL"); |
2721 | NotImplemented("llGetCameraRot"); | 2721 | } |
2722 | return new LSL_Types.Quaternion(); | 2722 | |
2723 | } | 2723 | public string llEscapeURL(string url) |
2724 | 2724 | { | |
2725 | public void llSetPrimURL() | 2725 | try |
2726 | { | 2726 | { |
2727 | NotImplemented("llSetPrimURL"); | 2727 | return Uri.EscapeUriString(url); |
2728 | } | 2728 | } |
2729 | 2729 | catch (Exception ex) | |
2730 | public void llRefreshPrimURL() | 2730 | { |
2731 | { | 2731 | return "llEscapeURL: " + ex.ToString(); |
2732 | NotImplemented("llRefreshPrimURL"); | 2732 | } |
2733 | } | 2733 | } |
2734 | 2734 | ||
2735 | public string llEscapeURL(string url) | 2735 | public string llUnescapeURL(string url) |
2736 | { | 2736 | { |
2737 | try | 2737 | try |
2738 | { | 2738 | { |
2739 | return Uri.EscapeUriString(url); | 2739 | return Uri.UnescapeDataString(url); |
2740 | } | 2740 | } |
2741 | catch (Exception ex) | 2741 | catch (Exception ex) |
2742 | { | 2742 | { |
2743 | return "llEscapeURL: " + ex.ToString(); | 2743 | return "llUnescapeURL: " + ex.ToString(); |
2744 | } | 2744 | } |
2745 | } | 2745 | } |
2746 | 2746 | ||
2747 | public string llUnescapeURL(string url) | 2747 | public void llMapDestination(string simname, LSL_Types.Vector3 pos, LSL_Types.Vector3 look_at) |
2748 | { | 2748 | { |
2749 | try | 2749 | NotImplemented("llMapDestination"); |
2750 | { | 2750 | } |
2751 | return Uri.UnescapeDataString(url); | 2751 | |
2752 | } | 2752 | public void llAddToLandBanList(string avatar, double hours) |
2753 | catch (Exception ex) | 2753 | { |
2754 | { | 2754 | NotImplemented("llAddToLandBanList"); |
2755 | return "llUnescapeURL: " + ex.ToString(); | 2755 | } |
2756 | } | 2756 | |
2757 | } | 2757 | public void llRemoveFromLandPassList(string avatar) |
2758 | 2758 | { | |
2759 | public void llMapDestination(string simname, LSL_Types.Vector3 pos, LSL_Types.Vector3 look_at) | 2759 | NotImplemented("llRemoveFromLandPassList"); |
2760 | { | 2760 | } |
2761 | NotImplemented("llMapDestination"); | 2761 | |
2762 | } | 2762 | public void llRemoveFromLandBanList(string avatar) |
2763 | 2763 | { | |
2764 | public void llAddToLandBanList(string avatar, double hours) | 2764 | NotImplemented("llRemoveFromLandBanList"); |
2765 | { | 2765 | } |
2766 | NotImplemented("llAddToLandBanList"); | 2766 | |
2767 | } | 2767 | public void llSetCameraParams(LSL_Types.list rules) |
2768 | 2768 | { | |
2769 | public void llRemoveFromLandPassList(string avatar) | 2769 | NotImplemented("llSetCameraParams"); |
2770 | { | 2770 | } |
2771 | NotImplemented("llRemoveFromLandPassList"); | 2771 | |
2772 | } | 2772 | public void llClearCameraParams() |
2773 | 2773 | { | |
2774 | public void llRemoveFromLandBanList(string avatar) | 2774 | NotImplemented("llClearCameraParams"); |
2775 | { | 2775 | } |
2776 | NotImplemented("llRemoveFromLandBanList"); | 2776 | |
2777 | } | 2777 | public double llListStatistics(int operation, LSL_Types.list src) |
2778 | 2778 | { | |
2779 | public void llSetCameraParams(LSL_Types.list rules) | 2779 | NotImplemented("llListStatistics"); |
2780 | { | 2780 | return 0; |
2781 | NotImplemented("llSetCameraParams"); | 2781 | } |
2782 | } | 2782 | |
2783 | 2783 | public int llGetUnixTime() | |
2784 | public void llClearCameraParams() | 2784 | { |
2785 | { | 2785 | return Util.UnixTimeSinceEpoch(); |
2786 | NotImplemented("llClearCameraParams"); | 2786 | } |
2787 | } | 2787 | |
2788 | 2788 | public int llGetParcelFlags(LSL_Types.Vector3 pos) | |
2789 | public double llListStatistics(int operation, LSL_Types.list src) | 2789 | { |
2790 | { | 2790 | NotImplemented("llGetParcelFlags"); |
2791 | NotImplemented("llListStatistics"); | 2791 | return 0; |
2792 | return 0; | 2792 | } |
2793 | } | 2793 | |
2794 | 2794 | public int llGetRegionFlags() | |
2795 | public int llGetUnixTime() | 2795 | { |
2796 | { | 2796 | NotImplemented("llGetRegionFlags"); |
2797 | return Util.UnixTimeSinceEpoch(); | 2797 | return 0; |
2798 | } | 2798 | } |
2799 | 2799 | ||
2800 | public int llGetParcelFlags(LSL_Types.Vector3 pos) | 2800 | public string llXorBase64StringsCorrect(string str1, string str2) |
2801 | { | 2801 | { |
2802 | NotImplemented("llGetParcelFlags"); | 2802 | string ret = ""; |
2803 | return 0; | 2803 | string src1 = llBase64ToString(str1); |
2804 | } | 2804 | string src2 = llBase64ToString(str2); |
2805 | 2805 | int c = 0; | |
2806 | public int llGetRegionFlags() | 2806 | for (int i = 0; i < src1.Length; i++) |
2807 | { | 2807 | { |
2808 | NotImplemented("llGetRegionFlags"); | 2808 | ret += src1[i] ^ src2[c]; |
2809 | return 0; | 2809 | |
2810 | } | 2810 | c++; |
2811 | 2811 | if (c > src2.Length) | |
2812 | public string llXorBase64StringsCorrect(string str1, string str2) | 2812 | c = 0; |
2813 | { | 2813 | } |
2814 | string ret = ""; | 2814 | return llStringToBase64(ret); |
2815 | string src1 = llBase64ToString(str1); | 2815 | } |
2816 | string src2 = llBase64ToString(str2); | 2816 | |
2817 | int c = 0; | 2817 | public string llHTTPRequest(string url, LSL_Types.list parameters, string body) |
2818 | for (int i = 0; i < src1.Length; i++) | 2818 | { |
2819 | { | 2819 | IHttpRequests httpScriptMod = |
2820 | ret += src1[i] ^ src2[c]; | 2820 | m_ScriptEngine.World.RequestModuleInterface<IHttpRequests>(); |
2821 | 2821 | List<string> param = new List<string>(); | |
2822 | c++; | 2822 | foreach (object o in parameters.Data) |
2823 | if (c > src2.Length) | 2823 | { |
2824 | c = 0; | 2824 | param.Add(o.ToString()); |
2825 | } | 2825 | } |
2826 | return llStringToBase64(ret); | 2826 | LLUUID reqID = httpScriptMod. |
2827 | } | 2827 | StartHttpRequest(m_localID, m_itemID, url, param, body); |
2828 | 2828 | ||
2829 | public string llHTTPRequest(string url, LSL_Types.list parameters, string body) | 2829 | if (!reqID.Equals(null)) |
2830 | { | 2830 | return reqID.ToString(); |
2831 | IHttpRequests httpScriptMod = | 2831 | else |
2832 | m_ScriptEngine.World.RequestModuleInterface<IHttpRequests>(); | 2832 | return null; |
2833 | List<string> param = new List<string>(); | 2833 | } |
2834 | foreach (object o in parameters.Data) | 2834 | |
2835 | { | 2835 | public void llResetLandBanList() |
2836 | param.Add(o.ToString()); | 2836 | { |
2837 | } | 2837 | NotImplemented("llResetLandBanList"); |
2838 | LLUUID reqID = httpScriptMod. | 2838 | } |
2839 | StartHttpRequest(m_localID, m_itemID, url, param, body); | 2839 | |
2840 | 2840 | public void llResetLandPassList() | |
2841 | if (!reqID.Equals(null)) | 2841 | { |
2842 | return reqID.ToString(); | 2842 | NotImplemented("llResetLandPassList"); |
2843 | else | 2843 | } |
2844 | return null; | 2844 | |
2845 | } | 2845 | public int llGetParcelPrimCount(LSL_Types.Vector3 pos, int category, int sim_wide) |
2846 | 2846 | { | |
2847 | public void llResetLandBanList() | 2847 | NotImplemented("llGetParcelPrimCount"); |
2848 | { | 2848 | return 0; |
2849 | NotImplemented("llResetLandBanList"); | 2849 | } |
2850 | } | 2850 | |
2851 | 2851 | public LSL_Types.list llGetParcelPrimOwners(LSL_Types.Vector3 pos) | |
2852 | public void llResetLandPassList() | 2852 | { |
2853 | { | 2853 | NotImplemented("llGetParcelPrimOwners"); |
2854 | NotImplemented("llResetLandPassList"); | 2854 | return new LSL_Types.list(); |
2855 | } | 2855 | } |
2856 | 2856 | ||
2857 | public int llGetParcelPrimCount(LSL_Types.Vector3 pos, int category, int sim_wide) | 2857 | public int llGetObjectPrimCount(string object_id) |
2858 | { | 2858 | { |
2859 | NotImplemented("llGetParcelPrimCount"); | 2859 | SceneObjectPart part = World.GetSceneObjectPart(new LLUUID(object_id)); |
2860 | return 0; | 2860 | if (part == null) |
2861 | } | 2861 | { |
2862 | 2862 | return 0; | |
2863 | public LSL_Types.list llGetParcelPrimOwners(LSL_Types.Vector3 pos) | 2863 | } |
2864 | { | 2864 | else |
2865 | NotImplemented("llGetParcelPrimOwners"); | 2865 | { |
2866 | return new LSL_Types.list(); | 2866 | return part.ParentGroup.Children.Count; |
2867 | } | 2867 | } |
2868 | 2868 | } | |
2869 | public int llGetObjectPrimCount(string object_id) | 2869 | |
2870 | { | 2870 | public int llGetParcelMaxPrims(LSL_Types.Vector3 pos, int sim_wide) |
2871 | SceneObjectPart part = World.GetSceneObjectPart(new LLUUID(object_id)); | 2871 | { |
2872 | if (part == null) | 2872 | // Alondria: This currently just is utilizing the normal grid's 0.22 prims/m2 calculation |
2873 | { | 2873 | // Which probably will be irrelevent in OpenSim.... |
2874 | return 0; | 2874 | LandData land = World.GetLandData((float)pos.x, (float)pos.y); |
2875 | } | 2875 | float bonusfactor = World.RegionInfo.EstateSettings.objectBonusFactor; |
2876 | else | 2876 | if (land == null) |
2877 | { | 2877 | { |
2878 | return part.ParentGroup.Children.Count; | 2878 | return 0; |
2879 | } | 2879 | } |
2880 | } | 2880 | if (sim_wide == 1) |
2881 | 2881 | { | |
2882 | public int llGetParcelMaxPrims(LSL_Types.Vector3 pos, int sim_wide) | 2882 | decimal v = land.simwideArea * (decimal)(0.22) * (decimal)bonusfactor; |
2883 | { | 2883 | return (int)v; |
2884 | // Alondria: This currently just is utilizing the normal grid's 0.22 prims/m2 calculation | 2884 | } |
2885 | // Which probably will be irrelevent in OpenSim.... | 2885 | else |
2886 | LandData land = World.GetLandData((float)pos.x, (float)pos.y); | 2886 | { |
2887 | float bonusfactor = World.RegionInfo.EstateSettings.objectBonusFactor; | 2887 | decimal v = land.area * (decimal)(0.22) * (decimal)bonusfactor; |
2888 | if (land == null) | 2888 | return (int)v; |
2889 | { | 2889 | } |
2890 | return 0; | 2890 | |
2891 | } | 2891 | } |
2892 | if (sim_wide == 1) | 2892 | |
2893 | { | 2893 | public LSL_Types.list llGetParcelDetails(LSL_Types.Vector3 pos, LSL_Types.list param) |
2894 | decimal v = land.simwideArea * (decimal)(0.22) * (decimal)bonusfactor; | 2894 | { |
2895 | return (int)v; | 2895 | LandData land = World.GetLandData((float)pos.x, (float)pos.y); |
2896 | } | 2896 | if (land == null) |
2897 | else | 2897 | { |
2898 | { | 2898 | return new LSL_Types.list(0); |
2899 | decimal v = land.area * (decimal)(0.22) * (decimal)bonusfactor; | 2899 | } |
2900 | return (int)v; | 2900 | LSL_Types.list ret = new LSL_Types.list(); |
2901 | } | 2901 | foreach (object o in param.Data) |
2902 | 2902 | { | |
2903 | } | 2903 | switch (o.ToString()) |
2904 | 2904 | { | |
2905 | public LSL_Types.list llGetParcelDetails(LSL_Types.Vector3 pos, LSL_Types.list param) | 2905 | case "0": |
2906 | { | 2906 | ret = ret + new LSL_Types.list(land.landName); |
2907 | LandData land = World.GetLandData((float)pos.x, (float)pos.y); | 2907 | break; |
2908 | if (land == null) | 2908 | case "1": |
2909 | { | 2909 | ret = ret + new LSL_Types.list(land.landDesc); |
2910 | return new LSL_Types.list(0); | 2910 | break; |
2911 | } | 2911 | case "2": |
2912 | LSL_Types.list ret = new LSL_Types.list(); | 2912 | ret = ret + new LSL_Types.list(land.ownerID.ToString()); |
2913 | foreach (object o in param.Data) | 2913 | break; |
2914 | { | 2914 | case "3": |
2915 | switch (o.ToString()) | 2915 | ret = ret + new LSL_Types.list(land.groupID.ToString()); |
2916 | { | 2916 | break; |
2917 | case "0": | 2917 | case "4": |
2918 | ret = ret + new LSL_Types.list(land.landName); | 2918 | ret = ret + new LSL_Types.list(land.area); |
2919 | break; | 2919 | break; |
2920 | case "1": | 2920 | default: |
2921 | ret = ret + new LSL_Types.list(land.landDesc); | 2921 | ret = ret + new LSL_Types.list(0); |
2922 | break; | 2922 | break; |
2923 | case "2": | 2923 | } |
2924 | ret = ret + new LSL_Types.list(land.ownerID.ToString()); | 2924 | } |
2925 | break; | 2925 | return ret; |
2926 | case "3": | 2926 | } |
2927 | ret = ret + new LSL_Types.list(land.groupID.ToString()); | 2927 | |
2928 | break; | 2928 | // |
2929 | case "4": | 2929 | // OpenSim functions |
2930 | ret = ret + new LSL_Types.list(land.area); | 2930 | // |
2931 | break; | 2931 | public int osTerrainSetHeight(int x, int y, double val) |
2932 | default: | 2932 | { |
2933 | ret = ret + new LSL_Types.list(0); | 2933 | if (x > 255 || x < 0 || y > 255 || y < 0) |
2934 | break; | 2934 | LSLError("osTerrainSetHeight: Coordinate out of bounds"); |
2935 | } | 2935 | |
2936 | } | 2936 | if (World.PermissionsMngr.CanTerraform(m_host.OwnerID, new LLVector3(x, y, 0))) |
2937 | return ret; | 2937 | { |
2938 | } | 2938 | World.Terrain.Set(x, y, val); |
2939 | 2939 | return 1; | |
2940 | // | 2940 | } |
2941 | // OpenSim functions | 2941 | else |
2942 | // | 2942 | { |
2943 | public int osTerrainSetHeight(int x, int y, double val) | 2943 | return 0; |
2944 | { | 2944 | } |
2945 | if (x > 255 || x < 0 || y > 255 || y < 0) | 2945 | } |
2946 | LSLError("osTerrainSetHeight: Coordinate out of bounds"); | 2946 | |
2947 | 2947 | public double osTerrainGetHeight(int x, int y) | |
2948 | if (World.PermissionsMngr.CanTerraform(m_host.OwnerID, new LLVector3(x, y, 0))) | 2948 | { |
2949 | { | 2949 | if (x > 255 || x < 0 || y > 255 || y < 0) |
2950 | World.Terrain.Set(x, y, val); | 2950 | LSLError("osTerrainGetHeight: Coordinate out of bounds"); |
2951 | return 1; | 2951 | |
2952 | } | 2952 | return World.Terrain.GetHeight(x, y); |
2953 | else | 2953 | } |
2954 | { | 2954 | |
2955 | return 0; | 2955 | public int osRegionRestart(double seconds) |
2956 | } | 2956 | { |
2957 | } | 2957 | if (World.PermissionsMngr.CanRestartSim(m_host.OwnerID)) |
2958 | 2958 | { | |
2959 | public double osTerrainGetHeight(int x, int y) | 2959 | World.Restart((float)seconds); |
2960 | { | 2960 | return 1; |
2961 | if (x > 255 || x < 0 || y > 255 || y < 0) | 2961 | } |
2962 | LSLError("osTerrainGetHeight: Coordinate out of bounds"); | 2962 | else |
2963 | 2963 | { | |
2964 | return World.Terrain.GetHeight(x, y); | 2964 | return 0; |
2965 | } | 2965 | } |
2966 | 2966 | } | |
2967 | public int osRegionRestart(double seconds) | 2967 | |
2968 | { | 2968 | public void osRegionNotice(string msg) |
2969 | if (World.PermissionsMngr.CanRestartSim(m_host.OwnerID)) | 2969 | { |
2970 | { | 2970 | World.SendGeneralAlert(msg); |
2971 | World.Restart((float)seconds); | 2971 | } |
2972 | return 1; | 2972 | |
2973 | } | 2973 | public string osSetDynamicTextureURL(string dynamicID, string contentType, string url, string extraParams, |
2974 | else | 2974 | int timer) |
2975 | { | 2975 | { |
2976 | return 0; | 2976 | if (dynamicID == "") |
2977 | } | 2977 | { |
2978 | } | 2978 | IDynamicTextureManager textureManager = World.RequestModuleInterface<IDynamicTextureManager>(); |
2979 | 2979 | LLUUID createdTexture = | |
2980 | public void osRegionNotice(string msg) | 2980 | textureManager.AddDynamicTextureURL(World.RegionInfo.RegionID, m_host.UUID, contentType, url, |
2981 | { | 2981 | extraParams, timer); |
2982 | World.SendGeneralAlert(msg); | 2982 | return createdTexture.ToString(); |
2983 | } | 2983 | } |
2984 | 2984 | else | |
2985 | public string osSetDynamicTextureURL(string dynamicID, string contentType, string url, string extraParams, | 2985 | { |
2986 | int timer) | 2986 | //TODO update existing dynamic textures |
2987 | { | 2987 | } |
2988 | if (dynamicID == "") | 2988 | |
2989 | { | 2989 | return LLUUID.Zero.ToString(); |
2990 | IDynamicTextureManager textureManager = World.RequestModuleInterface<IDynamicTextureManager>(); | 2990 | } |
2991 | LLUUID createdTexture = | 2991 | |
2992 | textureManager.AddDynamicTextureURL(World.RegionInfo.RegionID, m_host.UUID, contentType, url, | 2992 | private void NotImplemented(string Command) |
2993 | extraParams, timer); | 2993 | { |
2994 | return createdTexture.ToString(); | 2994 | if (throwErrorOnNotImplemented) |
2995 | } | 2995 | throw new NotImplementedException("Command not implemented: " + Command); |
2996 | else | 2996 | } |
2997 | { | 2997 | |
2998 | //TODO update existing dynamic textures | 2998 | private void LSLError(string msg) |
2999 | } | 2999 | { |
3000 | 3000 | throw new Exception("LSL Runtime Error: " + msg); | |
3001 | return LLUUID.Zero.ToString(); | 3001 | } |
3002 | } | 3002 | } |
3003 | 3003 | } \ No newline at end of file | |
3004 | private void NotImplemented(string Command) | ||
3005 | { | ||
3006 | if (throwErrorOnNotImplemented) | ||
3007 | throw new NotImplementedException("Command not implemented: " + Command); | ||
3008 | } | ||
3009 | |||
3010 | private void LSLError(string msg) | ||
3011 | { | ||
3012 | throw new Exception("LSL Runtime Error: " + msg); | ||
3013 | } | ||
3014 | } | ||
3015 | } | ||
diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/AppDomainManager.cs b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/AppDomainManager.cs index 66153a7..4eea69a 100644 --- a/OpenSim/Region/ScriptEngine/DotNetEngine/AppDomainManager.cs +++ b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/AppDomainManager.cs | |||
@@ -1,238 +1,238 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) Contributors, http://opensimulator.org/ | 2 | * Copyright (c) Contributors, http://opensimulator.org/ |
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | 3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. |
4 | * | 4 | * |
5 | * Redistribution and use in source and binary forms, with or without | 5 | * Redistribution and use in source and binary forms, with or without |
6 | * modification, are permitted provided that the following conditions are met: | 6 | * modification, are permitted provided that the following conditions are met: |
7 | * * Redistributions of source code must retain the above copyright | 7 | * * Redistributions of source code must retain the above copyright |
8 | * notice, this list of conditions and the following disclaimer. | 8 | * notice, this list of conditions and the following disclaimer. |
9 | * * Redistributions in binary form must reproduce the above copyright | 9 | * * Redistributions in binary form must reproduce the above copyright |
10 | * notice, this list of conditions and the following disclaimer in the | 10 | * notice, this list of conditions and the following disclaimer in the |
11 | * documentation and/or other materials provided with the distribution. | 11 | * documentation and/or other materials provided with the distribution. |
12 | * * Neither the name of the OpenSim Project nor the | 12 | * * Neither the name of the OpenSim Project nor the |
13 | * names of its contributors may be used to endorse or promote products | 13 | * names of its contributors may be used to endorse or promote products |
14 | * derived from this software without specific prior written permission. | 14 | * derived from this software without specific prior written permission. |
15 | * | 15 | * |
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS AS IS AND ANY | 16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS AS IS AND ANY |
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | 17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | 19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY |
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | 20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 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 | 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 | 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 | 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. | 25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | * | 26 | * |
27 | */ | 27 | */ |
28 | 28 | ||
29 | using System; | 29 | using System; |
30 | using System.Collections; | 30 | using System.Collections; |
31 | using System.Collections.Generic; | 31 | using System.Collections.Generic; |
32 | using System.Reflection; | 32 | using System.Reflection; |
33 | using OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL; | 33 | using OpenSim.Region.ScriptEngine.Common; |
34 | 34 | ||
35 | namespace OpenSim.Region.ScriptEngine.DotNetEngine | 35 | namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase |
36 | { | 36 | { |
37 | public class AppDomainManager | 37 | public class AppDomainManager |
38 | { | 38 | { |
39 | 39 | ||
40 | // | 40 | // |
41 | // This class does AppDomain handling and loading/unloading of scripts in it. | 41 | // This class does AppDomain handling and loading/unloading of scripts in it. |
42 | // It is instanced in "ScriptEngine" and controlled from "ScriptManager" | 42 | // It is instanced in "ScriptEngine" and controlled from "ScriptManager" |
43 | // | 43 | // |
44 | // 1. Create a new AppDomain if old one is full (or doesn't exist) | 44 | // 1. Create a new AppDomain if old one is full (or doesn't exist) |
45 | // 2. Load scripts into AppDomain | 45 | // 2. Load scripts into AppDomain |
46 | // 3. Unload scripts from AppDomain (stopping them and marking them as inactive) | 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 | 47 | // 4. Unload AppDomain completely when all scripts in it has stopped |
48 | // | 48 | // |
49 | 49 | ||
50 | 50 | ||
51 | private int maxScriptsPerAppDomain = 1; | 51 | private int maxScriptsPerAppDomain = 1; |
52 | 52 | ||
53 | /// <summary> | 53 | /// <summary> |
54 | /// Internal list of all AppDomains | 54 | /// Internal list of all AppDomains |
55 | /// </summary> | 55 | /// </summary> |
56 | private List<AppDomainStructure> appDomains = new List<AppDomainStructure>(); | 56 | private List<AppDomainStructure> appDomains = new List<AppDomainStructure>(); |
57 | 57 | ||
58 | /// <summary> | 58 | /// <summary> |
59 | /// Structure to keep track of data around AppDomain | 59 | /// Structure to keep track of data around AppDomain |
60 | /// </summary> | 60 | /// </summary> |
61 | private class AppDomainStructure | 61 | private class AppDomainStructure |
62 | { | 62 | { |
63 | /// <summary> | 63 | /// <summary> |
64 | /// The AppDomain itself | 64 | /// The AppDomain itself |
65 | /// </summary> | 65 | /// </summary> |
66 | public AppDomain CurrentAppDomain; | 66 | public AppDomain CurrentAppDomain; |
67 | 67 | ||
68 | /// <summary> | 68 | /// <summary> |
69 | /// Number of scripts loaded into AppDomain | 69 | /// Number of scripts loaded into AppDomain |
70 | /// </summary> | 70 | /// </summary> |
71 | public int ScriptsLoaded; | 71 | public int ScriptsLoaded; |
72 | 72 | ||
73 | /// <summary> | 73 | /// <summary> |
74 | /// Number of dead scripts | 74 | /// Number of dead scripts |
75 | /// </summary> | 75 | /// </summary> |
76 | public int ScriptsWaitingUnload; | 76 | public int ScriptsWaitingUnload; |
77 | } | 77 | } |
78 | 78 | ||
79 | /// <summary> | 79 | /// <summary> |
80 | /// Current AppDomain | 80 | /// Current AppDomain |
81 | /// </summary> | 81 | /// </summary> |
82 | private AppDomainStructure currentAD; | 82 | private AppDomainStructure currentAD; |
83 | 83 | ||
84 | private object getLock = new object(); // Mutex | 84 | private object getLock = new object(); // Mutex |
85 | private object freeLock = new object(); // Mutex | 85 | private object freeLock = new object(); // Mutex |
86 | 86 | ||
87 | //private ScriptEngine m_scriptEngine; | 87 | //private ScriptEngine m_scriptEngine; |
88 | //public AppDomainManager(ScriptEngine scriptEngine) | 88 | //public AppDomainManager(ScriptEngine scriptEngine) |
89 | public AppDomainManager() | 89 | public AppDomainManager() |
90 | { | 90 | { |
91 | //m_scriptEngine = scriptEngine; | 91 | //m_scriptEngine = scriptEngine; |
92 | } | 92 | } |
93 | 93 | ||
94 | /// <summary> | 94 | /// <summary> |
95 | /// Find a free AppDomain, creating one if necessary | 95 | /// Find a free AppDomain, creating one if necessary |
96 | /// </summary> | 96 | /// </summary> |
97 | /// <returns>Free AppDomain</returns> | 97 | /// <returns>Free AppDomain</returns> |
98 | private AppDomainStructure GetFreeAppDomain() | 98 | private AppDomainStructure GetFreeAppDomain() |
99 | { | 99 | { |
100 | Console.WriteLine("Finding free AppDomain"); | 100 | Console.WriteLine("Finding free AppDomain"); |
101 | lock (getLock) | 101 | lock (getLock) |
102 | { | 102 | { |
103 | // Current full? | 103 | // Current full? |
104 | if (currentAD != null && currentAD.ScriptsLoaded >= maxScriptsPerAppDomain) | 104 | if (currentAD != null && currentAD.ScriptsLoaded >= maxScriptsPerAppDomain) |
105 | { | 105 | { |
106 | // Add it to AppDomains list and empty current | 106 | // Add it to AppDomains list and empty current |
107 | appDomains.Add(currentAD); | 107 | appDomains.Add(currentAD); |
108 | currentAD = null; | 108 | currentAD = null; |
109 | } | 109 | } |
110 | // No current | 110 | // No current |
111 | if (currentAD == null) | 111 | if (currentAD == null) |
112 | { | 112 | { |
113 | // Create a new current AppDomain | 113 | // Create a new current AppDomain |
114 | currentAD = new AppDomainStructure(); | 114 | currentAD = new AppDomainStructure(); |
115 | currentAD.CurrentAppDomain = PrepareNewAppDomain(); | 115 | currentAD.CurrentAppDomain = PrepareNewAppDomain(); |
116 | } | 116 | } |
117 | 117 | ||
118 | Console.WriteLine("Scripts loaded in this Appdomain: " + currentAD.ScriptsLoaded); | 118 | Console.WriteLine("Scripts loaded in this Appdomain: " + currentAD.ScriptsLoaded); |
119 | return currentAD; | 119 | return currentAD; |
120 | } // lock | 120 | } // lock |
121 | } | 121 | } |
122 | 122 | ||
123 | private int AppDomainNameCount; | 123 | private int AppDomainNameCount; |
124 | 124 | ||
125 | /// <summary> | 125 | /// <summary> |
126 | /// Create and prepare a new AppDomain for scripts | 126 | /// Create and prepare a new AppDomain for scripts |
127 | /// </summary> | 127 | /// </summary> |
128 | /// <returns>The new AppDomain</returns> | 128 | /// <returns>The new AppDomain</returns> |
129 | private AppDomain PrepareNewAppDomain() | 129 | private AppDomain PrepareNewAppDomain() |
130 | { | 130 | { |
131 | // Create and prepare a new AppDomain | 131 | // Create and prepare a new AppDomain |
132 | AppDomainNameCount++; | 132 | AppDomainNameCount++; |
133 | // TODO: Currently security match current appdomain | 133 | // TODO: Currently security match current appdomain |
134 | 134 | ||
135 | // Construct and initialize settings for a second AppDomain. | 135 | // Construct and initialize settings for a second AppDomain. |
136 | AppDomainSetup ads = new AppDomainSetup(); | 136 | AppDomainSetup ads = new AppDomainSetup(); |
137 | ads.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory; | 137 | ads.ApplicationBase = AppDomain.CurrentDomain.BaseDirectory; |
138 | ads.DisallowBindingRedirects = false; | 138 | ads.DisallowBindingRedirects = false; |
139 | ads.DisallowCodeDownload = true; | 139 | ads.DisallowCodeDownload = true; |
140 | ads.LoaderOptimization = LoaderOptimization.MultiDomain; // Sounds good ;) | 140 | ads.LoaderOptimization = LoaderOptimization.MultiDomain; // Sounds good ;) |
141 | ads.ShadowCopyFiles = "true"; // Enabled shadowing | 141 | ads.ShadowCopyFiles = "true"; // Enabled shadowing |
142 | ads.ConfigurationFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile; | 142 | ads.ConfigurationFile = AppDomain.CurrentDomain.SetupInformation.ConfigurationFile; |
143 | 143 | ||
144 | AppDomain AD = AppDomain.CreateDomain("ScriptAppDomain_" + AppDomainNameCount, null, ads); | 144 | AppDomain AD = AppDomain.CreateDomain("ScriptAppDomain_" + AppDomainNameCount, null, ads); |
145 | Console.WriteLine("Loading: " + | 145 | Console.WriteLine("Loading: " + |
146 | AssemblyName.GetAssemblyName("OpenSim.Region.ScriptEngine.Common.dll").ToString()); | 146 | AssemblyName.GetAssemblyName("OpenSim.Region.ScriptEngine.Common.dll").ToString()); |
147 | AD.Load(AssemblyName.GetAssemblyName("OpenSim.Region.ScriptEngine.Common.dll")); | 147 | AD.Load(AssemblyName.GetAssemblyName("OpenSim.Region.ScriptEngine.Common.dll")); |
148 | 148 | ||
149 | // Return the new AppDomain | 149 | // Return the new AppDomain |
150 | return AD; | 150 | return AD; |
151 | } | 151 | } |
152 | 152 | ||
153 | /// <summary> | 153 | /// <summary> |
154 | /// Unload appdomains that are full and have only dead scripts | 154 | /// Unload appdomains that are full and have only dead scripts |
155 | /// </summary> | 155 | /// </summary> |
156 | private void UnloadAppDomains() | 156 | private void UnloadAppDomains() |
157 | { | 157 | { |
158 | lock (freeLock) | 158 | lock (freeLock) |
159 | { | 159 | { |
160 | // Go through all | 160 | // Go through all |
161 | foreach (AppDomainStructure ads in new ArrayList(appDomains)) | 161 | foreach (AppDomainStructure ads in new ArrayList(appDomains)) |
162 | { | 162 | { |
163 | // Don't process current AppDomain | 163 | // Don't process current AppDomain |
164 | if (ads.CurrentAppDomain != currentAD.CurrentAppDomain) | 164 | if (ads.CurrentAppDomain != currentAD.CurrentAppDomain) |
165 | { | 165 | { |
166 | // Not current AppDomain | 166 | // Not current AppDomain |
167 | // Is number of unloaded bigger or equal to number of loaded? | 167 | // Is number of unloaded bigger or equal to number of loaded? |
168 | if (ads.ScriptsLoaded <= ads.ScriptsWaitingUnload) | 168 | if (ads.ScriptsLoaded <= ads.ScriptsWaitingUnload) |
169 | { | 169 | { |
170 | Console.WriteLine("Found empty AppDomain, unloading"); | 170 | Console.WriteLine("Found empty AppDomain, unloading"); |
171 | // Remove from internal list | 171 | // Remove from internal list |
172 | appDomains.Remove(ads); | 172 | appDomains.Remove(ads); |
173 | #if DEBUG | 173 | #if DEBUG |
174 | long m = GC.GetTotalMemory(true); | 174 | long m = GC.GetTotalMemory(true); |
175 | #endif | 175 | #endif |
176 | // Unload | 176 | // Unload |
177 | AppDomain.Unload(ads.CurrentAppDomain); | 177 | AppDomain.Unload(ads.CurrentAppDomain); |
178 | #if DEBUG | 178 | #if DEBUG |
179 | Console.WriteLine("AppDomain unload freed " + (m - GC.GetTotalMemory(true)) + | 179 | Console.WriteLine("AppDomain unload freed " + (m - GC.GetTotalMemory(true)) + |
180 | " bytes of memory"); | 180 | " bytes of memory"); |
181 | #endif | 181 | #endif |
182 | } | 182 | } |
183 | } | 183 | } |
184 | } // foreach | 184 | } // foreach |
185 | } // lock | 185 | } // lock |
186 | } | 186 | } |
187 | 187 | ||
188 | 188 | ||
189 | public LSL_BaseClass LoadScript(string FileName) | 189 | public IScript LoadScript(string FileName) |
190 | { | 190 | { |
191 | // Find next available AppDomain to put it in | 191 | // Find next available AppDomain to put it in |
192 | AppDomainStructure FreeAppDomain = GetFreeAppDomain(); | 192 | AppDomainStructure FreeAppDomain = GetFreeAppDomain(); |
193 | 193 | ||
194 | Console.WriteLine("Loading into AppDomain: " + FileName); | 194 | Console.WriteLine("Loading into AppDomain: " + FileName); |
195 | LSL_BaseClass mbrt = | 195 | IScript mbrt = |
196 | (LSL_BaseClass) | 196 | (IScript) |
197 | FreeAppDomain.CurrentAppDomain.CreateInstanceFromAndUnwrap(FileName, "SecondLife.Script"); | 197 | FreeAppDomain.CurrentAppDomain.CreateInstanceFromAndUnwrap(FileName, "SecondLife.Script"); |
198 | //Console.WriteLine("ScriptEngine AppDomainManager: is proxy={0}", RemotingServices.IsTransparentProxy(mbrt)); | 198 | //Console.WriteLine("ScriptEngine AppDomainManager: is proxy={0}", RemotingServices.IsTransparentProxy(mbrt)); |
199 | FreeAppDomain.ScriptsLoaded++; | 199 | FreeAppDomain.ScriptsLoaded++; |
200 | 200 | ||
201 | return mbrt; | 201 | return mbrt; |
202 | } | 202 | } |
203 | 203 | ||
204 | 204 | ||
205 | /// <summary> | 205 | /// <summary> |
206 | /// Increase "dead script" counter for an AppDomain | 206 | /// Increase "dead script" counter for an AppDomain |
207 | /// </summary> | 207 | /// </summary> |
208 | /// <param name="ad"></param> | 208 | /// <param name="ad"></param> |
209 | //[Obsolete("Needs fixing, needs a real purpose in life!!!")] | 209 | //[Obsolete("Needs fixing, needs a real purpose in life!!!")] |
210 | public void StopScript(AppDomain ad) | 210 | public void StopScript(AppDomain ad) |
211 | { | 211 | { |
212 | lock (freeLock) | 212 | lock (freeLock) |
213 | { | 213 | { |
214 | Console.WriteLine("Stopping script in AppDomain"); | 214 | Console.WriteLine("Stopping script in AppDomain"); |
215 | // Check if it is current AppDomain | 215 | // Check if it is current AppDomain |
216 | if (currentAD.CurrentAppDomain == ad) | 216 | if (currentAD.CurrentAppDomain == ad) |
217 | { | 217 | { |
218 | // Yes - increase | 218 | // Yes - increase |
219 | currentAD.ScriptsWaitingUnload++; | 219 | currentAD.ScriptsWaitingUnload++; |
220 | return; | 220 | return; |
221 | } | 221 | } |
222 | 222 | ||
223 | // Lopp through all AppDomains | 223 | // Lopp through all AppDomains |
224 | foreach (AppDomainStructure ads in new ArrayList(appDomains)) | 224 | foreach (AppDomainStructure ads in new ArrayList(appDomains)) |
225 | { | 225 | { |
226 | if (ads.CurrentAppDomain == ad) | 226 | if (ads.CurrentAppDomain == ad) |
227 | { | 227 | { |
228 | // Found it | 228 | // Found it |
229 | ads.ScriptsWaitingUnload++; | 229 | ads.ScriptsWaitingUnload++; |
230 | break; | 230 | break; |
231 | } | 231 | } |
232 | } // foreach | 232 | } // foreach |
233 | } // lock | 233 | } // lock |
234 | 234 | ||
235 | UnloadAppDomains(); // Outsite lock, has its own GetLock | 235 | UnloadAppDomains(); // Outsite lock, has its own GetLock |
236 | } | 236 | } |
237 | } | 237 | } |
238 | } \ No newline at end of file | 238 | } \ No newline at end of file |
diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/Common.cs b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/Common.cs index db9a535..00ea078 100644 --- a/OpenSim/Region/ScriptEngine/DotNetEngine/Common.cs +++ b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/Common.cs | |||
@@ -1,57 +1,57 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) Contributors, http://opensimulator.org/ | 2 | * Copyright (c) Contributors, http://opensimulator.org/ |
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | 3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. |
4 | * | 4 | * |
5 | * Redistribution and use in source and binary forms, with or without | 5 | * Redistribution and use in source and binary forms, with or without |
6 | * modification, are permitted provided that the following conditions are met: | 6 | * modification, are permitted provided that the following conditions are met: |
7 | * * Redistributions of source code must retain the above copyright | 7 | * * Redistributions of source code must retain the above copyright |
8 | * notice, this list of conditions and the following disclaimer. | 8 | * notice, this list of conditions and the following disclaimer. |
9 | * * Redistributions in binary form must reproduce the above copyright | 9 | * * Redistributions in binary form must reproduce the above copyright |
10 | * notice, this list of conditions and the following disclaimer in the | 10 | * notice, this list of conditions and the following disclaimer in the |
11 | * documentation and/or other materials provided with the distribution. | 11 | * documentation and/or other materials provided with the distribution. |
12 | * * Neither the name of the OpenSim Project nor the | 12 | * * Neither the name of the OpenSim Project nor the |
13 | * names of its contributors may be used to endorse or promote products | 13 | * names of its contributors may be used to endorse or promote products |
14 | * derived from this software without specific prior written permission. | 14 | * derived from this software without specific prior written permission. |
15 | * | 15 | * |
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | 16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY |
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | 17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | 19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY |
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | 20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 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 | 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 | 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 | 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. | 25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | * | 26 | * |
27 | */ | 27 | */ |
28 | /* Original code: Tedd Hansen */ | 28 | /* Original code: Tedd Hansen */ |
29 | namespace OpenSim.Region.ScriptEngine.DotNetEngine | 29 | namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase |
30 | { | 30 | { |
31 | public static class Common | 31 | public static class Common |
32 | { | 32 | { |
33 | public static bool debug = true; | 33 | public static bool debug = true; |
34 | public static ScriptEngine mySE; | 34 | public static ScriptEngine mySE; |
35 | 35 | ||
36 | // This class just contains some static log stuff used for debugging. | 36 | // This class just contains some static log stuff used for debugging. |
37 | 37 | ||
38 | //public delegate void SendToDebugEventDelegate(string Message); | 38 | //public delegate void SendToDebugEventDelegate(string Message); |
39 | //public delegate void SendToLogEventDelegate(string Message); | 39 | //public delegate void SendToLogEventDelegate(string Message); |
40 | //static public event SendToDebugEventDelegate SendToDebugEvent; | 40 | //static public event SendToDebugEventDelegate SendToDebugEvent; |
41 | //static public event SendToLogEventDelegate SendToLogEvent; | 41 | //static public event SendToLogEventDelegate SendToLogEvent; |
42 | 42 | ||
43 | public static void SendToDebug(string Message) | 43 | public static void SendToDebug(string Message) |
44 | { | 44 | { |
45 | //if (Debug == true) | 45 | //if (Debug == true) |
46 | mySE.Log.Verbose("ScriptEngine", "Debug: " + Message); | 46 | mySE.Log.Verbose("ScriptEngine", "Debug: " + Message); |
47 | //SendToDebugEvent("\r\n" + DateTime.Now.ToString("[HH:mm:ss] ") + Message); | 47 | //SendToDebugEvent("\r\n" + DateTime.Now.ToString("[HH:mm:ss] ") + Message); |
48 | } | 48 | } |
49 | 49 | ||
50 | public static void SendToLog(string Message) | 50 | public static void SendToLog(string Message) |
51 | { | 51 | { |
52 | //if (Debug == true) | 52 | //if (Debug == true) |
53 | mySE.Log.Verbose("ScriptEngine", "LOG: " + Message); | 53 | mySE.Log.Verbose("ScriptEngine", "LOG: " + Message); |
54 | //SendToLogEvent("\r\n" + DateTime.Now.ToString("[HH:mm:ss] ") + Message); | 54 | //SendToLogEvent("\r\n" + DateTime.Now.ToString("[HH:mm:ss] ") + Message); |
55 | } | 55 | } |
56 | } | 56 | } |
57 | } \ No newline at end of file | 57 | } \ No newline at end of file |
diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/EventManager.cs b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventManager.cs index a36691d..a5ad911 100644 --- a/OpenSim/Region/ScriptEngine/DotNetEngine/EventManager.cs +++ b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventManager.cs | |||
@@ -1,259 +1,259 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) Contributors, http://opensimulator.org/ | 2 | * Copyright (c) Contributors, http://opensimulator.org/ |
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | 3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. |
4 | * | 4 | * |
5 | * Redistribution and use in source and binary forms, with or without | 5 | * Redistribution and use in source and binary forms, with or without |
6 | * modification, are permitted provided that the following conditions are met: | 6 | * modification, are permitted provided that the following conditions are met: |
7 | * * Redistributions of source code must retain the above copyright | 7 | * * Redistributions of source code must retain the above copyright |
8 | * notice, this list of conditions and the following disclaimer. | 8 | * notice, this list of conditions and the following disclaimer. |
9 | * * Redistributions in binary form must reproduce the above copyright | 9 | * * Redistributions in binary form must reproduce the above copyright |
10 | * notice, this list of conditions and the following disclaimer in the | 10 | * notice, this list of conditions and the following disclaimer in the |
11 | * documentation and/or other materials provided with the distribution. | 11 | * documentation and/or other materials provided with the distribution. |
12 | * * Neither the name of the OpenSim Project nor the | 12 | * * Neither the name of the OpenSim Project nor the |
13 | * names of its contributors may be used to endorse or promote products | 13 | * names of its contributors may be used to endorse or promote products |
14 | * derived from this software without specific prior written permission. | 14 | * derived from this software without specific prior written permission. |
15 | * | 15 | * |
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | 16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY |
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | 17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | 19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY |
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | 20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 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 | 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 | 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 | 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. | 25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | * | 26 | * |
27 | */ | 27 | */ |
28 | /* Original code: Tedd Hansen */ | 28 | /* Original code: Tedd Hansen */ |
29 | using System; | 29 | using System; |
30 | using libsecondlife; | 30 | using libsecondlife; |
31 | using OpenSim.Framework; | 31 | using OpenSim.Framework; |
32 | 32 | ||
33 | namespace OpenSim.Region.ScriptEngine.DotNetEngine | 33 | namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase |
34 | { | 34 | { |
35 | /// <summary> | 35 | /// <summary> |
36 | /// Prepares events so they can be directly executed upon a script by EventQueueManager, then queues it. | 36 | /// Prepares events so they can be directly executed upon a script by EventQueueManager, then queues it. |
37 | /// </summary> | 37 | /// </summary> |
38 | [Serializable] | 38 | [Serializable] |
39 | public class EventManager : OpenSim.Region.ScriptEngine.Common.ScriptServerInterfaces.RemoteEvents | 39 | public class EventManager : OpenSim.Region.ScriptEngine.Common.ScriptServerInterfaces.RemoteEvents |
40 | { | 40 | { |
41 | 41 | ||
42 | // | 42 | // |
43 | // Class is instanced in "ScriptEngine" and Uses "EventQueueManager" that is also instanced in "ScriptEngine". | 43 | // Class is instanced in "ScriptEngine" and Uses "EventQueueManager" that is also instanced in "ScriptEngine". |
44 | // This class needs a bit of explaining: | 44 | // This class needs a bit of explaining: |
45 | // | 45 | // |
46 | // This class it the link between an event inside OpenSim and the corresponding event in a user script being executed. | 46 | // This class it the link between an event inside OpenSim and the corresponding event in a user script being executed. |
47 | // | 47 | // |
48 | // For example when an user touches an object then the "myScriptEngine.World.EventManager.OnObjectGrab" event is fired inside OpenSim. | 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. | 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. | 50 | // It will then be delivered to the script by EventQueueManager. |
51 | // | 51 | // |
52 | // You can check debug C# dump of an LSL script if you need to verify what exact parameters are needed. | 52 | // You can check debug C# dump of an LSL script if you need to verify what exact parameters are needed. |
53 | // | 53 | // |
54 | 54 | ||
55 | 55 | ||
56 | private ScriptEngine myScriptEngine; | 56 | private ScriptEngine myScriptEngine; |
57 | //public IScriptHost TEMP_OBJECT_ID; | 57 | //public IScriptHost TEMP_OBJECT_ID; |
58 | public EventManager(ScriptEngine _ScriptEngine, bool performHookUp) | 58 | public EventManager(ScriptEngine _ScriptEngine, bool performHookUp) |
59 | { | 59 | { |
60 | myScriptEngine = _ScriptEngine; | 60 | myScriptEngine = _ScriptEngine; |
61 | 61 | ||
62 | // Hook up to events from OpenSim | 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 | 63 | // We may not want to do it because someone is controlling us and will deliver events to us |
64 | if (performHookUp) | 64 | if (performHookUp) |
65 | { | 65 | { |
66 | myScriptEngine.Log.Verbose("ScriptEngine", "Hooking up to server events"); | 66 | myScriptEngine.Log.Verbose("ScriptEngine", "Hooking up to server events"); |
67 | myScriptEngine.World.EventManager.OnObjectGrab += touch_start; | 67 | myScriptEngine.World.EventManager.OnObjectGrab += touch_start; |
68 | myScriptEngine.World.EventManager.OnRezScript += OnRezScript; | 68 | myScriptEngine.World.EventManager.OnRezScript += OnRezScript; |
69 | myScriptEngine.World.EventManager.OnRemoveScript += OnRemoveScript; | 69 | myScriptEngine.World.EventManager.OnRemoveScript += OnRemoveScript; |
70 | // TODO: HOOK ALL EVENTS UP TO SERVER! | 70 | // TODO: HOOK ALL EVENTS UP TO SERVER! |
71 | } | 71 | } |
72 | } | 72 | } |
73 | 73 | ||
74 | public void touch_start(uint localID, LLVector3 offsetPos, IClientAPI remoteClient) | 74 | public void touch_start(uint localID, LLVector3 offsetPos, IClientAPI remoteClient) |
75 | { | 75 | { |
76 | // Add to queue for all scripts in ObjectID object | 76 | // Add to queue for all scripts in ObjectID object |
77 | myScriptEngine.m_EventQueueManager.AddToObjectQueue(localID, "touch_start", new object[] {(int) 1}); | 77 | myScriptEngine.m_EventQueueManager.AddToObjectQueue(localID, "touch_start", new object[] {(int) 1}); |
78 | } | 78 | } |
79 | 79 | ||
80 | public void OnRezScript(uint localID, LLUUID itemID, string script) | 80 | public void OnRezScript(uint localID, LLUUID itemID, string script) |
81 | { | 81 | { |
82 | Console.WriteLine("OnRezScript localID: " + localID + " LLUID: " + itemID.ToString() + " Size: " + | 82 | Console.WriteLine("OnRezScript localID: " + localID + " LLUID: " + itemID.ToString() + " Size: " + |
83 | script.Length); | 83 | script.Length); |
84 | myScriptEngine.m_ScriptManager.StartScript(localID, itemID, script); | 84 | myScriptEngine.m_ScriptManager.StartScript(localID, itemID, script); |
85 | } | 85 | } |
86 | 86 | ||
87 | public void OnRemoveScript(uint localID, LLUUID itemID) | 87 | public void OnRemoveScript(uint localID, LLUUID itemID) |
88 | { | 88 | { |
89 | Console.WriteLine("OnRemoveScript localID: " + localID + " LLUID: " + itemID.ToString()); | 89 | Console.WriteLine("OnRemoveScript localID: " + localID + " LLUID: " + itemID.ToString()); |
90 | myScriptEngine.m_ScriptManager.StopScript( | 90 | myScriptEngine.m_ScriptManager.StopScript( |
91 | localID, | 91 | localID, |
92 | itemID | 92 | itemID |
93 | ); | 93 | ); |
94 | } | 94 | } |
95 | 95 | ||
96 | // TODO: Replace placeholders below | 96 | // TODO: Replace placeholders below |
97 | // NOTE! THE PARAMETERS FOR THESE FUNCTIONS ARE NOT CORRECT! | 97 | // NOTE! THE PARAMETERS FOR THESE FUNCTIONS ARE NOT CORRECT! |
98 | // These needs to be hooked up to OpenSim during init of this class | 98 | // These needs to be hooked up to OpenSim during init of this class |
99 | // then queued in EventQueueManager. | 99 | // then queued in EventQueueManager. |
100 | // When queued in EventQueueManager they need to be LSL compatible (name and params) | 100 | // When queued in EventQueueManager they need to be LSL compatible (name and params) |
101 | 101 | ||
102 | public void state_exit(uint localID, LLUUID itemID) | 102 | public void state_exit(uint localID, LLUUID itemID) |
103 | { | 103 | { |
104 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "state_exit"); | 104 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "state_exit"); |
105 | } | 105 | } |
106 | 106 | ||
107 | public void touch(uint localID, LLUUID itemID) | 107 | public void touch(uint localID, LLUUID itemID) |
108 | { | 108 | { |
109 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "touch"); | 109 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "touch"); |
110 | } | 110 | } |
111 | 111 | ||
112 | public void touch_end(uint localID, LLUUID itemID) | 112 | public void touch_end(uint localID, LLUUID itemID) |
113 | { | 113 | { |
114 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "touch_end"); | 114 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "touch_end"); |
115 | } | 115 | } |
116 | 116 | ||
117 | public void collision_start(uint localID, LLUUID itemID) | 117 | public void collision_start(uint localID, LLUUID itemID) |
118 | { | 118 | { |
119 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "collision_start"); | 119 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "collision_start"); |
120 | } | 120 | } |
121 | 121 | ||
122 | public void collision(uint localID, LLUUID itemID) | 122 | public void collision(uint localID, LLUUID itemID) |
123 | { | 123 | { |
124 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "collision"); | 124 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "collision"); |
125 | } | 125 | } |
126 | 126 | ||
127 | public void collision_end(uint localID, LLUUID itemID) | 127 | public void collision_end(uint localID, LLUUID itemID) |
128 | { | 128 | { |
129 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "collision_end"); | 129 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "collision_end"); |
130 | } | 130 | } |
131 | 131 | ||
132 | public void land_collision_start(uint localID, LLUUID itemID) | 132 | public void land_collision_start(uint localID, LLUUID itemID) |
133 | { | 133 | { |
134 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "land_collision_start"); | 134 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "land_collision_start"); |
135 | } | 135 | } |
136 | 136 | ||
137 | public void land_collision(uint localID, LLUUID itemID) | 137 | public void land_collision(uint localID, LLUUID itemID) |
138 | { | 138 | { |
139 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "land_collision"); | 139 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "land_collision"); |
140 | } | 140 | } |
141 | 141 | ||
142 | public void land_collision_end(uint localID, LLUUID itemID) | 142 | public void land_collision_end(uint localID, LLUUID itemID) |
143 | { | 143 | { |
144 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "land_collision_end"); | 144 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "land_collision_end"); |
145 | } | 145 | } |
146 | 146 | ||
147 | // Handled by long commands | 147 | // Handled by long commands |
148 | public void timer(uint localID, LLUUID itemID) | 148 | public void timer(uint localID, LLUUID itemID) |
149 | { | 149 | { |
150 | //myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, ""); | 150 | //myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, ""); |
151 | } | 151 | } |
152 | 152 | ||
153 | public void listen(uint localID, LLUUID itemID) | 153 | public void listen(uint localID, LLUUID itemID) |
154 | { | 154 | { |
155 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "listen"); | 155 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "listen"); |
156 | } | 156 | } |
157 | 157 | ||
158 | public void on_rez(uint localID, LLUUID itemID) | 158 | public void on_rez(uint localID, LLUUID itemID) |
159 | { | 159 | { |
160 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "on_rez"); | 160 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "on_rez"); |
161 | } | 161 | } |
162 | 162 | ||
163 | public void sensor(uint localID, LLUUID itemID) | 163 | public void sensor(uint localID, LLUUID itemID) |
164 | { | 164 | { |
165 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "sensor"); | 165 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "sensor"); |
166 | } | 166 | } |
167 | 167 | ||
168 | public void no_sensor(uint localID, LLUUID itemID) | 168 | public void no_sensor(uint localID, LLUUID itemID) |
169 | { | 169 | { |
170 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "no_sensor"); | 170 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "no_sensor"); |
171 | } | 171 | } |
172 | 172 | ||
173 | public void control(uint localID, LLUUID itemID) | 173 | public void control(uint localID, LLUUID itemID) |
174 | { | 174 | { |
175 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "control"); | 175 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "control"); |
176 | } | 176 | } |
177 | 177 | ||
178 | public void money(uint localID, LLUUID itemID) | 178 | public void money(uint localID, LLUUID itemID) |
179 | { | 179 | { |
180 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "money"); | 180 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "money"); |
181 | } | 181 | } |
182 | 182 | ||
183 | public void email(uint localID, LLUUID itemID) | 183 | public void email(uint localID, LLUUID itemID) |
184 | { | 184 | { |
185 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "email"); | 185 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "email"); |
186 | } | 186 | } |
187 | 187 | ||
188 | public void at_target(uint localID, LLUUID itemID) | 188 | public void at_target(uint localID, LLUUID itemID) |
189 | { | 189 | { |
190 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "at_target"); | 190 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "at_target"); |
191 | } | 191 | } |
192 | 192 | ||
193 | public void not_at_target(uint localID, LLUUID itemID) | 193 | public void not_at_target(uint localID, LLUUID itemID) |
194 | { | 194 | { |
195 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "not_at_target"); | 195 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "not_at_target"); |
196 | } | 196 | } |
197 | 197 | ||
198 | public void at_rot_target(uint localID, LLUUID itemID) | 198 | public void at_rot_target(uint localID, LLUUID itemID) |
199 | { | 199 | { |
200 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "at_rot_target"); | 200 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "at_rot_target"); |
201 | } | 201 | } |
202 | 202 | ||
203 | public void not_at_rot_target(uint localID, LLUUID itemID) | 203 | public void not_at_rot_target(uint localID, LLUUID itemID) |
204 | { | 204 | { |
205 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "not_at_rot_target"); | 205 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "not_at_rot_target"); |
206 | } | 206 | } |
207 | 207 | ||
208 | public void run_time_permissions(uint localID, LLUUID itemID) | 208 | public void run_time_permissions(uint localID, LLUUID itemID) |
209 | { | 209 | { |
210 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "run_time_permissions"); | 210 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "run_time_permissions"); |
211 | } | 211 | } |
212 | 212 | ||
213 | public void changed(uint localID, LLUUID itemID) | 213 | public void changed(uint localID, LLUUID itemID) |
214 | { | 214 | { |
215 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "changed"); | 215 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "changed"); |
216 | } | 216 | } |
217 | 217 | ||
218 | public void attach(uint localID, LLUUID itemID) | 218 | public void attach(uint localID, LLUUID itemID) |
219 | { | 219 | { |
220 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "attach"); | 220 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "attach"); |
221 | } | 221 | } |
222 | 222 | ||
223 | public void dataserver(uint localID, LLUUID itemID) | 223 | public void dataserver(uint localID, LLUUID itemID) |
224 | { | 224 | { |
225 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "dataserver"); | 225 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "dataserver"); |
226 | } | 226 | } |
227 | 227 | ||
228 | public void link_message(uint localID, LLUUID itemID) | 228 | public void link_message(uint localID, LLUUID itemID) |
229 | { | 229 | { |
230 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "link_message"); | 230 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "link_message"); |
231 | } | 231 | } |
232 | 232 | ||
233 | public void moving_start(uint localID, LLUUID itemID) | 233 | public void moving_start(uint localID, LLUUID itemID) |
234 | { | 234 | { |
235 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "moving_start"); | 235 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "moving_start"); |
236 | } | 236 | } |
237 | 237 | ||
238 | public void moving_end(uint localID, LLUUID itemID) | 238 | public void moving_end(uint localID, LLUUID itemID) |
239 | { | 239 | { |
240 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "moving_end"); | 240 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "moving_end"); |
241 | } | 241 | } |
242 | 242 | ||
243 | public void object_rez(uint localID, LLUUID itemID) | 243 | public void object_rez(uint localID, LLUUID itemID) |
244 | { | 244 | { |
245 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "object_rez"); | 245 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "object_rez"); |
246 | } | 246 | } |
247 | 247 | ||
248 | public void remote_data(uint localID, LLUUID itemID) | 248 | public void remote_data(uint localID, LLUUID itemID) |
249 | { | 249 | { |
250 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "remote_data"); | 250 | myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "remote_data"); |
251 | } | 251 | } |
252 | 252 | ||
253 | // Handled by long commands | 253 | // Handled by long commands |
254 | public void http_response(uint localID, LLUUID itemID) | 254 | public void http_response(uint localID, LLUUID itemID) |
255 | { | 255 | { |
256 | // myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "http_response"); | 256 | // myScriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "http_response"); |
257 | } | 257 | } |
258 | } | 258 | } |
259 | } \ No newline at end of file | 259 | } \ No newline at end of file |
diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/EventQueueManager.cs b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventQueueManager.cs index e7cb489..62194df 100644 --- a/OpenSim/Region/ScriptEngine/DotNetEngine/EventQueueManager.cs +++ b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/EventQueueManager.cs | |||
@@ -1,364 +1,363 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) Contributors, http://opensimulator.org/ | 2 | * Copyright (c) Contributors, http://opensimulator.org/ |
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | 3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. |
4 | * | 4 | * |
5 | * Redistribution and use in source and binary forms, with or without | 5 | * Redistribution and use in source and binary forms, with or without |
6 | * modification, are permitted provided that the following conditions are met: | 6 | * modification, are permitted provided that the following conditions are met: |
7 | * * Redistributions of source code must retain the above copyright | 7 | * * Redistributions of source code must retain the above copyright |
8 | * notice, this list of conditions and the following disclaimer. | 8 | * notice, this list of conditions and the following disclaimer. |
9 | * * Redistributions in binary form must reproduce the above copyright | 9 | * * Redistributions in binary form must reproduce the above copyright |
10 | * notice, this list of conditions and the following disclaimer in the | 10 | * notice, this list of conditions and the following disclaimer in the |
11 | * documentation and/or other materials provided with the distribution. | 11 | * documentation and/or other materials provided with the distribution. |
12 | * * Neither the name of the OpenSim Project nor the | 12 | * * Neither the name of the OpenSim Project nor the |
13 | * names of its contributors may be used to endorse or promote products | 13 | * names of its contributors may be used to endorse or promote products |
14 | * derived from this software without specific prior written permission. | 14 | * derived from this software without specific prior written permission. |
15 | * | 15 | * |
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | 16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY |
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | 17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | 19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY |
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | 20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 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 | 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 | 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 | 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. | 25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | * | 26 | * |
27 | */ | 27 | */ |
28 | /* Original code: Tedd Hansen */ | 28 | /* Original code: Tedd Hansen */ |
29 | using System; | 29 | using System; |
30 | using System.Collections; | 30 | using System.Collections; |
31 | using System.Collections.Generic; | 31 | using System.Collections.Generic; |
32 | using System.Threading; | 32 | using System.Threading; |
33 | using libsecondlife; | 33 | using libsecondlife; |
34 | using OpenSim.Framework; | 34 | using OpenSim.Framework; |
35 | using OpenSim.Region.Environment.Scenes.Scripting; | 35 | using OpenSim.Region.Environment.Scenes.Scripting; |
36 | using OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL; | 36 | |
37 | 37 | namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase | |
38 | namespace OpenSim.Region.ScriptEngine.DotNetEngine | 38 | { |
39 | { | 39 | /// <summary> |
40 | /// <summary> | 40 | /// EventQueueManager handles event queues |
41 | /// EventQueueManager handles event queues | 41 | /// Events are queued and executed in separate thread |
42 | /// Events are queued and executed in separate thread | 42 | /// </summary> |
43 | /// </summary> | 43 | [Serializable] |
44 | [Serializable] | 44 | public class EventQueueManager |
45 | internal class EventQueueManager | 45 | { |
46 | { | 46 | |
47 | 47 | // | |
48 | // | 48 | // Class is instanced in "ScriptEngine" and used by "EventManager" also instanced in "ScriptEngine". |
49 | // Class is instanced in "ScriptEngine" and used by "EventManager" also instanced in "ScriptEngine". | 49 | // |
50 | // | 50 | // Class purpose is to queue and execute functions that are received by "EventManager": |
51 | // 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 "EventManager" to release its event thread immediately, thus not interrupting server execution. | 52 | // - allowing us to prioritize and control execution of script functions. |
53 | // - 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 | // Class can use multiple threads for simultaneous execution. Mutexes are used for thread safety. | 54 | // |
55 | // | 55 | // 1. Hold an execution queue for scripts |
56 | // 1. Hold an execution queue for scripts | 56 | // 2. Use threads to process queue, each thread executes one script function on each pass. |
57 | // 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 | // 3. Catch any script error and process it | 58 | // |
59 | // | 59 | // |
60 | // | 60 | // Notes: |
61 | // Notes: | 61 | // * Current execution load balancing is optimized for 1 thread, and can cause unfair execute balancing between scripts. |
62 | // * 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 | // 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 | // * 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 | // increase number of threads to allow more concurrent script executions in OpenSim. | 65 | // |
66 | // | 66 | |
67 | 67 | ||
68 | 68 | /// <summary> | |
69 | /// <summary> | 69 | /// List of threads processing event queue |
70 | /// List of threads processing event queue | 70 | /// </summary> |
71 | /// </summary> | 71 | private List<Thread> eventQueueThreads = new List<Thread>(); |
72 | private List<Thread> eventQueueThreads = new List<Thread>(); | 72 | |
73 | 73 | private object queueLock = new object(); // Mutex lock object | |
74 | private object queueLock = new object(); // Mutex lock object | 74 | |
75 | 75 | /// <summary> | |
76 | /// <summary> | 76 | /// How many ms to sleep if queue is empty |
77 | /// How many ms to sleep if queue is empty | 77 | /// </summary> |
78 | /// </summary> | 78 | private int nothingToDoSleepms = 50; |
79 | private int nothingToDoSleepms = 50; | 79 | |
80 | 80 | /// <summary> | |
81 | /// <summary> | 81 | /// How many threads to process queue with |
82 | /// How many threads to process queue with | 82 | /// </summary> |
83 | /// </summary> | 83 | private int numberOfThreads = 2; |
84 | private int numberOfThreads = 2; | 84 | |
85 | 85 | /// <summary> | |
86 | /// <summary> | 86 | /// Queue containing events waiting to be executed |
87 | /// Queue containing events waiting to be executed | 87 | /// </summary> |
88 | /// </summary> | 88 | private Queue<QueueItemStruct> eventQueue = new Queue<QueueItemStruct>(); |
89 | private Queue<QueueItemStruct> eventQueue = new Queue<QueueItemStruct>(); | 89 | |
90 | 90 | /// <summary> | |
91 | /// <summary> | 91 | /// Queue item structure |
92 | /// Queue item structure | 92 | /// </summary> |
93 | /// </summary> | 93 | private struct QueueItemStruct |
94 | private struct QueueItemStruct | 94 | { |
95 | { | 95 | public uint localID; |
96 | public uint localID; | 96 | public LLUUID itemID; |
97 | public LLUUID itemID; | 97 | public string functionName; |
98 | public string functionName; | 98 | public object[] param; |
99 | public object[] param; | 99 | } |
100 | } | 100 | |
101 | 101 | /// <summary> | |
102 | /// <summary> | 102 | /// List of localID locks for mutex processing of script events |
103 | /// List of localID locks for mutex processing of script events | 103 | /// </summary> |
104 | /// </summary> | 104 | private List<uint> objectLocks = new List<uint>(); |
105 | private List<uint> objectLocks = new List<uint>(); | 105 | |
106 | 106 | private object tryLockLock = new object(); // Mutex lock object | |
107 | private object tryLockLock = new object(); // Mutex lock object | 107 | |
108 | 108 | private ScriptEngine m_ScriptEngine; | |
109 | private ScriptEngine m_ScriptEngine; | 109 | |
110 | 110 | public EventQueueManager(ScriptEngine _ScriptEngine) | |
111 | public EventQueueManager(ScriptEngine _ScriptEngine) | 111 | { |
112 | { | 112 | m_ScriptEngine = _ScriptEngine; |
113 | m_ScriptEngine = _ScriptEngine; | 113 | |
114 | 114 | // | |
115 | // | 115 | // Start event queue processing threads (worker threads) |
116 | // Start event queue processing threads (worker threads) | 116 | // |
117 | // | 117 | for (int ThreadCount = 0; ThreadCount <= numberOfThreads; ThreadCount++) |
118 | for (int ThreadCount = 0; ThreadCount <= numberOfThreads; ThreadCount++) | 118 | { |
119 | { | 119 | Thread EventQueueThread = new Thread(EventQueueThreadLoop); |
120 | Thread EventQueueThread = new Thread(EventQueueThreadLoop); | 120 | eventQueueThreads.Add(EventQueueThread); |
121 | eventQueueThreads.Add(EventQueueThread); | 121 | EventQueueThread.IsBackground = true; |
122 | EventQueueThread.IsBackground = true; | 122 | EventQueueThread.Priority = ThreadPriority.BelowNormal; |
123 | EventQueueThread.Priority = ThreadPriority.BelowNormal; | 123 | EventQueueThread.Name = "EventQueueManagerThread_" + ThreadCount; |
124 | EventQueueThread.Name = "EventQueueManagerThread_" + ThreadCount; | 124 | EventQueueThread.Start(); |
125 | EventQueueThread.Start(); | 125 | } |
126 | } | 126 | } |
127 | } | 127 | |
128 | 128 | ~EventQueueManager() | |
129 | ~EventQueueManager() | 129 | { |
130 | { | 130 | // Kill worker threads |
131 | // Kill worker threads | 131 | foreach (Thread EventQueueThread in new ArrayList(eventQueueThreads)) |
132 | foreach (Thread EventQueueThread in new ArrayList(eventQueueThreads)) | 132 | { |
133 | { | 133 | if (EventQueueThread != null && EventQueueThread.IsAlive == true) |
134 | if (EventQueueThread != null && EventQueueThread.IsAlive == true) | 134 | { |
135 | { | 135 | try |
136 | try | 136 | { |
137 | { | 137 | EventQueueThread.Abort(); |
138 | EventQueueThread.Abort(); | 138 | EventQueueThread.Join(); |
139 | EventQueueThread.Join(); | 139 | } |
140 | } | 140 | catch (Exception) |
141 | catch (Exception) | 141 | { |
142 | { | 142 | //myScriptEngine.Log.Verbose("ScriptEngine", "EventQueueManager Exception killing worker thread: " + e.ToString()); |
143 | //myScriptEngine.Log.Verbose("ScriptEngine", "EventQueueManager Exception killing worker thread: " + e.ToString()); | 143 | } |
144 | } | 144 | } |
145 | } | 145 | } |
146 | } | 146 | eventQueueThreads.Clear(); |
147 | eventQueueThreads.Clear(); | 147 | // Todo: Clean up our queues |
148 | // Todo: Clean up our queues | 148 | eventQueue.Clear(); |
149 | eventQueue.Clear(); | 149 | } |
150 | } | 150 | |
151 | 151 | /// <summary> | |
152 | /// <summary> | 152 | /// Queue processing thread loop |
153 | /// Queue processing thread loop | 153 | /// </summary> |
154 | /// </summary> | 154 | private void EventQueueThreadLoop() |
155 | private void EventQueueThreadLoop() | 155 | { |
156 | { | 156 | //myScriptEngine.m_logger.Verbose("ScriptEngine", "EventQueueManager Worker thread spawned"); |
157 | //myScriptEngine.m_logger.Verbose("ScriptEngine", "EventQueueManager Worker thread spawned"); | 157 | try |
158 | try | 158 | { |
159 | { | 159 | QueueItemStruct BlankQIS = new QueueItemStruct(); |
160 | QueueItemStruct BlankQIS = new QueueItemStruct(); | 160 | while (true) |
161 | while (true) | 161 | { |
162 | { | 162 | try |
163 | try | 163 | { |
164 | { | 164 | QueueItemStruct QIS = BlankQIS; |
165 | QueueItemStruct QIS = BlankQIS; | 165 | bool GotItem = false; |
166 | bool GotItem = false; | 166 | |
167 | 167 | if (eventQueue.Count == 0) | |
168 | if (eventQueue.Count == 0) | 168 | { |
169 | { | 169 | // Nothing to do? Sleep a bit waiting for something to do |
170 | // Nothing to do? Sleep a bit waiting for something to do | 170 | Thread.Sleep(nothingToDoSleepms); |
171 | Thread.Sleep(nothingToDoSleepms); | 171 | } |
172 | } | 172 | else |
173 | else | 173 | { |
174 | { | 174 | // Something in queue, process |
175 | // Something in queue, process | 175 | //myScriptEngine.m_logger.Verbose("ScriptEngine", "Processing event for localID: " + QIS.localID + ", itemID: " + QIS.itemID + ", FunctionName: " + QIS.FunctionName); |
176 | //myScriptEngine.m_logger.Verbose("ScriptEngine", "Processing event for localID: " + QIS.localID + ", itemID: " + QIS.itemID + ", FunctionName: " + QIS.FunctionName); | 176 | |
177 | 177 | // OBJECT BASED LOCK - TWO THREADS WORKING ON SAME OBJECT IS NOT GOOD | |
178 | // OBJECT BASED LOCK - TWO THREADS WORKING ON SAME OBJECT IS NOT GOOD | 178 | lock (queueLock) |
179 | lock (queueLock) | 179 | { |
180 | { | 180 | GotItem = false; |
181 | GotItem = false; | 181 | for (int qc = 0; qc < eventQueue.Count; qc++) |
182 | for (int qc = 0; qc < eventQueue.Count; qc++) | 182 | { |
183 | { | 183 | // Get queue item |
184 | // Get queue item | 184 | QIS = eventQueue.Dequeue(); |
185 | QIS = eventQueue.Dequeue(); | 185 | |
186 | 186 | // Check if object is being processed by someone else | |
187 | // Check if object is being processed by someone else | 187 | if (TryLock(QIS.localID) == false) |
188 | if (TryLock(QIS.localID) == false) | 188 | { |
189 | { | 189 | // Object is already being processed, requeue it |
190 | // Object is already being processed, requeue it | 190 | eventQueue.Enqueue(QIS); |
191 | eventQueue.Enqueue(QIS); | 191 | } |
192 | } | 192 | else |
193 | else | 193 | { |
194 | { | 194 | // We have lock on an object and can process it |
195 | // We have lock on an object and can process it | 195 | GotItem = true; |
196 | GotItem = true; | 196 | break; |
197 | break; | 197 | } |
198 | } | 198 | } // go through queue |
199 | } // go through queue | 199 | } // lock |
200 | } // lock | 200 | |
201 | 201 | if (GotItem == true) | |
202 | if (GotItem == true) | 202 | { |
203 | { | 203 | // Execute function |
204 | // Execute function | 204 | try |
205 | try | 205 | { |
206 | { | 206 | #if DEBUG |
207 | #if DEBUG | 207 | m_ScriptEngine.Log.Debug("ScriptEngine", "Executing event:\r\n" |
208 | m_ScriptEngine.Log.Debug("ScriptEngine", "Executing event:\r\n" | 208 | + "QIS.localID: " + QIS.localID |
209 | + "QIS.localID: " + QIS.localID | 209 | + ", QIS.itemID: " + QIS.itemID |
210 | + ", QIS.itemID: " + QIS.itemID | 210 | + ", QIS.functionName: " + QIS.functionName); |
211 | + ", QIS.functionName: " + QIS.functionName); | 211 | #endif |
212 | #endif | 212 | m_ScriptEngine.m_ScriptManager.ExecuteEvent(QIS.localID, QIS.itemID, |
213 | m_ScriptEngine.m_ScriptManager.ExecuteEvent(QIS.localID, QIS.itemID, | 213 | QIS.functionName, QIS.param); |
214 | QIS.functionName, QIS.param); | 214 | } |
215 | } | 215 | catch (Exception e) |
216 | catch (Exception e) | 216 | { |
217 | { | 217 | // DISPLAY ERROR INWORLD |
218 | // DISPLAY ERROR INWORLD | 218 | string text = "Error executing script function \"" + QIS.functionName + "\":\r\n"; |
219 | string text = "Error executing script function \"" + QIS.functionName + "\":\r\n"; | 219 | //if (e.InnerException != null) |
220 | //if (e.InnerException != null) | 220 | //{ |
221 | //{ | 221 | // Send inner exception |
222 | // Send inner exception | 222 | text += e.InnerException.Message.ToString(); |
223 | text += e.InnerException.Message.ToString(); | 223 | //} |
224 | //} | 224 | //else |
225 | //else | 225 | //{ |
226 | //{ | 226 | text += "\r\n"; |
227 | text += "\r\n"; | 227 | // Send normal |
228 | // Send normal | 228 | text += e.Message.ToString(); |
229 | text += e.Message.ToString(); | 229 | //} |
230 | //} | 230 | try |
231 | try | 231 | { |
232 | { | 232 | if (text.Length > 1500) |
233 | if (text.Length > 1500) | 233 | text = text.Substring(0, 1500); |
234 | text = text.Substring(0, 1500); | 234 | IScriptHost m_host = m_ScriptEngine.World.GetSceneObjectPart(QIS.localID); |
235 | IScriptHost m_host = m_ScriptEngine.World.GetSceneObjectPart(QIS.localID); | 235 | //if (m_host != null) |
236 | //if (m_host != null) | 236 | //{ |
237 | //{ | 237 | m_ScriptEngine.World.SimChat(Helpers.StringToField(text), ChatTypeEnum.Say, 0, |
238 | m_ScriptEngine.World.SimChat(Helpers.StringToField(text), ChatTypeEnum.Say, 0, | 238 | m_host.AbsolutePosition, m_host.Name, m_host.UUID); |
239 | m_host.AbsolutePosition, m_host.Name, m_host.UUID); | 239 | } |
240 | } | 240 | catch |
241 | catch | 241 | { |
242 | { | 242 | //} |
243 | //} | 243 | //else |
244 | //else | 244 | //{ |
245 | //{ | 245 | // T oconsole |
246 | // T oconsole | 246 | m_ScriptEngine.Log.Error("ScriptEngine", |
247 | m_ScriptEngine.Log.Error("ScriptEngine", | 247 | "Unable to send text in-world:\r\n" + text); |
248 | "Unable to send text in-world:\r\n" + text); | 248 | } |
249 | } | 249 | } |
250 | } | 250 | finally |
251 | finally | 251 | { |
252 | { | 252 | ReleaseLock(QIS.localID); |
253 | ReleaseLock(QIS.localID); | 253 | } |
254 | } | 254 | } |
255 | } | 255 | } // Something in queue |
256 | } // Something in queue | 256 | } |
257 | } | 257 | catch (ThreadAbortException tae) |
258 | catch (ThreadAbortException tae) | 258 | { |
259 | { | 259 | throw tae; |
260 | throw tae; | 260 | } |
261 | } | 261 | catch (Exception e) |
262 | catch (Exception e) | 262 | { |
263 | { | 263 | m_ScriptEngine.Log.Error("ScriptEngine", "Exception in EventQueueThreadLoop: " + e.ToString()); |
264 | m_ScriptEngine.Log.Error("ScriptEngine", "Exception in EventQueueThreadLoop: " + e.ToString()); | 264 | } |
265 | } | 265 | } // while |
266 | } // while | 266 | } // try |
267 | } // try | 267 | catch (ThreadAbortException) |
268 | catch (ThreadAbortException) | 268 | { |
269 | { | 269 | //myScriptEngine.Log.Verbose("ScriptEngine", "EventQueueManager Worker thread killed: " + tae.Message); |
270 | //myScriptEngine.Log.Verbose("ScriptEngine", "EventQueueManager Worker thread killed: " + tae.Message); | 270 | } |
271 | } | 271 | } |
272 | } | 272 | |
273 | 273 | /// <summary> | |
274 | /// <summary> | 274 | /// Try to get a mutex lock on localID |
275 | /// Try to get a mutex lock on localID | 275 | /// </summary> |
276 | /// </summary> | 276 | /// <param name="localID"></param> |
277 | /// <param name="localID"></param> | 277 | /// <returns></returns> |
278 | /// <returns></returns> | 278 | private bool TryLock(uint localID) |
279 | private bool TryLock(uint localID) | 279 | { |
280 | { | 280 | lock (tryLockLock) |
281 | lock (tryLockLock) | 281 | { |
282 | { | 282 | if (objectLocks.Contains(localID) == true) |
283 | if (objectLocks.Contains(localID) == true) | 283 | { |
284 | { | 284 | return false; |
285 | return false; | 285 | } |
286 | } | 286 | else |
287 | else | 287 | { |
288 | { | 288 | objectLocks.Add(localID); |
289 | objectLocks.Add(localID); | 289 | return true; |
290 | return true; | 290 | } |
291 | } | 291 | } |
292 | } | 292 | } |
293 | } | 293 | |
294 | 294 | /// <summary> | |
295 | /// <summary> | 295 | /// Release mutex lock on localID |
296 | /// Release mutex lock on localID | 296 | /// </summary> |
297 | /// </summary> | 297 | /// <param name="localID"></param> |
298 | /// <param name="localID"></param> | 298 | private void ReleaseLock(uint localID) |
299 | private void ReleaseLock(uint localID) | 299 | { |
300 | { | 300 | lock (tryLockLock) |
301 | lock (tryLockLock) | 301 | { |
302 | { | 302 | if (objectLocks.Contains(localID) == true) |
303 | if (objectLocks.Contains(localID) == true) | 303 | { |
304 | { | 304 | objectLocks.Remove(localID); |
305 | objectLocks.Remove(localID); | 305 | } |
306 | } | 306 | } |
307 | } | 307 | } |
308 | } | 308 | |
309 | 309 | ||
310 | 310 | /// <summary> | |
311 | /// <summary> | 311 | /// Add event to event execution queue |
312 | /// Add event to event execution queue | 312 | /// </summary> |
313 | /// </summary> | 313 | /// <param name="localID"></param> |
314 | /// <param name="localID"></param> | 314 | /// <param name="FunctionName">Name of the function, will be state + "_event_" + FunctionName</param> |
315 | /// <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 | /// <param name="param">Array of parameters to match event mask</param> | 316 | public void AddToObjectQueue(uint localID, string FunctionName, params object[] param) |
317 | public void AddToObjectQueue(uint localID, string FunctionName, params object[] param) | 317 | { |
318 | { | 318 | // Determine all scripts in Object and add to their queue |
319 | // Determine all scripts in Object and add to their queue | 319 | //myScriptEngine.m_logger.Verbose("ScriptEngine", "EventQueueManager Adding localID: " + localID + ", FunctionName: " + FunctionName); |
320 | //myScriptEngine.m_logger.Verbose("ScriptEngine", "EventQueueManager Adding localID: " + localID + ", FunctionName: " + FunctionName); | 320 | |
321 | 321 | ||
322 | 322 | // Do we have any scripts in this object at all? If not, return | |
323 | // Do we have any scripts in this object at all? If not, return | 323 | if (m_ScriptEngine.m_ScriptManager.Scripts.ContainsKey(localID) == false) |
324 | if (m_ScriptEngine.m_ScriptManager.Scripts.ContainsKey(localID) == false) | 324 | { |
325 | { | 325 | //Console.WriteLine("Event \"" + FunctionName + "\" for localID: " + localID + ". No scripts found on this localID."); |
326 | //Console.WriteLine("Event \"" + FunctionName + "\" for localID: " + localID + ". No scripts found on this localID."); | 326 | return; |
327 | return; | 327 | } |
328 | } | 328 | |
329 | 329 | Dictionary<LLUUID, IScript>.KeyCollection scriptKeys = | |
330 | Dictionary<LLUUID, LSL_BaseClass>.KeyCollection scriptKeys = | 330 | m_ScriptEngine.m_ScriptManager.GetScriptKeys(localID); |
331 | m_ScriptEngine.m_ScriptManager.GetScriptKeys(localID); | 331 | |
332 | 332 | foreach (LLUUID itemID in scriptKeys) | |
333 | foreach (LLUUID itemID in scriptKeys) | 333 | { |
334 | { | 334 | // Add to each script in that object |
335 | // 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 | // TODO: Some scripts may not subscribe to this event. Should we NOT add it? Does it matter? | 336 | AddToScriptQueue(localID, itemID, FunctionName, param); |
337 | AddToScriptQueue(localID, itemID, FunctionName, param); | 337 | } |
338 | } | 338 | } |
339 | } | 339 | |
340 | 340 | /// <summary> | |
341 | /// <summary> | 341 | /// Add event to event execution queue |
342 | /// Add event to event execution queue | 342 | /// </summary> |
343 | /// </summary> | 343 | /// <param name="localID"></param> |
344 | /// <param name="localID"></param> | 344 | /// <param name="itemID"></param> |
345 | /// <param name="itemID"></param> | 345 | /// <param name="FunctionName">Name of the function, will be state + "_event_" + FunctionName</param> |
346 | /// <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 | /// <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 | public void AddToScriptQueue(uint localID, LLUUID itemID, string FunctionName, params object[] param) | 348 | { |
349 | { | 349 | lock (queueLock) |
350 | lock (queueLock) | 350 | { |
351 | { | 351 | // Create a structure and add data |
352 | // Create a structure and add data | 352 | QueueItemStruct QIS = new QueueItemStruct(); |
353 | QueueItemStruct QIS = new QueueItemStruct(); | 353 | QIS.localID = localID; |
354 | QIS.localID = localID; | 354 | QIS.itemID = itemID; |
355 | QIS.itemID = itemID; | 355 | QIS.functionName = FunctionName; |
356 | QIS.functionName = FunctionName; | 356 | QIS.param = param; |
357 | QIS.param = param; | 357 | |
358 | 358 | // Add it to queue | |
359 | // Add it to queue | 359 | eventQueue.Enqueue(QIS); |
360 | eventQueue.Enqueue(QIS); | 360 | } |
361 | } | 361 | } |
362 | } | 362 | } |
363 | } | ||
364 | } \ No newline at end of file | 363 | } \ No newline at end of file |
diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/LSLLongCmdHandler.cs b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/LSLLongCmdHandler.cs index 1e4dc99..94241eb 100644 --- a/OpenSim/Region/ScriptEngine/DotNetEngine/LSLLongCmdHandler.cs +++ b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/LSLLongCmdHandler.cs | |||
@@ -1,295 +1,295 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) Contributors, http://opensimulator.org/ | 2 | * Copyright (c) Contributors, http://opensimulator.org/ |
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | 3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. |
4 | * | 4 | * |
5 | * Redistribution and use in source and binary forms, with or without | 5 | * Redistribution and use in source and binary forms, with or without |
6 | * modification, are permitted provided that the following conditions are met: | 6 | * modification, are permitted provided that the following conditions are met: |
7 | * * Redistributions of source code must retain the above copyright | 7 | * * Redistributions of source code must retain the above copyright |
8 | * notice, this list of conditions and the following disclaimer. | 8 | * notice, this list of conditions and the following disclaimer. |
9 | * * Redistributions in binary form must reproduce the above copyright | 9 | * * Redistributions in binary form must reproduce the above copyright |
10 | * notice, this list of conditions and the following disclaimer in the | 10 | * notice, this list of conditions and the following disclaimer in the |
11 | * documentation and/or other materials provided with the distribution. | 11 | * documentation and/or other materials provided with the distribution. |
12 | * * Neither the name of the OpenSim Project nor the | 12 | * * Neither the name of the OpenSim Project nor the |
13 | * names of its contributors may be used to endorse or promote products | 13 | * names of its contributors may be used to endorse or promote products |
14 | * derived from this software without specific prior written permission. | 14 | * derived from this software without specific prior written permission. |
15 | * | 15 | * |
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS AS IS AND ANY | 16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS AS IS AND ANY |
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | 17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | 19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY |
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | 20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 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 | 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 | 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 | 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. | 25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | * | 26 | * |
27 | */ | 27 | */ |
28 | 28 | ||
29 | using System; | 29 | using System; |
30 | using System.Collections.Generic; | 30 | using System.Collections.Generic; |
31 | using System.Threading; | 31 | using System.Threading; |
32 | using libsecondlife; | 32 | using libsecondlife; |
33 | using OpenSim.Region.Environment.Interfaces; | 33 | using OpenSim.Region.Environment.Interfaces; |
34 | using OpenSim.Region.Environment.Modules; | 34 | using OpenSim.Region.Environment.Modules; |
35 | 35 | ||
36 | namespace OpenSim.Region.ScriptEngine.DotNetEngine | 36 | namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase |
37 | { | 37 | { |
38 | /// <summary> | 38 | /// <summary> |
39 | /// Handles LSL commands that takes long time and returns an event, for example timers, HTTP requests, etc. | 39 | /// Handles LSL commands that takes long time and returns an event, for example timers, HTTP requests, etc. |
40 | /// </summary> | 40 | /// </summary> |
41 | internal class LSLLongCmdHandler | 41 | public class LSLLongCmdHandler |
42 | { | 42 | { |
43 | private Thread cmdHandlerThread; | 43 | private Thread cmdHandlerThread; |
44 | private int cmdHandlerThreadCycleSleepms = 100; | 44 | private int cmdHandlerThreadCycleSleepms = 100; |
45 | 45 | ||
46 | private ScriptEngine m_ScriptEngine; | 46 | private ScriptEngine m_ScriptEngine; |
47 | 47 | ||
48 | public LSLLongCmdHandler(ScriptEngine _ScriptEngine) | 48 | public LSLLongCmdHandler(ScriptEngine _ScriptEngine) |
49 | { | 49 | { |
50 | m_ScriptEngine = _ScriptEngine; | 50 | m_ScriptEngine = _ScriptEngine; |
51 | 51 | ||
52 | // Start the thread that will be doing the work | 52 | // Start the thread that will be doing the work |
53 | cmdHandlerThread = new Thread(CmdHandlerThreadLoop); | 53 | cmdHandlerThread = new Thread(CmdHandlerThreadLoop); |
54 | cmdHandlerThread.Name = "CmdHandlerThread"; | 54 | cmdHandlerThread.Name = "CmdHandlerThread"; |
55 | cmdHandlerThread.Priority = ThreadPriority.BelowNormal; | 55 | cmdHandlerThread.Priority = ThreadPriority.BelowNormal; |
56 | cmdHandlerThread.IsBackground = true; | 56 | cmdHandlerThread.IsBackground = true; |
57 | cmdHandlerThread.Start(); | 57 | cmdHandlerThread.Start(); |
58 | } | 58 | } |
59 | 59 | ||
60 | ~LSLLongCmdHandler() | 60 | ~LSLLongCmdHandler() |
61 | { | 61 | { |
62 | // Shut down thread | 62 | // Shut down thread |
63 | try | 63 | try |
64 | { | 64 | { |
65 | if (cmdHandlerThread != null) | 65 | if (cmdHandlerThread != null) |
66 | { | 66 | { |
67 | if (cmdHandlerThread.IsAlive == true) | 67 | if (cmdHandlerThread.IsAlive == true) |
68 | { | 68 | { |
69 | cmdHandlerThread.Abort(); | 69 | cmdHandlerThread.Abort(); |
70 | cmdHandlerThread.Join(); | 70 | cmdHandlerThread.Join(); |
71 | } | 71 | } |
72 | } | 72 | } |
73 | } | 73 | } |
74 | catch | 74 | catch |
75 | { | 75 | { |
76 | } | 76 | } |
77 | } | 77 | } |
78 | 78 | ||
79 | private void CmdHandlerThreadLoop() | 79 | private void CmdHandlerThreadLoop() |
80 | { | 80 | { |
81 | while (true) | 81 | while (true) |
82 | { | 82 | { |
83 | // Check timers | 83 | // Check timers |
84 | CheckTimerEvents(); | 84 | CheckTimerEvents(); |
85 | Thread.Sleep(25); | 85 | Thread.Sleep(25); |
86 | // Check HttpRequests | 86 | // Check HttpRequests |
87 | CheckHttpRequests(); | 87 | CheckHttpRequests(); |
88 | Thread.Sleep(25); | 88 | Thread.Sleep(25); |
89 | // Check XMLRPCRequests | 89 | // Check XMLRPCRequests |
90 | CheckXMLRPCRequests(); | 90 | CheckXMLRPCRequests(); |
91 | Thread.Sleep(25); | 91 | Thread.Sleep(25); |
92 | // Check Listeners | 92 | // Check Listeners |
93 | CheckListeners(); | 93 | CheckListeners(); |
94 | Thread.Sleep(25); | 94 | Thread.Sleep(25); |
95 | 95 | ||
96 | // Sleep before next cycle | 96 | // Sleep before next cycle |
97 | //Thread.Sleep(cmdHandlerThreadCycleSleepms); | 97 | //Thread.Sleep(cmdHandlerThreadCycleSleepms); |
98 | } | 98 | } |
99 | } | 99 | } |
100 | 100 | ||
101 | /// <summary> | 101 | /// <summary> |
102 | /// Remove a specific script (and all its pending commands) | 102 | /// Remove a specific script (and all its pending commands) |
103 | /// </summary> | 103 | /// </summary> |
104 | /// <param name="m_localID"></param> | 104 | /// <param name="m_localID"></param> |
105 | /// <param name="m_itemID"></param> | 105 | /// <param name="m_itemID"></param> |
106 | public void RemoveScript(uint localID, LLUUID itemID) | 106 | public void RemoveScript(uint localID, LLUUID itemID) |
107 | { | 107 | { |
108 | // Remove a specific script | 108 | // Remove a specific script |
109 | 109 | ||
110 | // Remove from: Timers | 110 | // Remove from: Timers |
111 | UnSetTimerEvents(localID, itemID); | 111 | UnSetTimerEvents(localID, itemID); |
112 | // Remove from: HttpRequest | 112 | // Remove from: HttpRequest |
113 | IHttpRequests iHttpReq = | 113 | IHttpRequests iHttpReq = |
114 | m_ScriptEngine.World.RequestModuleInterface<IHttpRequests>(); | 114 | m_ScriptEngine.World.RequestModuleInterface<IHttpRequests>(); |
115 | iHttpReq.StopHttpRequest(localID, itemID); | 115 | iHttpReq.StopHttpRequest(localID, itemID); |
116 | } | 116 | } |
117 | 117 | ||
118 | #region TIMER | 118 | #region TIMER |
119 | 119 | ||
120 | // | 120 | // |
121 | // TIMER | 121 | // TIMER |
122 | // | 122 | // |
123 | private class TimerClass | 123 | private class TimerClass |
124 | { | 124 | { |
125 | public uint localID; | 125 | public uint localID; |
126 | public LLUUID itemID; | 126 | public LLUUID itemID; |
127 | public double interval; | 127 | public double interval; |
128 | public DateTime next; | 128 | public DateTime next; |
129 | } | 129 | } |
130 | 130 | ||
131 | private List<TimerClass> Timers = new List<TimerClass>(); | 131 | private List<TimerClass> Timers = new List<TimerClass>(); |
132 | private object TimerListLock = new object(); | 132 | private object TimerListLock = new object(); |
133 | 133 | ||
134 | public void SetTimerEvent(uint m_localID, LLUUID m_itemID, double sec) | 134 | public void SetTimerEvent(uint m_localID, LLUUID m_itemID, double sec) |
135 | { | 135 | { |
136 | Console.WriteLine("SetTimerEvent"); | 136 | Console.WriteLine("SetTimerEvent"); |
137 | 137 | ||
138 | // Always remove first, in case this is a re-set | 138 | // Always remove first, in case this is a re-set |
139 | UnSetTimerEvents(m_localID, m_itemID); | 139 | UnSetTimerEvents(m_localID, m_itemID); |
140 | if (sec == 0) // Disabling timer | 140 | if (sec == 0) // Disabling timer |
141 | return; | 141 | return; |
142 | 142 | ||
143 | // Add to timer | 143 | // Add to timer |
144 | TimerClass ts = new TimerClass(); | 144 | TimerClass ts = new TimerClass(); |
145 | ts.localID = m_localID; | 145 | ts.localID = m_localID; |
146 | ts.itemID = m_itemID; | 146 | ts.itemID = m_itemID; |
147 | ts.interval = sec; | 147 | ts.interval = sec; |
148 | ts.next = DateTime.Now.ToUniversalTime().AddSeconds(ts.interval); | 148 | ts.next = DateTime.Now.ToUniversalTime().AddSeconds(ts.interval); |
149 | lock (TimerListLock) | 149 | lock (TimerListLock) |
150 | { | 150 | { |
151 | Timers.Add(ts); | 151 | Timers.Add(ts); |
152 | } | 152 | } |
153 | } | 153 | } |
154 | 154 | ||
155 | public void UnSetTimerEvents(uint m_localID, LLUUID m_itemID) | 155 | public void UnSetTimerEvents(uint m_localID, LLUUID m_itemID) |
156 | { | 156 | { |
157 | // Remove from timer | 157 | // Remove from timer |
158 | lock (TimerListLock) | 158 | lock (TimerListLock) |
159 | { | 159 | { |
160 | List<TimerClass> NewTimers = new List<TimerClass>(); | 160 | List<TimerClass> NewTimers = new List<TimerClass>(); |
161 | foreach (TimerClass ts in Timers) | 161 | foreach (TimerClass ts in Timers) |
162 | { | 162 | { |
163 | if (ts.localID != m_localID && ts.itemID != m_itemID) | 163 | if (ts.localID != m_localID && ts.itemID != m_itemID) |
164 | { | 164 | { |
165 | NewTimers.Add(ts); | 165 | NewTimers.Add(ts); |
166 | } | 166 | } |
167 | } | 167 | } |
168 | Timers.Clear(); | 168 | Timers.Clear(); |
169 | Timers = NewTimers; | 169 | Timers = NewTimers; |
170 | } | 170 | } |
171 | } | 171 | } |
172 | 172 | ||
173 | public void CheckTimerEvents() | 173 | public void CheckTimerEvents() |
174 | { | 174 | { |
175 | // Nothing to do here? | 175 | // Nothing to do here? |
176 | if (Timers.Count == 0) | 176 | if (Timers.Count == 0) |
177 | return; | 177 | return; |
178 | 178 | ||
179 | lock (TimerListLock) | 179 | lock (TimerListLock) |
180 | { | 180 | { |
181 | // Go through all timers | 181 | // Go through all timers |
182 | foreach (TimerClass ts in Timers) | 182 | foreach (TimerClass ts in Timers) |
183 | { | 183 | { |
184 | // Time has passed? | 184 | // Time has passed? |
185 | if (ts.next.ToUniversalTime() < DateTime.Now.ToUniversalTime()) | 185 | if (ts.next.ToUniversalTime() < DateTime.Now.ToUniversalTime()) |
186 | { | 186 | { |
187 | // Add it to queue | 187 | // Add it to queue |
188 | m_ScriptEngine.m_EventQueueManager.AddToScriptQueue(ts.localID, ts.itemID, "timer", | 188 | m_ScriptEngine.m_EventQueueManager.AddToScriptQueue(ts.localID, ts.itemID, "timer", |
189 | new object[] {}); | 189 | new object[] {}); |
190 | // set next interval | 190 | // set next interval |
191 | 191 | ||
192 | 192 | ||
193 | ts.next = DateTime.Now.ToUniversalTime().AddSeconds(ts.interval); | 193 | ts.next = DateTime.Now.ToUniversalTime().AddSeconds(ts.interval); |
194 | } | 194 | } |
195 | } | 195 | } |
196 | } // lock | 196 | } // lock |
197 | } | 197 | } |
198 | 198 | ||
199 | #endregion | 199 | #endregion |
200 | 200 | ||
201 | #region HTTP REQUEST | 201 | #region HTTP REQUEST |
202 | 202 | ||
203 | public void CheckHttpRequests() | 203 | public void CheckHttpRequests() |
204 | { | 204 | { |
205 | if (m_ScriptEngine.World == null) | 205 | if (m_ScriptEngine.World == null) |
206 | return; | 206 | return; |
207 | 207 | ||
208 | IHttpRequests iHttpReq = | 208 | IHttpRequests iHttpReq = |
209 | m_ScriptEngine.World.RequestModuleInterface<IHttpRequests>(); | 209 | m_ScriptEngine.World.RequestModuleInterface<IHttpRequests>(); |
210 | 210 | ||
211 | HttpRequestClass httpInfo = null; | 211 | HttpRequestClass httpInfo = null; |
212 | 212 | ||
213 | if (iHttpReq != null) | 213 | if (iHttpReq != null) |
214 | httpInfo = iHttpReq.GetNextCompletedRequest(); | 214 | httpInfo = iHttpReq.GetNextCompletedRequest(); |
215 | 215 | ||
216 | while (httpInfo != null) | 216 | while (httpInfo != null) |
217 | { | 217 | { |
218 | //Console.WriteLine("PICKED HTTP REQ:" + httpInfo.response_body + httpInfo.status); | 218 | //Console.WriteLine("PICKED HTTP REQ:" + httpInfo.response_body + httpInfo.status); |
219 | 219 | ||
220 | // Deliver data to prim's remote_data handler | 220 | // Deliver data to prim's remote_data handler |
221 | // | 221 | // |
222 | // TODO: Returning null for metadata, since the lsl function | 222 | // TODO: Returning null for metadata, since the lsl function |
223 | // only returns the byte for HTTP_BODY_TRUNCATED, which is not | 223 | // only returns the byte for HTTP_BODY_TRUNCATED, which is not |
224 | // implemented here yet anyway. Should be fixed if/when maxsize | 224 | // implemented here yet anyway. Should be fixed if/when maxsize |
225 | // is supported | 225 | // is supported |
226 | 226 | ||
227 | object[] resobj = new object[] | 227 | object[] resobj = new object[] |
228 | { | 228 | { |
229 | httpInfo.reqID.ToString(), httpInfo.status, null, httpInfo.response_body | 229 | httpInfo.reqID.ToString(), httpInfo.status, null, httpInfo.response_body |
230 | }; | 230 | }; |
231 | 231 | ||
232 | m_ScriptEngine.m_EventQueueManager.AddToScriptQueue( | 232 | m_ScriptEngine.m_EventQueueManager.AddToScriptQueue( |
233 | httpInfo.localID, httpInfo.itemID, "http_response", resobj | 233 | httpInfo.localID, httpInfo.itemID, "http_response", resobj |
234 | ); | 234 | ); |
235 | 235 | ||
236 | httpInfo.Stop(); | 236 | httpInfo.Stop(); |
237 | httpInfo = null; | 237 | httpInfo = null; |
238 | 238 | ||
239 | httpInfo = iHttpReq.GetNextCompletedRequest(); | 239 | httpInfo = iHttpReq.GetNextCompletedRequest(); |
240 | } | 240 | } |
241 | } | 241 | } |
242 | 242 | ||
243 | #endregion | 243 | #endregion |
244 | 244 | ||
245 | public void CheckXMLRPCRequests() | 245 | public void CheckXMLRPCRequests() |
246 | { | 246 | { |
247 | if (m_ScriptEngine.World == null) | 247 | if (m_ScriptEngine.World == null) |
248 | return; | 248 | return; |
249 | 249 | ||
250 | IXMLRPC xmlrpc = m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>(); | 250 | IXMLRPC xmlrpc = m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>(); |
251 | 251 | ||
252 | if (xmlrpc != null) | 252 | if (xmlrpc != null) |
253 | { | 253 | { |
254 | while (xmlrpc.hasRequests()) | 254 | while (xmlrpc.hasRequests()) |
255 | { | 255 | { |
256 | RPCRequestInfo rInfo = xmlrpc.GetNextRequest(); | 256 | RPCRequestInfo rInfo = xmlrpc.GetNextRequest(); |
257 | //Console.WriteLine("PICKED REQUEST"); | 257 | //Console.WriteLine("PICKED REQUEST"); |
258 | 258 | ||
259 | //Deliver data to prim's remote_data handler | 259 | //Deliver data to prim's remote_data handler |
260 | object[] resobj = new object[] | 260 | object[] resobj = new object[] |
261 | { | 261 | { |
262 | 2, rInfo.GetChannelKey().ToString(), rInfo.GetMessageID().ToString(), "", | 262 | 2, rInfo.GetChannelKey().ToString(), rInfo.GetMessageID().ToString(), "", |
263 | rInfo.GetIntValue(), | 263 | rInfo.GetIntValue(), |
264 | rInfo.GetStrVal() | 264 | rInfo.GetStrVal() |
265 | }; | 265 | }; |
266 | m_ScriptEngine.m_EventQueueManager.AddToScriptQueue( | 266 | m_ScriptEngine.m_EventQueueManager.AddToScriptQueue( |
267 | rInfo.GetLocalID(), rInfo.GetItemID(), "remote_data", resobj | 267 | rInfo.GetLocalID(), rInfo.GetItemID(), "remote_data", resobj |
268 | ); | 268 | ); |
269 | } | 269 | } |
270 | } | 270 | } |
271 | } | 271 | } |
272 | 272 | ||
273 | public void CheckListeners() | 273 | public void CheckListeners() |
274 | { | 274 | { |
275 | if (m_ScriptEngine.World == null) | 275 | if (m_ScriptEngine.World == null) |
276 | return; | 276 | return; |
277 | IWorldComm comms = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); | 277 | IWorldComm comms = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); |
278 | 278 | ||
279 | while (comms.HasMessages()) | 279 | while (comms.HasMessages()) |
280 | { | 280 | { |
281 | ListenerInfo lInfo = comms.GetNextMessage(); | 281 | ListenerInfo lInfo = comms.GetNextMessage(); |
282 | 282 | ||
283 | //Deliver data to prim's listen handler | 283 | //Deliver data to prim's listen handler |
284 | object[] resobj = new object[] | 284 | object[] resobj = new object[] |
285 | { | 285 | { |
286 | lInfo.GetChannel(), lInfo.GetName(), lInfo.GetID().ToString(), lInfo.GetMessage() | 286 | lInfo.GetChannel(), lInfo.GetName(), lInfo.GetID().ToString(), lInfo.GetMessage() |
287 | }; | 287 | }; |
288 | 288 | ||
289 | m_ScriptEngine.m_EventQueueManager.AddToScriptQueue( | 289 | m_ScriptEngine.m_EventQueueManager.AddToScriptQueue( |
290 | lInfo.GetLocalID(), lInfo.GetItemID(), "listen", resobj | 290 | lInfo.GetLocalID(), lInfo.GetItemID(), "listen", resobj |
291 | ); | 291 | ); |
292 | } | 292 | } |
293 | } | 293 | } |
294 | } | 294 | } |
295 | } \ No newline at end of file | 295 | } \ No newline at end of file |
diff --git a/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/ScriptEngine.cs b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/ScriptEngine.cs new file mode 100644 index 0000000..9637252 --- /dev/null +++ b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/ScriptEngine.cs | |||
@@ -0,0 +1,131 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSim Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | * | ||
27 | */ | ||
28 | /* Original code: Tedd Hansen */ | ||
29 | using System; | ||
30 | using Nini.Config; | ||
31 | using OpenSim.Framework.Console; | ||
32 | using OpenSim.Region.Environment.Interfaces; | ||
33 | using OpenSim.Region.Environment.Scenes; | ||
34 | using OpenSim.Region.ScriptEngine.Common; | ||
35 | using OpenSim.Region.ScriptEngine.Common.ScriptEngineBase; | ||
36 | |||
37 | namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase | ||
38 | { | ||
39 | /// <summary> | ||
40 | /// This is the root object for ScriptEngine. Objects access each other trough this class. | ||
41 | /// </summary> | ||
42 | /// | ||
43 | [Serializable] | ||
44 | public abstract class ScriptEngine : IRegionModule, OpenSim.Region.ScriptEngine.Common.ScriptServerInterfaces.ScriptEngine | ||
45 | { | ||
46 | public Scene World; | ||
47 | public EventManager m_EventManager; // Handles and queues incoming events from OpenSim | ||
48 | public EventQueueManager m_EventQueueManager; // Executes events | ||
49 | public ScriptManager m_ScriptManager; // Load, unload and execute scripts | ||
50 | public AppDomainManager m_AppDomainManager; | ||
51 | public LSLLongCmdHandler m_LSLLongCmdHandler; | ||
52 | |||
53 | public ScriptManager GetScriptManager() | ||
54 | { | ||
55 | return _GetScriptManager(); | ||
56 | } | ||
57 | public abstract ScriptManager _GetScriptManager(); | ||
58 | |||
59 | private LogBase m_log; | ||
60 | |||
61 | public ScriptEngine() | ||
62 | { | ||
63 | //Common.SendToDebug("ScriptEngine Object Initialized"); | ||
64 | Common.mySE = this; | ||
65 | } | ||
66 | |||
67 | public LogBase Log | ||
68 | { | ||
69 | get { return m_log; } | ||
70 | } | ||
71 | |||
72 | public void InitializeEngine(Scene Sceneworld, LogBase logger, bool HookUpToServer, ScriptManager newScriptManager) | ||
73 | { | ||
74 | World = Sceneworld; | ||
75 | m_log = logger; | ||
76 | |||
77 | Log.Verbose("ScriptEngine", "DotNet & LSL ScriptEngine initializing"); | ||
78 | |||
79 | //m_logger.Status("ScriptEngine", "InitializeEngine"); | ||
80 | |||
81 | // Create all objects we'll be using | ||
82 | m_EventQueueManager = new EventQueueManager(this); | ||
83 | m_EventManager = new EventManager(this, HookUpToServer); | ||
84 | m_ScriptManager = newScriptManager; | ||
85 | //m_ScriptManager = new ScriptManager(this); | ||
86 | m_AppDomainManager = new AppDomainManager(); | ||
87 | m_LSLLongCmdHandler = new LSLLongCmdHandler(this); | ||
88 | |||
89 | // Should we iterate the region for scripts that needs starting? | ||
90 | // Or can we assume we are loaded before anything else so we can use proper events? | ||
91 | } | ||
92 | |||
93 | public void Shutdown() | ||
94 | { | ||
95 | // We are shutting down | ||
96 | } | ||
97 | |||
98 | ScriptServerInterfaces.RemoteEvents ScriptServerInterfaces.ScriptEngine.EventManager() | ||
99 | { | ||
100 | return this.m_EventManager; | ||
101 | } | ||
102 | |||
103 | |||
104 | #region IRegionModule | ||
105 | |||
106 | public abstract void Initialise(Scene scene, IConfigSource config); | ||
107 | |||
108 | public void PostInitialise() | ||
109 | { | ||
110 | } | ||
111 | |||
112 | public void Close() | ||
113 | { | ||
114 | } | ||
115 | |||
116 | public string Name | ||
117 | { | ||
118 | get { return "DotNetEngine"; } | ||
119 | } | ||
120 | |||
121 | public bool IsSharedModule | ||
122 | { | ||
123 | get { return false; } | ||
124 | } | ||
125 | |||
126 | |||
127 | |||
128 | #endregion | ||
129 | |||
130 | } | ||
131 | } \ No newline at end of file | ||
diff --git a/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/ScriptManager.cs b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/ScriptManager.cs new file mode 100644 index 0000000..55c9545 --- /dev/null +++ b/OpenSim/Region/ScriptEngine/Common/ScriptEngineBase/ScriptManager.cs | |||
@@ -0,0 +1,347 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSim Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | * | ||
27 | */ | ||
28 | /* Original code: Tedd Hansen */ | ||
29 | using System; | ||
30 | using System.Collections.Generic; | ||
31 | using System.IO; | ||
32 | using System.Reflection; | ||
33 | using System.Runtime.Serialization.Formatters.Binary; | ||
34 | using System.Threading; | ||
35 | using libsecondlife; | ||
36 | using OpenSim.Framework; | ||
37 | using OpenSim.Region.Environment.Scenes; | ||
38 | using OpenSim.Region.ScriptEngine.Common; | ||
39 | |||
40 | namespace OpenSim.Region.ScriptEngine.Common.ScriptEngineBase | ||
41 | { | ||
42 | /// <summary> | ||
43 | /// Loads scripts | ||
44 | /// Compiles them if necessary | ||
45 | /// Execute functions for EventQueueManager (Sends them to script on other AppDomain for execution) | ||
46 | /// </summary> | ||
47 | /// | ||
48 | |||
49 | // This class is as close as you get to the script without being inside script class. It handles all the dirty work for other classes. | ||
50 | // * Keeps track of running scripts | ||
51 | // * Compiles script if necessary (through "Compiler") | ||
52 | // * Loads script (through "AppDomainManager" called from for example "EventQueueManager") | ||
53 | // * Executes functions inside script (called from for example "EventQueueManager" class) | ||
54 | // * Unloads script (through "AppDomainManager" called from for example "EventQueueManager") | ||
55 | // * Dedicated load/unload thread, and queues loading/unloading. | ||
56 | // This so that scripts starting or stopping will not slow down other theads or whole system. | ||
57 | // | ||
58 | [Serializable] | ||
59 | public abstract class ScriptManager | ||
60 | { | ||
61 | #region Declares | ||
62 | |||
63 | private Thread scriptLoadUnloadThread; | ||
64 | private int scriptLoadUnloadThread_IdleSleepms = 100; | ||
65 | private Queue<LUStruct> LUQueue = new Queue<LUStruct>(); | ||
66 | |||
67 | |||
68 | // Load/Unload structure | ||
69 | private struct LUStruct | ||
70 | { | ||
71 | public uint localID; | ||
72 | public LLUUID itemID; | ||
73 | public string script; | ||
74 | public LUType Action; | ||
75 | } | ||
76 | |||
77 | private enum LUType | ||
78 | { | ||
79 | Unknown = 0, | ||
80 | Load = 1, | ||
81 | Unload = 2 | ||
82 | } | ||
83 | |||
84 | // Object<string, Script<string, script>> | ||
85 | // IMPORTANT: Types and MemberInfo-derived objects require a LOT of memory. | ||
86 | // Instead use RuntimeTypeHandle, RuntimeFieldHandle and RunTimeHandle (IntPtr) instead! | ||
87 | public Dictionary<uint, Dictionary<LLUUID, IScript>> Scripts = | ||
88 | new Dictionary<uint, Dictionary<LLUUID, IScript>>(); | ||
89 | |||
90 | public Scene World | ||
91 | { | ||
92 | get { return m_scriptEngine.World; } | ||
93 | } | ||
94 | |||
95 | #endregion | ||
96 | |||
97 | #region Object init/shutdown | ||
98 | |||
99 | public ScriptEngineBase.ScriptEngine m_scriptEngine; | ||
100 | |||
101 | public ScriptManager(ScriptEngineBase.ScriptEngine scriptEngine) | ||
102 | { | ||
103 | m_scriptEngine = scriptEngine; | ||
104 | AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve); | ||
105 | scriptLoadUnloadThread = new Thread(ScriptLoadUnloadThreadLoop); | ||
106 | scriptLoadUnloadThread.Name = "ScriptLoadUnloadThread"; | ||
107 | scriptLoadUnloadThread.IsBackground = true; | ||
108 | scriptLoadUnloadThread.Priority = ThreadPriority.BelowNormal; | ||
109 | scriptLoadUnloadThread.Start(); | ||
110 | } | ||
111 | |||
112 | ~ScriptManager() | ||
113 | { | ||
114 | // Abort load/unload thread | ||
115 | try | ||
116 | { | ||
117 | if (scriptLoadUnloadThread != null) | ||
118 | { | ||
119 | if (scriptLoadUnloadThread.IsAlive == true) | ||
120 | { | ||
121 | scriptLoadUnloadThread.Abort(); | ||
122 | scriptLoadUnloadThread.Join(); | ||
123 | } | ||
124 | } | ||
125 | } | ||
126 | catch | ||
127 | { | ||
128 | } | ||
129 | } | ||
130 | |||
131 | #endregion | ||
132 | |||
133 | #region Load / Unload scripts (Thread loop) | ||
134 | |||
135 | private void ScriptLoadUnloadThreadLoop() | ||
136 | { | ||
137 | try | ||
138 | { | ||
139 | while (true) | ||
140 | { | ||
141 | if (LUQueue.Count == 0) | ||
142 | Thread.Sleep(scriptLoadUnloadThread_IdleSleepms); | ||
143 | if (LUQueue.Count > 0) | ||
144 | { | ||
145 | LUStruct item = LUQueue.Dequeue(); | ||
146 | lock (startStopLock) // Lock so we have only 1 thread working on loading/unloading of scripts | ||
147 | { | ||
148 | if (item.Action == LUType.Unload) | ||
149 | { | ||
150 | _StopScript(item.localID, item.itemID); | ||
151 | } | ||
152 | if (item.Action == LUType.Load) | ||
153 | { | ||
154 | _StartScript(item.localID, item.itemID, item.script); | ||
155 | } | ||
156 | } | ||
157 | } | ||
158 | } | ||
159 | } | ||
160 | catch (ThreadAbortException tae) | ||
161 | { | ||
162 | string a = tae.ToString(); | ||
163 | a = ""; | ||
164 | // Expected | ||
165 | } | ||
166 | } | ||
167 | |||
168 | #endregion | ||
169 | |||
170 | #region Helper functions | ||
171 | |||
172 | private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) | ||
173 | { | ||
174 | //Console.WriteLine("ScriptManager.CurrentDomain_AssemblyResolve: " + args.Name); | ||
175 | return Assembly.GetExecutingAssembly().FullName == args.Name ? Assembly.GetExecutingAssembly() : null; | ||
176 | } | ||
177 | |||
178 | #endregion | ||
179 | |||
180 | |||
181 | |||
182 | #region Start/Stop/Reset script | ||
183 | |||
184 | private readonly Object startStopLock = new Object(); | ||
185 | |||
186 | /// <summary> | ||
187 | /// Fetches, loads and hooks up a script to an objects events | ||
188 | /// </summary> | ||
189 | /// <param name="itemID"></param> | ||
190 | /// <param name="localID"></param> | ||
191 | public void StartScript(uint localID, LLUUID itemID, string Script) | ||
192 | { | ||
193 | LUStruct ls = new LUStruct(); | ||
194 | ls.localID = localID; | ||
195 | ls.itemID = itemID; | ||
196 | ls.script = Script; | ||
197 | ls.Action = LUType.Load; | ||
198 | LUQueue.Enqueue(ls); | ||
199 | } | ||
200 | |||
201 | /// <summary> | ||
202 | /// Disables and unloads a script | ||
203 | /// </summary> | ||
204 | /// <param name="localID"></param> | ||
205 | /// <param name="itemID"></param> | ||
206 | public void StopScript(uint localID, LLUUID itemID) | ||
207 | { | ||
208 | LUStruct ls = new LUStruct(); | ||
209 | ls.localID = localID; | ||
210 | ls.itemID = itemID; | ||
211 | ls.Action = LUType.Unload; | ||
212 | LUQueue.Enqueue(ls); | ||
213 | } | ||
214 | |||
215 | // Create a new instance of the compiler (reuse) | ||
216 | //private Compiler.LSL.Compiler LSLCompiler = new Compiler.LSL.Compiler(); | ||
217 | |||
218 | public abstract void _StartScript(uint localID, LLUUID itemID, string Script); | ||
219 | |||
220 | public abstract void _StopScript(uint localID, LLUUID itemID); | ||
221 | |||
222 | |||
223 | #endregion | ||
224 | |||
225 | #region Perform event execution in script | ||
226 | |||
227 | /// <summary> | ||
228 | /// Execute a LL-event-function in Script | ||
229 | /// </summary> | ||
230 | /// <param name="localID">Object the script is located in</param> | ||
231 | /// <param name="itemID">Script ID</param> | ||
232 | /// <param name="FunctionName">Name of function</param> | ||
233 | /// <param name="args">Arguments to pass to function</param> | ||
234 | internal void ExecuteEvent(uint localID, LLUUID itemID, string FunctionName, object[] args) | ||
235 | { | ||
236 | #if DEBUG | ||
237 | Console.WriteLine("ScriptEngine: Inside ExecuteEvent for event " + FunctionName); | ||
238 | #endif | ||
239 | // Execute a function in the script | ||
240 | //m_scriptEngine.Log.Verbose("ScriptEngine", "Executing Function localID: " + localID + ", itemID: " + itemID + ", FunctionName: " + FunctionName); | ||
241 | //ScriptBaseInterface Script = (ScriptBaseInterface)GetScript(localID, itemID); | ||
242 | IScript Script = GetScript(localID, itemID); | ||
243 | if (Script == null) | ||
244 | return; | ||
245 | #if DEBUG | ||
246 | Console.WriteLine("ScriptEngine: Executing event: " + FunctionName); | ||
247 | #endif | ||
248 | // Must be done in correct AppDomain, so leaving it up to the script itself | ||
249 | Script.Exec.ExecuteEvent(FunctionName, args); | ||
250 | } | ||
251 | |||
252 | #endregion | ||
253 | |||
254 | #region Internal functions to keep track of script | ||
255 | |||
256 | public Dictionary<LLUUID, IScript>.KeyCollection GetScriptKeys(uint localID) | ||
257 | { | ||
258 | if (Scripts.ContainsKey(localID) == false) | ||
259 | return null; | ||
260 | |||
261 | Dictionary<LLUUID, IScript> Obj; | ||
262 | Scripts.TryGetValue(localID, out Obj); | ||
263 | |||
264 | return Obj.Keys; | ||
265 | } | ||
266 | |||
267 | public IScript GetScript(uint localID, LLUUID itemID) | ||
268 | { | ||
269 | if (Scripts.ContainsKey(localID) == false) | ||
270 | return null; | ||
271 | |||
272 | Dictionary<LLUUID, IScript> Obj; | ||
273 | Scripts.TryGetValue(localID, out Obj); | ||
274 | if (Obj.ContainsKey(itemID) == false) | ||
275 | return null; | ||
276 | |||
277 | // Get script | ||
278 | IScript Script; | ||
279 | Obj.TryGetValue(itemID, out Script); | ||
280 | |||
281 | return Script; | ||
282 | } | ||
283 | |||
284 | public void SetScript(uint localID, LLUUID itemID, IScript Script) | ||
285 | { | ||
286 | // Create object if it doesn't exist | ||
287 | if (Scripts.ContainsKey(localID) == false) | ||
288 | { | ||
289 | Scripts.Add(localID, new Dictionary<LLUUID, IScript>()); | ||
290 | } | ||
291 | |||
292 | // Delete script if it exists | ||
293 | Dictionary<LLUUID, IScript> Obj; | ||
294 | Scripts.TryGetValue(localID, out Obj); | ||
295 | if (Obj.ContainsKey(itemID) == true) | ||
296 | Obj.Remove(itemID); | ||
297 | |||
298 | // Add to object | ||
299 | Obj.Add(itemID, Script); | ||
300 | } | ||
301 | |||
302 | public void RemoveScript(uint localID, LLUUID itemID) | ||
303 | { | ||
304 | // Don't have that object? | ||
305 | if (Scripts.ContainsKey(localID) == false) | ||
306 | return; | ||
307 | |||
308 | // Delete script if it exists | ||
309 | Dictionary<LLUUID, IScript> Obj; | ||
310 | Scripts.TryGetValue(localID, out Obj); | ||
311 | if (Obj.ContainsKey(itemID) == true) | ||
312 | Obj.Remove(itemID); | ||
313 | } | ||
314 | |||
315 | #endregion | ||
316 | |||
317 | |||
318 | public void ResetScript(uint localID, LLUUID itemID) | ||
319 | { | ||
320 | string script = GetScript(localID, itemID).Source; | ||
321 | StopScript(localID, itemID); | ||
322 | StartScript(localID, itemID, script); | ||
323 | } | ||
324 | |||
325 | |||
326 | #region Script serialization/deserialization | ||
327 | |||
328 | public void GetSerializedScript(uint localID, LLUUID itemID) | ||
329 | { | ||
330 | // Serialize the script and return it | ||
331 | // Should not be a problem | ||
332 | FileStream fs = File.Create("SERIALIZED_SCRIPT_" + itemID); | ||
333 | BinaryFormatter b = new BinaryFormatter(); | ||
334 | b.Serialize(fs, GetScript(localID, itemID)); | ||
335 | fs.Close(); | ||
336 | } | ||
337 | |||
338 | public void PutSerializedScript(uint localID, LLUUID itemID) | ||
339 | { | ||
340 | // Deserialize the script and inject it into an AppDomain | ||
341 | |||
342 | // How to inject into an AppDomain? | ||
343 | } | ||
344 | |||
345 | #endregion | ||
346 | } | ||
347 | } \ No newline at end of file | ||
diff --git a/OpenSim/Region/ScriptEngine/Common/ScriptServerInterfaces.cs b/OpenSim/Region/ScriptEngine/Common/ScriptServerInterfaces.cs index 23ef126..8a3354f 100644 --- a/OpenSim/Region/ScriptEngine/Common/ScriptServerInterfaces.cs +++ b/OpenSim/Region/ScriptEngine/Common/ScriptServerInterfaces.cs | |||
@@ -2,6 +2,7 @@ | |||
2 | using OpenSim.Framework; | 2 | using OpenSim.Framework; |
3 | using OpenSim.Framework.Console; | 3 | using OpenSim.Framework.Console; |
4 | using OpenSim.Region.Environment.Scenes; | 4 | using OpenSim.Region.Environment.Scenes; |
5 | using OpenSim.Region.ScriptEngine.Common.ScriptEngineBase; | ||
5 | 6 | ||
6 | namespace OpenSim.Region.ScriptEngine.Common | 7 | namespace OpenSim.Region.ScriptEngine.Common |
7 | { | 8 | { |
@@ -44,7 +45,7 @@ namespace OpenSim.Region.ScriptEngine.Common | |||
44 | void remote_data(uint localID, LLUUID itemID); | 45 | void remote_data(uint localID, LLUUID itemID); |
45 | void http_response(uint localID, LLUUID itemID); | 46 | void http_response(uint localID, LLUUID itemID); |
46 | } | 47 | } |
47 | 48 | ||
48 | public interface ServerRemotingObject | 49 | public interface ServerRemotingObject |
49 | { | 50 | { |
50 | RemoteEvents Events(); | 51 | RemoteEvents Events(); |
@@ -52,7 +53,8 @@ namespace OpenSim.Region.ScriptEngine.Common | |||
52 | public interface ScriptEngine | 53 | public interface ScriptEngine |
53 | { | 54 | { |
54 | RemoteEvents EventManager(); | 55 | RemoteEvents EventManager(); |
55 | void InitializeEngine(Scene Sceneworld, LogBase logger, bool DontHookUp); | 56 | void InitializeEngine(Scene Sceneworld, LogBase logger, bool DontHookUp, ScriptManager newScriptManager); |
57 | ScriptManager GetScriptManager(); | ||
56 | } | 58 | } |
57 | 59 | ||
58 | } | 60 | } |
diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/Compiler.cs b/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/Compiler.cs index 441c952..9cd22e2 100644 --- a/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/Compiler.cs +++ b/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/Compiler.cs | |||
@@ -58,10 +58,10 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL | |||
58 | { | 58 | { |
59 | case ".txt": | 59 | case ".txt": |
60 | case ".lsl": | 60 | case ".lsl": |
61 | Common.SendToDebug("Source code is LSL, converting to CS"); | 61 | Common.ScriptEngineBase.Common.SendToDebug("Source code is LSL, converting to CS"); |
62 | return CompileFromLSLText(File.ReadAllText(LSOFileName)); | 62 | return CompileFromLSLText(File.ReadAllText(LSOFileName)); |
63 | case ".cs": | 63 | case ".cs": |
64 | Common.SendToDebug("Source code is CS"); | 64 | Common.ScriptEngineBase.Common.SendToDebug("Source code is CS"); |
65 | return CompileFromCSText(File.ReadAllText(LSOFileName)); | 65 | return CompileFromCSText(File.ReadAllText(LSOFileName)); |
66 | default: | 66 | default: |
67 | throw new Exception("Unknown script type."); | 67 | throw new Exception("Unknown script type."); |
diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/LSL2CSConverter.cs b/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/LSL2CSConverter.cs index dfdf8f4..724d8f5 100644 --- a/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/LSL2CSConverter.cs +++ b/OpenSim/Region/ScriptEngine/DotNetEngine/Compiler/LSL/LSL2CSConverter.cs | |||
@@ -313,7 +313,7 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL | |||
313 | "namespace SecondLife { "; | 313 | "namespace SecondLife { "; |
314 | Return += "" + | 314 | Return += "" + |
315 | //"[Serializable] " + | 315 | //"[Serializable] " + |
316 | "public class Script : OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL.LSL_BaseClass { "; | 316 | "public class Script : OpenSim.Region.ScriptEngine.Common.LSL_BaseClass { "; |
317 | Return += @"public Script() { } "; | 317 | Return += @"public Script() { } "; |
318 | Return += Script; | 318 | Return += Script; |
319 | Return += "} }\r\n"; | 319 | Return += "} }\r\n"; |
diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/ScriptEngine.cs b/OpenSim/Region/ScriptEngine/DotNetEngine/ScriptEngine.cs index c3cb34d..191d3b2 100644 --- a/OpenSim/Region/ScriptEngine/DotNetEngine/ScriptEngine.cs +++ b/OpenSim/Region/ScriptEngine/DotNetEngine/ScriptEngine.cs | |||
@@ -32,93 +32,23 @@ using OpenSim.Framework.Console; | |||
32 | using OpenSim.Region.Environment.Interfaces; | 32 | using OpenSim.Region.Environment.Interfaces; |
33 | using OpenSim.Region.Environment.Scenes; | 33 | using OpenSim.Region.Environment.Scenes; |
34 | using OpenSim.Region.ScriptEngine.Common; | 34 | using OpenSim.Region.ScriptEngine.Common; |
35 | using OpenSim.Region.ScriptEngine.Common.ScriptEngineBase; | ||
36 | using EventManager=OpenSim.Region.ScriptEngine.Common.ScriptEngineBase.EventManager; | ||
35 | 37 | ||
36 | namespace OpenSim.Region.ScriptEngine.DotNetEngine | 38 | namespace OpenSim.Region.ScriptEngine.DotNetEngine |
37 | { | 39 | { |
38 | /// <summary> | ||
39 | /// This is the root object for ScriptEngine. Objects access each other trough this class. | ||
40 | /// </summary> | ||
41 | /// | ||
42 | [Serializable] | 40 | [Serializable] |
43 | public class ScriptEngine : IRegionModule, OpenSim.Region.ScriptEngine.Common.ScriptServerInterfaces.ScriptEngine | 41 | public class ScriptEngine : OpenSim.Region.ScriptEngine.Common.ScriptEngineBase.ScriptEngine |
44 | { | 42 | { |
45 | public Scene World; | 43 | // We need to override a few things for our DotNetEngine |
46 | public EventManager m_EventManager; // Handles and queues incoming events from OpenSim | 44 | public override void Initialise(Scene scene, IConfigSource config) |
47 | internal EventQueueManager m_EventQueueManager; // Executes events | ||
48 | public ScriptManager m_ScriptManager; // Load, unload and execute scripts | ||
49 | internal AppDomainManager m_AppDomainManager; | ||
50 | internal LSLLongCmdHandler m_LSLLongCmdHandler; | ||
51 | |||
52 | private LogBase m_log; | ||
53 | |||
54 | public ScriptEngine() | ||
55 | { | ||
56 | //Common.SendToDebug("ScriptEngine Object Initialized"); | ||
57 | Common.mySE = this; | ||
58 | } | ||
59 | |||
60 | public LogBase Log | ||
61 | { | ||
62 | get { return m_log; } | ||
63 | } | ||
64 | |||
65 | public void InitializeEngine(Scene Sceneworld, LogBase logger, bool HookUpToServer) | ||
66 | { | ||
67 | World = Sceneworld; | ||
68 | m_log = logger; | ||
69 | |||
70 | Log.Verbose("ScriptEngine", "DotNet & LSL ScriptEngine initializing"); | ||
71 | |||
72 | //m_logger.Status("ScriptEngine", "InitializeEngine"); | ||
73 | |||
74 | // Create all objects we'll be using | ||
75 | m_EventQueueManager = new EventQueueManager(this); | ||
76 | m_EventManager = new EventManager(this, HookUpToServer); | ||
77 | m_ScriptManager = new ScriptManager(this); | ||
78 | m_AppDomainManager = new AppDomainManager(); | ||
79 | m_LSLLongCmdHandler = new LSLLongCmdHandler(this); | ||
80 | |||
81 | // Should we iterate the region for scripts that needs starting? | ||
82 | // Or can we assume we are loaded before anything else so we can use proper events? | ||
83 | } | ||
84 | |||
85 | public void Shutdown() | ||
86 | { | ||
87 | // We are shutting down | ||
88 | } | ||
89 | |||
90 | ScriptServerInterfaces.RemoteEvents ScriptServerInterfaces.ScriptEngine.EventManager() | ||
91 | { | ||
92 | return this.m_EventManager; | ||
93 | } | ||
94 | |||
95 | |||
96 | #region IRegionModule | ||
97 | |||
98 | public void Initialise(Scene scene, IConfigSource config) | ||
99 | { | ||
100 | InitializeEngine(scene, MainLog.Instance, true); | ||
101 | } | ||
102 | |||
103 | public void PostInitialise() | ||
104 | { | 45 | { |
46 | InitializeEngine(scene, MainLog.Instance, true, GetScriptManager()); | ||
105 | } | 47 | } |
106 | 48 | ||
107 | public void Close() | 49 | public override OpenSim.Region.ScriptEngine.Common.ScriptEngineBase.ScriptManager _GetScriptManager() |
108 | { | 50 | { |
51 | return new ScriptManager(this); | ||
109 | } | 52 | } |
110 | |||
111 | public string Name | ||
112 | { | ||
113 | get { return "DotNetEngine"; } | ||
114 | } | ||
115 | |||
116 | public bool IsSharedModule | ||
117 | { | ||
118 | get { return false; } | ||
119 | } | ||
120 | |||
121 | #endregion | ||
122 | |||
123 | } | 53 | } |
124 | } \ No newline at end of file | 54 | } \ No newline at end of file |
diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/ScriptManager.cs b/OpenSim/Region/ScriptEngine/DotNetEngine/ScriptManager.cs index 223bb8f..0c28ac7 100644 --- a/OpenSim/Region/ScriptEngine/DotNetEngine/ScriptManager.cs +++ b/OpenSim/Region/ScriptEngine/DotNetEngine/ScriptManager.cs | |||
@@ -35,421 +35,127 @@ using System.Threading; | |||
35 | using libsecondlife; | 35 | using libsecondlife; |
36 | using OpenSim.Framework; | 36 | using OpenSim.Framework; |
37 | using OpenSim.Region.Environment.Scenes; | 37 | using OpenSim.Region.Environment.Scenes; |
38 | using OpenSim.Region.ScriptEngine.DotNetEngine.Compiler; | 38 | using OpenSim.Region.ScriptEngine.Common; |
39 | using OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL; | 39 | using OpenSim.Region.ScriptEngine.DotNetEngine.Compiler.LSL; |
40 | 40 | ||
41 | namespace OpenSim.Region.ScriptEngine.DotNetEngine | 41 | namespace OpenSim.Region.ScriptEngine.DotNetEngine |
42 | { | 42 | { |
43 | /// <summary> | 43 | public class ScriptManager : OpenSim.Region.ScriptEngine.Common.ScriptEngineBase.ScriptManager |
44 | /// Loads scripts | ||
45 | /// Compiles them if necessary | ||
46 | /// Execute functions for EventQueueManager (Sends them to script on other AppDomain for execution) | ||
47 | /// </summary> | ||
48 | /// | ||
49 | |||
50 | // 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. | ||
51 | // * Keeps track of running scripts | ||
52 | // * Compiles script if necessary (through "Compiler") | ||
53 | // * Loads script (through "AppDomainManager" called from for example "EventQueueManager") | ||
54 | // * Executes functions inside script (called from for example "EventQueueManager" class) | ||
55 | // * Unloads script (through "AppDomainManager" called from for example "EventQueueManager") | ||
56 | // * Dedicated load/unload thread, and queues loading/unloading. | ||
57 | // This so that scripts starting or stopping will not slow down other theads or whole system. | ||
58 | // | ||
59 | [Serializable] | ||
60 | public class ScriptManager | ||
61 | { | 44 | { |
62 | #region Declares | 45 | public ScriptManager(Common.ScriptEngineBase.ScriptEngine scriptEngine) |
63 | 46 | : base(scriptEngine) | |
64 | private Thread scriptLoadUnloadThread; | ||
65 | private int scriptLoadUnloadThread_IdleSleepms = 100; | ||
66 | private Queue<LUStruct> LUQueue = new Queue<LUStruct>(); | ||
67 | |||
68 | |||
69 | // Load/Unload structure | ||
70 | private struct LUStruct | ||
71 | { | 47 | { |
72 | public uint localID; | 48 | base.m_scriptEngine = scriptEngine; |
73 | public LLUUID itemID; | ||
74 | public string script; | ||
75 | public LUType Action; | ||
76 | } | ||
77 | |||
78 | private enum LUType | ||
79 | { | ||
80 | Unknown = 0, | ||
81 | Load = 1, | ||
82 | Unload = 2 | ||
83 | } | ||
84 | 49 | ||
85 | // Object<string, Script<string, script>> | ||
86 | // IMPORTANT: Types and MemberInfo-derived objects require a LOT of memory. | ||
87 | // Instead use RuntimeTypeHandle, RuntimeFieldHandle and RunTimeHandle (IntPtr) instead! | ||
88 | internal Dictionary<uint, Dictionary<LLUUID, LSL_BaseClass>> Scripts = | ||
89 | new Dictionary<uint, Dictionary<LLUUID, LSL_BaseClass>>(); | ||
90 | |||
91 | public Scene World | ||
92 | { | ||
93 | get { return m_scriptEngine.World; } | ||
94 | } | 50 | } |
95 | 51 | ||
96 | #endregion | 52 | // KEEP TRACK OF SCRIPTS <int id, whatever script> |
97 | 53 | //internal Dictionary<uint, Dictionary<LLUUID, LSL_BaseClass>> Scripts = new Dictionary<uint, Dictionary<LLUUID, LSL_BaseClass>>(); | |
98 | #region Object init/shutdown | 54 | // LOAD SCRIPT |
99 | 55 | // UNLOAD SCRIPT | |
100 | private ScriptEngine m_scriptEngine; | 56 | // PROVIDE SCRIPT WITH ITS INTERFACE TO OpenSim |
101 | 57 | ||
102 | public ScriptManager(ScriptEngine scriptEngine) | 58 | private Compiler.LSL.Compiler LSLCompiler = new Compiler.LSL.Compiler(); |
103 | { | ||
104 | m_scriptEngine = scriptEngine; | ||
105 | AppDomain.CurrentDomain.AssemblyResolve += new ResolveEventHandler(CurrentDomain_AssemblyResolve); | ||
106 | scriptLoadUnloadThread = new Thread(ScriptLoadUnloadThreadLoop); | ||
107 | scriptLoadUnloadThread.Name = "ScriptLoadUnloadThread"; | ||
108 | scriptLoadUnloadThread.IsBackground = true; | ||
109 | scriptLoadUnloadThread.Priority = ThreadPriority.BelowNormal; | ||
110 | scriptLoadUnloadThread.Start(); | ||
111 | } | ||
112 | 59 | ||
113 | ~ScriptManager() | 60 | public override void _StartScript(uint localID, LLUUID itemID, string Script) |
114 | { | 61 | { |
115 | // Abort load/unload thread | 62 | //IScriptHost root = host.GetRoot(); |
116 | try | 63 | Console.WriteLine("ScriptManager StartScript: localID: " + localID + ", itemID: " + itemID); |
117 | { | ||
118 | if (scriptLoadUnloadThread != null) | ||
119 | { | ||
120 | if (scriptLoadUnloadThread.IsAlive == true) | ||
121 | { | ||
122 | scriptLoadUnloadThread.Abort(); | ||
123 | scriptLoadUnloadThread.Join(); | ||
124 | } | ||
125 | } | ||
126 | } | ||
127 | catch | ||
128 | { | ||
129 | } | ||
130 | } | ||
131 | 64 | ||
132 | #endregion | 65 | // We will initialize and start the script. |
66 | // It will be up to the script itself to hook up the correct events. | ||
67 | string ScriptSource = ""; | ||
133 | 68 | ||
134 | #region Load / Unload scripts (Thread loop) | 69 | SceneObjectPart m_host = World.GetSceneObjectPart(localID); |
135 | 70 | ||
136 | private void ScriptLoadUnloadThreadLoop() | ||
137 | { | ||
138 | try | 71 | try |
139 | { | 72 | { |
140 | while (true) | 73 | // Compile (We assume LSL) |
141 | { | 74 | ScriptSource = LSLCompiler.CompileFromLSLText(Script); |
142 | if (LUQueue.Count == 0) | ||
143 | Thread.Sleep(scriptLoadUnloadThread_IdleSleepms); | ||
144 | if (LUQueue.Count > 0) | ||
145 | { | ||
146 | LUStruct item = LUQueue.Dequeue(); | ||
147 | if (item.Action == LUType.Unload) | ||
148 | _StopScript(item.localID, item.itemID); | ||
149 | if (item.Action == LUType.Load) | ||
150 | _StartScript(item.localID, item.itemID, item.script); | ||
151 | } | ||
152 | } | ||
153 | } | ||
154 | catch (ThreadAbortException tae) | ||
155 | { | ||
156 | string a = tae.ToString(); | ||
157 | a = ""; | ||
158 | // Expected | ||
159 | } | ||
160 | } | ||
161 | |||
162 | #endregion | ||
163 | |||
164 | #region Helper functions | ||
165 | |||
166 | private static Assembly CurrentDomain_AssemblyResolve(object sender, ResolveEventArgs args) | ||
167 | { | ||
168 | //Console.WriteLine("ScriptManager.CurrentDomain_AssemblyResolve: " + args.Name); | ||
169 | return Assembly.GetExecutingAssembly().FullName == args.Name ? Assembly.GetExecutingAssembly() : null; | ||
170 | } | ||
171 | |||
172 | #endregion | ||
173 | |||
174 | #region Internal functions to keep track of script | ||
175 | |||
176 | internal Dictionary<LLUUID, LSL_BaseClass>.KeyCollection GetScriptKeys(uint localID) | ||
177 | { | ||
178 | if (Scripts.ContainsKey(localID) == false) | ||
179 | return null; | ||
180 | |||
181 | Dictionary<LLUUID, LSL_BaseClass> Obj; | ||
182 | Scripts.TryGetValue(localID, out Obj); | ||
183 | |||
184 | return Obj.Keys; | ||
185 | } | ||
186 | |||
187 | internal LSL_BaseClass GetScript(uint localID, LLUUID itemID) | ||
188 | { | ||
189 | if (Scripts.ContainsKey(localID) == false) | ||
190 | return null; | ||
191 | |||
192 | Dictionary<LLUUID, LSL_BaseClass> Obj; | ||
193 | Scripts.TryGetValue(localID, out Obj); | ||
194 | if (Obj.ContainsKey(itemID) == false) | ||
195 | return null; | ||
196 | |||
197 | // Get script | ||
198 | LSL_BaseClass Script; | ||
199 | Obj.TryGetValue(itemID, out Script); | ||
200 | |||
201 | return Script; | ||
202 | } | ||
203 | |||
204 | internal void SetScript(uint localID, LLUUID itemID, LSL_BaseClass Script) | ||
205 | { | ||
206 | // Create object if it doesn't exist | ||
207 | if (Scripts.ContainsKey(localID) == false) | ||
208 | { | ||
209 | Scripts.Add(localID, new Dictionary<LLUUID, LSL_BaseClass>()); | ||
210 | } | ||
211 | |||
212 | // Delete script if it exists | ||
213 | Dictionary<LLUUID, LSL_BaseClass> Obj; | ||
214 | Scripts.TryGetValue(localID, out Obj); | ||
215 | if (Obj.ContainsKey(itemID) == true) | ||
216 | Obj.Remove(itemID); | ||
217 | |||
218 | // Add to object | ||
219 | Obj.Add(itemID, Script); | ||
220 | } | ||
221 | |||
222 | internal void RemoveScript(uint localID, LLUUID itemID) | ||
223 | { | ||
224 | // Don't have that object? | ||
225 | if (Scripts.ContainsKey(localID) == false) | ||
226 | return; | ||
227 | |||
228 | // Delete script if it exists | ||
229 | Dictionary<LLUUID, LSL_BaseClass> Obj; | ||
230 | Scripts.TryGetValue(localID, out Obj); | ||
231 | if (Obj.ContainsKey(itemID) == true) | ||
232 | Obj.Remove(itemID); | ||
233 | } | ||
234 | |||
235 | #endregion | ||
236 | |||
237 | #region Start/Stop/Reset script | ||
238 | |||
239 | private Object startStopLock = new Object(); | ||
240 | |||
241 | /// <summary> | ||
242 | /// Fetches, loads and hooks up a script to an objects events | ||
243 | /// </summary> | ||
244 | /// <param name="itemID"></param> | ||
245 | /// <param name="localID"></param> | ||
246 | public void StartScript(uint localID, LLUUID itemID, string Script) | ||
247 | { | ||
248 | LUStruct ls = new LUStruct(); | ||
249 | ls.localID = localID; | ||
250 | ls.itemID = itemID; | ||
251 | ls.script = Script; | ||
252 | ls.Action = LUType.Load; | ||
253 | LUQueue.Enqueue(ls); | ||
254 | } | ||
255 | |||
256 | /// <summary> | ||
257 | /// Disables and unloads a script | ||
258 | /// </summary> | ||
259 | /// <param name="localID"></param> | ||
260 | /// <param name="itemID"></param> | ||
261 | public void StopScript(uint localID, LLUUID itemID) | ||
262 | { | ||
263 | LUStruct ls = new LUStruct(); | ||
264 | ls.localID = localID; | ||
265 | ls.itemID = itemID; | ||
266 | ls.Action = LUType.Unload; | ||
267 | LUQueue.Enqueue(ls); | ||
268 | } | ||
269 | |||
270 | public void ResetScript(uint localID, LLUUID itemID) | ||
271 | { | ||
272 | string script = GetScript(localID, itemID).SourceCode; | ||
273 | StopScript(localID, itemID); | ||
274 | StartScript(localID, itemID, script); | ||
275 | } | ||
276 | |||
277 | // Create a new instance of the compiler (reuse) | ||
278 | private Compiler.LSL.Compiler LSLCompiler = new Compiler.LSL.Compiler(); | ||
279 | |||
280 | private void _StartScript(uint localID, LLUUID itemID, string Script) | ||
281 | { | ||
282 | lock (startStopLock) | ||
283 | { | ||
284 | //IScriptHost root = host.GetRoot(); | ||
285 | Console.WriteLine("ScriptManager StartScript: localID: " + localID + ", itemID: " + itemID); | ||
286 | |||
287 | // We will initialize and start the script. | ||
288 | // It will be up to the script itself to hook up the correct events. | ||
289 | string ScriptSource = ""; | ||
290 | |||
291 | SceneObjectPart m_host = World.GetSceneObjectPart(localID); | ||
292 | |||
293 | try | ||
294 | { | ||
295 | if (!Script.EndsWith("dll")) | ||
296 | { | ||
297 | // Compile (We assume LSL) | ||
298 | ScriptSource = LSLCompiler.CompileFromLSLText(Script); | ||
299 | //Console.WriteLine("Compilation of " + FileName + " done"); | ||
300 | // * Insert yield into code | ||
301 | ScriptSource = ProcessYield(ScriptSource); | ||
302 | } | ||
303 | else | ||
304 | { | ||
305 | ScriptSource = Script; | ||
306 | } | ||
307 | 75 | ||
308 | #if DEBUG | 76 | #if DEBUG |
309 | long before; | 77 | long before; |
310 | before = GC.GetTotalMemory(true); | 78 | before = GC.GetTotalMemory(true); |
311 | #endif | 79 | #endif |
312 | 80 | ||
313 | LSL_BaseClass CompiledScript; | 81 | IScript CompiledScript; |
314 | CompiledScript = m_scriptEngine.m_AppDomainManager.LoadScript(ScriptSource); | 82 | CompiledScript = m_scriptEngine.m_AppDomainManager.LoadScript(ScriptSource); |
315 | 83 | ||
316 | #if DEBUG | 84 | #if DEBUG |
317 | Console.WriteLine("Script " + itemID + " occupies {0} bytes", GC.GetTotalMemory(true) - before); | 85 | Console.WriteLine("Script " + itemID + " occupies {0} bytes", GC.GetTotalMemory(true) - before); |
318 | #endif | 86 | #endif |
319 | 87 | ||
320 | CompiledScript.SourceCode = ScriptSource; | 88 | CompiledScript.Source = ScriptSource; |
321 | // Add it to our script memstruct | 89 | // Add it to our script memstruct |
322 | SetScript(localID, itemID, CompiledScript); | 90 | SetScript(localID, itemID, CompiledScript); |
323 | 91 | ||
324 | // We need to give (untrusted) assembly a private instance of BuiltIns | 92 | // We need to give (untrusted) assembly a private instance of BuiltIns |
325 | // this private copy will contain Read-Only FullitemID so that it can bring that on to the server whenever needed. | 93 | // this private copy will contain Read-Only FullitemID so that it can bring that on to the server whenever needed. |
326 | 94 | ||
327 | 95 | ||
328 | LSL_BuiltIn_Commands LSLB = new LSL_BuiltIn_Commands(m_scriptEngine, m_host, localID, itemID); | 96 | LSL_BuiltIn_Commands LSLB = new LSL_BuiltIn_Commands(m_scriptEngine, m_host, localID, itemID); |
329 | 97 | ||
330 | // Start the script - giving it BuiltIns | 98 | // Start the script - giving it BuiltIns |
331 | CompiledScript.Start(LSLB); | 99 | CompiledScript.Start(LSLB); |
332 | 100 | ||
333 | // Fire the first start-event | 101 | // Fire the first start-event |
334 | m_scriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "state_entry", new object[] {}); | 102 | m_scriptEngine.m_EventQueueManager.AddToScriptQueue(localID, itemID, "state_entry", new object[] { }); |
335 | } | ||
336 | catch (Exception e) | ||
337 | { | ||
338 | //m_scriptEngine.Log.Error("ScriptEngine", "Error compiling script: " + e.ToString()); | ||
339 | try | ||
340 | { | ||
341 | // DISPLAY ERROR INWORLD | ||
342 | string text = "Error compiling script:\r\n" + e.Message.ToString(); | ||
343 | if (text.Length > 1500) | ||
344 | text = text.Substring(0, 1500); | ||
345 | World.SimChat(Helpers.StringToField(text), ChatTypeEnum.Say, 0, m_host.AbsolutePosition, | ||
346 | m_host.Name, m_host.UUID); | ||
347 | } | ||
348 | catch (Exception e2) | ||
349 | { | ||
350 | m_scriptEngine.Log.Error("ScriptEngine", "Error displaying error in-world: " + e2.ToString()); | ||
351 | m_scriptEngine.Log.Error("ScriptEngine", | ||
352 | "Errormessage: Error compiling script:\r\n" + e.Message.ToString()); | ||
353 | } | ||
354 | } | ||
355 | } | 103 | } |
356 | } | 104 | catch (Exception e) |
357 | |||
358 | private void _StopScript(uint localID, LLUUID itemID) | ||
359 | { | ||
360 | lock (startStopLock) | ||
361 | { | 105 | { |
362 | // Stop script | 106 | //m_scriptEngine.Log.Error("ScriptEngine", "Error compiling script: " + e.ToString()); |
363 | Console.WriteLine("Stop script localID: " + localID + " LLUID: " + itemID.ToString()); | ||
364 | |||
365 | |||
366 | // Stop long command on script | ||
367 | m_scriptEngine.m_LSLLongCmdHandler.RemoveScript(localID, itemID); | ||
368 | |||
369 | LSL_BaseClass LSLBC = GetScript(localID, itemID); | ||
370 | if (LSLBC == null) | ||
371 | return; | ||
372 | |||
373 | // TEMP: First serialize it | ||
374 | //GetSerializedScript(localID, itemID); | ||
375 | |||
376 | |||
377 | try | 107 | try |
378 | { | 108 | { |
379 | // Get AppDomain | 109 | // DISPLAY ERROR INWORLD |
380 | AppDomain ad = LSLBC.Exec.GetAppDomain(); | 110 | string text = "Error compiling script:\r\n" + e.Message.ToString(); |
381 | // Tell script not to accept new requests | 111 | if (text.Length > 1500) |
382 | GetScript(localID, itemID).Exec.StopScript(); | 112 | text = text.Substring(0, 1500); |
383 | // Remove from internal structure | 113 | World.SimChat(Helpers.StringToField(text), ChatTypeEnum.Say, 0, m_host.AbsolutePosition, |
384 | RemoveScript(localID, itemID); | 114 | m_host.Name, m_host.UUID); |
385 | // Tell AppDomain that we have stopped script | ||
386 | m_scriptEngine.m_AppDomainManager.StopScript(ad); | ||
387 | } | 115 | } |
388 | catch (Exception e) | 116 | catch (Exception e2) |
389 | { | 117 | { |
390 | Console.WriteLine("Exception stopping script localID: " + localID + " LLUID: " + itemID.ToString() + | 118 | m_scriptEngine.Log.Error("ScriptEngine", "Error displaying error in-world: " + e2.ToString()); |
391 | ": " + e.ToString()); | 119 | m_scriptEngine.Log.Error("ScriptEngine", |
120 | "Errormessage: Error compiling script:\r\n" + e.Message.ToString()); | ||
392 | } | 121 | } |
393 | } | 122 | } |
394 | } | 123 | } |
395 | 124 | ||
396 | private string ProcessYield(string FileName) | 125 | public override void _StopScript(uint localID, LLUUID itemID) |
397 | { | 126 | { |
398 | // TODO: Create a new assembly and copy old but insert Yield Code | 127 | // Stop script |
399 | //return TempDotNetMicroThreadingCodeInjector.TestFix(FileName); | 128 | Console.WriteLine("Stop script localID: " + localID + " LLUID: " + itemID.ToString()); |
400 | return FileName; | ||
401 | } | ||
402 | 129 | ||
403 | #endregion | ||
404 | 130 | ||
405 | #region Perform event execution in script | 131 | // Stop long command on script |
132 | m_scriptEngine.m_LSLLongCmdHandler.RemoveScript(localID, itemID); | ||
406 | 133 | ||
407 | /// <summary> | 134 | IScript LSLBC = GetScript(localID, itemID); |
408 | /// Execute a LL-event-function in Script | 135 | if (LSLBC == null) |
409 | /// </summary> | ||
410 | /// <param name="localID">Object the script is located in</param> | ||
411 | /// <param name="itemID">Script ID</param> | ||
412 | /// <param name="FunctionName">Name of function</param> | ||
413 | /// <param name="args">Arguments to pass to function</param> | ||
414 | internal void ExecuteEvent(uint localID, LLUUID itemID, string FunctionName, object[] args) | ||
415 | { | ||
416 | #if DEBUG | ||
417 | Console.WriteLine("ScriptEngine: Inside ExecuteEvent for event " + FunctionName); | ||
418 | #endif | ||
419 | // Execute a function in the script | ||
420 | //m_scriptEngine.Log.Verbose("ScriptEngine", "Executing Function localID: " + localID + ", itemID: " + itemID + ", FunctionName: " + FunctionName); | ||
421 | LSL_BaseClass Script = m_scriptEngine.m_ScriptManager.GetScript(localID, itemID); | ||
422 | if (Script == null) | ||
423 | return; | 136 | return; |
424 | 137 | ||
425 | #if DEBUG | 138 | // TEMP: First serialize it |
426 | Console.WriteLine("ScriptEngine: Executing event: " + FunctionName); | 139 | //GetSerializedScript(localID, itemID); |
427 | #endif | ||
428 | // Must be done in correct AppDomain, so leaving it up to the script itself | ||
429 | Script.Exec.ExecuteEvent(FunctionName, args); | ||
430 | } | ||
431 | 140 | ||
432 | #endregion | ||
433 | 141 | ||
434 | #region Script serialization/deserialization | 142 | try |
435 | 143 | { | |
436 | public void GetSerializedScript(uint localID, LLUUID itemID) | 144 | // Get AppDomain |
437 | { | 145 | AppDomain ad = LSLBC.Exec.GetAppDomain(); |
438 | // Serialize the script and return it | 146 | // Tell script not to accept new requests |
439 | // Should not be a problem | 147 | GetScript(localID, itemID).Exec.StopScript(); |
440 | FileStream fs = File.Create("SERIALIZED_SCRIPT_" + itemID); | 148 | // Remove from internal structure |
441 | BinaryFormatter b = new BinaryFormatter(); | 149 | RemoveScript(localID, itemID); |
442 | b.Serialize(fs, GetScript(localID, itemID)); | 150 | // Tell AppDomain that we have stopped script |
443 | fs.Close(); | 151 | m_scriptEngine.m_AppDomainManager.StopScript(ad); |
444 | } | 152 | } |
445 | 153 | catch (Exception e) | |
446 | public void PutSerializedScript(uint localID, LLUUID itemID) | 154 | { |
447 | { | 155 | Console.WriteLine("Exception stopping script localID: " + localID + " LLUID: " + itemID.ToString() + |
448 | // Deserialize the script and inject it into an AppDomain | 156 | ": " + e.ToString()); |
449 | 157 | } | |
450 | // How to inject into an AppDomain? | ||
451 | } | 158 | } |
452 | 159 | ||
453 | #endregion | ||
454 | } | 160 | } |
455 | } \ No newline at end of file | 161 | } \ No newline at end of file |
diff --git a/OpenSim/Region/ScriptEngine/DotNetEngine/TempDotNetMicroThreadingCodeInjector.cs b/OpenSim/Region/ScriptEngine/DotNetEngine/TempDotNetMicroThreadingCodeInjector.cs deleted file mode 100644 index 072c249..0000000 --- a/OpenSim/Region/ScriptEngine/DotNetEngine/TempDotNetMicroThreadingCodeInjector.cs +++ /dev/null | |||
@@ -1,69 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSim Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS AS IS AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | * | ||
27 | */ | ||
28 | |||
29 | using System; | ||
30 | using System.IO; | ||
31 | using Rail.Reflect; | ||
32 | using Rail.Transformation; | ||
33 | |||
34 | namespace OpenSim.Region.ScriptEngine.DotNetEngine | ||
35 | { | ||
36 | /// <summary> | ||
37 | /// Tedds Sandbox for RAIL/microtrheading. This class is only for testing purposes! | ||
38 | /// Its offspring will be the actual implementation. | ||
39 | /// </summary> | ||
40 | internal class TempDotNetMicroThreadingCodeInjector | ||
41 | { | ||
42 | public static string TestFix(string FileName) | ||
43 | { | ||
44 | string ret = Path.GetFileNameWithoutExtension(FileName + "_fixed.dll"); | ||
45 | |||
46 | Console.WriteLine("Loading: \"" + FileName + "\""); | ||
47 | RAssemblyDef rAssembly = RAssemblyDef.LoadAssembly(FileName); | ||
48 | |||
49 | |||
50 | //Get the type of the method to copy from assembly Teste2.exe to assembly Teste.exe | ||
51 | RTypeDef type = (RTypeDef) rAssembly.RModuleDef.GetType("SecondLife.Script"); | ||
52 | |||
53 | //Get the methods in the type | ||
54 | RMethod[] m = type.GetMethods(); | ||
55 | |||
56 | //Create a MethodPrologueAdder visitor object with the method to add | ||
57 | //and with the flag that enables local variable creation set to true | ||
58 | MethodPrologueAdder mpa = new MethodPrologueAdder((RMethodDef) m[0], true); | ||
59 | |||
60 | //Apply the changes to the assembly | ||
61 | rAssembly.Accept(mpa); | ||
62 | |||
63 | //Save the new assembly | ||
64 | rAssembly.SaveAssembly(ret); | ||
65 | |||
66 | return ret; | ||
67 | } | ||
68 | } | ||
69 | } \ No newline at end of file | ||