aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/ScriptEngine/Shared/Api
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/CM_Api.cs477
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs974
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs36
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/Timer.cs32
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Interface/ICM_Api.cs21
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs2
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Runtime/CM_Constants.cs77
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Runtime/CM_Stub.cs76
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Runtime/Executor.cs2
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OpenSim.Region.ScriptEngine.Shared.Api.Runtime.mdp2
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Runtime/ScriptBase.cs2
11 files changed, 1357 insertions, 344 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/CM_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/CM_Api.cs
new file mode 100644
index 0000000..99973b4
--- /dev/null
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/CM_Api.cs
@@ -0,0 +1,477 @@
1using System;
2using System.Reflection;
3using System.Collections;
4using System.Collections.Generic;
5using System.Runtime.Remoting.Lifetime;
6using OpenMetaverse;
7using Nini.Config;
8using OpenSim;
9using OpenSim.Framework;
10using OpenSim.Region.CoreModules.World.Meta7Windlight;
11using OpenSim.Region.Framework.Interfaces;
12using OpenSim.Region.Framework.Scenes;
13using OpenSim.Region.ScriptEngine.Shared;
14using OpenSim.Region.ScriptEngine.Shared.Api.Plugins;
15using OpenSim.Region.ScriptEngine.Shared.ScriptBase;
16using OpenSim.Region.ScriptEngine.Interfaces;
17using OpenSim.Region.ScriptEngine.Shared.Api.Interfaces;
18
19using LSL_Float = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLFloat;
20using LSL_Integer = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLInteger;
21using LSL_Key = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLString;
22using LSL_List = OpenSim.Region.ScriptEngine.Shared.LSL_Types.list;
23using LSL_Rotation = OpenSim.Region.ScriptEngine.Shared.LSL_Types.Quaternion;
24using LSL_String = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLString;
25using LSL_Vector = OpenSim.Region.ScriptEngine.Shared.LSL_Types.Vector3;
26
27namespace OpenSim.Region.ScriptEngine.Shared.Api
28{
29 [Serializable]
30 public class CM_Api : MarshalByRefObject, ICM_Api, IScriptApi
31 {
32 internal IScriptEngine m_ScriptEngine;
33 internal SceneObjectPart m_host;
34 internal uint m_localID;
35 internal UUID m_itemID;
36 internal bool m_CMFunctionsEnabled = false;
37 internal IScriptModuleComms m_comms = null;
38
39 public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, uint localID, UUID itemID)
40 {
41 m_ScriptEngine = ScriptEngine;
42 m_host = host;
43 m_localID = localID;
44 m_itemID = itemID;
45
46 if (m_ScriptEngine.Config.GetBoolean("AllowCareminsterFunctions", false))
47 m_CMFunctionsEnabled = true;
48
49 m_comms = m_ScriptEngine.World.RequestModuleInterface<IScriptModuleComms>();
50 if (m_comms == null)
51 m_CMFunctionsEnabled = false;
52 }
53
54 public override Object InitializeLifetimeService()
55 {
56 ILease lease = (ILease)base.InitializeLifetimeService();
57
58 if (lease.CurrentState == LeaseState.Initial)
59 {
60 lease.InitialLeaseTime = TimeSpan.FromMinutes(0);
61 // lease.RenewOnCallTime = TimeSpan.FromSeconds(10.0);
62 // lease.SponsorshipTimeout = TimeSpan.FromMinutes(1.0);
63 }
64 return lease;
65 }
66
67 public Scene World
68 {
69 get { return m_ScriptEngine.World; }
70 }
71
72 //
73 //Dumps an error message on the debug console.
74 //
75
76 internal void CMShoutError(string message)
77 {
78 if (message.Length > 1023)
79 message = message.Substring(0, 1023);
80
81 World.SimChat(Utils.StringToBytes(message),
82 ChatTypeEnum.Shout, ScriptBaseClass.DEBUG_CHANNEL, m_host.ParentGroup.RootPart.AbsolutePosition, m_host.Name, m_host.UUID, true);
83
84 IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>();
85 wComm.DeliverMessage(ChatTypeEnum.Shout, ScriptBaseClass.DEBUG_CHANNEL, m_host.Name, m_host.UUID, message);
86 }
87
88 /// <summary>
89 /// Get the current Windlight scene
90 /// </summary>
91 /// <returns>List of windlight parameters</returns>
92 public LSL_List cmGetWindlightScene(LSL_List rules)
93 {
94 if (!m_CMFunctionsEnabled)
95 {
96 CMShoutError("Careminster functions are not enabled.");
97 return new LSL_List();
98 }
99 m_host.AddScriptLPS(1);
100 RegionMeta7WindlightData wl = m_host.ParentGroup.Scene.RegionInfo.WindlightSettings;
101
102 LSL_List values = new LSL_List();
103 int idx = 0;
104 while (idx < rules.Length)
105 {
106 uint rule = (uint)rules.GetLSLIntegerItem(idx);
107 LSL_List toadd = new LSL_List();
108
109 switch (rule)
110 {
111 case (int)ScriptBaseClass.WL_AMBIENT:
112 toadd.Add(new LSL_Rotation(wl.ambient.X, wl.ambient.Y, wl.ambient.Z, wl.ambient.W));
113 break;
114 case (int)ScriptBaseClass.WL_BIG_WAVE_DIRECTION:
115 toadd.Add(new LSL_Vector(wl.bigWaveDirection.X, wl.bigWaveDirection.Y, 0.0f));
116 break;
117 case (int)ScriptBaseClass.WL_BLUE_DENSITY:
118 toadd.Add(new LSL_Rotation(wl.blueDensity.X, wl.blueDensity.Y, wl.blueDensity.Z, wl.blueDensity.W));
119 break;
120 case (int)ScriptBaseClass.WL_BLUR_MULTIPLIER:
121 toadd.Add(new LSL_Float(wl.blurMultiplier));
122 break;
123 case (int)ScriptBaseClass.WL_CLOUD_COLOR:
124 toadd.Add(new LSL_Rotation(wl.cloudColor.X, wl.cloudColor.Y, wl.cloudColor.Z, wl.cloudColor.W));
125 break;
126 case (int)ScriptBaseClass.WL_CLOUD_COVERAGE:
127 toadd.Add(new LSL_Float(wl.cloudCoverage));
128 break;
129 case (int)ScriptBaseClass.WL_CLOUD_DETAIL_XY_DENSITY:
130 toadd.Add(new LSL_Vector(wl.cloudDetailXYDensity.X, wl.cloudDetailXYDensity.Y, wl.cloudDetailXYDensity.Z));
131 break;
132 case (int)ScriptBaseClass.WL_CLOUD_SCALE:
133 toadd.Add(new LSL_Float(wl.cloudScale));
134 break;
135 case (int)ScriptBaseClass.WL_CLOUD_SCROLL_X:
136 toadd.Add(new LSL_Float(wl.cloudScrollX));
137 break;
138 case (int)ScriptBaseClass.WL_CLOUD_SCROLL_X_LOCK:
139 toadd.Add(new LSL_Integer(wl.cloudScrollXLock ? 1 : 0));
140 break;
141 case (int)ScriptBaseClass.WL_CLOUD_SCROLL_Y:
142 toadd.Add(new LSL_Float(wl.cloudScrollY));
143 break;
144 case (int)ScriptBaseClass.WL_CLOUD_SCROLL_Y_LOCK:
145 toadd.Add(new LSL_Integer(wl.cloudScrollYLock ? 1 : 0));
146 break;
147 case (int)ScriptBaseClass.WL_CLOUD_XY_DENSITY:
148 toadd.Add(new LSL_Vector(wl.cloudXYDensity.X, wl.cloudXYDensity.Y, wl.cloudXYDensity.Z));
149 break;
150 case (int)ScriptBaseClass.WL_DENSITY_MULTIPLIER:
151 toadd.Add(new LSL_Float(wl.densityMultiplier));
152 break;
153 case (int)ScriptBaseClass.WL_DISTANCE_MULTIPLIER:
154 toadd.Add(new LSL_Float(wl.distanceMultiplier));
155 break;
156 case (int)ScriptBaseClass.WL_DRAW_CLASSIC_CLOUDS:
157 toadd.Add(new LSL_Integer(wl.drawClassicClouds ? 1 : 0));
158 break;
159 case (int)ScriptBaseClass.WL_EAST_ANGLE:
160 toadd.Add(new LSL_Float(wl.eastAngle));
161 break;
162 case (int)ScriptBaseClass.WL_FRESNEL_OFFSET:
163 toadd.Add(new LSL_Float(wl.fresnelOffset));
164 break;
165 case (int)ScriptBaseClass.WL_FRESNEL_SCALE:
166 toadd.Add(new LSL_Float(wl.fresnelScale));
167 break;
168 case (int)ScriptBaseClass.WL_HAZE_DENSITY:
169 toadd.Add(new LSL_Float(wl.hazeDensity));
170 break;
171 case (int)ScriptBaseClass.WL_HAZE_HORIZON:
172 toadd.Add(new LSL_Float(wl.hazeHorizon));
173 break;
174 case (int)ScriptBaseClass.WL_HORIZON:
175 toadd.Add(new LSL_Rotation(wl.horizon.X, wl.horizon.Y, wl.horizon.Z, wl.horizon.W));
176 break;
177 case (int)ScriptBaseClass.WL_LITTLE_WAVE_DIRECTION:
178 toadd.Add(new LSL_Vector(wl.littleWaveDirection.X, wl.littleWaveDirection.Y, 0.0f));
179 break;
180 case (int)ScriptBaseClass.WL_MAX_ALTITUDE:
181 toadd.Add(new LSL_Integer(wl.maxAltitude));
182 break;
183 case (int)ScriptBaseClass.WL_NORMAL_MAP_TEXTURE:
184 toadd.Add(new LSL_Key(wl.normalMapTexture.ToString()));
185 break;
186 case (int)ScriptBaseClass.WL_REFLECTION_WAVELET_SCALE:
187 toadd.Add(new LSL_Vector(wl.reflectionWaveletScale.X, wl.reflectionWaveletScale.Y, wl.reflectionWaveletScale.Z));
188 break;
189 case (int)ScriptBaseClass.WL_REFRACT_SCALE_ABOVE:
190 toadd.Add(new LSL_Float(wl.refractScaleAbove));
191 break;
192 case (int)ScriptBaseClass.WL_REFRACT_SCALE_BELOW:
193 toadd.Add(new LSL_Float(wl.refractScaleBelow));
194 break;
195 case (int)ScriptBaseClass.WL_SCENE_GAMMA:
196 toadd.Add(new LSL_Float(wl.sceneGamma));
197 break;
198 case (int)ScriptBaseClass.WL_STAR_BRIGHTNESS:
199 toadd.Add(new LSL_Float(wl.starBrightness));
200 break;
201 case (int)ScriptBaseClass.WL_SUN_GLOW_FOCUS:
202 toadd.Add(new LSL_Float(wl.sunGlowFocus));
203 break;
204 case (int)ScriptBaseClass.WL_SUN_GLOW_SIZE:
205 toadd.Add(new LSL_Float(wl.sunGlowSize));
206 break;
207 case (int)ScriptBaseClass.WL_SUN_MOON_COLOR:
208 toadd.Add(new LSL_Rotation(wl.sunMoonColor.X, wl.sunMoonColor.Y, wl.sunMoonColor.Z, wl.sunMoonColor.W));
209 break;
210 case (int)ScriptBaseClass.WL_UNDERWATER_FOG_MODIFIER:
211 toadd.Add(new LSL_Float(wl.underwaterFogModifier));
212 break;
213 case (int)ScriptBaseClass.WL_WATER_COLOR:
214 toadd.Add(new LSL_Vector(wl.waterColor.X, wl.waterColor.Y, wl.waterColor.Z));
215 break;
216 case (int)ScriptBaseClass.WL_WATER_FOG_DENSITY_EXPONENT:
217 toadd.Add(new LSL_Float(wl.waterFogDensityExponent));
218 break;
219 }
220
221 if (toadd.Length > 0)
222 {
223 values.Add(rule);
224 values.Add(toadd.Data[0]);
225 }
226 idx++;
227 }
228
229
230 return values;
231
232 }
233
234 private RegionMeta7WindlightData getWindlightProfileFromRules(LSL_List rules)
235 {
236 RegionMeta7WindlightData wl = (RegionMeta7WindlightData)m_host.ParentGroup.Scene.RegionInfo.WindlightSettings.Clone();
237
238 LSL_List values = new LSL_List();
239 int idx = 0;
240 while (idx < rules.Length)
241 {
242 uint rule = (uint)rules.GetLSLIntegerItem(idx);
243 LSL_Types.Quaternion iQ;
244 LSL_Types.Vector3 iV;
245 switch (rule)
246 {
247 case (int)ScriptBaseClass.WL_SUN_MOON_POSITION:
248 idx++;
249 wl.sunMoonPosition = (float)rules.GetLSLFloatItem(idx);
250 break;
251 case (int)ScriptBaseClass.WL_AMBIENT:
252 idx++;
253 iQ = rules.GetQuaternionItem(idx);
254 wl.ambient = new Vector4((float)iQ.x, (float)iQ.y, (float)iQ.z, (float)iQ.s);
255 break;
256 case (int)ScriptBaseClass.WL_BIG_WAVE_DIRECTION:
257 idx++;
258 iV = rules.GetVector3Item(idx);
259 wl.bigWaveDirection = new Vector2((float)iV.x, (float)iV.y);
260 break;
261 case (int)ScriptBaseClass.WL_BLUE_DENSITY:
262 idx++;
263 iQ = rules.GetQuaternionItem(idx);
264 wl.blueDensity = new Vector4((float)iQ.x, (float)iQ.y, (float)iQ.z, (float)iQ.s);
265 break;
266 case (int)ScriptBaseClass.WL_BLUR_MULTIPLIER:
267 idx++;
268 wl.blurMultiplier = (float)rules.GetLSLFloatItem(idx);
269 break;
270 case (int)ScriptBaseClass.WL_CLOUD_COLOR:
271 idx++;
272 iQ = rules.GetQuaternionItem(idx);
273 wl.cloudColor = new Vector4((float)iQ.x, (float)iQ.y, (float)iQ.z, (float)iQ.s);
274 break;
275 case (int)ScriptBaseClass.WL_CLOUD_COVERAGE:
276 idx++;
277 wl.cloudCoverage = (float)rules.GetLSLFloatItem(idx);
278 break;
279 case (int)ScriptBaseClass.WL_CLOUD_DETAIL_XY_DENSITY:
280 idx++;
281 iV = rules.GetVector3Item(idx);
282 wl.cloudDetailXYDensity = new Vector3((float)iV.x, (float)iV.y, (float)iV.z);
283 break;
284 case (int)ScriptBaseClass.WL_CLOUD_SCALE:
285 idx++;
286 wl.cloudScale = (float)rules.GetLSLFloatItem(idx);
287 break;
288 case (int)ScriptBaseClass.WL_CLOUD_SCROLL_X:
289 idx++;
290 wl.cloudScrollX = (float)rules.GetLSLFloatItem(idx);
291 break;
292 case (int)ScriptBaseClass.WL_CLOUD_SCROLL_X_LOCK:
293 idx++;
294 wl.cloudScrollXLock = rules.GetLSLIntegerItem(idx).value == 1 ? true : false;
295 break;
296 case (int)ScriptBaseClass.WL_CLOUD_SCROLL_Y:
297 idx++;
298 wl.cloudScrollY = (float)rules.GetLSLFloatItem(idx);
299 break;
300 case (int)ScriptBaseClass.WL_CLOUD_SCROLL_Y_LOCK:
301 idx++;
302 wl.cloudScrollYLock = rules.GetLSLIntegerItem(idx).value == 1 ? true : false;
303 break;
304 case (int)ScriptBaseClass.WL_CLOUD_XY_DENSITY:
305 idx++;
306 iV = rules.GetVector3Item(idx);
307 wl.cloudXYDensity = new Vector3((float)iV.x, (float)iV.y, (float)iV.z);
308 break;
309 case (int)ScriptBaseClass.WL_DENSITY_MULTIPLIER:
310 idx++;
311 wl.densityMultiplier = (float)rules.GetLSLFloatItem(idx);
312 break;
313 case (int)ScriptBaseClass.WL_DISTANCE_MULTIPLIER:
314 idx++;
315 wl.distanceMultiplier = (float)rules.GetLSLFloatItem(idx);
316 break;
317 case (int)ScriptBaseClass.WL_DRAW_CLASSIC_CLOUDS:
318 idx++;
319 wl.drawClassicClouds = rules.GetLSLIntegerItem(idx).value == 1 ? true : false;
320 break;
321 case (int)ScriptBaseClass.WL_EAST_ANGLE:
322 idx++;
323 wl.eastAngle = (float)rules.GetLSLFloatItem(idx);
324 break;
325 case (int)ScriptBaseClass.WL_FRESNEL_OFFSET:
326 idx++;
327 wl.fresnelOffset = (float)rules.GetLSLFloatItem(idx);
328 break;
329 case (int)ScriptBaseClass.WL_FRESNEL_SCALE:
330 idx++;
331 wl.fresnelScale = (float)rules.GetLSLFloatItem(idx);
332 break;
333 case (int)ScriptBaseClass.WL_HAZE_DENSITY:
334 idx++;
335 wl.hazeDensity = (float)rules.GetLSLFloatItem(idx);
336 break;
337 case (int)ScriptBaseClass.WL_HAZE_HORIZON:
338 idx++;
339 wl.hazeHorizon = (float)rules.GetLSLFloatItem(idx);
340 break;
341 case (int)ScriptBaseClass.WL_HORIZON:
342 idx++;
343 iQ = rules.GetQuaternionItem(idx);
344 wl.horizon = new Vector4((float)iQ.x, (float)iQ.y, (float)iQ.z, (float)iQ.s);
345 break;
346 case (int)ScriptBaseClass.WL_LITTLE_WAVE_DIRECTION:
347 idx++;
348 iV = rules.GetVector3Item(idx);
349 wl.littleWaveDirection = new Vector2((float)iV.x, (float)iV.y);
350 break;
351 case (int)ScriptBaseClass.WL_MAX_ALTITUDE:
352 idx++;
353 wl.maxAltitude = (ushort)rules.GetLSLIntegerItem(idx).value;
354 break;
355 case (int)ScriptBaseClass.WL_NORMAL_MAP_TEXTURE:
356 idx++;
357 wl.normalMapTexture = new UUID(rules.GetLSLStringItem(idx).m_string);
358 break;
359 case (int)ScriptBaseClass.WL_REFLECTION_WAVELET_SCALE:
360 idx++;
361 iV = rules.GetVector3Item(idx);
362 wl.reflectionWaveletScale = new Vector3((float)iV.x, (float)iV.y, (float)iV.z);
363 break;
364 case (int)ScriptBaseClass.WL_REFRACT_SCALE_ABOVE:
365 idx++;
366 wl.refractScaleAbove = (float)rules.GetLSLFloatItem(idx);
367 break;
368 case (int)ScriptBaseClass.WL_REFRACT_SCALE_BELOW:
369 idx++;
370 wl.refractScaleBelow = (float)rules.GetLSLFloatItem(idx);
371 break;
372 case (int)ScriptBaseClass.WL_SCENE_GAMMA:
373 idx++;
374 wl.sceneGamma = (float)rules.GetLSLFloatItem(idx);
375 break;
376 case (int)ScriptBaseClass.WL_STAR_BRIGHTNESS:
377 idx++;
378 wl.starBrightness = (float)rules.GetLSLFloatItem(idx);
379 break;
380 case (int)ScriptBaseClass.WL_SUN_GLOW_FOCUS:
381 idx++;
382 wl.sunGlowFocus = (float)rules.GetLSLFloatItem(idx);
383 break;
384 case (int)ScriptBaseClass.WL_SUN_GLOW_SIZE:
385 idx++;
386 wl.sunGlowSize = (float)rules.GetLSLFloatItem(idx);
387 break;
388 case (int)ScriptBaseClass.WL_SUN_MOON_COLOR:
389 idx++;
390 iQ = rules.GetQuaternionItem(idx);
391 wl.sunMoonColor = new Vector4((float)iQ.x, (float)iQ.y, (float)iQ.z, (float)iQ.s);
392 break;
393 case (int)ScriptBaseClass.WL_UNDERWATER_FOG_MODIFIER:
394 idx++;
395 wl.underwaterFogModifier = (float)rules.GetLSLFloatItem(idx);
396 break;
397 case (int)ScriptBaseClass.WL_WATER_COLOR:
398 idx++;
399 iV = rules.GetVector3Item(idx);
400 wl.waterColor = new Vector3((float)iV.x, (float)iV.y, (float)iV.z);
401 break;
402 case (int)ScriptBaseClass.WL_WATER_FOG_DENSITY_EXPONENT:
403 idx++;
404 wl.waterFogDensityExponent = (float)rules.GetLSLFloatItem(idx);
405 break;
406 }
407 idx++;
408 }
409 return wl;
410 }
411 /// <summary>
412 /// Set the current Windlight scene
413 /// </summary>
414 /// <param name="rules"></param>
415 /// <returns>success: true or false</returns>
416 public int cmSetWindlightScene(LSL_List rules)
417 {
418 if (!m_CMFunctionsEnabled)
419 {
420 CMShoutError("Careminster functions are not enabled.");
421 return 0;
422 }
423 if (!World.RegionInfo.EstateSettings.IsEstateManager(m_host.OwnerID) && World.GetScenePresence(m_host.OwnerID).GodLevel < 200)
424 {
425 CMShoutError("cmSetWindlightScene can only be used by estate managers or owners.");
426 return 0;
427 }
428 int success = 0;
429 m_host.AddScriptLPS(1);
430 if (Meta7WindlightModule.EnableWindlight)
431 {
432 RegionMeta7WindlightData wl = getWindlightProfileFromRules(rules);
433 m_host.ParentGroup.Scene.StoreWindlightProfile(wl);
434 success = 1;
435 }
436 else
437 {
438 CMShoutError("Windlight module is disabled");
439 return 0;
440 }
441 return success;
442 }
443 /// <summary>
444 /// Set the current Windlight scene to a target avatar
445 /// </summary>
446 /// <param name="rules"></param>
447 /// <returns>success: true or false</returns>
448 public int cmSetWindlightSceneTargeted(LSL_List rules, LSL_Key target)
449 {
450 if (!m_CMFunctionsEnabled)
451 {
452 CMShoutError("Careminster functions are not enabled.");
453 return 0;
454 }
455 if (!World.RegionInfo.EstateSettings.IsEstateManager(m_host.OwnerID) && World.GetScenePresence(m_host.OwnerID).GodLevel < 200)
456 {
457 CMShoutError("cmSetWindlightSceneTargeted can only be used by estate managers or owners.");
458 return 0;
459 }
460 int success = 0;
461 m_host.AddScriptLPS(1);
462 if (Meta7WindlightModule.EnableWindlight)
463 {
464 RegionMeta7WindlightData wl = getWindlightProfileFromRules(rules);
465 World.EventManager.TriggerOnSendNewWindlightProfileTargeted(wl, new UUID(target.m_string));
466 success = 1;
467 }
468 else
469 {
470 CMShoutError("Windlight module is disabled");
471 return 0;
472 }
473 return success;
474 }
475
476 }
477}
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index b040ca77..8f82304 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -28,6 +28,7 @@
28using System; 28using System;
29using System.Collections; 29using System.Collections;
30using System.Collections.Generic; 30using System.Collections.Generic;
31using System.Diagnostics; //for [DebuggerNonUserCode]
31using System.Runtime.Remoting.Lifetime; 32using System.Runtime.Remoting.Lifetime;
32using System.Text; 33using System.Text;
33using System.Threading; 34using System.Threading;
@@ -151,6 +152,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
151 get { return m_ScriptEngine.World; } 152 get { return m_ScriptEngine.World; }
152 } 153 }
153 154
155 [DebuggerNonUserCode]
154 public void state(string newState) 156 public void state(string newState)
155 { 157 {
156 m_ScriptEngine.SetState(m_itemID, newState); 158 m_ScriptEngine.SetState(m_itemID, newState);
@@ -160,6 +162,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
160 /// Reset the named script. The script must be present 162 /// Reset the named script. The script must be present
161 /// in the same prim. 163 /// in the same prim.
162 /// </summary> 164 /// </summary>
165 [DebuggerNonUserCode]
163 public void llResetScript() 166 public void llResetScript()
164 { 167 {
165 m_host.AddScriptLPS(1); 168 m_host.AddScriptLPS(1);
@@ -218,7 +221,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
218 221
219 public List<SceneObjectPart> GetLinkParts(int linkType) 222 public List<SceneObjectPart> GetLinkParts(int linkType)
220 { 223 {
221 List<SceneObjectPart> ret = new List<SceneObjectPart>(); 224 List<SceneObjectPart> ret = new List<SceneObjectPart>();
225 if (m_host == null || m_host.ParentGroup == null || m_host.ParentGroup.IsDeleted)
226 return ret;
222 ret.Add(m_host); 227 ret.Add(m_host);
223 228
224 switch (linkType) 229 switch (linkType)
@@ -272,40 +277,48 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
272 protected UUID InventorySelf() 277 protected UUID InventorySelf()
273 { 278 {
274 UUID invItemID = new UUID(); 279 UUID invItemID = new UUID();
275 280 bool unlock = false;
276 lock (m_host.TaskInventory) 281 if (!m_host.TaskInventory.IsReadLockedByMe())
277 { 282 {
278 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 283 m_host.TaskInventory.LockItemsForRead(true);
284 unlock = true;
285 }
286 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
287 {
288 if (inv.Value.Type == 10 && inv.Value.ItemID == m_itemID)
279 { 289 {
280 if (inv.Value.Type == 10 && inv.Value.ItemID == m_itemID) 290 invItemID = inv.Key;
281 { 291 break;
282 invItemID = inv.Key;
283 break;
284 }
285 } 292 }
286 } 293 }
287 294 if (unlock)
295 {
296 m_host.TaskInventory.LockItemsForRead(false);
297 }
288 return invItemID; 298 return invItemID;
289 } 299 }
290 300
291 protected UUID InventoryKey(string name, int type) 301 protected UUID InventoryKey(string name, int type)
292 { 302 {
293 m_host.AddScriptLPS(1); 303 m_host.AddScriptLPS(1);
294 304 m_host.TaskInventory.LockItemsForRead(true);
295 lock (m_host.TaskInventory) 305
306 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
296 { 307 {
297 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 308 if (inv.Value.Name == name)
298 { 309 {
299 if (inv.Value.Name == name) 310 m_host.TaskInventory.LockItemsForRead(false);
311
312 if (inv.Value.Type != type)
300 { 313 {
301 if (inv.Value.Type != type) 314 return UUID.Zero;
302 return UUID.Zero;
303
304 return inv.Value.AssetID;
305 } 315 }
316
317 return inv.Value.AssetID;
306 } 318 }
307 } 319 }
308 320
321 m_host.TaskInventory.LockItemsForRead(false);
309 return UUID.Zero; 322 return UUID.Zero;
310 } 323 }
311 324
@@ -313,17 +326,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
313 { 326 {
314 m_host.AddScriptLPS(1); 327 m_host.AddScriptLPS(1);
315 328
316 lock (m_host.TaskInventory) 329
330 m_host.TaskInventory.LockItemsForRead(true);
331
332 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
317 { 333 {
318 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 334 if (inv.Value.Name == name)
319 { 335 {
320 if (inv.Value.Name == name) 336 m_host.TaskInventory.LockItemsForRead(false);
321 { 337 return inv.Value.AssetID;
322 return inv.Value.AssetID;
323 }
324 } 338 }
325 } 339 }
326 340
341 m_host.TaskInventory.LockItemsForRead(false);
342
343
327 return UUID.Zero; 344 return UUID.Zero;
328 } 345 }
329 346
@@ -705,6 +722,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
705 { 722 {
706 //A and B should both be normalized 723 //A and B should both be normalized
707 m_host.AddScriptLPS(1); 724 m_host.AddScriptLPS(1);
725 /* This method is more accurate than the SL one, and thus causes problems
726 for scripts that deal with the SL inaccuracy around 180-degrees -.- .._.
727
708 double dotProduct = LSL_Vector.Dot(a, b); 728 double dotProduct = LSL_Vector.Dot(a, b);
709 LSL_Vector crossProduct = LSL_Vector.Cross(a, b); 729 LSL_Vector crossProduct = LSL_Vector.Cross(a, b);
710 double magProduct = LSL_Vector.Mag(a) * LSL_Vector.Mag(b); 730 double magProduct = LSL_Vector.Mag(a) * LSL_Vector.Mag(b);
@@ -721,8 +741,57 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
721 return new LSL_Rotation(0.0f, 0.0f, 0.0f, 1.0f); 741 return new LSL_Rotation(0.0f, 0.0f, 0.0f, 1.0f);
722 742
723 return new LSL_Rotation((float)x, (float)y, (float)z, (float)w); 743 return new LSL_Rotation((float)x, (float)y, (float)z, (float)w);
724 } 744 */
725 745
746 // This method mimics the 180 errors found in SL
747 // See www.euclideanspace.com... angleBetween
748 LSL_Vector vec_a = a;
749 LSL_Vector vec_b = b;
750
751 // Eliminate zero length
752 LSL_Float vec_a_mag = LSL_Vector.Mag(vec_a);
753 LSL_Float vec_b_mag = LSL_Vector.Mag(vec_b);
754 if (vec_a_mag < 0.00001 ||
755 vec_b_mag < 0.00001)
756 {
757 return new LSL_Rotation(0.0f, 0.0f, 0.0f, 1.0f);
758 }
759
760 // Normalize
761 vec_a = llVecNorm(vec_a);
762 vec_b = llVecNorm(vec_b);
763
764 // Calculate axis and rotation angle
765 LSL_Vector axis = vec_a % vec_b;
766 LSL_Float cos_theta = vec_a * vec_b;
767
768 // Check if parallel
769 if (cos_theta > 0.99999)
770 {
771 return new LSL_Rotation(0.0f, 0.0f, 0.0f, 1.0f);
772 }
773
774 // Check if anti-parallel
775 else if (cos_theta < -0.99999)
776 {
777 LSL_Vector orthog_axis = new LSL_Vector(1.0, 0.0, 0.0) - (vec_a.x / (vec_a * vec_a) * vec_a);
778 if (LSL_Vector.Mag(orthog_axis) < 0.000001) orthog_axis = new LSL_Vector(0.0, 0.0, 1.0);
779 return new LSL_Rotation((float)orthog_axis.x, (float)orthog_axis.y, (float)orthog_axis.z, 0.0);
780 }
781 else // other rotation
782 {
783 LSL_Float theta = (LSL_Float)Math.Acos(cos_theta) * 0.5f;
784 axis = llVecNorm(axis);
785 double x, y, z, s, t;
786 s = Math.Cos(theta);
787 t = Math.Sin(theta);
788 x = axis.x * t;
789 y = axis.y * t;
790 z = axis.z * t;
791 return new LSL_Rotation(x,y,z,s);
792 }
793 }
794
726 public void llWhisper(int channelID, string text) 795 public void llWhisper(int channelID, string text)
727 { 796 {
728 m_host.AddScriptLPS(1); 797 m_host.AddScriptLPS(1);
@@ -1049,7 +1118,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1049 public virtual void llDie() 1118 public virtual void llDie()
1050 { 1119 {
1051 m_host.AddScriptLPS(1); 1120 m_host.AddScriptLPS(1);
1052 throw new SelfDeleteException(); 1121 if (!m_host.IsAttachment) throw new SelfDeleteException();
1053 } 1122 }
1054 1123
1055 public LSL_Float llGround(LSL_Vector offset) 1124 public LSL_Float llGround(LSL_Vector offset)
@@ -1121,7 +1190,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1121 } 1190 }
1122 1191
1123 public void llSetStatus(int status, int value) 1192 public void llSetStatus(int status, int value)
1124 { 1193 {
1194 if (m_host == null || m_host.ParentGroup == null || m_host.ParentGroup.IsDeleted)
1195 return;
1125 m_host.AddScriptLPS(1); 1196 m_host.AddScriptLPS(1);
1126 1197
1127 int statusrotationaxis = 0; 1198 int statusrotationaxis = 0;
@@ -1296,7 +1367,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1296 } 1367 }
1297 1368
1298 protected void SetScale(SceneObjectPart part, LSL_Vector scale) 1369 protected void SetScale(SceneObjectPart part, LSL_Vector scale)
1299 { 1370 {
1300 // TODO: this needs to trigger a persistance save as well 1371 // TODO: this needs to trigger a persistance save as well
1301 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted) 1372 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
1302 return; 1373 return;
@@ -1351,6 +1422,48 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1351 { 1422 {
1352 m_host.AddScriptLPS(1); 1423 m_host.AddScriptLPS(1);
1353 1424
1425 SetColor(m_host, color, face);
1426 }
1427
1428 protected void SetColor(SceneObjectPart part, LSL_Vector color, int face)
1429 {
1430 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
1431 return;
1432
1433 Primitive.TextureEntry tex = part.Shape.Textures;
1434 Color4 texcolor;
1435 if (face >= 0 && face < GetNumberOfSides(part))
1436 {
1437 texcolor = tex.CreateFace((uint)face).RGBA;
1438 texcolor.R = Util.Clip((float)color.x, 0.0f, 1.0f);
1439 texcolor.G = Util.Clip((float)color.y, 0.0f, 1.0f);
1440 texcolor.B = Util.Clip((float)color.z, 0.0f, 1.0f);
1441 tex.FaceTextures[face].RGBA = texcolor;
1442 part.UpdateTexture(tex);
1443 return;
1444 }
1445 else if (face == ScriptBaseClass.ALL_SIDES)
1446 {
1447 for (uint i = 0; i < GetNumberOfSides(part); i++)
1448 {
1449 if (tex.FaceTextures[i] != null)
1450 {
1451 texcolor = tex.FaceTextures[i].RGBA;
1452 texcolor.R = Util.Clip((float)color.x, 0.0f, 1.0f);
1453 texcolor.G = Util.Clip((float)color.y, 0.0f, 1.0f);
1454 texcolor.B = Util.Clip((float)color.z, 0.0f, 1.0f);
1455 tex.FaceTextures[i].RGBA = texcolor;
1456 }
1457 texcolor = tex.DefaultTexture.RGBA;
1458 texcolor.R = Util.Clip((float)color.x, 0.0f, 1.0f);
1459 texcolor.G = Util.Clip((float)color.y, 0.0f, 1.0f);
1460 texcolor.B = Util.Clip((float)color.z, 0.0f, 1.0f);
1461 tex.DefaultTexture.RGBA = texcolor;
1462 }
1463 part.UpdateTexture(tex);
1464 return;
1465 }
1466
1354 if (face == ScriptBaseClass.ALL_SIDES) 1467 if (face == ScriptBaseClass.ALL_SIDES)
1355 face = SceneObjectPart.ALL_SIDES; 1468 face = SceneObjectPart.ALL_SIDES;
1356 1469
@@ -1358,7 +1471,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1358 } 1471 }
1359 1472
1360 public void SetTexGen(SceneObjectPart part, int face,int style) 1473 public void SetTexGen(SceneObjectPart part, int face,int style)
1361 { 1474 {
1475 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
1476 return;
1477
1362 Primitive.TextureEntry tex = part.Shape.Textures; 1478 Primitive.TextureEntry tex = part.Shape.Textures;
1363 MappingType textype; 1479 MappingType textype;
1364 textype = MappingType.Default; 1480 textype = MappingType.Default;
@@ -1388,7 +1504,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1388 } 1504 }
1389 1505
1390 public void SetGlow(SceneObjectPart part, int face, float glow) 1506 public void SetGlow(SceneObjectPart part, int face, float glow)
1391 { 1507 {
1508 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
1509 return;
1510
1392 Primitive.TextureEntry tex = part.Shape.Textures; 1511 Primitive.TextureEntry tex = part.Shape.Textures;
1393 if (face >= 0 && face < GetNumberOfSides(part)) 1512 if (face >= 0 && face < GetNumberOfSides(part))
1394 { 1513 {
@@ -1413,7 +1532,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1413 } 1532 }
1414 1533
1415 public void SetShiny(SceneObjectPart part, int face, int shiny, Bumpiness bump) 1534 public void SetShiny(SceneObjectPart part, int face, int shiny, Bumpiness bump)
1416 { 1535 {
1536 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
1537 return;
1417 1538
1418 Shininess sval = new Shininess(); 1539 Shininess sval = new Shininess();
1419 1540
@@ -1463,7 +1584,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1463 } 1584 }
1464 1585
1465 public void SetFullBright(SceneObjectPart part, int face, bool bright) 1586 public void SetFullBright(SceneObjectPart part, int face, bool bright)
1466 { 1587 {
1588 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
1589 return;
1590
1467 Primitive.TextureEntry tex = part.Shape.Textures; 1591 Primitive.TextureEntry tex = part.Shape.Textures;
1468 if (face >= 0 && face < GetNumberOfSides(part)) 1592 if (face >= 0 && face < GetNumberOfSides(part))
1469 { 1593 {
@@ -1530,7 +1654,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1530 } 1654 }
1531 1655
1532 protected void SetAlpha(SceneObjectPart part, double alpha, int face) 1656 protected void SetAlpha(SceneObjectPart part, double alpha, int face)
1533 { 1657 {
1658 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
1659 return;
1660
1534 Primitive.TextureEntry tex = part.Shape.Textures; 1661 Primitive.TextureEntry tex = part.Shape.Textures;
1535 Color4 texcolor; 1662 Color4 texcolor;
1536 if (face >= 0 && face < GetNumberOfSides(part)) 1663 if (face >= 0 && face < GetNumberOfSides(part))
@@ -1575,8 +1702,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1575 /// <param name="Force"></param> 1702 /// <param name="Force"></param>
1576 protected void SetFlexi(SceneObjectPart part, bool flexi, int softness, float gravity, float friction, 1703 protected void SetFlexi(SceneObjectPart part, bool flexi, int softness, float gravity, float friction,
1577 float wind, float tension, LSL_Vector Force) 1704 float wind, float tension, LSL_Vector Force)
1578 { 1705 {
1579 if (part == null) 1706 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
1580 return; 1707 return;
1581 1708
1582 if (flexi) 1709 if (flexi)
@@ -1610,8 +1737,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1610 /// <param name="radius"></param> 1737 /// <param name="radius"></param>
1611 /// <param name="falloff"></param> 1738 /// <param name="falloff"></param>
1612 protected void SetPointLight(SceneObjectPart part, bool light, LSL_Vector color, float intensity, float radius, float falloff) 1739 protected void SetPointLight(SceneObjectPart part, bool light, LSL_Vector color, float intensity, float radius, float falloff)
1613 { 1740 {
1614 if (part == null) 1741 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
1615 return; 1742 return;
1616 1743
1617 if (light) 1744 if (light)
@@ -1696,7 +1823,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1696 } 1823 }
1697 1824
1698 protected void SetTexture(SceneObjectPart part, string texture, int face) 1825 protected void SetTexture(SceneObjectPart part, string texture, int face)
1699 { 1826 {
1827 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
1828 return;
1829
1700 UUID textureID=new UUID(); 1830 UUID textureID=new UUID();
1701 1831
1702 if (!UUID.TryParse(texture, out textureID)) 1832 if (!UUID.TryParse(texture, out textureID))
@@ -1741,7 +1871,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1741 } 1871 }
1742 1872
1743 protected void ScaleTexture(SceneObjectPart part, double u, double v, int face) 1873 protected void ScaleTexture(SceneObjectPart part, double u, double v, int face)
1744 { 1874 {
1875 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
1876 return;
1877
1745 Primitive.TextureEntry tex = part.Shape.Textures; 1878 Primitive.TextureEntry tex = part.Shape.Textures;
1746 if (face >= 0 && face < GetNumberOfSides(part)) 1879 if (face >= 0 && face < GetNumberOfSides(part))
1747 { 1880 {
@@ -1777,7 +1910,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1777 } 1910 }
1778 1911
1779 protected void OffsetTexture(SceneObjectPart part, double u, double v, int face) 1912 protected void OffsetTexture(SceneObjectPart part, double u, double v, int face)
1780 { 1913 {
1914 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
1915 return;
1916
1781 Primitive.TextureEntry tex = part.Shape.Textures; 1917 Primitive.TextureEntry tex = part.Shape.Textures;
1782 if (face >= 0 && face < GetNumberOfSides(part)) 1918 if (face >= 0 && face < GetNumberOfSides(part))
1783 { 1919 {
@@ -1813,7 +1949,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1813 } 1949 }
1814 1950
1815 protected void RotateTexture(SceneObjectPart part, double rotation, int face) 1951 protected void RotateTexture(SceneObjectPart part, double rotation, int face)
1816 { 1952 {
1953 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
1954 return;
1955
1817 Primitive.TextureEntry tex = part.Shape.Textures; 1956 Primitive.TextureEntry tex = part.Shape.Textures;
1818 if (face >= 0 && face < GetNumberOfSides(part)) 1957 if (face >= 0 && face < GetNumberOfSides(part))
1819 { 1958 {
@@ -1883,7 +2022,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1883 } 2022 }
1884 2023
1885 protected void SetPos(SceneObjectPart part, LSL_Vector targetPos) 2024 protected void SetPos(SceneObjectPart part, LSL_Vector targetPos)
1886 { 2025 {
2026 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
2027 return;
2028
1887 // Capped movemment if distance > 10m (http://wiki.secondlife.com/wiki/LlSetPos) 2029 // Capped movemment if distance > 10m (http://wiki.secondlife.com/wiki/LlSetPos)
1888 LSL_Vector currentPos = llGetLocalPos(); 2030 LSL_Vector currentPos = llGetLocalPos();
1889 2031
@@ -1977,7 +2119,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1977 } 2119 }
1978 2120
1979 protected void SetRot(SceneObjectPart part, Quaternion rot) 2121 protected void SetRot(SceneObjectPart part, Quaternion rot)
1980 { 2122 {
2123 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
2124 return;
2125
1981 part.UpdateRotation(rot); 2126 part.UpdateRotation(rot);
1982 // Update rotation does not move the object in the physics scene if it's a linkset. 2127 // Update rotation does not move the object in the physics scene if it's a linkset.
1983 2128
@@ -2597,12 +2742,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2597 2742
2598 m_host.AddScriptLPS(1); 2743 m_host.AddScriptLPS(1);
2599 2744
2745 m_host.TaskInventory.LockItemsForRead(true);
2600 TaskInventoryItem item = m_host.TaskInventory[invItemID]; 2746 TaskInventoryItem item = m_host.TaskInventory[invItemID];
2601 2747 m_host.TaskInventory.LockItemsForRead(false);
2602 lock (m_host.TaskInventory)
2603 {
2604 item = m_host.TaskInventory[invItemID];
2605 }
2606 2748
2607 if (item.PermsGranter == UUID.Zero) 2749 if (item.PermsGranter == UUID.Zero)
2608 return 0; 2750 return 0;
@@ -2677,6 +2819,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2677 if (dist > m_ScriptDistanceFactor * 10.0f) 2819 if (dist > m_ScriptDistanceFactor * 10.0f)
2678 return; 2820 return;
2679 2821
2822 //Clone is thread-safe
2680 TaskInventoryDictionary partInventory = (TaskInventoryDictionary)m_host.TaskInventory.Clone(); 2823 TaskInventoryDictionary partInventory = (TaskInventoryDictionary)m_host.TaskInventory.Clone();
2681 2824
2682 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in partInventory) 2825 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in partInventory)
@@ -2756,10 +2899,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2756 // the angles of rotation in radians into rotation value 2899 // the angles of rotation in radians into rotation value
2757 2900
2758 LSL_Types.Quaternion rot = llEuler2Rot(angle); 2901 LSL_Types.Quaternion rot = llEuler2Rot(angle);
2902 /*
2759 Quaternion rotation = new Quaternion((float)rot.x, (float)rot.y, (float)rot.z, (float)rot.s); 2903 Quaternion rotation = new Quaternion((float)rot.x, (float)rot.y, (float)rot.z, (float)rot.s);
2760 m_host.startLookAt(rotation, (float)damping, (float)strength); 2904 m_host.startLookAt(rotation, (float)damping, (float)strength);
2905 This would only work if your physics system contains an APID controller */
2761 // Orient the object to the angle calculated 2906 // Orient the object to the angle calculated
2762 //llSetRot(rot); 2907 llSetRot(rot);
2908 }
2909
2910 public void llRotLookAt(LSL_Rotation target, double strength, double damping)
2911 {
2912 m_host.AddScriptLPS(1);
2913// NotImplemented("llRotLookAt");
2914 m_host.RotLookAt(Rot2Quaternion(target), (float)strength, (float)damping);
2915
2763 } 2916 }
2764 2917
2765 public void llStopLookAt() 2918 public void llStopLookAt()
@@ -2808,13 +2961,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2808 { 2961 {
2809 TaskInventoryItem item; 2962 TaskInventoryItem item;
2810 2963
2811 lock (m_host.TaskInventory) 2964 m_host.TaskInventory.LockItemsForRead(true);
2965 if (!m_host.TaskInventory.ContainsKey(InventorySelf()))
2812 { 2966 {
2813 if (!m_host.TaskInventory.ContainsKey(InventorySelf())) 2967 m_host.TaskInventory.LockItemsForRead(false);
2814 return; 2968 return;
2815 else
2816 item = m_host.TaskInventory[InventorySelf()];
2817 } 2969 }
2970 else
2971 {
2972 item = m_host.TaskInventory[InventorySelf()];
2973 }
2974 m_host.TaskInventory.LockItemsForRead(false);
2818 2975
2819 if (item.PermsGranter != UUID.Zero) 2976 if (item.PermsGranter != UUID.Zero)
2820 { 2977 {
@@ -2836,13 +2993,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2836 { 2993 {
2837 TaskInventoryItem item; 2994 TaskInventoryItem item;
2838 2995
2996 m_host.TaskInventory.LockItemsForRead(true);
2839 lock (m_host.TaskInventory) 2997 lock (m_host.TaskInventory)
2840 { 2998 {
2999
2841 if (!m_host.TaskInventory.ContainsKey(InventorySelf())) 3000 if (!m_host.TaskInventory.ContainsKey(InventorySelf()))
3001 {
3002 m_host.TaskInventory.LockItemsForRead(false);
2842 return; 3003 return;
3004 }
2843 else 3005 else
3006 {
2844 item = m_host.TaskInventory[InventorySelf()]; 3007 item = m_host.TaskInventory[InventorySelf()];
3008 }
2845 } 3009 }
3010 m_host.TaskInventory.LockItemsForRead(false);
2846 3011
2847 m_host.AddScriptLPS(1); 3012 m_host.AddScriptLPS(1);
2848 3013
@@ -2879,13 +3044,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2879 3044
2880 TaskInventoryItem item; 3045 TaskInventoryItem item;
2881 3046
2882 lock (m_host.TaskInventory) 3047 m_host.TaskInventory.LockItemsForRead(true);
3048
3049 if (!m_host.TaskInventory.ContainsKey(InventorySelf()))
2883 { 3050 {
2884 if (!m_host.TaskInventory.ContainsKey(InventorySelf())) 3051 m_host.TaskInventory.LockItemsForRead(false);
2885 return; 3052 return;
2886 else
2887 item = m_host.TaskInventory[InventorySelf()];
2888 } 3053 }
3054 else
3055 {
3056 item = m_host.TaskInventory[InventorySelf()];
3057 }
3058
3059 m_host.TaskInventory.LockItemsForRead(false);
2889 3060
2890 if (item.PermsGranter != m_host.OwnerID) 3061 if (item.PermsGranter != m_host.OwnerID)
2891 return; 3062 return;
@@ -2913,13 +3084,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2913 3084
2914 TaskInventoryItem item; 3085 TaskInventoryItem item;
2915 3086
2916 lock (m_host.TaskInventory) 3087 m_host.TaskInventory.LockItemsForRead(true);
3088
3089 if (!m_host.TaskInventory.ContainsKey(InventorySelf()))
2917 { 3090 {
2918 if (!m_host.TaskInventory.ContainsKey(InventorySelf())) 3091 m_host.TaskInventory.LockItemsForRead(false);
2919 return; 3092 return;
2920 else
2921 item = m_host.TaskInventory[InventorySelf()];
2922 } 3093 }
3094 else
3095 {
3096 item = m_host.TaskInventory[InventorySelf()];
3097 }
3098 m_host.TaskInventory.LockItemsForRead(false);
3099
2923 3100
2924 if (item.PermsGranter != m_host.OwnerID) 3101 if (item.PermsGranter != m_host.OwnerID)
2925 return; 3102 return;
@@ -2956,8 +3133,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2956 return m_host.OwnerID.ToString(); 3133 return m_host.OwnerID.ToString();
2957 } 3134 }
2958 3135
3136 [DebuggerNonUserCode]
2959 public void llInstantMessage(string user, string message) 3137 public void llInstantMessage(string user, string message)
2960 { 3138 {
3139 UUID result;
3140 if (!UUID.TryParse(user, out result))
3141 {
3142 throw new Exception(String.Format("An invalid key of '{0} was passed to llInstantMessage", user));
3143 return;
3144 }
3145
3146
2961 m_host.AddScriptLPS(1); 3147 m_host.AddScriptLPS(1);
2962 3148
2963 // We may be able to use ClientView.SendInstantMessage here, but we need a client instance. 3149 // We may be able to use ClientView.SendInstantMessage here, but we need a client instance.
@@ -2972,7 +3158,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2972 UUID friendTransactionID = UUID.Random(); 3158 UUID friendTransactionID = UUID.Random();
2973 3159
2974 //m_pendingFriendRequests.Add(friendTransactionID, fromAgentID); 3160 //m_pendingFriendRequests.Add(friendTransactionID, fromAgentID);
2975 3161
2976 GridInstantMessage msg = new GridInstantMessage(); 3162 GridInstantMessage msg = new GridInstantMessage();
2977 msg.fromAgentID = new Guid(m_host.UUID.ToString()); // fromAgentID.Guid; 3163 msg.fromAgentID = new Guid(m_host.UUID.ToString()); // fromAgentID.Guid;
2978 msg.toAgentID = new Guid(user); // toAgentID.Guid; 3164 msg.toAgentID = new Guid(user); // toAgentID.Guid;
@@ -3121,13 +3307,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3121 m_host.AddScriptLPS(1); 3307 m_host.AddScriptLPS(1);
3122 } 3308 }
3123 3309
3124 public void llRotLookAt(LSL_Rotation target, double strength, double damping)
3125 {
3126 m_host.AddScriptLPS(1);
3127 Quaternion rot = new Quaternion((float)target.x, (float)target.y, (float)target.z, (float)target.s);
3128 m_host.RotLookAt(rot, (float)strength, (float)damping);
3129 }
3130
3131 public LSL_Integer llStringLength(string str) 3310 public LSL_Integer llStringLength(string str)
3132 { 3311 {
3133 m_host.AddScriptLPS(1); 3312 m_host.AddScriptLPS(1);
@@ -3151,14 +3330,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3151 3330
3152 TaskInventoryItem item; 3331 TaskInventoryItem item;
3153 3332
3154 lock (m_host.TaskInventory) 3333 m_host.TaskInventory.LockItemsForRead(true);
3334 if (!m_host.TaskInventory.ContainsKey(InventorySelf()))
3155 { 3335 {
3156 if (!m_host.TaskInventory.ContainsKey(InventorySelf())) 3336 m_host.TaskInventory.LockItemsForRead(false);
3157 return; 3337 return;
3158 else
3159 item = m_host.TaskInventory[InventorySelf()];
3160 } 3338 }
3161 3339 else
3340 {
3341 item = m_host.TaskInventory[InventorySelf()];
3342 }
3343 m_host.TaskInventory.LockItemsForRead(false);
3162 if (item.PermsGranter == UUID.Zero) 3344 if (item.PermsGranter == UUID.Zero)
3163 return; 3345 return;
3164 3346
@@ -3188,13 +3370,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3188 3370
3189 TaskInventoryItem item; 3371 TaskInventoryItem item;
3190 3372
3191 lock (m_host.TaskInventory) 3373 m_host.TaskInventory.LockItemsForRead(true);
3374 if (!m_host.TaskInventory.ContainsKey(InventorySelf()))
3192 { 3375 {
3193 if (!m_host.TaskInventory.ContainsKey(InventorySelf())) 3376 m_host.TaskInventory.LockItemsForRead(false);
3194 return; 3377 return;
3195 else 3378 }
3196 item = m_host.TaskInventory[InventorySelf()]; 3379 else
3380 {
3381 item = m_host.TaskInventory[InventorySelf()];
3197 } 3382 }
3383 m_host.TaskInventory.LockItemsForRead(false);
3384
3198 3385
3199 if (item.PermsGranter == UUID.Zero) 3386 if (item.PermsGranter == UUID.Zero)
3200 return; 3387 return;
@@ -3271,10 +3458,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3271 3458
3272 TaskInventoryItem item; 3459 TaskInventoryItem item;
3273 3460
3274 lock (m_host.TaskInventory) 3461
3462 m_host.TaskInventory.LockItemsForRead(true);
3463 if (!m_host.TaskInventory.ContainsKey(invItemID))
3464 {
3465 m_host.TaskInventory.LockItemsForRead(false);
3466 return;
3467 }
3468 else
3275 { 3469 {
3276 item = m_host.TaskInventory[invItemID]; 3470 item = m_host.TaskInventory[invItemID];
3277 } 3471 }
3472 m_host.TaskInventory.LockItemsForRead(false);
3278 3473
3279 if (agentID == UUID.Zero || perm == 0) // Releasing permissions 3474 if (agentID == UUID.Zero || perm == 0) // Releasing permissions
3280 { 3475 {
@@ -3306,11 +3501,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3306 3501
3307 if ((perm & (~implicitPerms)) == 0) // Requested only implicit perms 3502 if ((perm & (~implicitPerms)) == 0) // Requested only implicit perms
3308 { 3503 {
3309 lock (m_host.TaskInventory) 3504 m_host.TaskInventory.LockItemsForWrite(true);
3310 { 3505 m_host.TaskInventory[invItemID].PermsGranter = agentID;
3311 m_host.TaskInventory[invItemID].PermsGranter = agentID; 3506 m_host.TaskInventory[invItemID].PermsMask = perm;
3312 m_host.TaskInventory[invItemID].PermsMask = perm; 3507 m_host.TaskInventory.LockItemsForWrite(false);
3313 }
3314 3508
3315 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( 3509 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams(
3316 "run_time_permissions", new Object[] { 3510 "run_time_permissions", new Object[] {
@@ -3330,11 +3524,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3330 3524
3331 if ((perm & (~implicitPerms)) == 0) // Requested only implicit perms 3525 if ((perm & (~implicitPerms)) == 0) // Requested only implicit perms
3332 { 3526 {
3333 lock (m_host.TaskInventory) 3527 m_host.TaskInventory.LockItemsForWrite(true);
3334 { 3528 m_host.TaskInventory[invItemID].PermsGranter = agentID;
3335 m_host.TaskInventory[invItemID].PermsGranter = agentID; 3529 m_host.TaskInventory[invItemID].PermsMask = perm;
3336 m_host.TaskInventory[invItemID].PermsMask = perm; 3530 m_host.TaskInventory.LockItemsForWrite(false);
3337 }
3338 3531
3339 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( 3532 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams(
3340 "run_time_permissions", new Object[] { 3533 "run_time_permissions", new Object[] {
@@ -3355,11 +3548,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3355 3548
3356 if (!m_waitingForScriptAnswer) 3549 if (!m_waitingForScriptAnswer)
3357 { 3550 {
3358 lock (m_host.TaskInventory) 3551 m_host.TaskInventory.LockItemsForWrite(true);
3359 { 3552 m_host.TaskInventory[invItemID].PermsGranter = agentID;
3360 m_host.TaskInventory[invItemID].PermsGranter = agentID; 3553 m_host.TaskInventory[invItemID].PermsMask = 0;
3361 m_host.TaskInventory[invItemID].PermsMask = 0; 3554 m_host.TaskInventory.LockItemsForWrite(false);
3362 }
3363 3555
3364 presence.ControllingClient.OnScriptAnswer += handleScriptAnswer; 3556 presence.ControllingClient.OnScriptAnswer += handleScriptAnswer;
3365 m_waitingForScriptAnswer=true; 3557 m_waitingForScriptAnswer=true;
@@ -3394,10 +3586,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3394 if ((answer & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) == 0) 3586 if ((answer & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) == 0)
3395 llReleaseControls(); 3587 llReleaseControls();
3396 3588
3397 lock (m_host.TaskInventory) 3589
3398 { 3590 m_host.TaskInventory.LockItemsForWrite(true);
3399 m_host.TaskInventory[invItemID].PermsMask = answer; 3591 m_host.TaskInventory[invItemID].PermsMask = answer;
3400 } 3592 m_host.TaskInventory.LockItemsForWrite(false);
3593
3401 3594
3402 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( 3595 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams(
3403 "run_time_permissions", new Object[] { 3596 "run_time_permissions", new Object[] {
@@ -3409,16 +3602,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3409 { 3602 {
3410 m_host.AddScriptLPS(1); 3603 m_host.AddScriptLPS(1);
3411 3604
3412 lock (m_host.TaskInventory) 3605 m_host.TaskInventory.LockItemsForRead(true);
3606
3607 foreach (TaskInventoryItem item in m_host.TaskInventory.Values)
3413 { 3608 {
3414 foreach (TaskInventoryItem item in m_host.TaskInventory.Values) 3609 if (item.Type == 10 && item.ItemID == m_itemID)
3415 { 3610 {
3416 if (item.Type == 10 && item.ItemID == m_itemID) 3611 m_host.TaskInventory.LockItemsForRead(false);
3417 { 3612 return item.PermsGranter.ToString();
3418 return item.PermsGranter.ToString();
3419 }
3420 } 3613 }
3421 } 3614 }
3615 m_host.TaskInventory.LockItemsForRead(false);
3422 3616
3423 return UUID.Zero.ToString(); 3617 return UUID.Zero.ToString();
3424 } 3618 }
@@ -3427,19 +3621,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3427 { 3621 {
3428 m_host.AddScriptLPS(1); 3622 m_host.AddScriptLPS(1);
3429 3623
3430 lock (m_host.TaskInventory) 3624 m_host.TaskInventory.LockItemsForRead(true);
3625
3626 foreach (TaskInventoryItem item in m_host.TaskInventory.Values)
3431 { 3627 {
3432 foreach (TaskInventoryItem item in m_host.TaskInventory.Values) 3628 if (item.Type == 10 && item.ItemID == m_itemID)
3433 { 3629 {
3434 if (item.Type == 10 && item.ItemID == m_itemID) 3630 int perms = item.PermsMask;
3435 { 3631 if (m_automaticLinkPermission)
3436 int perms = item.PermsMask; 3632 perms |= ScriptBaseClass.PERMISSION_CHANGE_LINKS;
3437 if (m_automaticLinkPermission) 3633 m_host.TaskInventory.LockItemsForRead(false);
3438 perms |= ScriptBaseClass.PERMISSION_CHANGE_LINKS; 3634 return perms;
3439 return perms;
3440 }
3441 } 3635 }
3442 } 3636 }
3637 m_host.TaskInventory.LockItemsForRead(false);
3443 3638
3444 return 0; 3639 return 0;
3445 } 3640 }
@@ -3472,11 +3667,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3472 UUID invItemID = InventorySelf(); 3667 UUID invItemID = InventorySelf();
3473 3668
3474 TaskInventoryItem item; 3669 TaskInventoryItem item;
3475 lock (m_host.TaskInventory) 3670 m_host.TaskInventory.LockItemsForRead(true);
3476 { 3671 item = m_host.TaskInventory[invItemID];
3477 item = m_host.TaskInventory[invItemID]; 3672 m_host.TaskInventory.LockItemsForRead(false);
3478 } 3673
3479
3480 if ((item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0 3674 if ((item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0
3481 && !m_automaticLinkPermission) 3675 && !m_automaticLinkPermission)
3482 { 3676 {
@@ -3529,16 +3723,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3529 m_host.AddScriptLPS(1); 3723 m_host.AddScriptLPS(1);
3530 UUID invItemID = InventorySelf(); 3724 UUID invItemID = InventorySelf();
3531 3725
3532 lock (m_host.TaskInventory) 3726 m_host.TaskInventory.LockItemsForRead(true);
3533 {
3534 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0 3727 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0
3535 && !m_automaticLinkPermission) 3728 && !m_automaticLinkPermission)
3536 { 3729 {
3537 ShoutError("Script trying to link but PERMISSION_CHANGE_LINKS permission not set!"); 3730 ShoutError("Script trying to link but PERMISSION_CHANGE_LINKS permission not set!");
3731 m_host.TaskInventory.LockItemsForRead(false);
3538 return; 3732 return;
3539 } 3733 }
3540 } 3734 m_host.TaskInventory.LockItemsForRead(false);
3541 3735
3542 if (linknum < ScriptBaseClass.LINK_THIS) 3736 if (linknum < ScriptBaseClass.LINK_THIS)
3543 return; 3737 return;
3544 3738
@@ -3715,17 +3909,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3715 m_host.AddScriptLPS(1); 3909 m_host.AddScriptLPS(1);
3716 int count = 0; 3910 int count = 0;
3717 3911
3718 lock (m_host.TaskInventory) 3912 m_host.TaskInventory.LockItemsForRead(true);
3913 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
3719 { 3914 {
3720 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 3915 if (inv.Value.Type == type || type == -1)
3721 { 3916 {
3722 if (inv.Value.Type == type || type == -1) 3917 count = count + 1;
3723 {
3724 count = count + 1;
3725 }
3726 } 3918 }
3727 } 3919 }
3728 3920
3921 m_host.TaskInventory.LockItemsForRead(false);
3729 return count; 3922 return count;
3730 } 3923 }
3731 3924
@@ -3734,16 +3927,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3734 m_host.AddScriptLPS(1); 3927 m_host.AddScriptLPS(1);
3735 ArrayList keys = new ArrayList(); 3928 ArrayList keys = new ArrayList();
3736 3929
3737 lock (m_host.TaskInventory) 3930 m_host.TaskInventory.LockItemsForRead(true);
3931 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
3738 { 3932 {
3739 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 3933 if (inv.Value.Type == type || type == -1)
3740 { 3934 {
3741 if (inv.Value.Type == type || type == -1) 3935 keys.Add(inv.Value.Name);
3742 {
3743 keys.Add(inv.Value.Name);
3744 }
3745 } 3936 }
3746 } 3937 }
3938 m_host.TaskInventory.LockItemsForRead(false);
3747 3939
3748 if (keys.Count == 0) 3940 if (keys.Count == 0)
3749 { 3941 {
@@ -3780,20 +3972,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3780 } 3972 }
3781 3973
3782 // move the first object found with this inventory name 3974 // move the first object found with this inventory name
3783 lock (m_host.TaskInventory) 3975 m_host.TaskInventory.LockItemsForRead(true);
3976 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
3784 { 3977 {
3785 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 3978 if (inv.Value.Name == inventory)
3786 { 3979 {
3787 if (inv.Value.Name == inventory) 3980 found = true;
3788 { 3981 objId = inv.Key;
3789 found = true; 3982 assetType = inv.Value.Type;
3790 objId = inv.Key; 3983 objName = inv.Value.Name;
3791 assetType = inv.Value.Type; 3984 break;
3792 objName = inv.Value.Name;
3793 break;
3794 }
3795 } 3985 }
3796 } 3986 }
3987 m_host.TaskInventory.LockItemsForRead(false);
3797 3988
3798 if (!found) 3989 if (!found)
3799 { 3990 {
@@ -3828,34 +4019,39 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3828 bucket); 4019 bucket);
3829 4020
3830 if (m_TransferModule != null) 4021 if (m_TransferModule != null)
3831 m_TransferModule.SendInstantMessage(msg, delegate(bool success) {}); 4022 m_TransferModule.SendInstantMessage(msg, delegate(bool success) {});
4023
4024 //This delay should only occur when giving inventory to avatars.
4025 ScriptSleep(3000);
3832 } 4026 }
3833 else 4027 else
3834 { 4028 {
3835 // destination is an object 4029 // destination is an object
3836 World.MoveTaskInventoryItem(destId, m_host, objId); 4030 World.MoveTaskInventoryItem(destId, m_host, objId);
3837 } 4031 }
3838 ScriptSleep(3000); 4032
3839 } 4033 }
3840 4034
4035 [DebuggerNonUserCode]
3841 public void llRemoveInventory(string name) 4036 public void llRemoveInventory(string name)
3842 { 4037 {
3843 m_host.AddScriptLPS(1); 4038 m_host.AddScriptLPS(1);
3844 4039
3845 lock (m_host.TaskInventory) 4040 m_host.TaskInventory.LockItemsForRead(true);
4041 foreach (TaskInventoryItem item in m_host.TaskInventory.Values)
3846 { 4042 {
3847 foreach (TaskInventoryItem item in m_host.TaskInventory.Values) 4043 if (item.Name == name)
3848 { 4044 {
3849 if (item.Name == name) 4045 if (item.ItemID == m_itemID)
3850 { 4046 throw new ScriptDeleteException();
3851 if (item.ItemID == m_itemID) 4047 else
3852 throw new ScriptDeleteException(); 4048 m_host.Inventory.RemoveInventoryItem(item.ItemID);
3853 else 4049
3854 m_host.Inventory.RemoveInventoryItem(item.ItemID); 4050 m_host.TaskInventory.LockItemsForRead(false);
3855 return; 4051 return;
3856 }
3857 } 4052 }
3858 } 4053 }
4054 m_host.TaskInventory.LockItemsForRead(false);
3859 } 4055 }
3860 4056
3861 public void llSetText(string text, LSL_Vector color, double alpha) 4057 public void llSetText(string text, LSL_Vector color, double alpha)
@@ -3944,6 +4140,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3944 { 4140 {
3945 m_host.AddScriptLPS(1); 4141 m_host.AddScriptLPS(1);
3946 4142
4143 //Clone is thread safe
3947 TaskInventoryDictionary itemDictionary = (TaskInventoryDictionary)m_host.TaskInventory.Clone(); 4144 TaskInventoryDictionary itemDictionary = (TaskInventoryDictionary)m_host.TaskInventory.Clone();
3948 4145
3949 foreach (TaskInventoryItem item in itemDictionary.Values) 4146 foreach (TaskInventoryItem item in itemDictionary.Values)
@@ -4057,17 +4254,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4057 UUID soundId = UUID.Zero; 4254 UUID soundId = UUID.Zero;
4058 if (!UUID.TryParse(impact_sound, out soundId)) 4255 if (!UUID.TryParse(impact_sound, out soundId))
4059 { 4256 {
4060 lock (m_host.TaskInventory) 4257 m_host.TaskInventory.LockItemsForRead(true);
4258 foreach (TaskInventoryItem item in m_host.TaskInventory.Values)
4061 { 4259 {
4062 foreach (TaskInventoryItem item in m_host.TaskInventory.Values) 4260 if (item.Type == (int)AssetType.Sound && item.Name == impact_sound)
4063 { 4261 {
4064 if (item.Type == (int)AssetType.Sound && item.Name == impact_sound) 4262 soundId = item.AssetID;
4065 { 4263 break;
4066 soundId = item.AssetID;
4067 break;
4068 }
4069 } 4264 }
4070 } 4265 }
4266 m_host.TaskInventory.LockItemsForRead(false);
4071 } 4267 }
4072 m_host.CollisionSound = soundId; 4268 m_host.CollisionSound = soundId;
4073 m_host.CollisionSoundVolume = (float)impact_volume; 4269 m_host.CollisionSoundVolume = (float)impact_volume;
@@ -4113,6 +4309,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4113 UUID partItemID; 4309 UUID partItemID;
4114 foreach (SceneObjectPart part in parts) 4310 foreach (SceneObjectPart part in parts)
4115 { 4311 {
4312 //Clone is thread safe
4116 TaskInventoryDictionary itemsDictionary = (TaskInventoryDictionary)part.TaskInventory.Clone(); 4313 TaskInventoryDictionary itemsDictionary = (TaskInventoryDictionary)part.TaskInventory.Clone();
4117 4314
4118 foreach (TaskInventoryItem item in itemsDictionary.Values) 4315 foreach (TaskInventoryItem item in itemsDictionary.Values)
@@ -4327,17 +4524,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4327 4524
4328 m_host.AddScriptLPS(1); 4525 m_host.AddScriptLPS(1);
4329 4526
4330 lock (m_host.TaskInventory) 4527 m_host.TaskInventory.LockItemsForRead(true);
4528 foreach (TaskInventoryItem item in m_host.TaskInventory.Values)
4331 { 4529 {
4332 foreach (TaskInventoryItem item in m_host.TaskInventory.Values) 4530 if (item.Type == 10 && item.ItemID == m_itemID)
4333 { 4531 {
4334 if (item.Type == 10 && item.ItemID == m_itemID) 4532 result = item.Name!=null?item.Name:String.Empty;
4335 { 4533 break;
4336 result = item.Name != null ? item.Name : String.Empty;
4337 break;
4338 }
4339 } 4534 }
4340 } 4535 }
4536 m_host.TaskInventory.LockItemsForRead(false);
4341 4537
4342 return result; 4538 return result;
4343 } 4539 }
@@ -4490,23 +4686,24 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4490 { 4686 {
4491 m_host.AddScriptLPS(1); 4687 m_host.AddScriptLPS(1);
4492 4688
4493 lock (m_host.TaskInventory) 4689 m_host.TaskInventory.LockItemsForRead(true);
4690 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
4494 { 4691 {
4495 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 4692 if (inv.Value.Name == name)
4496 { 4693 {
4497 if (inv.Value.Name == name) 4694 if ((inv.Value.CurrentPermissions & (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify)) == (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify))
4498 { 4695 {
4499 if ((inv.Value.CurrentPermissions & (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify)) == (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify)) 4696 m_host.TaskInventory.LockItemsForRead(false);
4500 { 4697 return inv.Value.AssetID.ToString();
4501 return inv.Value.AssetID.ToString(); 4698 }
4502 } 4699 else
4503 else 4700 {
4504 { 4701 m_host.TaskInventory.LockItemsForRead(false);
4505 return UUID.Zero.ToString(); 4702 return UUID.Zero.ToString();
4506 }
4507 } 4703 }
4508 } 4704 }
4509 } 4705 }
4706 m_host.TaskInventory.LockItemsForRead(false);
4510 4707
4511 return UUID.Zero.ToString(); 4708 return UUID.Zero.ToString();
4512 } 4709 }
@@ -6059,14 +6256,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6059 6256
6060 protected UUID GetTaskInventoryItem(string name) 6257 protected UUID GetTaskInventoryItem(string name)
6061 { 6258 {
6062 lock (m_host.TaskInventory) 6259 m_host.TaskInventory.LockItemsForRead(true);
6260 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
6063 { 6261 {
6064 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 6262 if (inv.Value.Name == name)
6065 { 6263 {
6066 if (inv.Value.Name == name) 6264 m_host.TaskInventory.LockItemsForRead(false);
6067 return inv.Key; 6265 return inv.Key;
6068 } 6266 }
6069 } 6267 }
6268 m_host.TaskInventory.LockItemsForRead(false);
6070 6269
6071 return UUID.Zero; 6270 return UUID.Zero;
6072 } 6271 }
@@ -6394,22 +6593,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6394 } 6593 }
6395 6594
6396 // copy the first script found with this inventory name 6595 // copy the first script found with this inventory name
6397 lock (m_host.TaskInventory) 6596 m_host.TaskInventory.LockItemsForRead(true);
6597 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
6398 { 6598 {
6399 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 6599 if (inv.Value.Name == name)
6400 { 6600 {
6401 if (inv.Value.Name == name) 6601 // make sure the object is a script
6602 if (10 == inv.Value.Type)
6402 { 6603 {
6403 // make sure the object is a script 6604 found = true;
6404 if (10 == inv.Value.Type) 6605 srcId = inv.Key;
6405 { 6606 break;
6406 found = true;
6407 srcId = inv.Key;
6408 break;
6409 }
6410 } 6607 }
6411 } 6608 }
6412 } 6609 }
6610 m_host.TaskInventory.LockItemsForRead(false);
6413 6611
6414 if (!found) 6612 if (!found)
6415 { 6613 {
@@ -6491,8 +6689,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6491 } 6689 }
6492 6690
6493 protected ObjectShapePacket.ObjectDataBlock SetPrimitiveBlockShapeParams(SceneObjectPart part, int holeshape, LSL_Vector cut, float hollow, LSL_Vector twist) 6691 protected ObjectShapePacket.ObjectDataBlock SetPrimitiveBlockShapeParams(SceneObjectPart part, int holeshape, LSL_Vector cut, float hollow, LSL_Vector twist)
6494 { 6692 {
6495 ObjectShapePacket.ObjectDataBlock shapeBlock = new ObjectShapePacket.ObjectDataBlock(); 6693 ObjectShapePacket.ObjectDataBlock shapeBlock = new ObjectShapePacket.ObjectDataBlock();
6694 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
6695 return shapeBlock;
6496 6696
6497 if (holeshape != (int)ScriptBaseClass.PRIM_HOLE_DEFAULT && 6697 if (holeshape != (int)ScriptBaseClass.PRIM_HOLE_DEFAULT &&
6498 holeshape != (int)ScriptBaseClass.PRIM_HOLE_CIRCLE && 6698 holeshape != (int)ScriptBaseClass.PRIM_HOLE_CIRCLE &&
@@ -6562,7 +6762,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6562 } 6762 }
6563 6763
6564 protected void SetPrimitiveShapeParams(SceneObjectPart part, int holeshape, LSL_Vector cut, float hollow, LSL_Vector twist, LSL_Vector taper_b, LSL_Vector topshear, byte fudge) 6764 protected void SetPrimitiveShapeParams(SceneObjectPart part, int holeshape, LSL_Vector cut, float hollow, LSL_Vector twist, LSL_Vector taper_b, LSL_Vector topshear, byte fudge)
6565 { 6765 {
6766 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
6767 return;
6768
6566 ObjectShapePacket.ObjectDataBlock shapeBlock; 6769 ObjectShapePacket.ObjectDataBlock shapeBlock;
6567 6770
6568 shapeBlock = SetPrimitiveBlockShapeParams(part, holeshape, cut, hollow, twist); 6771 shapeBlock = SetPrimitiveBlockShapeParams(part, holeshape, cut, hollow, twist);
@@ -6611,7 +6814,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6611 } 6814 }
6612 6815
6613 protected void SetPrimitiveShapeParams(SceneObjectPart part, int holeshape, LSL_Vector cut, float hollow, LSL_Vector twist, LSL_Vector dimple, byte fudge) 6816 protected void SetPrimitiveShapeParams(SceneObjectPart part, int holeshape, LSL_Vector cut, float hollow, LSL_Vector twist, LSL_Vector dimple, byte fudge)
6614 { 6817 {
6818 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
6819 return;
6820
6615 ObjectShapePacket.ObjectDataBlock shapeBlock; 6821 ObjectShapePacket.ObjectDataBlock shapeBlock;
6616 6822
6617 shapeBlock = SetPrimitiveBlockShapeParams(part, holeshape, cut, hollow, twist); 6823 shapeBlock = SetPrimitiveBlockShapeParams(part, holeshape, cut, hollow, twist);
@@ -6653,7 +6859,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6653 } 6859 }
6654 6860
6655 protected void SetPrimitiveShapeParams(SceneObjectPart part, int holeshape, LSL_Vector cut, float hollow, LSL_Vector twist, LSL_Vector holesize, LSL_Vector topshear, LSL_Vector profilecut, LSL_Vector taper_a, float revolutions, float radiusoffset, float skew, byte fudge) 6861 protected void SetPrimitiveShapeParams(SceneObjectPart part, int holeshape, LSL_Vector cut, float hollow, LSL_Vector twist, LSL_Vector holesize, LSL_Vector topshear, LSL_Vector profilecut, LSL_Vector taper_a, float revolutions, float radiusoffset, float skew, byte fudge)
6656 { 6862 {
6863 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
6864 return;
6865
6657 ObjectShapePacket.ObjectDataBlock shapeBlock; 6866 ObjectShapePacket.ObjectDataBlock shapeBlock;
6658 6867
6659 shapeBlock = SetPrimitiveBlockShapeParams(part, holeshape, cut, hollow, twist); 6868 shapeBlock = SetPrimitiveBlockShapeParams(part, holeshape, cut, hollow, twist);
@@ -6774,7 +6983,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6774 } 6983 }
6775 6984
6776 protected void SetPrimitiveShapeParams(SceneObjectPart part, string map, int type) 6985 protected void SetPrimitiveShapeParams(SceneObjectPart part, string map, int type)
6777 { 6986 {
6987 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
6988 return;
6989
6778 ObjectShapePacket.ObjectDataBlock shapeBlock = new ObjectShapePacket.ObjectDataBlock(); 6990 ObjectShapePacket.ObjectDataBlock shapeBlock = new ObjectShapePacket.ObjectDataBlock();
6779 UUID sculptId; 6991 UUID sculptId;
6780 6992
@@ -6808,14 +7020,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6808 } 7020 }
6809 7021
6810 public void llSetPrimitiveParams(LSL_List rules) 7022 public void llSetPrimitiveParams(LSL_List rules)
6811 { 7023 {
6812 m_host.AddScriptLPS(1); 7024 m_host.AddScriptLPS(1);
6813 SetPrimParams(m_host, rules); 7025 SetPrimParams(m_host, rules);
6814 } 7026 }
6815 7027
6816 public void llSetLinkPrimitiveParams(int linknumber, LSL_List rules) 7028 public void llSetLinkPrimitiveParams(int linknumber, LSL_List rules)
6817 { 7029 {
6818 m_host.AddScriptLPS(1); 7030 m_host.AddScriptLPS(1);
6819 7031
6820 List<SceneObjectPart> parts = GetLinkParts(linknumber); 7032 List<SceneObjectPart> parts = GetLinkParts(linknumber);
6821 7033
@@ -6829,7 +7041,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6829 } 7041 }
6830 7042
6831 protected void SetPrimParams(SceneObjectPart part, LSL_List rules) 7043 protected void SetPrimParams(SceneObjectPart part, LSL_List rules)
6832 { 7044 {
7045 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
7046 return;
7047
6833 int idx = 0; 7048 int idx = 0;
6834 7049
6835 while (idx < rules.Length) 7050 while (idx < rules.Length)
@@ -7660,25 +7875,96 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7660 } 7875 }
7661 break; 7876 break;
7662 7877
7663 case (int)ScriptBaseClass.PRIM_BUMP_SHINY: 7878 case (int)ScriptBaseClass.PRIM_BUMP_SHINY:
7664 // TODO-------------- 7879 if (remain < 1)
7665 if (remain < 1) 7880 return res;
7666 return res; 7881 face = (int)rules.GetLSLIntegerItem(idx++);
7667 7882
7668 face=(int)rules.GetLSLIntegerItem(idx++); 7883 tex = part.Shape.Textures;
7669 7884 int shiny;
7670 res.Add(new LSL_Integer(0)); 7885 if (face == ScriptBaseClass.ALL_SIDES)
7671 res.Add(new LSL_Integer(0)); 7886 {
7887 for (face = 0; face < GetNumberOfSides(part); face++)
7888 {
7889 Shininess shinyness = tex.GetFace((uint)face).Shiny;
7890 if (shinyness == Shininess.High)
7891 {
7892 shiny = ScriptBaseClass.PRIM_SHINY_HIGH;
7893 }
7894 else if (shinyness == Shininess.Medium)
7895 {
7896 shiny = ScriptBaseClass.PRIM_SHINY_MEDIUM;
7897 }
7898 else if (shinyness == Shininess.Low)
7899 {
7900 shiny = ScriptBaseClass.PRIM_SHINY_LOW;
7901 }
7902 else
7903 {
7904 shiny = ScriptBaseClass.PRIM_SHINY_NONE;
7905 }
7906 res.Add(new LSL_Integer(shiny));
7907 res.Add(new LSL_Integer((int)tex.GetFace((uint)face).Bump));
7908 }
7909 }
7910 else
7911 {
7912 Shininess shinyness = tex.GetFace((uint)face).Shiny;
7913 if (shinyness == Shininess.High)
7914 {
7915 shiny = ScriptBaseClass.PRIM_SHINY_HIGH;
7916 }
7917 else if (shinyness == Shininess.Medium)
7918 {
7919 shiny = ScriptBaseClass.PRIM_SHINY_MEDIUM;
7920 }
7921 else if (shinyness == Shininess.Low)
7922 {
7923 shiny = ScriptBaseClass.PRIM_SHINY_LOW;
7924 }
7925 else
7926 {
7927 shiny = ScriptBaseClass.PRIM_SHINY_NONE;
7928 }
7929 res.Add(new LSL_Integer(shiny));
7930 res.Add(new LSL_Integer((int)tex.GetFace((uint)face).Bump));
7931 }
7672 break; 7932 break;
7673 7933
7674 case (int)ScriptBaseClass.PRIM_FULLBRIGHT: 7934 case (int)ScriptBaseClass.PRIM_FULLBRIGHT:
7675 // TODO-------------- 7935 if (remain < 1)
7676 if (remain < 1) 7936 return res;
7677 return res; 7937 face = (int)rules.GetLSLIntegerItem(idx++);
7678 7938
7679 face=(int)rules.GetLSLIntegerItem(idx++); 7939 tex = part.Shape.Textures;
7680 7940 int fullbright;
7681 res.Add(new LSL_Integer(0)); 7941 if (face == ScriptBaseClass.ALL_SIDES)
7942 {
7943 for (face = 0; face < GetNumberOfSides(part); face++)
7944 {
7945 if (tex.GetFace((uint)face).Fullbright == true)
7946 {
7947 fullbright = ScriptBaseClass.TRUE;
7948 }
7949 else
7950 {
7951 fullbright = ScriptBaseClass.FALSE;
7952 }
7953 res.Add(new LSL_Integer(fullbright));
7954 }
7955 }
7956 else
7957 {
7958 if (tex.GetFace((uint)face).Fullbright == true)
7959 {
7960 fullbright = ScriptBaseClass.TRUE;
7961 }
7962 else
7963 {
7964 fullbright = ScriptBaseClass.FALSE;
7965 }
7966 res.Add(new LSL_Integer(fullbright));
7967 }
7682 break; 7968 break;
7683 7969
7684 case (int)ScriptBaseClass.PRIM_FLEXIBLE: 7970 case (int)ScriptBaseClass.PRIM_FLEXIBLE:
@@ -7699,14 +7985,37 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7699 break; 7985 break;
7700 7986
7701 case (int)ScriptBaseClass.PRIM_TEXGEN: 7987 case (int)ScriptBaseClass.PRIM_TEXGEN:
7702 // TODO-------------- 7988 // (PRIM_TEXGEN_DEFAULT, PRIM_TEXGEN_PLANAR)
7703 // (PRIM_TEXGEN_DEFAULT, PRIM_TEXGEN_PLANAR) 7989 if (remain < 1)
7704 if (remain < 1) 7990 return res;
7705 return res; 7991 face = (int)rules.GetLSLIntegerItem(idx++);
7706 7992
7707 face=(int)rules.GetLSLIntegerItem(idx++); 7993 tex = part.Shape.Textures;
7708 7994 if (face == ScriptBaseClass.ALL_SIDES)
7709 res.Add(new LSL_Integer(0)); 7995 {
7996 for (face = 0; face < GetNumberOfSides(part); face++)
7997 {
7998 if (tex.GetFace((uint)face).TexMapType == MappingType.Planar)
7999 {
8000 res.Add(new LSL_Integer(ScriptBaseClass.PRIM_TEXGEN_PLANAR));
8001 }
8002 else
8003 {
8004 res.Add(new LSL_Integer(ScriptBaseClass.PRIM_TEXGEN_DEFAULT));
8005 }
8006 }
8007 }
8008 else
8009 {
8010 if (tex.GetFace((uint)face).TexMapType == MappingType.Planar)
8011 {
8012 res.Add(new LSL_Integer(ScriptBaseClass.PRIM_TEXGEN_PLANAR));
8013 }
8014 else
8015 {
8016 res.Add(new LSL_Integer(ScriptBaseClass.PRIM_TEXGEN_DEFAULT));
8017 }
8018 }
7710 break; 8019 break;
7711 8020
7712 case (int)ScriptBaseClass.PRIM_POINT_LIGHT: 8021 case (int)ScriptBaseClass.PRIM_POINT_LIGHT:
@@ -7724,14 +8033,26 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7724 res.Add(new LSL_Float(shape.LightFalloff)); // falloff 8033 res.Add(new LSL_Float(shape.LightFalloff)); // falloff
7725 break; 8034 break;
7726 8035
7727 case (int)ScriptBaseClass.PRIM_GLOW: 8036 case (int)ScriptBaseClass.PRIM_GLOW:
7728 // TODO-------------- 8037 if (remain < 1)
7729 if (remain < 1)
7730 return res; 8038 return res;
7731 8039 face = (int)rules.GetLSLIntegerItem(idx++);
7732 face=(int)rules.GetLSLIntegerItem(idx++); 8040
7733 8041 tex = part.Shape.Textures;
7734 res.Add(new LSL_Float(0)); 8042 float primglow;
8043 if (face == ScriptBaseClass.ALL_SIDES)
8044 {
8045 for (face = 0; face < GetNumberOfSides(part); face++)
8046 {
8047 primglow = tex.GetFace((uint)face).Glow;
8048 res.Add(new LSL_Float(primglow));
8049 }
8050 }
8051 else
8052 {
8053 primglow = tex.GetFace((uint)face).Glow;
8054 res.Add(new LSL_Float(primglow));
8055 }
7735 break; 8056 break;
7736 case (int)ScriptBaseClass.PRIM_TEXT: 8057 case (int)ScriptBaseClass.PRIM_TEXT:
7737 Color4 textColor = part.GetTextColor(); 8058 Color4 textColor = part.GetTextColor();
@@ -8268,28 +8589,28 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8268 { 8589 {
8269 m_host.AddScriptLPS(1); 8590 m_host.AddScriptLPS(1);
8270 8591
8271 lock (m_host.TaskInventory) 8592 m_host.TaskInventory.LockItemsForRead(true);
8593 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
8272 { 8594 {
8273 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 8595 if (inv.Value.Name == item)
8274 { 8596 {
8275 if (inv.Value.Name == item) 8597 m_host.TaskInventory.LockItemsForRead(false);
8598 switch (mask)
8276 { 8599 {
8277 switch (mask) 8600 case 0:
8278 { 8601 return (int)inv.Value.BasePermissions;
8279 case 0: 8602 case 1:
8280 return (int)inv.Value.BasePermissions; 8603 return (int)inv.Value.CurrentPermissions;
8281 case 1: 8604 case 2:
8282 return (int)inv.Value.CurrentPermissions; 8605 return (int)inv.Value.GroupPermissions;
8283 case 2: 8606 case 3:
8284 return (int)inv.Value.GroupPermissions; 8607 return (int)inv.Value.EveryonePermissions;
8285 case 3: 8608 case 4:
8286 return (int)inv.Value.EveryonePermissions; 8609 return (int)inv.Value.NextPermissions;
8287 case 4:
8288 return (int)inv.Value.NextPermissions;
8289 }
8290 } 8610 }
8291 } 8611 }
8292 } 8612 }
8613 m_host.TaskInventory.LockItemsForRead(false);
8293 8614
8294 return -1; 8615 return -1;
8295 } 8616 }
@@ -8336,16 +8657,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8336 { 8657 {
8337 m_host.AddScriptLPS(1); 8658 m_host.AddScriptLPS(1);
8338 8659
8339 lock (m_host.TaskInventory) 8660 m_host.TaskInventory.LockItemsForRead(true);
8661 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
8340 { 8662 {
8341 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 8663 if (inv.Value.Name == item)
8342 { 8664 {
8343 if (inv.Value.Name == item) 8665 m_host.TaskInventory.LockItemsForRead(false);
8344 { 8666 return inv.Value.CreatorID.ToString();
8345 return inv.Value.CreatorID.ToString();
8346 }
8347 } 8667 }
8348 } 8668 }
8669 m_host.TaskInventory.LockItemsForRead(false);
8349 8670
8350 llSay(0, "No item name '" + item + "'"); 8671 llSay(0, "No item name '" + item + "'");
8351 8672
@@ -8874,16 +9195,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8874 { 9195 {
8875 m_host.AddScriptLPS(1); 9196 m_host.AddScriptLPS(1);
8876 9197
8877 lock (m_host.TaskInventory) 9198 m_host.TaskInventory.LockItemsForRead(true);
9199 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
8878 { 9200 {
8879 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 9201 if (inv.Value.Name == name)
8880 { 9202 {
8881 if (inv.Value.Name == name) 9203 m_host.TaskInventory.LockItemsForRead(false);
8882 { 9204 return inv.Value.Type;
8883 return inv.Value.Type;
8884 }
8885 } 9205 }
8886 } 9206 }
9207 m_host.TaskInventory.LockItemsForRead(false);
8887 9208
8888 return -1; 9209 return -1;
8889 } 9210 }
@@ -8893,16 +9214,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8893 m_host.AddScriptLPS(1); 9214 m_host.AddScriptLPS(1);
8894 9215
8895 if (quick_pay_buttons.Data.Length < 4) 9216 if (quick_pay_buttons.Data.Length < 4)
8896 { 9217 {
8897 LSLError("List must have at least 4 elements"); 9218 int x;
8898 return; 9219 for (x=quick_pay_buttons.Data.Length; x<= 4; x++)
9220 {
9221 quick_pay_buttons.Add(ScriptBaseClass.PAY_HIDE);
9222 }
8899 } 9223 }
8900 m_host.ParentGroup.RootPart.PayPrice[0]=price; 9224 int[] nPrice = new int[5];
8901 9225 nPrice[0]=price;
8902 m_host.ParentGroup.RootPart.PayPrice[1]=(LSL_Integer)quick_pay_buttons.Data[0]; 9226 nPrice[1] = (LSL_Integer)quick_pay_buttons.Data[0];
8903 m_host.ParentGroup.RootPart.PayPrice[2]=(LSL_Integer)quick_pay_buttons.Data[1]; 9227 nPrice[2] = (LSL_Integer)quick_pay_buttons.Data[1];
8904 m_host.ParentGroup.RootPart.PayPrice[3]=(LSL_Integer)quick_pay_buttons.Data[2]; 9228 nPrice[3] = (LSL_Integer)quick_pay_buttons.Data[2];
8905 m_host.ParentGroup.RootPart.PayPrice[4]=(LSL_Integer)quick_pay_buttons.Data[3]; 9229 nPrice[4] = (LSL_Integer)quick_pay_buttons.Data[3];
9230 m_host.ParentGroup.RootPart.PayPrice = nPrice;
8906 m_host.ParentGroup.HasGroupChanged = true; 9231 m_host.ParentGroup.HasGroupChanged = true;
8907 } 9232 }
8908 9233
@@ -8914,17 +9239,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8914 if (invItemID == UUID.Zero) 9239 if (invItemID == UUID.Zero)
8915 return new LSL_Vector(); 9240 return new LSL_Vector();
8916 9241
8917 lock (m_host.TaskInventory) 9242 m_host.TaskInventory.LockItemsForRead(true);
9243 if (m_host.TaskInventory[invItemID].PermsGranter == UUID.Zero)
8918 { 9244 {
8919 if (m_host.TaskInventory[invItemID].PermsGranter == UUID.Zero) 9245 m_host.TaskInventory.LockItemsForRead(false);
8920 return new LSL_Vector(); 9246 return new LSL_Vector();
9247 }
8921 9248
8922 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0) 9249 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0)
8923 { 9250 {
8924 ShoutError("No permissions to track the camera"); 9251 ShoutError("No permissions to track the camera");
8925 return new LSL_Vector(); 9252 m_host.TaskInventory.LockItemsForRead(false);
8926 } 9253 return new LSL_Vector();
8927 } 9254 }
9255 m_host.TaskInventory.LockItemsForRead(false);
8928 9256
8929 ScenePresence presence = World.GetScenePresence(m_host.OwnerID); 9257 ScenePresence presence = World.GetScenePresence(m_host.OwnerID);
8930 if (presence != null) 9258 if (presence != null)
@@ -8942,17 +9270,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8942 if (invItemID == UUID.Zero) 9270 if (invItemID == UUID.Zero)
8943 return new LSL_Rotation(); 9271 return new LSL_Rotation();
8944 9272
8945 lock (m_host.TaskInventory) 9273 m_host.TaskInventory.LockItemsForRead(true);
9274 if (m_host.TaskInventory[invItemID].PermsGranter == UUID.Zero)
8946 { 9275 {
8947 if (m_host.TaskInventory[invItemID].PermsGranter == UUID.Zero) 9276 m_host.TaskInventory.LockItemsForRead(false);
8948 return new LSL_Rotation(); 9277 return new LSL_Rotation();
8949 9278 }
8950 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0) 9279 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0)
8951 { 9280 {
8952 ShoutError("No permissions to track the camera"); 9281 ShoutError("No permissions to track the camera");
8953 return new LSL_Rotation(); 9282 m_host.TaskInventory.LockItemsForRead(false);
8954 } 9283 return new LSL_Rotation();
8955 } 9284 }
9285 m_host.TaskInventory.LockItemsForRead(false);
8956 9286
8957 ScenePresence presence = World.GetScenePresence(m_host.OwnerID); 9287 ScenePresence presence = World.GetScenePresence(m_host.OwnerID);
8958 if (presence != null) 9288 if (presence != null)
@@ -9102,14 +9432,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
9102 if (objectID == UUID.Zero) return; 9432 if (objectID == UUID.Zero) return;
9103 9433
9104 UUID agentID; 9434 UUID agentID;
9105 lock (m_host.TaskInventory) 9435 m_host.TaskInventory.LockItemsForRead(true);
9106 { 9436 // we need the permission first, to know which avatar we want to set the camera for
9107 // we need the permission first, to know which avatar we want to set the camera for 9437 agentID = m_host.TaskInventory[invItemID].PermsGranter;
9108 agentID = m_host.TaskInventory[invItemID].PermsGranter;
9109 9438
9110 if (agentID == UUID.Zero) return; 9439 if (agentID == UUID.Zero)
9111 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0) return; 9440 {
9441 m_host.TaskInventory.LockItemsForRead(false);
9442 return;
9443 }
9444 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0)
9445 {
9446 m_host.TaskInventory.LockItemsForRead(false);
9447 return;
9112 } 9448 }
9449 m_host.TaskInventory.LockItemsForRead(false);
9113 9450
9114 ScenePresence presence = World.GetScenePresence(agentID); 9451 ScenePresence presence = World.GetScenePresence(agentID);
9115 9452
@@ -9159,12 +9496,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
9159 9496
9160 // we need the permission first, to know which avatar we want to clear the camera for 9497 // we need the permission first, to know which avatar we want to clear the camera for
9161 UUID agentID; 9498 UUID agentID;
9162 lock (m_host.TaskInventory) 9499 m_host.TaskInventory.LockItemsForRead(true);
9500 agentID = m_host.TaskInventory[invItemID].PermsGranter;
9501 if (agentID == UUID.Zero)
9163 { 9502 {
9164 agentID = m_host.TaskInventory[invItemID].PermsGranter; 9503 m_host.TaskInventory.LockItemsForRead(false);
9165 if (agentID == UUID.Zero) return; 9504 return;
9166 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0) return;
9167 } 9505 }
9506 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0)
9507 {
9508 m_host.TaskInventory.LockItemsForRead(false);
9509 return;
9510 }
9511 m_host.TaskInventory.LockItemsForRead(false);
9168 9512
9169 ScenePresence presence = World.GetScenePresence(agentID); 9513 ScenePresence presence = World.GetScenePresence(agentID);
9170 9514
@@ -9621,15 +9965,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
9621 9965
9622 internal UUID ScriptByName(string name) 9966 internal UUID ScriptByName(string name)
9623 { 9967 {
9624 lock (m_host.TaskInventory) 9968 m_host.TaskInventory.LockItemsForRead(true);
9969
9970 foreach (TaskInventoryItem item in m_host.TaskInventory.Values)
9625 { 9971 {
9626 foreach (TaskInventoryItem item in m_host.TaskInventory.Values) 9972 if (item.Type == 10 && item.Name == name)
9627 { 9973 {
9628 if (item.Type == 10 && item.Name == name) 9974 m_host.TaskInventory.LockItemsForRead(false);
9629 return item.ItemID; 9975 return item.ItemID;
9630 } 9976 }
9631 } 9977 }
9632 9978
9979 m_host.TaskInventory.LockItemsForRead(false);
9980
9633 return UUID.Zero; 9981 return UUID.Zero;
9634 } 9982 }
9635 9983
@@ -9670,6 +10018,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
9670 { 10018 {
9671 m_host.AddScriptLPS(1); 10019 m_host.AddScriptLPS(1);
9672 10020
10021 //Clone is thread safe
9673 TaskInventoryDictionary itemsDictionary = (TaskInventoryDictionary)m_host.TaskInventory.Clone(); 10022 TaskInventoryDictionary itemsDictionary = (TaskInventoryDictionary)m_host.TaskInventory.Clone();
9674 10023
9675 UUID assetID = UUID.Zero; 10024 UUID assetID = UUID.Zero;
@@ -9732,6 +10081,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
9732 { 10081 {
9733 m_host.AddScriptLPS(1); 10082 m_host.AddScriptLPS(1);
9734 10083
10084 //Clone is thread safe
9735 TaskInventoryDictionary itemsDictionary = (TaskInventoryDictionary)m_host.TaskInventory.Clone(); 10085 TaskInventoryDictionary itemsDictionary = (TaskInventoryDictionary)m_host.TaskInventory.Clone();
9736 10086
9737 UUID assetID = UUID.Zero; 10087 UUID assetID = UUID.Zero;
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
index 85ee29d..845834e 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
@@ -718,18 +718,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
718 if (target != null) 718 if (target != null)
719 { 719 {
720 UUID animID=UUID.Zero; 720 UUID animID=UUID.Zero;
721 lock (m_host.TaskInventory) 721 m_host.TaskInventory.LockItemsForRead(true);
722 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
722 { 723 {
723 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 724 if (inv.Value.Name == animation)
724 { 725 {
725 if (inv.Value.Name == animation) 726 if (inv.Value.Type == (int)AssetType.Animation)
726 { 727 animID = inv.Value.AssetID;
727 if (inv.Value.Type == (int)AssetType.Animation) 728 continue;
728 animID = inv.Value.AssetID;
729 continue;
730 }
731 } 729 }
732 } 730 }
731 m_host.TaskInventory.LockItemsForRead(false);
733 if (animID == UUID.Zero) 732 if (animID == UUID.Zero)
734 target.Animator.AddAnimation(animation, m_host.UUID); 733 target.Animator.AddAnimation(animation, m_host.UUID);
735 else 734 else
@@ -751,18 +750,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
751 if (target != null) 750 if (target != null)
752 { 751 {
753 UUID animID=UUID.Zero; 752 UUID animID=UUID.Zero;
754 lock (m_host.TaskInventory) 753 m_host.TaskInventory.LockItemsForRead(true);
754 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
755 { 755 {
756 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 756 if (inv.Value.Name == animation)
757 { 757 {
758 if (inv.Value.Name == animation) 758 if (inv.Value.Type == (int)AssetType.Animation)
759 { 759 animID = inv.Value.AssetID;
760 if (inv.Value.Type == (int)AssetType.Animation) 760 continue;
761 animID = inv.Value.AssetID;
762 continue;
763 }
764 } 761 }
765 } 762 }
763 m_host.TaskInventory.LockItemsForRead(false);
766 764
767 if (animID == UUID.Zero) 765 if (animID == UUID.Zero)
768 target.Animator.RemoveAnimation(animation); 766 target.Animator.RemoveAnimation(animation);
@@ -1531,6 +1529,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1531 1529
1532 if (!UUID.TryParse(name, out assetID)) 1530 if (!UUID.TryParse(name, out assetID))
1533 { 1531 {
1532 m_host.TaskInventory.LockItemsForRead(true);
1534 foreach (TaskInventoryItem item in m_host.TaskInventory.Values) 1533 foreach (TaskInventoryItem item in m_host.TaskInventory.Values)
1535 { 1534 {
1536 if (item.Type == 7 && item.Name == name) 1535 if (item.Type == 7 && item.Name == name)
@@ -1538,6 +1537,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1538 assetID = item.AssetID; 1537 assetID = item.AssetID;
1539 } 1538 }
1540 } 1539 }
1540 m_host.TaskInventory.LockItemsForRead(false);
1541 } 1541 }
1542 1542
1543 if (assetID == UUID.Zero) 1543 if (assetID == UUID.Zero)
@@ -1584,6 +1584,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1584 1584
1585 if (!UUID.TryParse(name, out assetID)) 1585 if (!UUID.TryParse(name, out assetID))
1586 { 1586 {
1587 m_host.TaskInventory.LockItemsForRead(true);
1587 foreach (TaskInventoryItem item in m_host.TaskInventory.Values) 1588 foreach (TaskInventoryItem item in m_host.TaskInventory.Values)
1588 { 1589 {
1589 if (item.Type == 7 && item.Name == name) 1590 if (item.Type == 7 && item.Name == name)
@@ -1591,6 +1592,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1591 assetID = item.AssetID; 1592 assetID = item.AssetID;
1592 } 1593 }
1593 } 1594 }
1595 m_host.TaskInventory.LockItemsForRead(false);
1594 } 1596 }
1595 1597
1596 if (assetID == UUID.Zero) 1598 if (assetID == UUID.Zero)
@@ -1641,6 +1643,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1641 1643
1642 if (!UUID.TryParse(name, out assetID)) 1644 if (!UUID.TryParse(name, out assetID))
1643 { 1645 {
1646 m_host.TaskInventory.LockItemsForRead(true);
1644 foreach (TaskInventoryItem item in m_host.TaskInventory.Values) 1647 foreach (TaskInventoryItem item in m_host.TaskInventory.Values)
1645 { 1648 {
1646 if (item.Type == 7 && item.Name == name) 1649 if (item.Type == 7 && item.Name == name)
@@ -1648,6 +1651,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1648 assetID = item.AssetID; 1651 assetID = item.AssetID;
1649 } 1652 }
1650 } 1653 }
1654 m_host.TaskInventory.LockItemsForRead(false);
1651 } 1655 }
1652 1656
1653 if (assetID == UUID.Zero) 1657 if (assetID == UUID.Zero)
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/Timer.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/Timer.cs
index eeb59d9..2fd33fe 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/Timer.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/Timer.cs
@@ -109,25 +109,27 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
109 if (Timers.Count == 0) 109 if (Timers.Count == 0)
110 return; 110 return;
111 111
112 Dictionary<string, TimerClass>.ValueCollection tvals;
112 lock (TimerListLock) 113 lock (TimerListLock)
113 { 114 {
114 // Go through all timers 115 // Go through all timers
115 Dictionary<string, TimerClass>.ValueCollection tvals = Timers.Values; 116 tvals = Timers.Values;
116 foreach (TimerClass ts in tvals) 117 }
118
119 foreach (TimerClass ts in tvals)
120 {
121 // Time has passed?
122 if (ts.next < DateTime.Now.Ticks)
117 { 123 {
118 // Time has passed? 124 //m_log.Debug("Time has passed: Now: " + DateTime.Now.Ticks + ", Passed: " + ts.next);
119 if (ts.next < DateTime.Now.Ticks) 125 // Add it to queue
120 { 126 m_CmdManager.m_ScriptEngine.PostScriptEvent(ts.itemID,
121 //m_log.Debug("Time has passed: Now: " + DateTime.Now.Ticks + ", Passed: " + ts.next); 127 new EventParams("timer", new Object[0],
122 // Add it to queue 128 new DetectParams[0]));
123 m_CmdManager.m_ScriptEngine.PostScriptEvent(ts.itemID, 129 // set next interval
124 new EventParams("timer", new Object[0], 130
125 new DetectParams[0])); 131 //ts.next = DateTime.Now.ToUniversalTime().AddSeconds(ts.interval);
126 // set next interval 132 ts.next = DateTime.Now.Ticks + ts.interval;
127
128 //ts.next = DateTime.Now.ToUniversalTime().AddSeconds(ts.interval);
129 ts.next = DateTime.Now.Ticks + ts.interval;
130 }
131 } 133 }
132 } 134 }
133 } 135 }
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ICM_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ICM_Api.cs
new file mode 100644
index 0000000..ef990a1
--- /dev/null
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ICM_Api.cs
@@ -0,0 +1,21 @@
1using System.Collections;
2using OpenSim.Region.ScriptEngine.Interfaces;
3
4using key = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLString;
5using rotation = OpenSim.Region.ScriptEngine.Shared.LSL_Types.Quaternion;
6using vector = OpenSim.Region.ScriptEngine.Shared.LSL_Types.Vector3;
7using LSL_List = OpenSim.Region.ScriptEngine.Shared.LSL_Types.list;
8using LSL_String = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLString;
9using LSL_Integer = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLInteger;
10using LSL_Float = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLFloat;
11
12namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
13{
14 public interface ICM_Api
15 {
16 // Windlight Functions
17 LSL_List cmGetWindlightScene(LSL_List rules);
18 int cmSetWindlightScene(LSL_List rules);
19 int cmSetWindlightSceneTargeted(LSL_List rules, key target);
20 }
21}
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs
index 60b8050..f5921e1 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs
@@ -80,7 +80,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
80 // Avatar Info Commands 80 // Avatar Info Commands
81 string osGetAgentIP(string agent); 81 string osGetAgentIP(string agent);
82 LSL_List osGetAgents(); 82 LSL_List osGetAgents();
83 83
84 // Teleport commands 84 // Teleport commands
85 void osTeleportAgent(string agent, string regionName, LSL_Types.Vector3 position, LSL_Types.Vector3 lookat); 85 void osTeleportAgent(string agent, string regionName, LSL_Types.Vector3 position, LSL_Types.Vector3 lookat);
86 void osTeleportAgent(string agent, int regionX, int regionY, LSL_Types.Vector3 position, LSL_Types.Vector3 lookat); 86 void osTeleportAgent(string agent, int regionX, int regionY, LSL_Types.Vector3 position, LSL_Types.Vector3 lookat);
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/CM_Constants.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/CM_Constants.cs
new file mode 100644
index 0000000..522c020
--- /dev/null
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/CM_Constants.cs
@@ -0,0 +1,77 @@
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 OpenSimulator 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
28using System;
29using vector = OpenSim.Region.ScriptEngine.Shared.LSL_Types.Vector3;
30using rotation = OpenSim.Region.ScriptEngine.Shared.LSL_Types.Quaternion;
31using LSLInteger = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLInteger;
32
33namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
34{
35 public partial class ScriptBaseClass
36 {
37 // Constants for cmWindlight*
38 public const int WL_WATER_COLOR = 0;
39 public const int WL_WATER_FOG_DENSITY_EXPONENT = 1;
40 public const int WL_UNDERWATER_FOG_MODIFIER = 2;
41 public const int WL_REFLECTION_WAVELET_SCALE = 3;
42 public const int WL_FRESNEL_SCALE = 4;
43 public const int WL_FRESNEL_OFFSET = 5;
44 public const int WL_REFRACT_SCALE_ABOVE = 6;
45 public const int WL_REFRACT_SCALE_BELOW = 7;
46 public const int WL_BLUR_MULTIPLIER = 8;
47 public const int WL_BIG_WAVE_DIRECTION = 9;
48 public const int WL_LITTLE_WAVE_DIRECTION = 10;
49 public const int WL_NORMAL_MAP_TEXTURE = 11;
50 public const int WL_HORIZON = 12;
51 public const int WL_HAZE_HORIZON = 13;
52 public const int WL_BLUE_DENSITY = 14;
53 public const int WL_HAZE_DENSITY = 15;
54 public const int WL_DENSITY_MULTIPLIER = 16;
55 public const int WL_DISTANCE_MULTIPLIER = 17;
56 public const int WL_MAX_ALTITUDE = 18;
57 public const int WL_SUN_MOON_COLOR = 19;
58 public const int WL_AMBIENT = 20;
59 public const int WL_EAST_ANGLE = 21;
60 public const int WL_SUN_GLOW_FOCUS = 22;
61 public const int WL_SUN_GLOW_SIZE = 23;
62 public const int WL_SCENE_GAMMA = 24;
63 public const int WL_STAR_BRIGHTNESS = 25;
64 public const int WL_CLOUD_COLOR = 26;
65 public const int WL_CLOUD_XY_DENSITY = 27;
66 public const int WL_CLOUD_COVERAGE = 28;
67 public const int WL_CLOUD_SCALE = 29;
68 public const int WL_CLOUD_DETAIL_XY_DENSITY = 30;
69 public const int WL_CLOUD_SCROLL_X = 31;
70 public const int WL_CLOUD_SCROLL_Y = 32;
71 public const int WL_CLOUD_SCROLL_Y_LOCK = 33;
72 public const int WL_CLOUD_SCROLL_X_LOCK = 34;
73 public const int WL_DRAW_CLASSIC_CLOUDS = 35;
74 public const int WL_SUN_MOON_POSITION = 36;
75
76 }
77}
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/CM_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/CM_Stub.cs
new file mode 100644
index 0000000..5bc3a88
--- /dev/null
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/CM_Stub.cs
@@ -0,0 +1,76 @@
1/*
2 * Copyright (c) Contributors, http://opensimulator.org/
3 * See CONTRIBUTORS.TXT for a full list of copyright holders.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the OpenSimulator 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
28using System;
29using System.Runtime.Remoting.Lifetime;
30using System.Threading;
31using System.Reflection;
32using System.Collections;
33using System.Collections.Generic;
34using OpenSim.Framework;
35using OpenSim.Region.Framework.Interfaces;
36using OpenSim.Region.ScriptEngine.Interfaces;
37using OpenSim.Region.ScriptEngine.Shared.Api.Interfaces;
38using integer = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLInteger;
39using vector = OpenSim.Region.ScriptEngine.Shared.LSL_Types.Vector3;
40using rotation = OpenSim.Region.ScriptEngine.Shared.LSL_Types.Quaternion;
41using key = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLString;
42using LSL_List = OpenSim.Region.ScriptEngine.Shared.LSL_Types.list;
43using LSL_String = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLString;
44using LSL_Float = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLFloat;
45using LSL_Integer = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLInteger;
46
47namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
48{
49 public partial class ScriptBaseClass : MarshalByRefObject
50 {
51 public ICM_Api m_CM_Functions;
52
53 public void ApiTypeCM(IScriptApi api)
54 {
55 if (!(api is ICM_Api))
56 return;
57
58 m_CM_Functions = (ICM_Api)api;
59 }
60
61 public LSL_List cmGetWindlightScene(LSL_List rules)
62 {
63 return m_CM_Functions.cmGetWindlightScene(rules);
64 }
65
66 public int cmSetWindlightScene(LSL_List rules)
67 {
68 return m_CM_Functions.cmSetWindlightScene(rules);
69 }
70
71 public int cmSetWindlightSceneTargeted(LSL_List rules, key target)
72 {
73 return m_CM_Functions.cmSetWindlightSceneTargeted(rules, target);
74 }
75 }
76}
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/Executor.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/Executor.cs
index 9615315..943d7a2 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/Executor.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/Executor.cs
@@ -27,6 +27,7 @@
27 27
28using System; 28using System;
29using System.Collections.Generic; 29using System.Collections.Generic;
30using System.Diagnostics; //for [DebuggerNonUserCode]
30using System.Reflection; 31using System.Reflection;
31using System.Runtime.Remoting.Lifetime; 32using System.Runtime.Remoting.Lifetime;
32using OpenSim.Region.ScriptEngine.Shared; 33using OpenSim.Region.ScriptEngine.Shared;
@@ -132,6 +133,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
132 return (eventFlags); 133 return (eventFlags);
133 } 134 }
134 135
136 [DebuggerNonUserCode]
135 public void ExecuteEvent(string state, string FunctionName, object[] args) 137 public void ExecuteEvent(string state, string FunctionName, object[] args)
136 { 138 {
137 // IMPORTANT: Types and MemberInfo-derived objects require a LOT of memory. 139 // IMPORTANT: Types and MemberInfo-derived objects require a LOT of memory.
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OpenSim.Region.ScriptEngine.Shared.Api.Runtime.mdp b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OpenSim.Region.ScriptEngine.Shared.Api.Runtime.mdp
index 98bbc68..23138ef 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OpenSim.Region.ScriptEngine.Shared.Api.Runtime.mdp
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OpenSim.Region.ScriptEngine.Shared.Api.Runtime.mdp
@@ -17,6 +17,8 @@
17 <excludeFiles /> 17 <excludeFiles />
18 </DeploymentInformation> 18 </DeploymentInformation>
19 <Contents> 19 <Contents>
20 <File name="./CM_Constants.cs" subtype="Code" buildaction="Compile" dependson="" data="" />
21 <File name="./CM_Stub.cs" subtype="Code" buildaction="Compile" dependson="" data="" />
20 <File name="./Executor.cs" subtype="Code" buildaction="Compile" dependson="" data="" /> 22 <File name="./Executor.cs" subtype="Code" buildaction="Compile" dependson="" data="" />
21 <File name="./LSL_Constants.cs" subtype="Code" buildaction="Compile" dependson="" data="" /> 23 <File name="./LSL_Constants.cs" subtype="Code" buildaction="Compile" dependson="" data="" />
22 <File name="./LSL_Stub.cs" subtype="Code" buildaction="Compile" dependson="" data="" /> 24 <File name="./LSL_Stub.cs" subtype="Code" buildaction="Compile" dependson="" data="" />
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/ScriptBase.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/ScriptBase.cs
index edbbc2a..b138da3 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/ScriptBase.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/ScriptBase.cs
@@ -33,6 +33,7 @@ using System.Threading;
33using System.Reflection; 33using System.Reflection;
34using System.Collections; 34using System.Collections;
35using System.Collections.Generic; 35using System.Collections.Generic;
36using System.Diagnostics; //for [DebuggerNonUserCode]
36using OpenSim.Region.ScriptEngine.Interfaces; 37using OpenSim.Region.ScriptEngine.Interfaces;
37using OpenSim.Region.ScriptEngine.Shared; 38using OpenSim.Region.ScriptEngine.Shared;
38using OpenSim.Region.ScriptEngine.Shared.Api.Runtime; 39using OpenSim.Region.ScriptEngine.Shared.Api.Runtime;
@@ -90,6 +91,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
90 return (int)m_Executor.GetStateEventFlags(state); 91 return (int)m_Executor.GetStateEventFlags(state);
91 } 92 }
92 93
94 [DebuggerNonUserCode]
93 public void ExecuteEvent(string state, string FunctionName, object[] args) 95 public void ExecuteEvent(string state, string FunctionName, object[] args)
94 { 96 {
95 m_Executor.ExecuteEvent(state, FunctionName, args); 97 m_Executor.ExecuteEvent(state, FunctionName, args);