aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/ScriptEngine/Shared/Api/Implementation
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/ScriptEngine/Shared/Api/Implementation')
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/CM_Api.cs473
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs562
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs36
3 files changed, 818 insertions, 253 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 cf3a1a0..28932b6 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);
@@ -272,40 +275,48 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
272 protected UUID InventorySelf() 275 protected UUID InventorySelf()
273 { 276 {
274 UUID invItemID = new UUID(); 277 UUID invItemID = new UUID();
275 278 bool unlock = false;
276 lock (m_host.TaskInventory) 279 if (!m_host.TaskInventory.IsReadLockedByMe())
280 {
281 m_host.TaskInventory.LockItemsForRead(true);
282 unlock = true;
283 }
284 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
277 { 285 {
278 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 286 if (inv.Value.Type == 10 && inv.Value.ItemID == m_itemID)
279 { 287 {
280 if (inv.Value.Type == 10 && inv.Value.ItemID == m_itemID) 288 invItemID = inv.Key;
281 { 289 break;
282 invItemID = inv.Key;
283 break;
284 }
285 } 290 }
286 } 291 }
287 292 if (unlock)
293 {
294 m_host.TaskInventory.LockItemsForRead(false);
295 }
288 return invItemID; 296 return invItemID;
289 } 297 }
290 298
291 protected UUID InventoryKey(string name, int type) 299 protected UUID InventoryKey(string name, int type)
292 { 300 {
293 m_host.AddScriptLPS(1); 301 m_host.AddScriptLPS(1);
294 302 m_host.TaskInventory.LockItemsForRead(true);
295 lock (m_host.TaskInventory) 303
304 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
296 { 305 {
297 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 306 if (inv.Value.Name == name)
298 { 307 {
299 if (inv.Value.Name == name) 308 m_host.TaskInventory.LockItemsForRead(false);
309
310 if (inv.Value.Type != type)
300 { 311 {
301 if (inv.Value.Type != type) 312 return UUID.Zero;
302 return UUID.Zero;
303
304 return inv.Value.AssetID;
305 } 313 }
314
315 return inv.Value.AssetID;
306 } 316 }
307 } 317 }
308 318
319 m_host.TaskInventory.LockItemsForRead(false);
309 return UUID.Zero; 320 return UUID.Zero;
310 } 321 }
311 322
@@ -313,17 +324,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
313 { 324 {
314 m_host.AddScriptLPS(1); 325 m_host.AddScriptLPS(1);
315 326
316 lock (m_host.TaskInventory) 327
328 m_host.TaskInventory.LockItemsForRead(true);
329
330 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
317 { 331 {
318 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 332 if (inv.Value.Name == name)
319 { 333 {
320 if (inv.Value.Name == name) 334 m_host.TaskInventory.LockItemsForRead(false);
321 { 335 return inv.Value.AssetID;
322 return inv.Value.AssetID;
323 }
324 } 336 }
325 } 337 }
326 338
339 m_host.TaskInventory.LockItemsForRead(false);
340
341
327 return UUID.Zero; 342 return UUID.Zero;
328 } 343 }
329 344
@@ -2555,12 +2570,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2555 2570
2556 m_host.AddScriptLPS(1); 2571 m_host.AddScriptLPS(1);
2557 2572
2573 m_host.TaskInventory.LockItemsForRead(true);
2558 TaskInventoryItem item = m_host.TaskInventory[invItemID]; 2574 TaskInventoryItem item = m_host.TaskInventory[invItemID];
2559 2575 m_host.TaskInventory.LockItemsForRead(false);
2560 lock (m_host.TaskInventory)
2561 {
2562 item = m_host.TaskInventory[invItemID];
2563 }
2564 2576
2565 if (item.PermsGranter == UUID.Zero) 2577 if (item.PermsGranter == UUID.Zero)
2566 return 0; 2578 return 0;
@@ -2635,6 +2647,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2635 if (dist > m_ScriptDistanceFactor * 10.0f) 2647 if (dist > m_ScriptDistanceFactor * 10.0f)
2636 return; 2648 return;
2637 2649
2650 //Clone is thread-safe
2638 TaskInventoryDictionary partInventory = (TaskInventoryDictionary)m_host.TaskInventory.Clone(); 2651 TaskInventoryDictionary partInventory = (TaskInventoryDictionary)m_host.TaskInventory.Clone();
2639 2652
2640 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in partInventory) 2653 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in partInventory)
@@ -2720,6 +2733,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2720 // Orient the object to the angle calculated 2733 // Orient the object to the angle calculated
2721 llSetRot(rot); 2734 llSetRot(rot);
2722 } 2735 }
2736
2737 public void llRotLookAt(LSL_Rotation target, double strength, double damping)
2738 {
2739 m_host.AddScriptLPS(1);
2740// NotImplemented("llRotLookAt");
2741 m_host.RotLookAt(Rot2Quaternion(target), (float)strength, (float)damping);
2742
2743 }
2723 2744
2724 public void llStopLookAt() 2745 public void llStopLookAt()
2725 { 2746 {
@@ -2759,13 +2780,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2759 { 2780 {
2760 TaskInventoryItem item; 2781 TaskInventoryItem item;
2761 2782
2762 lock (m_host.TaskInventory) 2783 m_host.TaskInventory.LockItemsForRead(true);
2784 if (!m_host.TaskInventory.ContainsKey(InventorySelf()))
2763 { 2785 {
2764 if (!m_host.TaskInventory.ContainsKey(InventorySelf())) 2786 m_host.TaskInventory.LockItemsForRead(false);
2765 return; 2787 return;
2766 else
2767 item = m_host.TaskInventory[InventorySelf()];
2768 } 2788 }
2789 else
2790 {
2791 item = m_host.TaskInventory[InventorySelf()];
2792 }
2793 m_host.TaskInventory.LockItemsForRead(false);
2769 2794
2770 if (item.PermsGranter != UUID.Zero) 2795 if (item.PermsGranter != UUID.Zero)
2771 { 2796 {
@@ -2787,13 +2812,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2787 { 2812 {
2788 TaskInventoryItem item; 2813 TaskInventoryItem item;
2789 2814
2815 m_host.TaskInventory.LockItemsForRead(true);
2790 lock (m_host.TaskInventory) 2816 lock (m_host.TaskInventory)
2791 { 2817 {
2818
2792 if (!m_host.TaskInventory.ContainsKey(InventorySelf())) 2819 if (!m_host.TaskInventory.ContainsKey(InventorySelf()))
2820 {
2821 m_host.TaskInventory.LockItemsForRead(false);
2793 return; 2822 return;
2823 }
2794 else 2824 else
2825 {
2795 item = m_host.TaskInventory[InventorySelf()]; 2826 item = m_host.TaskInventory[InventorySelf()];
2827 }
2796 } 2828 }
2829 m_host.TaskInventory.LockItemsForRead(false);
2797 2830
2798 m_host.AddScriptLPS(1); 2831 m_host.AddScriptLPS(1);
2799 2832
@@ -2830,14 +2863,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2830 2863
2831 TaskInventoryItem item; 2864 TaskInventoryItem item;
2832 2865
2833 lock (m_host.TaskInventory) 2866 m_host.TaskInventory.LockItemsForRead(true);
2867
2868 if (!m_host.TaskInventory.ContainsKey(InventorySelf()))
2834 { 2869 {
2835 if (!m_host.TaskInventory.ContainsKey(InventorySelf())) 2870 m_host.TaskInventory.LockItemsForRead(false);
2836 return; 2871 return;
2837 else 2872 }
2838 item = m_host.TaskInventory[InventorySelf()]; 2873 else
2874 {
2875 item = m_host.TaskInventory[InventorySelf()];
2839 } 2876 }
2840 2877
2878 m_host.TaskInventory.LockItemsForRead(false);
2879
2841 if (item.PermsGranter != m_host.OwnerID) 2880 if (item.PermsGranter != m_host.OwnerID)
2842 return; 2881 return;
2843 2882
@@ -2862,13 +2901,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2862 2901
2863 TaskInventoryItem item; 2902 TaskInventoryItem item;
2864 2903
2865 lock (m_host.TaskInventory) 2904 m_host.TaskInventory.LockItemsForRead(true);
2905
2906 if (!m_host.TaskInventory.ContainsKey(InventorySelf()))
2866 { 2907 {
2867 if (!m_host.TaskInventory.ContainsKey(InventorySelf())) 2908 m_host.TaskInventory.LockItemsForRead(false);
2868 return; 2909 return;
2869 else 2910 }
2870 item = m_host.TaskInventory[InventorySelf()]; 2911 else
2912 {
2913 item = m_host.TaskInventory[InventorySelf()];
2871 } 2914 }
2915 m_host.TaskInventory.LockItemsForRead(false);
2916
2872 2917
2873 if (item.PermsGranter != m_host.OwnerID) 2918 if (item.PermsGranter != m_host.OwnerID)
2874 return; 2919 return;
@@ -2904,8 +2949,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2904 return m_host.OwnerID.ToString(); 2949 return m_host.OwnerID.ToString();
2905 } 2950 }
2906 2951
2952 [DebuggerNonUserCode]
2907 public void llInstantMessage(string user, string message) 2953 public void llInstantMessage(string user, string message)
2908 { 2954 {
2955 UUID result;
2956 if (!UUID.TryParse(user, out result))
2957 {
2958 throw new Exception(String.Format("An invalid key of '{0} was passed to llInstantMessage", user));
2959 return;
2960 }
2961
2962
2909 m_host.AddScriptLPS(1); 2963 m_host.AddScriptLPS(1);
2910 2964
2911 // We may be able to use ClientView.SendInstantMessage here, but we need a client instance. 2965 // We may be able to use ClientView.SendInstantMessage here, but we need a client instance.
@@ -2920,7 +2974,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2920 UUID friendTransactionID = UUID.Random(); 2974 UUID friendTransactionID = UUID.Random();
2921 2975
2922 //m_pendingFriendRequests.Add(friendTransactionID, fromAgentID); 2976 //m_pendingFriendRequests.Add(friendTransactionID, fromAgentID);
2923 2977
2924 GridInstantMessage msg = new GridInstantMessage(); 2978 GridInstantMessage msg = new GridInstantMessage();
2925 msg.fromAgentID = new Guid(m_host.UUID.ToString()); // fromAgentID.Guid; 2979 msg.fromAgentID = new Guid(m_host.UUID.ToString()); // fromAgentID.Guid;
2926 msg.toAgentID = new Guid(user); // toAgentID.Guid; 2980 msg.toAgentID = new Guid(user); // toAgentID.Guid;
@@ -3069,13 +3123,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3069 m_host.AddScriptLPS(1); 3123 m_host.AddScriptLPS(1);
3070 } 3124 }
3071 3125
3072 public void llRotLookAt(LSL_Rotation target, double strength, double damping)
3073 {
3074 m_host.AddScriptLPS(1);
3075// NotImplemented("llRotLookAt");
3076 m_host.RotLookAt(Rot2Quaternion(target), (float)strength, (float)damping);
3077 }
3078
3079 public LSL_Integer llStringLength(string str) 3126 public LSL_Integer llStringLength(string str)
3080 { 3127 {
3081 m_host.AddScriptLPS(1); 3128 m_host.AddScriptLPS(1);
@@ -3099,14 +3146,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3099 3146
3100 TaskInventoryItem item; 3147 TaskInventoryItem item;
3101 3148
3102 lock (m_host.TaskInventory) 3149 m_host.TaskInventory.LockItemsForRead(true);
3150 if (!m_host.TaskInventory.ContainsKey(InventorySelf()))
3103 { 3151 {
3104 if (!m_host.TaskInventory.ContainsKey(InventorySelf())) 3152 m_host.TaskInventory.LockItemsForRead(false);
3105 return; 3153 return;
3106 else
3107 item = m_host.TaskInventory[InventorySelf()];
3108 } 3154 }
3109 3155 else
3156 {
3157 item = m_host.TaskInventory[InventorySelf()];
3158 }
3159 m_host.TaskInventory.LockItemsForRead(false);
3110 if (item.PermsGranter == UUID.Zero) 3160 if (item.PermsGranter == UUID.Zero)
3111 return; 3161 return;
3112 3162
@@ -3136,13 +3186,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3136 3186
3137 TaskInventoryItem item; 3187 TaskInventoryItem item;
3138 3188
3139 lock (m_host.TaskInventory) 3189 m_host.TaskInventory.LockItemsForRead(true);
3190 if (!m_host.TaskInventory.ContainsKey(InventorySelf()))
3140 { 3191 {
3141 if (!m_host.TaskInventory.ContainsKey(InventorySelf())) 3192 m_host.TaskInventory.LockItemsForRead(false);
3142 return; 3193 return;
3143 else
3144 item = m_host.TaskInventory[InventorySelf()];
3145 } 3194 }
3195 else
3196 {
3197 item = m_host.TaskInventory[InventorySelf()];
3198 }
3199 m_host.TaskInventory.LockItemsForRead(false);
3200
3146 3201
3147 if (item.PermsGranter == UUID.Zero) 3202 if (item.PermsGranter == UUID.Zero)
3148 return; 3203 return;
@@ -3215,10 +3270,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3215 3270
3216 TaskInventoryItem item; 3271 TaskInventoryItem item;
3217 3272
3218 lock (m_host.TaskInventory) 3273
3274 m_host.TaskInventory.LockItemsForRead(true);
3275 if (!m_host.TaskInventory.ContainsKey(invItemID))
3276 {
3277 m_host.TaskInventory.LockItemsForRead(false);
3278 return;
3279 }
3280 else
3219 { 3281 {
3220 item = m_host.TaskInventory[invItemID]; 3282 item = m_host.TaskInventory[invItemID];
3221 } 3283 }
3284 m_host.TaskInventory.LockItemsForRead(false);
3222 3285
3223 if (agentID == UUID.Zero || perm == 0) // Releasing permissions 3286 if (agentID == UUID.Zero || perm == 0) // Releasing permissions
3224 { 3287 {
@@ -3250,11 +3313,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3250 3313
3251 if ((perm & (~implicitPerms)) == 0) // Requested only implicit perms 3314 if ((perm & (~implicitPerms)) == 0) // Requested only implicit perms
3252 { 3315 {
3253 lock (m_host.TaskInventory) 3316 m_host.TaskInventory.LockItemsForWrite(true);
3254 { 3317 m_host.TaskInventory[invItemID].PermsGranter = agentID;
3255 m_host.TaskInventory[invItemID].PermsGranter = agentID; 3318 m_host.TaskInventory[invItemID].PermsMask = perm;
3256 m_host.TaskInventory[invItemID].PermsMask = perm; 3319 m_host.TaskInventory.LockItemsForWrite(false);
3257 }
3258 3320
3259 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( 3321 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams(
3260 "run_time_permissions", new Object[] { 3322 "run_time_permissions", new Object[] {
@@ -3274,11 +3336,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3274 3336
3275 if ((perm & (~implicitPerms)) == 0) // Requested only implicit perms 3337 if ((perm & (~implicitPerms)) == 0) // Requested only implicit perms
3276 { 3338 {
3277 lock (m_host.TaskInventory) 3339 m_host.TaskInventory.LockItemsForWrite(true);
3278 { 3340 m_host.TaskInventory[invItemID].PermsGranter = agentID;
3279 m_host.TaskInventory[invItemID].PermsGranter = agentID; 3341 m_host.TaskInventory[invItemID].PermsMask = perm;
3280 m_host.TaskInventory[invItemID].PermsMask = perm; 3342 m_host.TaskInventory.LockItemsForWrite(false);
3281 }
3282 3343
3283 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( 3344 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams(
3284 "run_time_permissions", new Object[] { 3345 "run_time_permissions", new Object[] {
@@ -3299,11 +3360,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3299 3360
3300 if (!m_waitingForScriptAnswer) 3361 if (!m_waitingForScriptAnswer)
3301 { 3362 {
3302 lock (m_host.TaskInventory) 3363 m_host.TaskInventory.LockItemsForWrite(true);
3303 { 3364 m_host.TaskInventory[invItemID].PermsGranter = agentID;
3304 m_host.TaskInventory[invItemID].PermsGranter = agentID; 3365 m_host.TaskInventory[invItemID].PermsMask = 0;
3305 m_host.TaskInventory[invItemID].PermsMask = 0; 3366 m_host.TaskInventory.LockItemsForWrite(false);
3306 }
3307 3367
3308 presence.ControllingClient.OnScriptAnswer += handleScriptAnswer; 3368 presence.ControllingClient.OnScriptAnswer += handleScriptAnswer;
3309 m_waitingForScriptAnswer=true; 3369 m_waitingForScriptAnswer=true;
@@ -3338,10 +3398,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3338 if ((answer & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) == 0) 3398 if ((answer & ScriptBaseClass.PERMISSION_TAKE_CONTROLS) == 0)
3339 llReleaseControls(); 3399 llReleaseControls();
3340 3400
3341 lock (m_host.TaskInventory) 3401
3342 { 3402 m_host.TaskInventory.LockItemsForWrite(true);
3343 m_host.TaskInventory[invItemID].PermsMask = answer; 3403 m_host.TaskInventory[invItemID].PermsMask = answer;
3344 } 3404 m_host.TaskInventory.LockItemsForWrite(false);
3405
3345 3406
3346 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams( 3407 m_ScriptEngine.PostScriptEvent(m_itemID, new EventParams(
3347 "run_time_permissions", new Object[] { 3408 "run_time_permissions", new Object[] {
@@ -3353,16 +3414,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3353 { 3414 {
3354 m_host.AddScriptLPS(1); 3415 m_host.AddScriptLPS(1);
3355 3416
3356 lock (m_host.TaskInventory) 3417 m_host.TaskInventory.LockItemsForRead(true);
3418
3419 foreach (TaskInventoryItem item in m_host.TaskInventory.Values)
3357 { 3420 {
3358 foreach (TaskInventoryItem item in m_host.TaskInventory.Values) 3421 if (item.Type == 10 && item.ItemID == m_itemID)
3359 { 3422 {
3360 if (item.Type == 10 && item.ItemID == m_itemID) 3423 m_host.TaskInventory.LockItemsForRead(false);
3361 { 3424 return item.PermsGranter.ToString();
3362 return item.PermsGranter.ToString();
3363 }
3364 } 3425 }
3365 } 3426 }
3427 m_host.TaskInventory.LockItemsForRead(false);
3366 3428
3367 return UUID.Zero.ToString(); 3429 return UUID.Zero.ToString();
3368 } 3430 }
@@ -3371,19 +3433,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3371 { 3433 {
3372 m_host.AddScriptLPS(1); 3434 m_host.AddScriptLPS(1);
3373 3435
3374 lock (m_host.TaskInventory) 3436 m_host.TaskInventory.LockItemsForRead(true);
3437
3438 foreach (TaskInventoryItem item in m_host.TaskInventory.Values)
3375 { 3439 {
3376 foreach (TaskInventoryItem item in m_host.TaskInventory.Values) 3440 if (item.Type == 10 && item.ItemID == m_itemID)
3377 { 3441 {
3378 if (item.Type == 10 && item.ItemID == m_itemID) 3442 int perms = item.PermsMask;
3379 { 3443 if (m_automaticLinkPermission)
3380 int perms = item.PermsMask; 3444 perms |= ScriptBaseClass.PERMISSION_CHANGE_LINKS;
3381 if (m_automaticLinkPermission) 3445 m_host.TaskInventory.LockItemsForRead(false);
3382 perms |= ScriptBaseClass.PERMISSION_CHANGE_LINKS; 3446 return perms;
3383 return perms;
3384 }
3385 } 3447 }
3386 } 3448 }
3449 m_host.TaskInventory.LockItemsForRead(false);
3387 3450
3388 return 0; 3451 return 0;
3389 } 3452 }
@@ -3416,11 +3479,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3416 UUID invItemID = InventorySelf(); 3479 UUID invItemID = InventorySelf();
3417 3480
3418 TaskInventoryItem item; 3481 TaskInventoryItem item;
3419 lock (m_host.TaskInventory) 3482 m_host.TaskInventory.LockItemsForRead(true);
3420 { 3483 item = m_host.TaskInventory[invItemID];
3421 item = m_host.TaskInventory[invItemID]; 3484 m_host.TaskInventory.LockItemsForRead(false);
3422 } 3485
3423
3424 if ((item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0 3486 if ((item.PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0
3425 && !m_automaticLinkPermission) 3487 && !m_automaticLinkPermission)
3426 { 3488 {
@@ -3473,16 +3535,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3473 m_host.AddScriptLPS(1); 3535 m_host.AddScriptLPS(1);
3474 UUID invItemID = InventorySelf(); 3536 UUID invItemID = InventorySelf();
3475 3537
3476 lock (m_host.TaskInventory) 3538 m_host.TaskInventory.LockItemsForRead(true);
3477 {
3478 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0 3539 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CHANGE_LINKS) == 0
3479 && !m_automaticLinkPermission) 3540 && !m_automaticLinkPermission)
3480 { 3541 {
3481 ShoutError("Script trying to link but PERMISSION_CHANGE_LINKS permission not set!"); 3542 ShoutError("Script trying to link but PERMISSION_CHANGE_LINKS permission not set!");
3543 m_host.TaskInventory.LockItemsForRead(false);
3482 return; 3544 return;
3483 } 3545 }
3484 } 3546 m_host.TaskInventory.LockItemsForRead(false);
3485 3547
3486 if (linknum < ScriptBaseClass.LINK_THIS) 3548 if (linknum < ScriptBaseClass.LINK_THIS)
3487 return; 3549 return;
3488 3550
@@ -3659,17 +3721,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3659 m_host.AddScriptLPS(1); 3721 m_host.AddScriptLPS(1);
3660 int count = 0; 3722 int count = 0;
3661 3723
3662 lock (m_host.TaskInventory) 3724 m_host.TaskInventory.LockItemsForRead(true);
3725 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
3663 { 3726 {
3664 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 3727 if (inv.Value.Type == type || type == -1)
3665 { 3728 {
3666 if (inv.Value.Type == type || type == -1) 3729 count = count + 1;
3667 {
3668 count = count + 1;
3669 }
3670 } 3730 }
3671 } 3731 }
3672 3732
3733 m_host.TaskInventory.LockItemsForRead(false);
3673 return count; 3734 return count;
3674 } 3735 }
3675 3736
@@ -3678,16 +3739,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3678 m_host.AddScriptLPS(1); 3739 m_host.AddScriptLPS(1);
3679 ArrayList keys = new ArrayList(); 3740 ArrayList keys = new ArrayList();
3680 3741
3681 lock (m_host.TaskInventory) 3742 m_host.TaskInventory.LockItemsForRead(true);
3743 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
3682 { 3744 {
3683 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 3745 if (inv.Value.Type == type || type == -1)
3684 { 3746 {
3685 if (inv.Value.Type == type || type == -1) 3747 keys.Add(inv.Value.Name);
3686 {
3687 keys.Add(inv.Value.Name);
3688 }
3689 } 3748 }
3690 } 3749 }
3750 m_host.TaskInventory.LockItemsForRead(false);
3691 3751
3692 if (keys.Count == 0) 3752 if (keys.Count == 0)
3693 { 3753 {
@@ -3724,20 +3784,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3724 } 3784 }
3725 3785
3726 // move the first object found with this inventory name 3786 // move the first object found with this inventory name
3727 lock (m_host.TaskInventory) 3787 m_host.TaskInventory.LockItemsForRead(true);
3788 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
3728 { 3789 {
3729 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 3790 if (inv.Value.Name == inventory)
3730 { 3791 {
3731 if (inv.Value.Name == inventory) 3792 found = true;
3732 { 3793 objId = inv.Key;
3733 found = true; 3794 assetType = inv.Value.Type;
3734 objId = inv.Key; 3795 objName = inv.Value.Name;
3735 assetType = inv.Value.Type; 3796 break;
3736 objName = inv.Value.Name;
3737 break;
3738 }
3739 } 3797 }
3740 } 3798 }
3799 m_host.TaskInventory.LockItemsForRead(false);
3741 3800
3742 if (!found) 3801 if (!found)
3743 { 3802 {
@@ -3782,24 +3841,26 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3782 ScriptSleep(3000); 3841 ScriptSleep(3000);
3783 } 3842 }
3784 3843
3844 [DebuggerNonUserCode]
3785 public void llRemoveInventory(string name) 3845 public void llRemoveInventory(string name)
3786 { 3846 {
3787 m_host.AddScriptLPS(1); 3847 m_host.AddScriptLPS(1);
3788 3848
3789 lock (m_host.TaskInventory) 3849 m_host.TaskInventory.LockItemsForRead(true);
3850 foreach (TaskInventoryItem item in m_host.TaskInventory.Values)
3790 { 3851 {
3791 foreach (TaskInventoryItem item in m_host.TaskInventory.Values) 3852 if (item.Name == name)
3792 { 3853 {
3793 if (item.Name == name) 3854 if (item.ItemID == m_itemID)
3794 { 3855 throw new ScriptDeleteException();
3795 if (item.ItemID == m_itemID) 3856 else
3796 throw new ScriptDeleteException(); 3857 m_host.Inventory.RemoveInventoryItem(item.ItemID);
3797 else 3858
3798 m_host.Inventory.RemoveInventoryItem(item.ItemID); 3859 m_host.TaskInventory.LockItemsForRead(false);
3799 return; 3860 return;
3800 }
3801 } 3861 }
3802 } 3862 }
3863 m_host.TaskInventory.LockItemsForRead(false);
3803 } 3864 }
3804 3865
3805 public void llSetText(string text, LSL_Vector color, double alpha) 3866 public void llSetText(string text, LSL_Vector color, double alpha)
@@ -3888,6 +3949,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3888 { 3949 {
3889 m_host.AddScriptLPS(1); 3950 m_host.AddScriptLPS(1);
3890 3951
3952 //Clone is thread safe
3891 TaskInventoryDictionary itemDictionary = (TaskInventoryDictionary)m_host.TaskInventory.Clone(); 3953 TaskInventoryDictionary itemDictionary = (TaskInventoryDictionary)m_host.TaskInventory.Clone();
3892 3954
3893 foreach (TaskInventoryItem item in itemDictionary.Values) 3955 foreach (TaskInventoryItem item in itemDictionary.Values)
@@ -3978,17 +4040,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3978 UUID soundId = UUID.Zero; 4040 UUID soundId = UUID.Zero;
3979 if (!UUID.TryParse(impact_sound, out soundId)) 4041 if (!UUID.TryParse(impact_sound, out soundId))
3980 { 4042 {
3981 lock (m_host.TaskInventory) 4043 m_host.TaskInventory.LockItemsForRead(true);
4044 foreach (TaskInventoryItem item in m_host.TaskInventory.Values)
3982 { 4045 {
3983 foreach (TaskInventoryItem item in m_host.TaskInventory.Values) 4046 if (item.Type == (int)AssetType.Sound && item.Name == impact_sound)
3984 { 4047 {
3985 if (item.Type == (int)AssetType.Sound && item.Name == impact_sound) 4048 soundId = item.AssetID;
3986 { 4049 break;
3987 soundId = item.AssetID;
3988 break;
3989 }
3990 } 4050 }
3991 } 4051 }
4052 m_host.TaskInventory.LockItemsForRead(false);
3992 } 4053 }
3993 m_host.CollisionSound = soundId; 4054 m_host.CollisionSound = soundId;
3994 m_host.CollisionSoundVolume = (float)impact_volume; 4055 m_host.CollisionSoundVolume = (float)impact_volume;
@@ -4034,6 +4095,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4034 UUID partItemID; 4095 UUID partItemID;
4035 foreach (SceneObjectPart part in parts) 4096 foreach (SceneObjectPart part in parts)
4036 { 4097 {
4098 //Clone is thread safe
4037 TaskInventoryDictionary itemsDictionary = (TaskInventoryDictionary)part.TaskInventory.Clone(); 4099 TaskInventoryDictionary itemsDictionary = (TaskInventoryDictionary)part.TaskInventory.Clone();
4038 4100
4039 foreach (TaskInventoryItem item in itemsDictionary.Values) 4101 foreach (TaskInventoryItem item in itemsDictionary.Values)
@@ -4241,17 +4303,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4241 4303
4242 m_host.AddScriptLPS(1); 4304 m_host.AddScriptLPS(1);
4243 4305
4244 lock (m_host.TaskInventory) 4306 m_host.TaskInventory.LockItemsForRead(true);
4307 foreach (TaskInventoryItem item in m_host.TaskInventory.Values)
4245 { 4308 {
4246 foreach (TaskInventoryItem item in m_host.TaskInventory.Values) 4309 if (item.Type == 10 && item.ItemID == m_itemID)
4247 { 4310 {
4248 if (item.Type == 10 && item.ItemID == m_itemID) 4311 result = item.Name!=null?item.Name:String.Empty;
4249 { 4312 break;
4250 result = item.Name!=null?item.Name:String.Empty;
4251 break;
4252 }
4253 } 4313 }
4254 } 4314 }
4315 m_host.TaskInventory.LockItemsForRead(false);
4255 4316
4256 return result; 4317 return result;
4257 } 4318 }
@@ -4509,23 +4570,24 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4509 { 4570 {
4510 m_host.AddScriptLPS(1); 4571 m_host.AddScriptLPS(1);
4511 4572
4512 lock (m_host.TaskInventory) 4573 m_host.TaskInventory.LockItemsForRead(true);
4574 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
4513 { 4575 {
4514 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 4576 if (inv.Value.Name == name)
4515 { 4577 {
4516 if (inv.Value.Name == name) 4578 if ((inv.Value.CurrentPermissions & (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify)) == (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify))
4517 { 4579 {
4518 if ((inv.Value.CurrentPermissions & (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify)) == (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify)) 4580 m_host.TaskInventory.LockItemsForRead(false);
4519 { 4581 return inv.Value.AssetID.ToString();
4520 return inv.Value.AssetID.ToString(); 4582 }
4521 } 4583 else
4522 else 4584 {
4523 { 4585 m_host.TaskInventory.LockItemsForRead(false);
4524 return UUID.Zero.ToString(); 4586 return UUID.Zero.ToString();
4525 }
4526 } 4587 }
4527 } 4588 }
4528 } 4589 }
4590 m_host.TaskInventory.LockItemsForRead(false);
4529 4591
4530 return UUID.Zero.ToString(); 4592 return UUID.Zero.ToString();
4531 } 4593 }
@@ -6021,14 +6083,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6021 6083
6022 protected UUID GetTaskInventoryItem(string name) 6084 protected UUID GetTaskInventoryItem(string name)
6023 { 6085 {
6024 lock (m_host.TaskInventory) 6086 m_host.TaskInventory.LockItemsForRead(true);
6087 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
6025 { 6088 {
6026 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 6089 if (inv.Value.Name == name)
6027 { 6090 {
6028 if (inv.Value.Name == name) 6091 m_host.TaskInventory.LockItemsForRead(false);
6029 return inv.Key; 6092 return inv.Key;
6030 } 6093 }
6031 } 6094 }
6095 m_host.TaskInventory.LockItemsForRead(false);
6032 6096
6033 return UUID.Zero; 6097 return UUID.Zero;
6034 } 6098 }
@@ -6339,22 +6403,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6339 } 6403 }
6340 6404
6341 // copy the first script found with this inventory name 6405 // copy the first script found with this inventory name
6342 lock (m_host.TaskInventory) 6406 m_host.TaskInventory.LockItemsForRead(true);
6407 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
6343 { 6408 {
6344 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 6409 if (inv.Value.Name == name)
6345 { 6410 {
6346 if (inv.Value.Name == name) 6411 // make sure the object is a script
6412 if (10 == inv.Value.Type)
6347 { 6413 {
6348 // make sure the object is a script 6414 found = true;
6349 if (10 == inv.Value.Type) 6415 srcId = inv.Key;
6350 { 6416 break;
6351 found = true;
6352 srcId = inv.Key;
6353 break;
6354 }
6355 } 6417 }
6356 } 6418 }
6357 } 6419 }
6420 m_host.TaskInventory.LockItemsForRead(false);
6358 6421
6359 if (!found) 6422 if (!found)
6360 { 6423 {
@@ -8170,28 +8233,28 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8170 { 8233 {
8171 m_host.AddScriptLPS(1); 8234 m_host.AddScriptLPS(1);
8172 8235
8173 lock (m_host.TaskInventory) 8236 m_host.TaskInventory.LockItemsForRead(true);
8237 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
8174 { 8238 {
8175 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 8239 if (inv.Value.Name == item)
8176 { 8240 {
8177 if (inv.Value.Name == item) 8241 m_host.TaskInventory.LockItemsForRead(false);
8242 switch (mask)
8178 { 8243 {
8179 switch (mask) 8244 case 0:
8180 { 8245 return (int)inv.Value.BasePermissions;
8181 case 0: 8246 case 1:
8182 return (int)inv.Value.BasePermissions; 8247 return (int)inv.Value.CurrentPermissions;
8183 case 1: 8248 case 2:
8184 return (int)inv.Value.CurrentPermissions; 8249 return (int)inv.Value.GroupPermissions;
8185 case 2: 8250 case 3:
8186 return (int)inv.Value.GroupPermissions; 8251 return (int)inv.Value.EveryonePermissions;
8187 case 3: 8252 case 4:
8188 return (int)inv.Value.EveryonePermissions; 8253 return (int)inv.Value.NextPermissions;
8189 case 4:
8190 return (int)inv.Value.NextPermissions;
8191 }
8192 } 8254 }
8193 } 8255 }
8194 } 8256 }
8257 m_host.TaskInventory.LockItemsForRead(false);
8195 8258
8196 return -1; 8259 return -1;
8197 } 8260 }
@@ -8206,16 +8269,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8206 { 8269 {
8207 m_host.AddScriptLPS(1); 8270 m_host.AddScriptLPS(1);
8208 8271
8209 lock (m_host.TaskInventory) 8272 m_host.TaskInventory.LockItemsForRead(true);
8273 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
8210 { 8274 {
8211 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 8275 if (inv.Value.Name == item)
8212 { 8276 {
8213 if (inv.Value.Name == item) 8277 m_host.TaskInventory.LockItemsForRead(false);
8214 { 8278 return inv.Value.CreatorID.ToString();
8215 return inv.Value.CreatorID.ToString();
8216 }
8217 } 8279 }
8218 } 8280 }
8281 m_host.TaskInventory.LockItemsForRead(false);
8219 8282
8220 llSay(0, "No item name '" + item + "'"); 8283 llSay(0, "No item name '" + item + "'");
8221 8284
@@ -8739,16 +8802,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8739 { 8802 {
8740 m_host.AddScriptLPS(1); 8803 m_host.AddScriptLPS(1);
8741 8804
8742 lock (m_host.TaskInventory) 8805 m_host.TaskInventory.LockItemsForRead(true);
8806 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory)
8743 { 8807 {
8744 foreach (KeyValuePair<UUID, TaskInventoryItem> inv in m_host.TaskInventory) 8808 if (inv.Value.Name == name)
8745 { 8809 {
8746 if (inv.Value.Name == name) 8810 m_host.TaskInventory.LockItemsForRead(false);
8747 { 8811 return inv.Value.Type;
8748 return inv.Value.Type;
8749 }
8750 } 8812 }
8751 } 8813 }
8814 m_host.TaskInventory.LockItemsForRead(false);
8752 8815
8753 return -1; 8816 return -1;
8754 } 8817 }
@@ -8779,17 +8842,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8779 if (invItemID == UUID.Zero) 8842 if (invItemID == UUID.Zero)
8780 return new LSL_Vector(); 8843 return new LSL_Vector();
8781 8844
8782 lock (m_host.TaskInventory) 8845 m_host.TaskInventory.LockItemsForRead(true);
8846 if (m_host.TaskInventory[invItemID].PermsGranter == UUID.Zero)
8783 { 8847 {
8784 if (m_host.TaskInventory[invItemID].PermsGranter == UUID.Zero) 8848 m_host.TaskInventory.LockItemsForRead(false);
8785 return new LSL_Vector(); 8849 return new LSL_Vector();
8850 }
8786 8851
8787 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0) 8852 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0)
8788 { 8853 {
8789 ShoutError("No permissions to track the camera"); 8854 ShoutError("No permissions to track the camera");
8790 return new LSL_Vector(); 8855 m_host.TaskInventory.LockItemsForRead(false);
8791 } 8856 return new LSL_Vector();
8792 } 8857 }
8858 m_host.TaskInventory.LockItemsForRead(false);
8793 8859
8794 ScenePresence presence = World.GetScenePresence(m_host.OwnerID); 8860 ScenePresence presence = World.GetScenePresence(m_host.OwnerID);
8795 if (presence != null) 8861 if (presence != null)
@@ -8807,17 +8873,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8807 if (invItemID == UUID.Zero) 8873 if (invItemID == UUID.Zero)
8808 return new LSL_Rotation(); 8874 return new LSL_Rotation();
8809 8875
8810 lock (m_host.TaskInventory) 8876 m_host.TaskInventory.LockItemsForRead(true);
8877 if (m_host.TaskInventory[invItemID].PermsGranter == UUID.Zero)
8811 { 8878 {
8812 if (m_host.TaskInventory[invItemID].PermsGranter == UUID.Zero) 8879 m_host.TaskInventory.LockItemsForRead(false);
8813 return new LSL_Rotation(); 8880 return new LSL_Rotation();
8814
8815 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0)
8816 {
8817 ShoutError("No permissions to track the camera");
8818 return new LSL_Rotation();
8819 }
8820 } 8881 }
8882 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0)
8883 {
8884 ShoutError("No permissions to track the camera");
8885 m_host.TaskInventory.LockItemsForRead(false);
8886 return new LSL_Rotation();
8887 }
8888 m_host.TaskInventory.LockItemsForRead(false);
8821 8889
8822 ScenePresence presence = World.GetScenePresence(m_host.OwnerID); 8890 ScenePresence presence = World.GetScenePresence(m_host.OwnerID);
8823 if (presence != null) 8891 if (presence != null)
@@ -8967,14 +9035,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8967 if (objectID == UUID.Zero) return; 9035 if (objectID == UUID.Zero) return;
8968 9036
8969 UUID agentID; 9037 UUID agentID;
8970 lock (m_host.TaskInventory) 9038 m_host.TaskInventory.LockItemsForRead(true);
8971 { 9039 // we need the permission first, to know which avatar we want to set the camera for
8972 // we need the permission first, to know which avatar we want to set the camera for 9040 agentID = m_host.TaskInventory[invItemID].PermsGranter;
8973 agentID = m_host.TaskInventory[invItemID].PermsGranter;
8974 9041
8975 if (agentID == UUID.Zero) return; 9042 if (agentID == UUID.Zero)
8976 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0) return; 9043 {
9044 m_host.TaskInventory.LockItemsForRead(false);
9045 return;
8977 } 9046 }
9047 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0)
9048 {
9049 m_host.TaskInventory.LockItemsForRead(false);
9050 return;
9051 }
9052 m_host.TaskInventory.LockItemsForRead(false);
8978 9053
8979 ScenePresence presence = World.GetScenePresence(agentID); 9054 ScenePresence presence = World.GetScenePresence(agentID);
8980 9055
@@ -9024,12 +9099,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
9024 9099
9025 // we need the permission first, to know which avatar we want to clear the camera for 9100 // we need the permission first, to know which avatar we want to clear the camera for
9026 UUID agentID; 9101 UUID agentID;
9027 lock (m_host.TaskInventory) 9102 m_host.TaskInventory.LockItemsForRead(true);
9103 agentID = m_host.TaskInventory[invItemID].PermsGranter;
9104 if (agentID == UUID.Zero)
9105 {
9106 m_host.TaskInventory.LockItemsForRead(false);
9107 return;
9108 }
9109 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0)
9028 { 9110 {
9029 agentID = m_host.TaskInventory[invItemID].PermsGranter; 9111 m_host.TaskInventory.LockItemsForRead(false);
9030 if (agentID == UUID.Zero) return; 9112 return;
9031 if ((m_host.TaskInventory[invItemID].PermsMask & ScriptBaseClass.PERMISSION_CONTROL_CAMERA) == 0) return;
9032 } 9113 }
9114 m_host.TaskInventory.LockItemsForRead(false);
9033 9115
9034 ScenePresence presence = World.GetScenePresence(agentID); 9116 ScenePresence presence = World.GetScenePresence(agentID);
9035 9117
@@ -9486,15 +9568,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
9486 9568
9487 internal UUID ScriptByName(string name) 9569 internal UUID ScriptByName(string name)
9488 { 9570 {
9489 lock (m_host.TaskInventory) 9571 m_host.TaskInventory.LockItemsForRead(true);
9572
9573 foreach (TaskInventoryItem item in m_host.TaskInventory.Values)
9490 { 9574 {
9491 foreach (TaskInventoryItem item in m_host.TaskInventory.Values) 9575 if (item.Type == 10 && item.Name == name)
9492 { 9576 {
9493 if (item.Type == 10 && item.Name == name) 9577 m_host.TaskInventory.LockItemsForRead(false);
9494 return item.ItemID; 9578 return item.ItemID;
9495 } 9579 }
9496 } 9580 }
9497 9581
9582 m_host.TaskInventory.LockItemsForRead(false);
9583
9498 return UUID.Zero; 9584 return UUID.Zero;
9499 } 9585 }
9500 9586
@@ -9535,6 +9621,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
9535 { 9621 {
9536 m_host.AddScriptLPS(1); 9622 m_host.AddScriptLPS(1);
9537 9623
9624 //Clone is thread safe
9538 TaskInventoryDictionary itemsDictionary = (TaskInventoryDictionary)m_host.TaskInventory.Clone(); 9625 TaskInventoryDictionary itemsDictionary = (TaskInventoryDictionary)m_host.TaskInventory.Clone();
9539 9626
9540 UUID assetID = UUID.Zero; 9627 UUID assetID = UUID.Zero;
@@ -9597,6 +9684,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
9597 { 9684 {
9598 m_host.AddScriptLPS(1); 9685 m_host.AddScriptLPS(1);
9599 9686
9687 //Clone is thread safe
9600 TaskInventoryDictionary itemsDictionary = (TaskInventoryDictionary)m_host.TaskInventory.Clone(); 9688 TaskInventoryDictionary itemsDictionary = (TaskInventoryDictionary)m_host.TaskInventory.Clone();
9601 9689
9602 UUID assetID = UUID.Zero; 9690 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 9c7604b..bd09534 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)