aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/ScriptEngine/Shared
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/ScriptEngine/Shared')
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/CM_Api.cs473
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs732
-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.cs76
-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
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs261
12 files changed, 1288 insertions, 427 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..d4250c1
--- /dev/null
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/CM_Api.cs
@@ -0,0 +1,473 @@
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_AMBIENT:
248 idx++;
249 iQ = rules.GetQuaternionItem(idx);
250 wl.ambient = new Vector4((float)iQ.x, (float)iQ.y, (float)iQ.z, (float)iQ.s);
251 break;
252 case (int)ScriptBaseClass.WL_BIG_WAVE_DIRECTION:
253 idx++;
254 iV = rules.GetVector3Item(idx);
255 wl.bigWaveDirection = new Vector2((float)iV.x, (float)iV.y);
256 break;
257 case (int)ScriptBaseClass.WL_BLUE_DENSITY:
258 idx++;
259 iQ = rules.GetQuaternionItem(idx);
260 wl.blueDensity = new Vector4((float)iQ.x, (float)iQ.y, (float)iQ.z, (float)iQ.s);
261 break;
262 case (int)ScriptBaseClass.WL_BLUR_MULTIPLIER:
263 idx++;
264 wl.blurMultiplier = (float)rules.GetLSLFloatItem(idx);
265 break;
266 case (int)ScriptBaseClass.WL_CLOUD_COLOR:
267 idx++;
268 iQ = rules.GetQuaternionItem(idx);
269 wl.cloudColor = new Vector4((float)iQ.x, (float)iQ.y, (float)iQ.z, (float)iQ.s);
270 break;
271 case (int)ScriptBaseClass.WL_CLOUD_COVERAGE:
272 idx++;
273 wl.cloudCoverage = (float)rules.GetLSLFloatItem(idx);
274 break;
275 case (int)ScriptBaseClass.WL_CLOUD_DETAIL_XY_DENSITY:
276 idx++;
277 iV = rules.GetVector3Item(idx);
278 wl.cloudDetailXYDensity = new Vector3((float)iV.x, (float)iV.y, (float)iV.z);
279 break;
280 case (int)ScriptBaseClass.WL_CLOUD_SCALE:
281 idx++;
282 wl.cloudScale = (float)rules.GetLSLFloatItem(idx);
283 break;
284 case (int)ScriptBaseClass.WL_CLOUD_SCROLL_X:
285 idx++;
286 wl.cloudScrollX = (float)rules.GetLSLFloatItem(idx);
287 break;
288 case (int)ScriptBaseClass.WL_CLOUD_SCROLL_X_LOCK:
289 idx++;
290 wl.cloudScrollXLock = rules.GetLSLIntegerItem(idx).value == 1 ? true : false;
291 break;
292 case (int)ScriptBaseClass.WL_CLOUD_SCROLL_Y:
293 idx++;
294 wl.cloudScrollY = (float)rules.GetLSLFloatItem(idx);
295 break;
296 case (int)ScriptBaseClass.WL_CLOUD_SCROLL_Y_LOCK:
297 idx++;
298 wl.cloudScrollYLock = rules.GetLSLIntegerItem(idx).value == 1 ? true : false;
299 break;
300 case (int)ScriptBaseClass.WL_CLOUD_XY_DENSITY:
301 idx++;
302 iV = rules.GetVector3Item(idx);
303 wl.cloudDetailXYDensity = new Vector3((float)iV.x, (float)iV.y, (float)iV.z);
304 break;
305 case (int)ScriptBaseClass.WL_DENSITY_MULTIPLIER:
306 idx++;
307 wl.densityMultiplier = (float)rules.GetLSLFloatItem(idx);
308 break;
309 case (int)ScriptBaseClass.WL_DISTANCE_MULTIPLIER:
310 idx++;
311 wl.distanceMultiplier = (float)rules.GetLSLFloatItem(idx);
312 break;
313 case (int)ScriptBaseClass.WL_DRAW_CLASSIC_CLOUDS:
314 idx++;
315 wl.drawClassicClouds = rules.GetLSLIntegerItem(idx).value == 1 ? true : false;
316 break;
317 case (int)ScriptBaseClass.WL_EAST_ANGLE:
318 idx++;
319 wl.eastAngle = (float)rules.GetLSLFloatItem(idx);
320 break;
321 case (int)ScriptBaseClass.WL_FRESNEL_OFFSET:
322 idx++;
323 wl.fresnelOffset = (float)rules.GetLSLFloatItem(idx);
324 break;
325 case (int)ScriptBaseClass.WL_FRESNEL_SCALE:
326 idx++;
327 wl.fresnelScale = (float)rules.GetLSLFloatItem(idx);
328 break;
329 case (int)ScriptBaseClass.WL_HAZE_DENSITY:
330 idx++;
331 wl.hazeDensity = (float)rules.GetLSLFloatItem(idx);
332 break;
333 case (int)ScriptBaseClass.WL_HAZE_HORIZON:
334 idx++;
335 wl.hazeHorizon = (float)rules.GetLSLFloatItem(idx);
336 break;
337 case (int)ScriptBaseClass.WL_HORIZON:
338 idx++;
339 iQ = rules.GetQuaternionItem(idx);
340 wl.horizon = new Vector4((float)iQ.x, (float)iQ.y, (float)iQ.z, (float)iQ.s);
341 break;
342 case (int)ScriptBaseClass.WL_LITTLE_WAVE_DIRECTION:
343 idx++;
344 iV = rules.GetVector3Item(idx);
345 wl.littleWaveDirection = new Vector2((float)iV.x, (float)iV.y);
346 break;
347 case (int)ScriptBaseClass.WL_MAX_ALTITUDE:
348 idx++;
349 wl.maxAltitude = (ushort)rules.GetLSLIntegerItem(idx).value;
350 break;
351 case (int)ScriptBaseClass.WL_NORMAL_MAP_TEXTURE:
352 idx++;
353 wl.normalMapTexture = new UUID(rules.GetLSLStringItem(idx).m_string);
354 break;
355 case (int)ScriptBaseClass.WL_REFLECTION_WAVELET_SCALE:
356 idx++;
357 iV = rules.GetVector3Item(idx);
358 wl.reflectionWaveletScale = new Vector3((float)iV.x, (float)iV.y, (float)iV.z);
359 break;
360 case (int)ScriptBaseClass.WL_REFRACT_SCALE_ABOVE:
361 idx++;
362 wl.refractScaleAbove = (float)rules.GetLSLFloatItem(idx);
363 break;
364 case (int)ScriptBaseClass.WL_REFRACT_SCALE_BELOW:
365 idx++;
366 wl.refractScaleBelow = (float)rules.GetLSLFloatItem(idx);
367 break;
368 case (int)ScriptBaseClass.WL_SCENE_GAMMA:
369 idx++;
370 wl.sceneGamma = (float)rules.GetLSLFloatItem(idx);
371 break;
372 case (int)ScriptBaseClass.WL_STAR_BRIGHTNESS:
373 idx++;
374 wl.starBrightness = (float)rules.GetLSLFloatItem(idx);
375 break;
376 case (int)ScriptBaseClass.WL_SUN_GLOW_FOCUS:
377 idx++;
378 wl.sunGlowFocus = (float)rules.GetLSLFloatItem(idx);
379 break;
380 case (int)ScriptBaseClass.WL_SUN_GLOW_SIZE:
381 idx++;
382 wl.sunGlowSize = (float)rules.GetLSLFloatItem(idx);
383 break;
384 case (int)ScriptBaseClass.WL_SUN_MOON_COLOR:
385 idx++;
386 iQ = rules.GetQuaternionItem(idx);
387 wl.sunMoonColor = new Vector4((float)iQ.x, (float)iQ.y, (float)iQ.z, (float)iQ.s);
388 break;
389 case (int)ScriptBaseClass.WL_UNDERWATER_FOG_MODIFIER:
390 idx++;
391 wl.underwaterFogModifier = (float)rules.GetLSLFloatItem(idx);
392 break;
393 case (int)ScriptBaseClass.WL_WATER_COLOR:
394 idx++;
395 iV = rules.GetVector3Item(idx);
396 wl.waterColor = new Vector3((float)iV.x, (float)iV.y, (float)iV.z);
397 break;
398 case (int)ScriptBaseClass.WL_WATER_FOG_DENSITY_EXPONENT:
399 idx++;
400 wl.waterFogDensityExponent = (float)rules.GetLSLFloatItem(idx);
401 break;
402 }
403 idx++;
404 }
405 return wl;
406 }
407 /// <summary>
408 /// Set the current Windlight scene
409 /// </summary>
410 /// <param name="rules"></param>
411 /// <returns>success: true or false</returns>
412 public int cmSetWindlightScene(LSL_List rules)
413 {
414 if (!m_CMFunctionsEnabled)
415 {
416 CMShoutError("Careminster functions are not enabled.");
417 return 0;
418 }
419 if (!World.RegionInfo.EstateSettings.IsEstateManager(m_host.OwnerID) && World.GetScenePresence(m_host.OwnerID).GodLevel < 200)
420 {
421 CMShoutError("cmSetWindlightScene can only be used by estate managers or owners.");
422 return 0;
423 }
424 int success = 0;
425 m_host.AddScriptLPS(1);
426 if (Meta7WindlightModule.EnableWindlight)
427 {
428 RegionMeta7WindlightData wl = getWindlightProfileFromRules(rules);
429 m_host.ParentGroup.Scene.StoreWindlightProfile(wl);
430 success = 1;
431 }
432 else
433 {
434 CMShoutError("Windlight module is disabled");
435 return 0;
436 }
437 return success;
438 }
439 /// <summary>
440 /// Set the current Windlight scene to a target avatar
441 /// </summary>
442 /// <param name="rules"></param>
443 /// <returns>success: true or false</returns>
444 public int cmSetWindlightSceneTargeted(LSL_List rules, LSL_Key target)
445 {
446 if (!m_CMFunctionsEnabled)
447 {
448 CMShoutError("Careminster functions are not enabled.");
449 return 0;
450 }
451 if (!World.RegionInfo.EstateSettings.IsEstateManager(m_host.OwnerID) && World.GetScenePresence(m_host.OwnerID).GodLevel < 200)
452 {
453 CMShoutError("cmSetWindlightSceneTargeted can only be used by estate managers or owners.");
454 return 0;
455 }
456 int success = 0;
457 m_host.AddScriptLPS(1);
458 if (Meta7WindlightModule.EnableWindlight)
459 {
460 RegionMeta7WindlightData wl = getWindlightProfileFromRules(rules);
461 World.EventManager.TriggerOnSendNewWindlightProfileTargeted(wl, new UUID(target.m_string));
462 success = 1;
463 }
464 else
465 {
466 CMShoutError("Windlight module is disabled");
467 return 0;
468 }
469 return success;
470 }
471
472 }
473}
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 39b597e..1469e7e 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())
282 {
283 m_host.TaskInventory.LockItemsForRead(true);
284 unlock = true;
285 }
286 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
277 { 287 {
278 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 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);
@@ -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;
@@ -1275,7 +1346,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1275 } 1346 }
1276 1347
1277 protected void SetScale(SceneObjectPart part, LSL_Vector scale) 1348 protected void SetScale(SceneObjectPart part, LSL_Vector scale)
1278 { 1349 {
1279 // TODO: this needs to trigger a persistance save as well 1350 // TODO: this needs to trigger a persistance save as well
1280 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted) 1351 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
1281 return; 1352 return;
@@ -1334,7 +1405,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1334 } 1405 }
1335 1406
1336 protected void SetColor(SceneObjectPart part, LSL_Vector color, int face) 1407 protected void SetColor(SceneObjectPart part, LSL_Vector color, int face)
1337 { 1408 {
1409 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
1410 return;
1411
1338 Primitive.TextureEntry tex = part.Shape.Textures; 1412 Primitive.TextureEntry tex = part.Shape.Textures;
1339 Color4 texcolor; 1413 Color4 texcolor;
1340 if (face >= 0 && face < GetNumberOfSides(part)) 1414 if (face >= 0 && face < GetNumberOfSides(part))
@@ -1371,7 +1445,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1371 } 1445 }
1372 1446
1373 public void SetTexGen(SceneObjectPart part, int face,int style) 1447 public void SetTexGen(SceneObjectPart part, int face,int style)
1374 { 1448 {
1449 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
1450 return;
1451
1375 Primitive.TextureEntry tex = part.Shape.Textures; 1452 Primitive.TextureEntry tex = part.Shape.Textures;
1376 MappingType textype; 1453 MappingType textype;
1377 textype = MappingType.Default; 1454 textype = MappingType.Default;
@@ -1401,7 +1478,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1401 } 1478 }
1402 1479
1403 public void SetGlow(SceneObjectPart part, int face, float glow) 1480 public void SetGlow(SceneObjectPart part, int face, float glow)
1404 { 1481 {
1482 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
1483 return;
1484
1405 Primitive.TextureEntry tex = part.Shape.Textures; 1485 Primitive.TextureEntry tex = part.Shape.Textures;
1406 if (face >= 0 && face < GetNumberOfSides(part)) 1486 if (face >= 0 && face < GetNumberOfSides(part))
1407 { 1487 {
@@ -1426,7 +1506,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1426 } 1506 }
1427 1507
1428 public void SetShiny(SceneObjectPart part, int face, int shiny, Bumpiness bump) 1508 public void SetShiny(SceneObjectPart part, int face, int shiny, Bumpiness bump)
1429 { 1509 {
1510 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
1511 return;
1430 1512
1431 Shininess sval = new Shininess(); 1513 Shininess sval = new Shininess();
1432 1514
@@ -1476,7 +1558,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1476 } 1558 }
1477 1559
1478 public void SetFullBright(SceneObjectPart part, int face, bool bright) 1560 public void SetFullBright(SceneObjectPart part, int face, bool bright)
1479 { 1561 {
1562 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
1563 return;
1564
1480 Primitive.TextureEntry tex = part.Shape.Textures; 1565 Primitive.TextureEntry tex = part.Shape.Textures;
1481 if (face >= 0 && face < GetNumberOfSides(part)) 1566 if (face >= 0 && face < GetNumberOfSides(part))
1482 { 1567 {
@@ -1543,7 +1628,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1543 } 1628 }
1544 1629
1545 protected void SetAlpha(SceneObjectPart part, double alpha, int face) 1630 protected void SetAlpha(SceneObjectPart part, double alpha, int face)
1546 { 1631 {
1632 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
1633 return;
1634
1547 Primitive.TextureEntry tex = part.Shape.Textures; 1635 Primitive.TextureEntry tex = part.Shape.Textures;
1548 Color4 texcolor; 1636 Color4 texcolor;
1549 if (face >= 0 && face < GetNumberOfSides(part)) 1637 if (face >= 0 && face < GetNumberOfSides(part))
@@ -1588,8 +1676,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1588 /// <param name="Force"></param> 1676 /// <param name="Force"></param>
1589 protected void SetFlexi(SceneObjectPart part, bool flexi, int softness, float gravity, float friction, 1677 protected void SetFlexi(SceneObjectPart part, bool flexi, int softness, float gravity, float friction,
1590 float wind, float tension, LSL_Vector Force) 1678 float wind, float tension, LSL_Vector Force)
1591 { 1679 {
1592 if (part == null) 1680 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
1593 return; 1681 return;
1594 1682
1595 if (flexi) 1683 if (flexi)
@@ -1623,8 +1711,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1623 /// <param name="radius"></param> 1711 /// <param name="radius"></param>
1624 /// <param name="falloff"></param> 1712 /// <param name="falloff"></param>
1625 protected void SetPointLight(SceneObjectPart part, bool light, LSL_Vector color, float intensity, float radius, float falloff) 1713 protected void SetPointLight(SceneObjectPart part, bool light, LSL_Vector color, float intensity, float radius, float falloff)
1626 { 1714 {
1627 if (part == null) 1715 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
1628 return; 1716 return;
1629 1717
1630 if (light) 1718 if (light)
@@ -1709,7 +1797,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1709 } 1797 }
1710 1798
1711 protected void SetTexture(SceneObjectPart part, string texture, int face) 1799 protected void SetTexture(SceneObjectPart part, string texture, int face)
1712 { 1800 {
1801 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
1802 return;
1803
1713 UUID textureID=new UUID(); 1804 UUID textureID=new UUID();
1714 1805
1715 if (!UUID.TryParse(texture, out textureID)) 1806 if (!UUID.TryParse(texture, out textureID))
@@ -1754,7 +1845,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1754 } 1845 }
1755 1846
1756 protected void ScaleTexture(SceneObjectPart part, double u, double v, int face) 1847 protected void ScaleTexture(SceneObjectPart part, double u, double v, int face)
1757 { 1848 {
1849 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
1850 return;
1851
1758 Primitive.TextureEntry tex = part.Shape.Textures; 1852 Primitive.TextureEntry tex = part.Shape.Textures;
1759 if (face >= 0 && face < GetNumberOfSides(part)) 1853 if (face >= 0 && face < GetNumberOfSides(part))
1760 { 1854 {
@@ -1790,7 +1884,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1790 } 1884 }
1791 1885
1792 protected void OffsetTexture(SceneObjectPart part, double u, double v, int face) 1886 protected void OffsetTexture(SceneObjectPart part, double u, double v, int face)
1793 { 1887 {
1888 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
1889 return;
1890
1794 Primitive.TextureEntry tex = part.Shape.Textures; 1891 Primitive.TextureEntry tex = part.Shape.Textures;
1795 if (face >= 0 && face < GetNumberOfSides(part)) 1892 if (face >= 0 && face < GetNumberOfSides(part))
1796 { 1893 {
@@ -1826,7 +1923,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1826 } 1923 }
1827 1924
1828 protected void RotateTexture(SceneObjectPart part, double rotation, int face) 1925 protected void RotateTexture(SceneObjectPart part, double rotation, int face)
1829 { 1926 {
1927 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
1928 return;
1929
1830 Primitive.TextureEntry tex = part.Shape.Textures; 1930 Primitive.TextureEntry tex = part.Shape.Textures;
1831 if (face >= 0 && face < GetNumberOfSides(part)) 1931 if (face >= 0 && face < GetNumberOfSides(part))
1832 { 1932 {
@@ -1896,7 +1996,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1896 } 1996 }
1897 1997
1898 protected void SetPos(SceneObjectPart part, LSL_Vector targetPos) 1998 protected void SetPos(SceneObjectPart part, LSL_Vector targetPos)
1899 { 1999 {
2000 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
2001 return;
2002
1900 // Capped movemment if distance > 10m (http://wiki.secondlife.com/wiki/LlSetPos) 2003 // Capped movemment if distance > 10m (http://wiki.secondlife.com/wiki/LlSetPos)
1901 LSL_Vector currentPos = llGetLocalPos(); 2004 LSL_Vector currentPos = llGetLocalPos();
1902 2005
@@ -1990,7 +2093,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1990 } 2093 }
1991 2094
1992 protected void SetRot(SceneObjectPart part, Quaternion rot) 2095 protected void SetRot(SceneObjectPart part, Quaternion rot)
1993 { 2096 {
2097 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
2098 return;
2099
1994 part.UpdateRotation(rot); 2100 part.UpdateRotation(rot);
1995 // Update rotation does not move the object in the physics scene if it's a linkset. 2101 // Update rotation does not move the object in the physics scene if it's a linkset.
1996 2102
@@ -2555,12 +2661,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2555 2661
2556 m_host.AddScriptLPS(1); 2662 m_host.AddScriptLPS(1);
2557 2663
2664 m_host.TaskInventory.LockItemsForRead(true);
2558 TaskInventoryItem item = m_host.TaskInventory[invItemID]; 2665 TaskInventoryItem item = m_host.TaskInventory[invItemID];
2559 2666 m_host.TaskInventory.LockItemsForRead(false);
2560 lock (m_host.TaskInventory)
2561 {
2562 item = m_host.TaskInventory[invItemID];
2563 }
2564 2667
2565 if (item.PermsGranter == UUID.Zero) 2668 if (item.PermsGranter == UUID.Zero)
2566 return 0; 2669 return 0;
@@ -2635,6 +2738,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2635 if (dist > m_ScriptDistanceFactor * 10.0f) 2738 if (dist > m_ScriptDistanceFactor * 10.0f)
2636 return; 2739 return;
2637 2740
2741 //Clone is thread-safe
2638 TaskInventoryDictionary partInventory = (TaskInventoryDictionary)m_host.TaskInventory.Clone(); 2742 TaskInventoryDictionary partInventory = (TaskInventoryDictionary)m_host.TaskInventory.Clone();
2639 2743
2640 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in partInventory) 2744 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in partInventory)
@@ -2720,6 +2824,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2720 // Orient the object to the angle calculated 2824 // Orient the object to the angle calculated
2721 llSetRot(rot); 2825 llSetRot(rot);
2722 } 2826 }
2827
2828 public void llRotLookAt(LSL_Rotation target, double strength, double damping)
2829 {
2830 m_host.AddScriptLPS(1);
2831// NotImplemented("llRotLookAt");
2832 m_host.RotLookAt(Rot2Quaternion(target), (float)strength, (float)damping);
2833
2834 }
2723 2835
2724 public void llStopLookAt() 2836 public void llStopLookAt()
2725 { 2837 {
@@ -2767,13 +2879,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2767 { 2879 {
2768 TaskInventoryItem item; 2880 TaskInventoryItem item;
2769 2881
2770 lock (m_host.TaskInventory) 2882 m_host.TaskInventory.LockItemsForRead(true);
2883 if (!m_host.TaskInventory.ContainsKey(InventorySelf()))
2771 { 2884 {
2772 if (!m_host.TaskInventory.ContainsKey(InventorySelf())) 2885 m_host.TaskInventory.LockItemsForRead(false);
2773 return; 2886 return;
2774 else
2775 item = m_host.TaskInventory[InventorySelf()];
2776 } 2887 }
2888 else
2889 {
2890 item = m_host.TaskInventory[InventorySelf()];
2891 }
2892 m_host.TaskInventory.LockItemsForRead(false);
2777 2893
2778 if (item.PermsGranter != UUID.Zero) 2894 if (item.PermsGranter != UUID.Zero)
2779 { 2895 {
@@ -2795,13 +2911,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2795 { 2911 {
2796 TaskInventoryItem item; 2912 TaskInventoryItem item;
2797 2913
2914 m_host.TaskInventory.LockItemsForRead(true);
2798 lock (m_host.TaskInventory) 2915 lock (m_host.TaskInventory)
2799 { 2916 {
2917
2800 if (!m_host.TaskInventory.ContainsKey(InventorySelf())) 2918 if (!m_host.TaskInventory.ContainsKey(InventorySelf()))
2919 {
2920 m_host.TaskInventory.LockItemsForRead(false);
2801 return; 2921 return;
2922 }
2802 else 2923 else
2924 {
2803 item = m_host.TaskInventory[InventorySelf()]; 2925 item = m_host.TaskInventory[InventorySelf()];
2926 }
2804 } 2927 }
2928 m_host.TaskInventory.LockItemsForRead(false);
2805 2929
2806 m_host.AddScriptLPS(1); 2930 m_host.AddScriptLPS(1);
2807 2931
@@ -2838,13 +2962,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2838 2962
2839 TaskInventoryItem item; 2963 TaskInventoryItem item;
2840 2964
2841 lock (m_host.TaskInventory) 2965 m_host.TaskInventory.LockItemsForRead(true);
2966
2967 if (!m_host.TaskInventory.ContainsKey(InventorySelf()))
2842 { 2968 {
2843 if (!m_host.TaskInventory.ContainsKey(InventorySelf())) 2969 m_host.TaskInventory.LockItemsForRead(false);
2844 return; 2970 return;
2845 else
2846 item = m_host.TaskInventory[InventorySelf()];
2847 } 2971 }
2972 else
2973 {
2974 item = m_host.TaskInventory[InventorySelf()];
2975 }
2976
2977 m_host.TaskInventory.LockItemsForRead(false);
2848 2978
2849 if (item.PermsGranter != m_host.OwnerID) 2979 if (item.PermsGranter != m_host.OwnerID)
2850 return; 2980 return;
@@ -2870,13 +3000,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2870 3000
2871 TaskInventoryItem item; 3001 TaskInventoryItem item;
2872 3002
2873 lock (m_host.TaskInventory) 3003 m_host.TaskInventory.LockItemsForRead(true);
3004
3005 if (!m_host.TaskInventory.ContainsKey(InventorySelf()))
2874 { 3006 {
2875 if (!m_host.TaskInventory.ContainsKey(InventorySelf())) 3007 m_host.TaskInventory.LockItemsForRead(false);
2876 return; 3008 return;
2877 else
2878 item = m_host.TaskInventory[InventorySelf()];
2879 } 3009 }
3010 else
3011 {
3012 item = m_host.TaskInventory[InventorySelf()];
3013 }
3014 m_host.TaskInventory.LockItemsForRead(false);
3015
2880 3016
2881 if (item.PermsGranter != m_host.OwnerID) 3017 if (item.PermsGranter != m_host.OwnerID)
2882 return; 3018 return;
@@ -2912,8 +3048,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2912 return m_host.OwnerID.ToString(); 3048 return m_host.OwnerID.ToString();
2913 } 3049 }
2914 3050
3051 [DebuggerNonUserCode]
2915 public void llInstantMessage(string user, string message) 3052 public void llInstantMessage(string user, string message)
2916 { 3053 {
3054 UUID result;
3055 if (!UUID.TryParse(user, out result))
3056 {
3057 throw new Exception(String.Format("An invalid key of '{0} was passed to llInstantMessage", user));
3058 return;
3059 }
3060
3061
2917 m_host.AddScriptLPS(1); 3062 m_host.AddScriptLPS(1);
2918 3063
2919 // We may be able to use ClientView.SendInstantMessage here, but we need a client instance. 3064 // We may be able to use ClientView.SendInstantMessage here, but we need a client instance.
@@ -2928,7 +3073,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2928 UUID friendTransactionID = UUID.Random(); 3073 UUID friendTransactionID = UUID.Random();
2929 3074
2930 //m_pendingFriendRequests.Add(friendTransactionID, fromAgentID); 3075 //m_pendingFriendRequests.Add(friendTransactionID, fromAgentID);
2931 3076
2932 GridInstantMessage msg = new GridInstantMessage(); 3077 GridInstantMessage msg = new GridInstantMessage();
2933 msg.fromAgentID = new Guid(m_host.UUID.ToString()); // fromAgentID.Guid; 3078 msg.fromAgentID = new Guid(m_host.UUID.ToString()); // fromAgentID.Guid;
2934 msg.toAgentID = new Guid(user); // toAgentID.Guid; 3079 msg.toAgentID = new Guid(user); // toAgentID.Guid;
@@ -3077,13 +3222,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3077 m_host.AddScriptLPS(1); 3222 m_host.AddScriptLPS(1);
3078 } 3223 }
3079 3224
3080 public void llRotLookAt(LSL_Rotation target, double strength, double damping)
3081 {
3082 m_host.AddScriptLPS(1);
3083// NotImplemented("llRotLookAt");
3084 m_host.RotLookAt(Rot2Quaternion(target), (float)strength, (float)damping);
3085 }
3086
3087 public LSL_Integer llStringLength(string str) 3225 public LSL_Integer llStringLength(string str)
3088 { 3226 {
3089 m_host.AddScriptLPS(1); 3227 m_host.AddScriptLPS(1);
@@ -3107,14 +3245,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3107 3245
3108 TaskInventoryItem item; 3246 TaskInventoryItem item;
3109 3247
3110 lock (m_host.TaskInventory) 3248 m_host.TaskInventory.LockItemsForRead(true);
3249 if (!m_host.TaskInventory.ContainsKey(InventorySelf()))
3111 { 3250 {
3112 if (!m_host.TaskInventory.ContainsKey(InventorySelf())) 3251 m_host.TaskInventory.LockItemsForRead(false);
3113 return; 3252 return;
3114 else
3115 item = m_host.TaskInventory[InventorySelf()];
3116 } 3253 }
3117 3254 else
3255 {
3256 item = m_host.TaskInventory[InventorySelf()];
3257 }
3258 m_host.TaskInventory.LockItemsForRead(false);
3118 if (item.PermsGranter == UUID.Zero) 3259 if (item.PermsGranter == UUID.Zero)
3119 return; 3260 return;
3120 3261
@@ -3144,13 +3285,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3144 3285
3145 TaskInventoryItem item; 3286 TaskInventoryItem item;
3146 3287
3147 lock (m_host.TaskInventory) 3288 m_host.TaskInventory.LockItemsForRead(true);
3289 if (!m_host.TaskInventory.ContainsKey(InventorySelf()))
3148 { 3290 {
3149 if (!m_host.TaskInventory.ContainsKey(InventorySelf())) 3291 m_host.TaskInventory.LockItemsForRead(false);
3150 return; 3292 return;
3151 else 3293 }
3152 item = m_host.TaskInventory[InventorySelf()]; 3294 else
3295 {
3296 item = m_host.TaskInventory[InventorySelf()];
3153 } 3297 }
3298 m_host.TaskInventory.LockItemsForRead(false);
3299
3154 3300
3155 if (item.PermsGranter == UUID.Zero) 3301 if (item.PermsGranter == UUID.Zero)
3156 return; 3302 return;
@@ -3223,10 +3369,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3223 3369
3224 TaskInventoryItem item; 3370 TaskInventoryItem item;
3225 3371
3226 lock (m_host.TaskInventory) 3372
3373 m_host.TaskInventory.LockItemsForRead(true);
3374 if (!m_host.TaskInventory.ContainsKey(invItemID))
3375 {
3376 m_host.TaskInventory.LockItemsForRead(false);
3377 return;
3378 }
3379 else
3227 { 3380 {
3228 item = m_host.TaskInventory[invItemID]; 3381 item = m_host.TaskInventory[invItemID];
3229 } 3382 }
3383 m_host.TaskInventory.LockItemsForRead(false);
3230 3384
3231 if (agentID == UUID.Zero || perm == 0) // Releasing permissions 3385 if (agentID == UUID.Zero || perm == 0) // Releasing permissions
3232 { 3386 {
@@ -3258,11 +3412,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3258 3412
3259 if ((perm & (~implicitPerms)) == 0) // Requested only implicit perms 3413 if ((perm & (~implicitPerms)) == 0) // Requested only implicit perms
3260 { 3414 {
3261 lock (m_host.TaskInventory) 3415 m_host.TaskInventory.LockItemsForWrite(true);
3262 { 3416 m_host.TaskInventory[invItemID].PermsGranter = agentID;
3263 m_host.TaskInventory[invItemID].PermsGranter = agentID; 3417 m_host.TaskInventory[invItemID].PermsMask = perm;
3264 m_host.TaskInventory[invItemID].PermsMask = perm; 3418 m_host.TaskInventory.LockItemsForWrite(false);
3265 }
3266 3419
3267 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( 3420 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams(
3268 "run_time_permissions", new Object[] { 3421 "run_time_permissions", new Object[] {
@@ -3282,11 +3435,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3282 3435
3283 if ((perm & (~implicitPerms)) == 0) // Requested only implicit perms 3436 if ((perm & (~implicitPerms)) == 0) // Requested only implicit perms
3284 { 3437 {
3285 lock (m_host.TaskInventory) 3438 m_host.TaskInventory.LockItemsForWrite(true);
3286 { 3439 m_host.TaskInventory[invItemID].PermsGranter = agentID;
3287 m_host.TaskInventory[invItemID].PermsGranter = agentID; 3440 m_host.TaskInventory[invItemID].PermsMask = perm;
3288 m_host.TaskInventory[invItemID].PermsMask = perm; 3441 m_host.TaskInventory.LockItemsForWrite(false);
3289 }
3290 3442
3291 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( 3443 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams(
3292 "run_time_permissions", new Object[] { 3444 "run_time_permissions", new Object[] {
@@ -3307,11 +3459,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3307 3459
3308 if (!m_waitingForScriptAnswer) 3460 if (!m_waitingForScriptAnswer)
3309 { 3461 {
3310 lock (m_host.TaskInventory) 3462 m_host.TaskInventory.LockItemsForWrite(true);
3311 { 3463 m_host.TaskInventory[invItemID].PermsGranter = agentID;
3312 m_host.TaskInventory[invItemID].PermsGranter = agentID; 3464 m_host.TaskInventory[invItemID].PermsMask = 0;
3313 m_host.TaskInventory[invItemID].PermsMask = 0; 3465 m_host.TaskInventory.LockItemsForWrite(false);
3314 }
3315 3466
3316 presence.ControllingClient.OnScriptAnswer += handleScriptAnswer; 3467 presence.ControllingClient.OnScriptAnswer += handleScriptAnswer;
3317 m_waitingForScriptAnswer=true; 3468 m_waitingForScriptAnswer=true;
@@ -3346,10 +3497,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3346 if ((answer & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) == 0) 3497 if ((answer & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) == 0)
3347 llReleaseControls(); 3498 llReleaseControls();
3348 3499
3349 lock (m_host.TaskInventory) 3500
3350 { 3501 m_host.TaskInventory.LockItemsForWrite(true);
3351 m_host.TaskInventory[invItemID].PermsMask = answer; 3502 m_host.TaskInventory[invItemID].PermsMask = answer;
3352 } 3503 m_host.TaskInventory.LockItemsForWrite(false);
3504
3353 3505
3354 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( 3506 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams(
3355 "run_time_permissions", new Object[] { 3507 "run_time_permissions", new Object[] {
@@ -3361,16 +3513,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3361 { 3513 {
3362 m_host.AddScriptLPS(1); 3514 m_host.AddScriptLPS(1);
3363 3515
3364 lock (m_host.TaskInventory) 3516 m_host.TaskInventory.LockItemsForRead(true);
3517
3518 foreach (TaskInventoryItem item in m_host.TaskInventory.Values)
3365 { 3519 {
3366 foreach (TaskInventoryItem item in m_host.TaskInventory.Values) 3520 if (item.Type == 10 && item.ItemID == m_itemID)
3367 { 3521 {
3368 if (item.Type == 10 && item.ItemID == m_itemID) 3522 m_host.TaskInventory.LockItemsForRead(false);
3369 { 3523 return item.PermsGranter.ToString();
3370 return item.PermsGranter.ToString();
3371 }
3372 } 3524 }
3373 } 3525 }
3526 m_host.TaskInventory.LockItemsForRead(false);
3374 3527
3375 return UUID.Zero.ToString(); 3528 return UUID.Zero.ToString();
3376 } 3529 }
@@ -3379,19 +3532,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3379 { 3532 {
3380 m_host.AddScriptLPS(1); 3533 m_host.AddScriptLPS(1);
3381 3534
3382 lock (m_host.TaskInventory) 3535 m_host.TaskInventory.LockItemsForRead(true);
3536
3537 foreach (TaskInventoryItem item in m_host.TaskInventory.Values)
3383 { 3538 {
3384 foreach (TaskInventoryItem item in m_host.TaskInventory.Values) 3539 if (item.Type == 10 && item.ItemID == m_itemID)
3385 { 3540 {
3386 if (item.Type == 10 && item.ItemID == m_itemID) 3541 int perms = item.PermsMask;
3387 { 3542 if (m_automaticLinkPermission)
3388 int perms = item.PermsMask; 3543 perms |= ScriptBaseClass.PERMISSION_CHANGE_LINKS;
3389 if (m_automaticLinkPermission) 3544 m_host.TaskInventory.LockItemsForRead(false);
3390 perms |= ScriptBaseClass.PERMISSION_CHANGE_LINKS; 3545 return perms;
3391 return perms;
3392 }
3393 } 3546 }
3394 } 3547 }
3548 m_host.TaskInventory.LockItemsForRead(false);
3395 3549
3396 return 0; 3550 return 0;
3397 } 3551 }
@@ -3424,11 +3578,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3424 UUID invItemID = InventorySelf(); 3578 UUID invItemID = InventorySelf();
3425 3579
3426 TaskInventoryItem item; 3580 TaskInventoryItem item;
3427 lock (m_host.TaskInventory) 3581 m_host.TaskInventory.LockItemsForRead(true);
3428 { 3582 item = m_host.TaskInventory[invItemID];
3429 item = m_host.TaskInventory[invItemID]; 3583 m_host.TaskInventory.LockItemsForRead(false);
3430 } 3584
3431
3432 if ((item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0 3585 if ((item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0
3433 && !m_automaticLinkPermission) 3586 && !m_automaticLinkPermission)
3434 { 3587 {
@@ -3481,16 +3634,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3481 m_host.AddScriptLPS(1); 3634 m_host.AddScriptLPS(1);
3482 UUID invItemID = InventorySelf(); 3635 UUID invItemID = InventorySelf();
3483 3636
3484 lock (m_host.TaskInventory) 3637 m_host.TaskInventory.LockItemsForRead(true);
3485 {
3486 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0 3638 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0
3487 && !m_automaticLinkPermission) 3639 && !m_automaticLinkPermission)
3488 { 3640 {
3489 ShoutError("Script trying to link but PERMISSION_CHANGE_LINKS permission not set!"); 3641 ShoutError("Script trying to link but PERMISSION_CHANGE_LINKS permission not set!");
3642 m_host.TaskInventory.LockItemsForRead(false);
3490 return; 3643 return;
3491 } 3644 }
3492 } 3645 m_host.TaskInventory.LockItemsForRead(false);
3493 3646
3494 if (linknum < ScriptBaseClass.LINK_THIS) 3647 if (linknum < ScriptBaseClass.LINK_THIS)
3495 return; 3648 return;
3496 3649
@@ -3667,17 +3820,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3667 m_host.AddScriptLPS(1); 3820 m_host.AddScriptLPS(1);
3668 int count = 0; 3821 int count = 0;
3669 3822
3670 lock (m_host.TaskInventory) 3823 m_host.TaskInventory.LockItemsForRead(true);
3824 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
3671 { 3825 {
3672 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 3826 if (inv.Value.Type == type || type == -1)
3673 { 3827 {
3674 if (inv.Value.Type == type || type == -1) 3828 count = count + 1;
3675 {
3676 count = count + 1;
3677 }
3678 } 3829 }
3679 } 3830 }
3680 3831
3832 m_host.TaskInventory.LockItemsForRead(false);
3681 return count; 3833 return count;
3682 } 3834 }
3683 3835
@@ -3686,16 +3838,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3686 m_host.AddScriptLPS(1); 3838 m_host.AddScriptLPS(1);
3687 ArrayList keys = new ArrayList(); 3839 ArrayList keys = new ArrayList();
3688 3840
3689 lock (m_host.TaskInventory) 3841 m_host.TaskInventory.LockItemsForRead(true);
3842 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
3690 { 3843 {
3691 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 3844 if (inv.Value.Type == type || type == -1)
3692 { 3845 {
3693 if (inv.Value.Type == type || type == -1) 3846 keys.Add(inv.Value.Name);
3694 {
3695 keys.Add(inv.Value.Name);
3696 }
3697 } 3847 }
3698 } 3848 }
3849 m_host.TaskInventory.LockItemsForRead(false);
3699 3850
3700 if (keys.Count == 0) 3851 if (keys.Count == 0)
3701 { 3852 {
@@ -3732,20 +3883,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3732 } 3883 }
3733 3884
3734 // move the first object found with this inventory name 3885 // move the first object found with this inventory name
3735 lock (m_host.TaskInventory) 3886 m_host.TaskInventory.LockItemsForRead(true);
3887 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
3736 { 3888 {
3737 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 3889 if (inv.Value.Name == inventory)
3738 { 3890 {
3739 if (inv.Value.Name == inventory) 3891 found = true;
3740 { 3892 objId = inv.Key;
3741 found = true; 3893 assetType = inv.Value.Type;
3742 objId = inv.Key; 3894 objName = inv.Value.Name;
3743 assetType = inv.Value.Type; 3895 break;
3744 objName = inv.Value.Name;
3745 break;
3746 }
3747 } 3896 }
3748 } 3897 }
3898 m_host.TaskInventory.LockItemsForRead(false);
3749 3899
3750 if (!found) 3900 if (!found)
3751 { 3901 {
@@ -3790,24 +3940,26 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3790 ScriptSleep(3000); 3940 ScriptSleep(3000);
3791 } 3941 }
3792 3942
3943 [DebuggerNonUserCode]
3793 public void llRemoveInventory(string name) 3944 public void llRemoveInventory(string name)
3794 { 3945 {
3795 m_host.AddScriptLPS(1); 3946 m_host.AddScriptLPS(1);
3796 3947
3797 lock (m_host.TaskInventory) 3948 m_host.TaskInventory.LockItemsForRead(true);
3949 foreach (TaskInventoryItem item in m_host.TaskInventory.Values)
3798 { 3950 {
3799 foreach (TaskInventoryItem item in m_host.TaskInventory.Values) 3951 if (item.Name == name)
3800 { 3952 {
3801 if (item.Name == name) 3953 if (item.ItemID == m_itemID)
3802 { 3954 throw new ScriptDeleteException();
3803 if (item.ItemID == m_itemID) 3955 else
3804 throw new ScriptDeleteException(); 3956 m_host.Inventory.RemoveInventoryItem(item.ItemID);
3805 else 3957
3806 m_host.Inventory.RemoveInventoryItem(item.ItemID); 3958 m_host.TaskInventory.LockItemsForRead(false);
3807 return; 3959 return;
3808 }
3809 } 3960 }
3810 } 3961 }
3962 m_host.TaskInventory.LockItemsForRead(false);
3811 } 3963 }
3812 3964
3813 public void llSetText(string text, LSL_Vector color, double alpha) 3965 public void llSetText(string text, LSL_Vector color, double alpha)
@@ -3897,6 +4049,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3897 { 4049 {
3898 m_host.AddScriptLPS(1); 4050 m_host.AddScriptLPS(1);
3899 4051
4052 //Clone is thread safe
3900 TaskInventoryDictionary itemDictionary = (TaskInventoryDictionary)m_host.TaskInventory.Clone(); 4053 TaskInventoryDictionary itemDictionary = (TaskInventoryDictionary)m_host.TaskInventory.Clone();
3901 4054
3902 foreach (TaskInventoryItem item in itemDictionary.Values) 4055 foreach (TaskInventoryItem item in itemDictionary.Values)
@@ -3987,17 +4140,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3987 UUID soundId = UUID.Zero; 4140 UUID soundId = UUID.Zero;
3988 if (!UUID.TryParse(impact_sound, out soundId)) 4141 if (!UUID.TryParse(impact_sound, out soundId))
3989 { 4142 {
3990 lock (m_host.TaskInventory) 4143 m_host.TaskInventory.LockItemsForRead(true);
4144 foreach (TaskInventoryItem item in m_host.TaskInventory.Values)
3991 { 4145 {
3992 foreach (TaskInventoryItem item in m_host.TaskInventory.Values) 4146 if (item.Type == (int)AssetType.Sound && item.Name == impact_sound)
3993 { 4147 {
3994 if (item.Type == (int)AssetType.Sound && item.Name == impact_sound) 4148 soundId = item.AssetID;
3995 { 4149 break;
3996 soundId = item.AssetID;
3997 break;
3998 }
3999 } 4150 }
4000 } 4151 }
4152 m_host.TaskInventory.LockItemsForRead(false);
4001 } 4153 }
4002 m_host.CollisionSound = soundId; 4154 m_host.CollisionSound = soundId;
4003 m_host.CollisionSoundVolume = (float)impact_volume; 4155 m_host.CollisionSoundVolume = (float)impact_volume;
@@ -4043,6 +4195,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4043 UUID partItemID; 4195 UUID partItemID;
4044 foreach (SceneObjectPart part in parts) 4196 foreach (SceneObjectPart part in parts)
4045 { 4197 {
4198 //Clone is thread safe
4046 TaskInventoryDictionary itemsDictionary = (TaskInventoryDictionary)part.TaskInventory.Clone(); 4199 TaskInventoryDictionary itemsDictionary = (TaskInventoryDictionary)part.TaskInventory.Clone();
4047 4200
4048 foreach (TaskInventoryItem item in itemsDictionary.Values) 4201 foreach (TaskInventoryItem item in itemsDictionary.Values)
@@ -4257,17 +4410,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4257 4410
4258 m_host.AddScriptLPS(1); 4411 m_host.AddScriptLPS(1);
4259 4412
4260 lock (m_host.TaskInventory) 4413 m_host.TaskInventory.LockItemsForRead(true);
4414 foreach (TaskInventoryItem item in m_host.TaskInventory.Values)
4261 { 4415 {
4262 foreach (TaskInventoryItem item in m_host.TaskInventory.Values) 4416 if (item.Type == 10 && item.ItemID == m_itemID)
4263 { 4417 {
4264 if (item.Type == 10 && item.ItemID == m_itemID) 4418 result = item.Name!=null?item.Name:String.Empty;
4265 { 4419 break;
4266 result = item.Name!=null?item.Name:String.Empty;
4267 break;
4268 }
4269 } 4420 }
4270 } 4421 }
4422 m_host.TaskInventory.LockItemsForRead(false);
4271 4423
4272 return result; 4424 return result;
4273 } 4425 }
@@ -4525,23 +4677,24 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4525 { 4677 {
4526 m_host.AddScriptLPS(1); 4678 m_host.AddScriptLPS(1);
4527 4679
4528 lock (m_host.TaskInventory) 4680 m_host.TaskInventory.LockItemsForRead(true);
4681 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
4529 { 4682 {
4530 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 4683 if (inv.Value.Name == name)
4531 { 4684 {
4532 if (inv.Value.Name == name) 4685 if ((inv.Value.CurrentPermissions & (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify)) == (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify))
4533 { 4686 {
4534 if ((inv.Value.CurrentPermissions & (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify)) == (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify)) 4687 m_host.TaskInventory.LockItemsForRead(false);
4535 { 4688 return inv.Value.AssetID.ToString();
4536 return inv.Value.AssetID.ToString(); 4689 }
4537 } 4690 else
4538 else 4691 {
4539 { 4692 m_host.TaskInventory.LockItemsForRead(false);
4540 return UUID.Zero.ToString(); 4693 return UUID.Zero.ToString();
4541 }
4542 } 4694 }
4543 } 4695 }
4544 } 4696 }
4697 m_host.TaskInventory.LockItemsForRead(false);
4545 4698
4546 return UUID.Zero.ToString(); 4699 return UUID.Zero.ToString();
4547 } 4700 }
@@ -6037,14 +6190,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6037 6190
6038 protected UUID GetTaskInventoryItem(string name) 6191 protected UUID GetTaskInventoryItem(string name)
6039 { 6192 {
6040 lock (m_host.TaskInventory) 6193 m_host.TaskInventory.LockItemsForRead(true);
6194 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
6041 { 6195 {
6042 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 6196 if (inv.Value.Name == name)
6043 { 6197 {
6044 if (inv.Value.Name == name) 6198 m_host.TaskInventory.LockItemsForRead(false);
6045 return inv.Key; 6199 return inv.Key;
6046 } 6200 }
6047 } 6201 }
6202 m_host.TaskInventory.LockItemsForRead(false);
6048 6203
6049 return UUID.Zero; 6204 return UUID.Zero;
6050 } 6205 }
@@ -6360,22 +6515,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6360 } 6515 }
6361 6516
6362 // copy the first script found with this inventory name 6517 // copy the first script found with this inventory name
6363 lock (m_host.TaskInventory) 6518 m_host.TaskInventory.LockItemsForRead(true);
6519 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
6364 { 6520 {
6365 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 6521 if (inv.Value.Name == name)
6366 { 6522 {
6367 if (inv.Value.Name == name) 6523 // make sure the object is a script
6524 if (10 == inv.Value.Type)
6368 { 6525 {
6369 // make sure the object is a script 6526 found = true;
6370 if (10 == inv.Value.Type) 6527 srcId = inv.Key;
6371 { 6528 break;
6372 found = true;
6373 srcId = inv.Key;
6374 break;
6375 }
6376 } 6529 }
6377 } 6530 }
6378 } 6531 }
6532 m_host.TaskInventory.LockItemsForRead(false);
6379 6533
6380 if (!found) 6534 if (!found)
6381 { 6535 {
@@ -6457,8 +6611,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6457 } 6611 }
6458 6612
6459 protected ObjectShapePacket.ObjectDataBlock SetPrimitiveBlockShapeParams(SceneObjectPart part, int holeshape, LSL_Vector cut, float hollow, LSL_Vector twist) 6613 protected ObjectShapePacket.ObjectDataBlock SetPrimitiveBlockShapeParams(SceneObjectPart part, int holeshape, LSL_Vector cut, float hollow, LSL_Vector twist)
6460 { 6614 {
6461 ObjectShapePacket.ObjectDataBlock shapeBlock = new ObjectShapePacket.ObjectDataBlock(); 6615 ObjectShapePacket.ObjectDataBlock shapeBlock = new ObjectShapePacket.ObjectDataBlock();
6616 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
6617 return shapeBlock;
6462 6618
6463 if (holeshape != (int)ScriptBaseClass.PRIM_HOLE_DEFAULT && 6619 if (holeshape != (int)ScriptBaseClass.PRIM_HOLE_DEFAULT &&
6464 holeshape != (int)ScriptBaseClass.PRIM_HOLE_CIRCLE && 6620 holeshape != (int)ScriptBaseClass.PRIM_HOLE_CIRCLE &&
@@ -6528,7 +6684,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6528 } 6684 }
6529 6685
6530 protected void SetPrimitiveShapeParams(SceneObjectPart part, int holeshape, LSL_Vector cut, float hollow, LSL_Vector twist, LSL_Vector taper_b, LSL_Vector topshear, byte fudge) 6686 protected void SetPrimitiveShapeParams(SceneObjectPart part, int holeshape, LSL_Vector cut, float hollow, LSL_Vector twist, LSL_Vector taper_b, LSL_Vector topshear, byte fudge)
6531 { 6687 {
6688 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
6689 return;
6690
6532 ObjectShapePacket.ObjectDataBlock shapeBlock; 6691 ObjectShapePacket.ObjectDataBlock shapeBlock;
6533 6692
6534 shapeBlock = SetPrimitiveBlockShapeParams(part, holeshape, cut, hollow, twist); 6693 shapeBlock = SetPrimitiveBlockShapeParams(part, holeshape, cut, hollow, twist);
@@ -6577,7 +6736,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6577 } 6736 }
6578 6737
6579 protected void SetPrimitiveShapeParams(SceneObjectPart part, int holeshape, LSL_Vector cut, float hollow, LSL_Vector twist, LSL_Vector dimple, byte fudge) 6738 protected void SetPrimitiveShapeParams(SceneObjectPart part, int holeshape, LSL_Vector cut, float hollow, LSL_Vector twist, LSL_Vector dimple, byte fudge)
6580 { 6739 {
6740 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
6741 return;
6742
6581 ObjectShapePacket.ObjectDataBlock shapeBlock; 6743 ObjectShapePacket.ObjectDataBlock shapeBlock;
6582 6744
6583 shapeBlock = SetPrimitiveBlockShapeParams(part, holeshape, cut, hollow, twist); 6745 shapeBlock = SetPrimitiveBlockShapeParams(part, holeshape, cut, hollow, twist);
@@ -6619,7 +6781,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6619 } 6781 }
6620 6782
6621 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) 6783 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)
6622 { 6784 {
6785 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
6786 return;
6787
6623 ObjectShapePacket.ObjectDataBlock shapeBlock; 6788 ObjectShapePacket.ObjectDataBlock shapeBlock;
6624 6789
6625 shapeBlock = SetPrimitiveBlockShapeParams(part, holeshape, cut, hollow, twist); 6790 shapeBlock = SetPrimitiveBlockShapeParams(part, holeshape, cut, hollow, twist);
@@ -6740,7 +6905,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6740 } 6905 }
6741 6906
6742 protected void SetPrimitiveShapeParams(SceneObjectPart part, string map, int type) 6907 protected void SetPrimitiveShapeParams(SceneObjectPart part, string map, int type)
6743 { 6908 {
6909 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
6910 return;
6911
6744 ObjectShapePacket.ObjectDataBlock shapeBlock = new ObjectShapePacket.ObjectDataBlock(); 6912 ObjectShapePacket.ObjectDataBlock shapeBlock = new ObjectShapePacket.ObjectDataBlock();
6745 UUID sculptId; 6913 UUID sculptId;
6746 6914
@@ -6774,14 +6942,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6774 } 6942 }
6775 6943
6776 public void llSetPrimitiveParams(LSL_List rules) 6944 public void llSetPrimitiveParams(LSL_List rules)
6777 { 6945 {
6778 m_host.AddScriptLPS(1); 6946 m_host.AddScriptLPS(1);
6779 SetPrimParams(m_host, rules); 6947 SetPrimParams(m_host, rules);
6780 } 6948 }
6781 6949
6782 public void llSetLinkPrimitiveParams(int linknumber, LSL_List rules) 6950 public void llSetLinkPrimitiveParams(int linknumber, LSL_List rules)
6783 { 6951 {
6784 m_host.AddScriptLPS(1); 6952 m_host.AddScriptLPS(1);
6785 6953
6786 List<SceneObjectPart> parts = GetLinkParts(linknumber); 6954 List<SceneObjectPart> parts = GetLinkParts(linknumber);
6787 6955
@@ -6790,7 +6958,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6790 } 6958 }
6791 6959
6792 protected void SetPrimParams(SceneObjectPart part, LSL_List rules) 6960 protected void SetPrimParams(SceneObjectPart part, LSL_List rules)
6793 { 6961 {
6962 if (part == null || part.ParentGroup == null || part.ParentGroup.IsDeleted)
6963 return;
6964
6794 int idx = 0; 6965 int idx = 0;
6795 6966
6796 while (idx < rules.Length) 6967 while (idx < rules.Length)
@@ -8195,28 +8366,28 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8195 { 8366 {
8196 m_host.AddScriptLPS(1); 8367 m_host.AddScriptLPS(1);
8197 8368
8198 lock (m_host.TaskInventory) 8369 m_host.TaskInventory.LockItemsForRead(true);
8370 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
8199 { 8371 {
8200 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 8372 if (inv.Value.Name == item)
8201 { 8373 {
8202 if (inv.Value.Name == item) 8374 m_host.TaskInventory.LockItemsForRead(false);
8375 switch (mask)
8203 { 8376 {
8204 switch (mask) 8377 case 0:
8205 { 8378 return (int)inv.Value.BasePermissions;
8206 case 0: 8379 case 1:
8207 return (int)inv.Value.BasePermissions; 8380 return (int)inv.Value.CurrentPermissions;
8208 case 1: 8381 case 2:
8209 return (int)inv.Value.CurrentPermissions; 8382 return (int)inv.Value.GroupPermissions;
8210 case 2: 8383 case 3:
8211 return (int)inv.Value.GroupPermissions; 8384 return (int)inv.Value.EveryonePermissions;
8212 case 3: 8385 case 4:
8213 return (int)inv.Value.EveryonePermissions; 8386 return (int)inv.Value.NextPermissions;
8214 case 4:
8215 return (int)inv.Value.NextPermissions;
8216 }
8217 } 8387 }
8218 } 8388 }
8219 } 8389 }
8390 m_host.TaskInventory.LockItemsForRead(false);
8220 8391
8221 return -1; 8392 return -1;
8222 } 8393 }
@@ -8231,16 +8402,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8231 { 8402 {
8232 m_host.AddScriptLPS(1); 8403 m_host.AddScriptLPS(1);
8233 8404
8234 lock (m_host.TaskInventory) 8405 m_host.TaskInventory.LockItemsForRead(true);
8406 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
8235 { 8407 {
8236 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 8408 if (inv.Value.Name == item)
8237 { 8409 {
8238 if (inv.Value.Name == item) 8410 m_host.TaskInventory.LockItemsForRead(false);
8239 { 8411 return inv.Value.CreatorID.ToString();
8240 return inv.Value.CreatorID.ToString();
8241 }
8242 } 8412 }
8243 } 8413 }
8414 m_host.TaskInventory.LockItemsForRead(false);
8244 8415
8245 llSay(0, "No item name '" + item + "'"); 8416 llSay(0, "No item name '" + item + "'");
8246 8417
@@ -8764,16 +8935,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8764 { 8935 {
8765 m_host.AddScriptLPS(1); 8936 m_host.AddScriptLPS(1);
8766 8937
8767 lock (m_host.TaskInventory) 8938 m_host.TaskInventory.LockItemsForRead(true);
8939 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
8768 { 8940 {
8769 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 8941 if (inv.Value.Name == name)
8770 { 8942 {
8771 if (inv.Value.Name == name) 8943 m_host.TaskInventory.LockItemsForRead(false);
8772 { 8944 return inv.Value.Type;
8773 return inv.Value.Type;
8774 }
8775 } 8945 }
8776 } 8946 }
8947 m_host.TaskInventory.LockItemsForRead(false);
8777 8948
8778 return -1; 8949 return -1;
8779 } 8950 }
@@ -8804,17 +8975,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8804 if (invItemID == UUID.Zero) 8975 if (invItemID == UUID.Zero)
8805 return new LSL_Vector(); 8976 return new LSL_Vector();
8806 8977
8807 lock (m_host.TaskInventory) 8978 m_host.TaskInventory.LockItemsForRead(true);
8979 if (m_host.TaskInventory[invItemID].PermsGranter == UUID.Zero)
8808 { 8980 {
8809 if (m_host.TaskInventory[invItemID].PermsGranter == UUID.Zero) 8981 m_host.TaskInventory.LockItemsForRead(false);
8810 return new LSL_Vector(); 8982 return new LSL_Vector();
8983 }
8811 8984
8812 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0) 8985 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0)
8813 { 8986 {
8814 ShoutError("No permissions to track the camera"); 8987 ShoutError("No permissions to track the camera");
8815 return new LSL_Vector(); 8988 m_host.TaskInventory.LockItemsForRead(false);
8816 } 8989 return new LSL_Vector();
8817 } 8990 }
8991 m_host.TaskInventory.LockItemsForRead(false);
8818 8992
8819 ScenePresence presence = World.GetScenePresence(m_host.OwnerID); 8993 ScenePresence presence = World.GetScenePresence(m_host.OwnerID);
8820 if (presence != null) 8994 if (presence != null)
@@ -8832,17 +9006,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8832 if (invItemID == UUID.Zero) 9006 if (invItemID == UUID.Zero)
8833 return new LSL_Rotation(); 9007 return new LSL_Rotation();
8834 9008
8835 lock (m_host.TaskInventory) 9009 m_host.TaskInventory.LockItemsForRead(true);
9010 if (m_host.TaskInventory[invItemID].PermsGranter == UUID.Zero)
8836 { 9011 {
8837 if (m_host.TaskInventory[invItemID].PermsGranter == UUID.Zero) 9012 m_host.TaskInventory.LockItemsForRead(false);
8838 return new LSL_Rotation(); 9013 return new LSL_Rotation();
8839
8840 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0)
8841 {
8842 ShoutError("No permissions to track the camera");
8843 return new LSL_Rotation();
8844 }
8845 } 9014 }
9015 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0)
9016 {
9017 ShoutError("No permissions to track the camera");
9018 m_host.TaskInventory.LockItemsForRead(false);
9019 return new LSL_Rotation();
9020 }
9021 m_host.TaskInventory.LockItemsForRead(false);
8846 9022
8847 ScenePresence presence = World.GetScenePresence(m_host.OwnerID); 9023 ScenePresence presence = World.GetScenePresence(m_host.OwnerID);
8848 if (presence != null) 9024 if (presence != null)
@@ -8992,14 +9168,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8992 if (objectID == UUID.Zero) return; 9168 if (objectID == UUID.Zero) return;
8993 9169
8994 UUID agentID; 9170 UUID agentID;
8995 lock (m_host.TaskInventory) 9171 m_host.TaskInventory.LockItemsForRead(true);
8996 { 9172 // we need the permission first, to know which avatar we want to set the camera for
8997 // we need the permission first, to know which avatar we want to set the camera for 9173 agentID = m_host.TaskInventory[invItemID].PermsGranter;
8998 agentID = m_host.TaskInventory[invItemID].PermsGranter;
8999 9174
9000 if (agentID == UUID.Zero) return; 9175 if (agentID == UUID.Zero)
9001 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0) return; 9176 {
9177 m_host.TaskInventory.LockItemsForRead(false);
9178 return;
9179 }
9180 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0)
9181 {
9182 m_host.TaskInventory.LockItemsForRead(false);
9183 return;
9002 } 9184 }
9185 m_host.TaskInventory.LockItemsForRead(false);
9003 9186
9004 ScenePresence presence = World.GetScenePresence(agentID); 9187 ScenePresence presence = World.GetScenePresence(agentID);
9005 9188
@@ -9049,12 +9232,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
9049 9232
9050 // we need the permission first, to know which avatar we want to clear the camera for 9233 // we need the permission first, to know which avatar we want to clear the camera for
9051 UUID agentID; 9234 UUID agentID;
9052 lock (m_host.TaskInventory) 9235 m_host.TaskInventory.LockItemsForRead(true);
9236 agentID = m_host.TaskInventory[invItemID].PermsGranter;
9237 if (agentID == UUID.Zero)
9053 { 9238 {
9054 agentID = m_host.TaskInventory[invItemID].PermsGranter; 9239 m_host.TaskInventory.LockItemsForRead(false);
9055 if (agentID == UUID.Zero) return; 9240 return;
9056 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0) return; 9241 }
9242 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0)
9243 {
9244 m_host.TaskInventory.LockItemsForRead(false);
9245 return;
9057 } 9246 }
9247 m_host.TaskInventory.LockItemsForRead(false);
9058 9248
9059 ScenePresence presence = World.GetScenePresence(agentID); 9249 ScenePresence presence = World.GetScenePresence(agentID);
9060 9250
@@ -9511,15 +9701,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
9511 9701
9512 internal UUID ScriptByName(string name) 9702 internal UUID ScriptByName(string name)
9513 { 9703 {
9514 lock (m_host.TaskInventory) 9704 m_host.TaskInventory.LockItemsForRead(true);
9705
9706 foreach (TaskInventoryItem item in m_host.TaskInventory.Values)
9515 { 9707 {
9516 foreach (TaskInventoryItem item in m_host.TaskInventory.Values) 9708 if (item.Type == 10 && item.Name == name)
9517 { 9709 {
9518 if (item.Type == 10 && item.Name == name) 9710 m_host.TaskInventory.LockItemsForRead(false);
9519 return item.ItemID; 9711 return item.ItemID;
9520 } 9712 }
9521 } 9713 }
9522 9714
9715 m_host.TaskInventory.LockItemsForRead(false);
9716
9523 return UUID.Zero; 9717 return UUID.Zero;
9524 } 9718 }
9525 9719
@@ -9560,6 +9754,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
9560 { 9754 {
9561 m_host.AddScriptLPS(1); 9755 m_host.AddScriptLPS(1);
9562 9756
9757 //Clone is thread safe
9563 TaskInventoryDictionary itemsDictionary = (TaskInventoryDictionary)m_host.TaskInventory.Clone(); 9758 TaskInventoryDictionary itemsDictionary = (TaskInventoryDictionary)m_host.TaskInventory.Clone();
9564 9759
9565 UUID assetID = UUID.Zero; 9760 UUID assetID = UUID.Zero;
@@ -9622,6 +9817,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
9622 { 9817 {
9623 m_host.AddScriptLPS(1); 9818 m_host.AddScriptLPS(1);
9624 9819
9820 //Clone is thread safe
9625 TaskInventoryDictionary itemsDictionary = (TaskInventoryDictionary)m_host.TaskInventory.Clone(); 9821 TaskInventoryDictionary itemsDictionary = (TaskInventoryDictionary)m_host.TaskInventory.Clone();
9626 9822
9627 UUID assetID = UUID.Zero; 9823 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 d8b9159..a5be251 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
@@ -728,18 +728,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
728 if (target != null) 728 if (target != null)
729 { 729 {
730 UUID animID=UUID.Zero; 730 UUID animID=UUID.Zero;
731 lock (m_host.TaskInventory) 731 m_host.TaskInventory.LockItemsForRead(true);
732 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
732 { 733 {
733 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 734 if (inv.Value.Name == animation)
734 { 735 {
735 if (inv.Value.Name == animation) 736 if (inv.Value.Type == (int)AssetType.Animation)
736 { 737 animID = inv.Value.AssetID;
737 if (inv.Value.Type == (int)AssetType.Animation) 738 continue;
738 animID = inv.Value.AssetID;
739 continue;
740 }
741 } 739 }
742 } 740 }
741 m_host.TaskInventory.LockItemsForRead(false);
743 if (animID == UUID.Zero) 742 if (animID == UUID.Zero)
744 target.Animator.AddAnimation(animation, m_host.UUID); 743 target.Animator.AddAnimation(animation, m_host.UUID);
745 else 744 else
@@ -761,18 +760,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
761 if (target != null) 760 if (target != null)
762 { 761 {
763 UUID animID=UUID.Zero; 762 UUID animID=UUID.Zero;
764 lock (m_host.TaskInventory) 763 m_host.TaskInventory.LockItemsForRead(true);
764 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
765 { 765 {
766 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 766 if (inv.Value.Name == animation)
767 { 767 {
768 if (inv.Value.Name == animation) 768 if (inv.Value.Type == (int)AssetType.Animation)
769 { 769 animID = inv.Value.AssetID;
770 if (inv.Value.Type == (int)AssetType.Animation) 770 continue;
771 animID = inv.Value.AssetID;
772 continue;
773 }
774 } 771 }
775 } 772 }
773 m_host.TaskInventory.LockItemsForRead(false);
776 774
777 if (animID == UUID.Zero) 775 if (animID == UUID.Zero)
778 target.Animator.RemoveAnimation(animation); 776 target.Animator.RemoveAnimation(animation);
@@ -1541,6 +1539,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1541 1539
1542 if (!UUID.TryParse(name, out assetID)) 1540 if (!UUID.TryParse(name, out assetID))
1543 { 1541 {
1542 m_host.TaskInventory.LockItemsForRead(true);
1544 foreach (TaskInventoryItem item in m_host.TaskInventory.Values) 1543 foreach (TaskInventoryItem item in m_host.TaskInventory.Values)
1545 { 1544 {
1546 if (item.Type == 7 && item.Name == name) 1545 if (item.Type == 7 && item.Name == name)
@@ -1548,6 +1547,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1548 assetID = item.AssetID; 1547 assetID = item.AssetID;
1549 } 1548 }
1550 } 1549 }
1550 m_host.TaskInventory.LockItemsForRead(false);
1551 } 1551 }
1552 1552
1553 if (assetID == UUID.Zero) 1553 if (assetID == UUID.Zero)
@@ -1594,6 +1594,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1594 1594
1595 if (!UUID.TryParse(name, out assetID)) 1595 if (!UUID.TryParse(name, out assetID))
1596 { 1596 {
1597 m_host.TaskInventory.LockItemsForRead(true);
1597 foreach (TaskInventoryItem item in m_host.TaskInventory.Values) 1598 foreach (TaskInventoryItem item in m_host.TaskInventory.Values)
1598 { 1599 {
1599 if (item.Type == 7 && item.Name == name) 1600 if (item.Type == 7 && item.Name == name)
@@ -1601,6 +1602,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1601 assetID = item.AssetID; 1602 assetID = item.AssetID;
1602 } 1603 }
1603 } 1604 }
1605 m_host.TaskInventory.LockItemsForRead(false);
1604 } 1606 }
1605 1607
1606 if (assetID == UUID.Zero) 1608 if (assetID == UUID.Zero)
@@ -1651,6 +1653,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1651 1653
1652 if (!UUID.TryParse(name, out assetID)) 1654 if (!UUID.TryParse(name, out assetID))
1653 { 1655 {
1656 m_host.TaskInventory.LockItemsForRead(true);
1654 foreach (TaskInventoryItem item in m_host.TaskInventory.Values) 1657 foreach (TaskInventoryItem item in m_host.TaskInventory.Values)
1655 { 1658 {
1656 if (item.Type == 7 && item.Name == name) 1659 if (item.Type == 7 && item.Name == name)
@@ -1658,6 +1661,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1658 assetID = item.AssetID; 1661 assetID = item.AssetID;
1659 } 1662 }
1660 } 1663 }
1664 m_host.TaskInventory.LockItemsForRead(false);
1661 } 1665 }
1662 1666
1663 if (assetID == UUID.Zero) 1667 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..7b67fa3
--- /dev/null
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/CM_Constants.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 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
75 }
76}
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 7f67599..15e0408 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;
@@ -131,6 +132,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
131 return (eventFlags); 132 return (eventFlags);
132 } 133 }
133 134
135 [DebuggerNonUserCode]
134 public void ExecuteEvent(string state, string FunctionName, object[] args) 136 public void ExecuteEvent(string state, string FunctionName, object[] args)
135 { 137 {
136 // IMPORTANT: Types and MemberInfo-derived objects require a LOT of memory. 138 // 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);
diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
index d30d2dc..6ecafd4 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
@@ -27,6 +27,7 @@
27 27
28using System; 28using System;
29using System.IO; 29using System.IO;
30using System.Diagnostics; //for [DebuggerNonUserCode]
30using System.Runtime.Remoting; 31using System.Runtime.Remoting;
31using System.Runtime.Remoting.Lifetime; 32using System.Runtime.Remoting.Lifetime;
32using System.Threading; 33using System.Threading;
@@ -237,13 +238,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
237 238
238 if (part != null) 239 if (part != null)
239 { 240 {
240 lock (part.TaskInventory) 241 part.TaskInventory.LockItemsForRead(true);
242 if (part.TaskInventory.ContainsKey(m_ItemID))
241 { 243 {
242 if (part.TaskInventory.ContainsKey(m_ItemID)) 244 m_thisScriptTask = part.TaskInventory[m_ItemID];
243 {
244 m_thisScriptTask = part.TaskInventory[m_ItemID];
245 }
246 } 245 }
246 part.TaskInventory.LockItemsForRead(false);
247 } 247 }
248 248
249 ApiManager am = new ApiManager(); 249 ApiManager am = new ApiManager();
@@ -428,14 +428,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
428 { 428 {
429 int permsMask; 429 int permsMask;
430 UUID permsGranter; 430 UUID permsGranter;
431 lock (part.TaskInventory) 431 part.TaskInventory.LockItemsForRead(true);
432 if (!part.TaskInventory.ContainsKey(m_ItemID))
432 { 433 {
433 if (!part.TaskInventory.ContainsKey(m_ItemID)) 434 part.TaskInventory.LockItemsForRead(false);
434 return; 435 return;
435
436 permsGranter = part.TaskInventory[m_ItemID].PermsGranter;
437 permsMask = part.TaskInventory[m_ItemID].PermsMask;
438 } 436 }
437 permsGranter = part.TaskInventory[m_ItemID].PermsGranter;
438 permsMask = part.TaskInventory[m_ItemID].PermsMask;
439 part.TaskInventory.LockItemsForRead(false);
439 440
440 if ((permsMask & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) != 0) 441 if ((permsMask & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) != 0)
441 { 442 {
@@ -544,6 +545,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
544 return true; 545 return true;
545 } 546 }
546 547
548 [DebuggerNonUserCode] //Prevents the debugger from farting in this function
547 public void SetState(string state) 549 public void SetState(string state)
548 { 550 {
549 if (state == State) 551 if (state == State)
@@ -555,7 +557,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
555 new DetectParams[0])); 557 new DetectParams[0]));
556 PostEvent(new EventParams("state_entry", new Object[0], 558 PostEvent(new EventParams("state_entry", new Object[0],
557 new DetectParams[0])); 559 new DetectParams[0]));
558 560
559 throw new EventAbortException(); 561 throw new EventAbortException();
560 } 562 }
561 563
@@ -638,154 +640,158 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
638 /// <returns></returns> 640 /// <returns></returns>
639 public object EventProcessor() 641 public object EventProcessor()
640 { 642 {
643
644 EventParams data = null;
645
646 lock (m_EventQueue)
647 {
641 lock (m_Script) 648 lock (m_Script)
642 { 649 {
643 EventParams data = null; 650 data = (EventParams) m_EventQueue.Dequeue();
644 651 if (data == null) // Shouldn't happen
645 lock (m_EventQueue)
646 { 652 {
647 data = (EventParams) m_EventQueue.Dequeue(); 653 if ((m_EventQueue.Count > 0) && m_RunEvents && (!m_ShuttingDown))
648 if (data == null) // Shouldn't happen
649 { 654 {
650 if ((m_EventQueue.Count > 0) && m_RunEvents && (!m_ShuttingDown)) 655 m_CurrentResult = m_Engine.QueueEventHandler(this);
651 {
652 m_CurrentResult = m_Engine.QueueEventHandler(this);
653 }
654 else
655 {
656 m_CurrentResult = null;
657 }
658 return 0;
659 } 656 }
660 657 else
661 if (data.EventName == "timer")
662 m_TimerQueued = false;
663 if (data.EventName == "control")
664 { 658 {
665 if (m_ControlEventsInQueue > 0) 659 m_CurrentResult = null;
666 m_ControlEventsInQueue--;
667 } 660 }
668 if (data.EventName == "collision") 661 return 0;
669 m_CollisionInQueue = false;
670 } 662 }
671
672 //m_log.DebugFormat("[XENGINE]: Processing event {0} for {1}", data.EventName, this);
673 663
674 m_DetectParams = data.DetectParams; 664 if (data.EventName == "timer")
675 665 m_TimerQueued = false;
676 if (data.EventName == "state") // Hardcoded state change 666 if (data.EventName == "control")
677 { 667 {
678 // m_log.DebugFormat("[Script] Script {0}.{1} state set to {2}", 668 if (m_ControlEventsInQueue > 0)
679 // m_PrimName, m_ScriptName, data.Params[0].ToString()); 669 m_ControlEventsInQueue--;
680 m_State=data.Params[0].ToString(); 670 }
681 AsyncCommandManager.RemoveScript(m_Engine, 671 if (data.EventName == "collision")
682 m_LocalID, m_ItemID); 672 m_CollisionInQueue = false;
673 }
674 }
675 lock(m_Script)
676 {
677
678 //m_log.DebugFormat("[XENGINE]: Processing event {0} for {1}", data.EventName, this);
683 679
684 SceneObjectPart part = m_Engine.World.GetSceneObjectPart( 680 m_DetectParams = data.DetectParams;
685 m_LocalID); 681
686 if (part != null) 682 if (data.EventName == "state") // Hardcoded state change
687 { 683 {
688 part.SetScriptEvents(m_ItemID, 684// m_log.DebugFormat("[Script] Script {0}.{1} state set to {2}",
689 (int)m_Script.GetStateEventFlags(State)); 685// m_PrimName, m_ScriptName, data.Params[0].ToString());
690 } 686 m_State=data.Params[0].ToString();
687 AsyncCommandManager.RemoveScript(m_Engine,
688 m_LocalID, m_ItemID);
689
690 SceneObjectPart part = m_Engine.World.GetSceneObjectPart(
691 m_LocalID);
692 if (part != null)
693 {
694 part.SetScriptEvents(m_ItemID,
695 (int)m_Script.GetStateEventFlags(State));
691 } 696 }
692 else 697 }
698 else
699 {
700 if (m_Engine.World.PipeEventsForScript(m_LocalID) ||
701 data.EventName == "control") // Don't freeze avies!
693 { 702 {
694 if (m_Engine.World.PipeEventsForScript(m_LocalID) || 703 SceneObjectPart part = m_Engine.World.GetSceneObjectPart(
695 data.EventName == "control") // Don't freeze avies! 704 m_LocalID);
696 { 705 // m_log.DebugFormat("[Script] Delivered event {2} in state {3} to {0}.{1}",
697 SceneObjectPart part = m_Engine.World.GetSceneObjectPart( 706 // m_PrimName, m_ScriptName, data.EventName, m_State);
698 m_LocalID);
699 // m_log.DebugFormat("[Script] Delivered event {2} in state {3} to {0}.{1}",
700 // m_PrimName, m_ScriptName, data.EventName, m_State);
701 707
702 try 708 try
703 { 709 {
704 m_CurrentEvent = data.EventName; 710 m_CurrentEvent = data.EventName;
705 m_EventStart = DateTime.Now; 711 m_EventStart = DateTime.Now;
706 m_InEvent = true; 712 m_InEvent = true;
707 713
708 m_Script.ExecuteEvent(State, data.EventName, data.Params); 714 m_Script.ExecuteEvent(State, data.EventName, data.Params);
709 715
710 m_InEvent = false; 716 m_InEvent = false;
711 m_CurrentEvent = String.Empty; 717 m_CurrentEvent = String.Empty;
712 718
713 if (m_SaveState) 719 if (m_SaveState)
714 { 720 {
715 // This will be the very first event we deliver 721 // This will be the very first event we deliver
716 // (state_entry) in default state 722 // (state_entry) in default state
717 // 723 //
718 724
719 SaveState(m_Assembly); 725 SaveState(m_Assembly);
720 726
721 m_SaveState = false; 727 m_SaveState = false;
722 }
723 } 728 }
724 catch (Exception e) 729 }
725 { 730 catch (Exception e)
726 // m_log.DebugFormat("[SCRIPT] Exception: {0}", e.Message); 731 {
727 m_InEvent = false; 732 // m_log.DebugFormat("[SCRIPT] Exception: {0}", e.Message);
728 m_CurrentEvent = String.Empty; 733 m_InEvent = false;
734 m_CurrentEvent = String.Empty;
729 735
730 if ((!(e is TargetInvocationException) || (!(e.InnerException is SelfDeleteException) && !(e.InnerException is ScriptDeleteException))) && !(e is ThreadAbortException)) 736 if ((!(e is TargetInvocationException) || (!(e.InnerException is SelfDeleteException) && !(e.InnerException is ScriptDeleteException))) && !(e is ThreadAbortException))
731 { 737 {
732 try 738 try
733 {
734 // DISPLAY ERROR INWORLD
735 string text = FormatException(e);
736
737 if (text.Length > 1000)
738 text = text.Substring(0, 1000);
739 m_Engine.World.SimChat(Utils.StringToBytes(text),
740 ChatTypeEnum.DebugChannel, 2147483647,
741 part.AbsolutePosition,
742 part.Name, part.UUID, false);
743 }
744 catch (Exception)
745 {
746 }
747 // catch (Exception e2) // LEGIT: User Scripting
748 // {
749 // m_log.Error("[SCRIPT]: "+
750 // "Error displaying error in-world: " +
751 // e2.ToString());
752 // m_log.Error("[SCRIPT]: " +
753 // "Errormessage: Error compiling script:\r\n" +
754 // e.ToString());
755 // }
756 }
757 else if ((e is TargetInvocationException) && (e.InnerException is SelfDeleteException))
758 { 739 {
759 m_InSelfDelete = true; 740 // DISPLAY ERROR INWORLD
760 if (part != null && part.ParentGroup != null) 741 string text = FormatException(e);
761 m_Engine.World.DeleteSceneObject(part.ParentGroup, false); 742
743 if (text.Length > 1000)
744 text = text.Substring(0, 1000);
745 m_Engine.World.SimChat(Utils.StringToBytes(text),
746 ChatTypeEnum.DebugChannel, 2147483647,
747 part.AbsolutePosition,
748 part.Name, part.UUID, false);
762 } 749 }
763 else if ((e is TargetInvocationException) && (e.InnerException is ScriptDeleteException)) 750 catch (Exception)
764 { 751 {
765 m_InSelfDelete = true;
766 if (part != null && part.ParentGroup != null)
767 part.Inventory.RemoveInventoryItem(m_ItemID);
768 } 752 }
753 // catch (Exception e2) // LEGIT: User Scripting
754 // {
755 // m_log.Error("[SCRIPT]: "+
756 // "Error displaying error in-world: " +
757 // e2.ToString());
758 // m_log.Error("[SCRIPT]: " +
759 // "Errormessage: Error compiling script:\r\n" +
760 // e.ToString());
761 // }
762 }
763 else if ((e is TargetInvocationException) && (e.InnerException is SelfDeleteException))
764 {
765 m_InSelfDelete = true;
766 if (part != null && part.ParentGroup != null)
767 m_Engine.World.DeleteSceneObject(part.ParentGroup, false);
768 }
769 else if ((e is TargetInvocationException) && (e.InnerException is ScriptDeleteException))
770 {
771 m_InSelfDelete = true;
772 if (part != null && part.ParentGroup != null)
773 part.Inventory.RemoveInventoryItem(m_ItemID);
769 } 774 }
770 } 775 }
771 } 776 }
777 }
772 778
773 lock (m_EventQueue) 779 lock (m_EventQueue)
780 {
781 if ((m_EventQueue.Count > 0) && m_RunEvents && (!m_ShuttingDown))
774 { 782 {
775 if ((m_EventQueue.Count > 0) && m_RunEvents && (!m_ShuttingDown)) 783 m_CurrentResult = m_Engine.QueueEventHandler(this);
776 { 784 }
777 m_CurrentResult = m_Engine.QueueEventHandler(this); 785 else
778 } 786 {
779 else 787 m_CurrentResult = null;
780 {
781 m_CurrentResult = null;
782 }
783 } 788 }
789 }
784 790
785 m_DetectParams = null; 791 m_DetectParams = null;
786 792
787 return 0; 793 return 0;
788 } 794 }
789 } 795 }
790 796
791 public int EventTime() 797 public int EventTime()
@@ -824,6 +830,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
824 new Object[0], new DetectParams[0])); 830 new Object[0], new DetectParams[0]));
825 } 831 }
826 832
833 [DebuggerNonUserCode] //Stops the VS debugger from farting in this function
827 public void ApiResetScript() 834 public void ApiResetScript()
828 { 835 {
829 // bool running = Running; 836 // bool running = Running;