aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs')
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs120
1 files changed, 31 insertions, 89 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 0db6fe3..be6ac0a 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -45,6 +45,7 @@ using OpenSim.Region.CoreModules.World.Terrain;
45using OpenSim.Region.Framework.Interfaces; 45using OpenSim.Region.Framework.Interfaces;
46using OpenSim.Region.Framework.Scenes; 46using OpenSim.Region.Framework.Scenes;
47using OpenSim.Region.Framework.Scenes.Animation; 47using OpenSim.Region.Framework.Scenes.Animation;
48using OpenSim.Region.Framework.Scenes.Scripting;
48using OpenSim.Region.Physics.Manager; 49using OpenSim.Region.Physics.Manager;
49using OpenSim.Region.ScriptEngine.Shared; 50using OpenSim.Region.ScriptEngine.Shared;
50using OpenSim.Region.ScriptEngine.Shared.Api.Plugins; 51using OpenSim.Region.ScriptEngine.Shared.Api.Plugins;
@@ -333,79 +334,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
333 } 334 }
334 } 335 }
335 336
336 protected UUID InventoryKey(string name, int type)
337 {
338 TaskInventoryItem item = m_host.Inventory.GetInventoryItem(name);
339
340 if (item != null && item.Type == type)
341 return item.AssetID;
342 else
343 return UUID.Zero;
344 }
345
346 /// <summary>
347 /// accepts a valid UUID, -or- a name of an inventory item.
348 /// Returns a valid UUID or UUID.Zero if key invalid and item not found
349 /// in prim inventory.
350 /// </summary>
351 /// <param name="k"></param>
352 /// <returns></returns>
353 protected UUID KeyOrName(string k)
354 {
355 UUID key;
356
357 // if we can parse the string as a key, use it.
358 // else try to locate the name in inventory of object. found returns key,
359 // not found returns UUID.Zero
360 if (!UUID.TryParse(k, out key))
361 {
362 TaskInventoryItem item = m_host.Inventory.GetInventoryItem(k);
363
364 if (item != null)
365 key = item.AssetID;
366 else
367 key = UUID.Zero;
368 }
369
370 return key;
371 }
372
373 /// <summary>
374 /// Return the UUID of the asset matching the specified key or name
375 /// and asset type.
376 /// </summary>
377 /// <param name="k"></param>
378 /// <param name="type"></param>
379 /// <returns></returns>
380 protected UUID KeyOrName(string k, AssetType type)
381 {
382 UUID key;
383
384 if (!UUID.TryParse(k, out key))
385 {
386 TaskInventoryItem item = m_host.Inventory.GetInventoryItem(k);
387 if (item != null && item.Type == (int)type)
388 key = item.AssetID;
389 }
390 else
391 {
392 lock (m_host.TaskInventory)
393 {
394 foreach (KeyValuePair<UUID, TaskInventoryItem> item in m_host.TaskInventory)
395 {
396 if (item.Value.Type == (int)type && item.Value.Name == k)
397 {
398 key = item.Value.ItemID;
399 break;
400 }
401 }
402 }
403 }
404
405
406 return key;
407 }
408
409 //These are the implementations of the various ll-functions used by the LSL scripts. 337 //These are the implementations of the various ll-functions used by the LSL scripts.
410 public LSL_Float llSin(double f) 338 public LSL_Float llSin(double f)
411 { 339 {
@@ -1816,7 +1744,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1816 { 1744 {
1817 UUID textureID = new UUID(); 1745 UUID textureID = new UUID();
1818 1746
1819 textureID = InventoryKey(texture, (int)AssetType.Texture); 1747 textureID = ScriptUtils.GetAssetIdFromItemName(m_host, texture, (int)AssetType.Texture);
1820 if (textureID == UUID.Zero) 1748 if (textureID == UUID.Zero)
1821 { 1749 {
1822 if (!UUID.TryParse(texture, out textureID)) 1750 if (!UUID.TryParse(texture, out textureID))
@@ -2450,7 +2378,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2450 if (m_SoundModule != null) 2378 if (m_SoundModule != null)
2451 { 2379 {
2452 m_SoundModule.SendSound(m_host.UUID, 2380 m_SoundModule.SendSound(m_host.UUID,
2453 KeyOrName(sound, AssetType.Sound), volume, false, 0, 2381 ScriptUtils.GetAssetIdFromKeyOrItemName(m_host, sound, AssetType.Sound), volume, false, 0,
2454 0, false, false); 2382 0, false, false);
2455 } 2383 }
2456 } 2384 }
@@ -2460,7 +2388,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2460 m_host.AddScriptLPS(1); 2388 m_host.AddScriptLPS(1);
2461 if (m_SoundModule != null) 2389 if (m_SoundModule != null)
2462 { 2390 {
2463 m_SoundModule.LoopSound(m_host.UUID, KeyOrName(sound), 2391 m_SoundModule.LoopSound(m_host.UUID, ScriptUtils.GetAssetIdFromKeyOrItemName(m_host, sound),
2464 volume, 20, false); 2392 volume, 20, false);
2465 } 2393 }
2466 } 2394 }
@@ -2470,7 +2398,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2470 m_host.AddScriptLPS(1); 2398 m_host.AddScriptLPS(1);
2471 if (m_SoundModule != null) 2399 if (m_SoundModule != null)
2472 { 2400 {
2473 m_SoundModule.LoopSound(m_host.UUID, KeyOrName(sound), 2401 m_SoundModule.LoopSound(m_host.UUID, ScriptUtils.GetAssetIdFromKeyOrItemName(m_host, sound),
2474 volume, 20, true); 2402 volume, 20, true);
2475 } 2403 }
2476 } 2404 }
@@ -2492,7 +2420,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2492 if (m_SoundModule != null) 2420 if (m_SoundModule != null)
2493 { 2421 {
2494 m_SoundModule.SendSound(m_host.UUID, 2422 m_SoundModule.SendSound(m_host.UUID,
2495 KeyOrName(sound, AssetType.Sound), volume, false, 0, 2423 ScriptUtils.GetAssetIdFromKeyOrItemName(m_host, sound, AssetType.Sound), volume, false, 0,
2496 0, true, false); 2424 0, true, false);
2497 } 2425 }
2498 } 2426 }
@@ -2504,7 +2432,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2504 if (m_SoundModule != null) 2432 if (m_SoundModule != null)
2505 { 2433 {
2506 m_SoundModule.SendSound(m_host.UUID, 2434 m_SoundModule.SendSound(m_host.UUID,
2507 KeyOrName(sound, AssetType.Sound), volume, true, 0, 0, 2435 ScriptUtils.GetAssetIdFromKeyOrItemName(m_host, sound, AssetType.Sound), volume, true, 0, 0,
2508 false, false); 2436 false, false);
2509 } 2437 }
2510 } 2438 }
@@ -2521,7 +2449,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2521 { 2449 {
2522 m_host.AddScriptLPS(1); 2450 m_host.AddScriptLPS(1);
2523 if (m_SoundModule != null) 2451 if (m_SoundModule != null)
2524 m_SoundModule.PreloadSound(m_host.UUID, KeyOrName(sound), 0); 2452 m_SoundModule.PreloadSound(m_host.UUID, ScriptUtils.GetAssetIdFromKeyOrItemName(m_host, sound), 0);
2525 ScriptSleep(1000); 2453 ScriptSleep(1000);
2526 } 2454 }
2527 2455
@@ -3352,7 +3280,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3352 if (presence != null) 3280 if (presence != null)
3353 { 3281 {
3354 // Do NOT try to parse UUID, animations cannot be triggered by ID 3282 // Do NOT try to parse UUID, animations cannot be triggered by ID
3355 UUID animID = InventoryKey(anim, (int)AssetType.Animation); 3283 UUID animID = ScriptUtils.GetAssetIdFromItemName(m_host, anim, (int)AssetType.Animation);
3356 if (animID == UUID.Zero) 3284 if (animID == UUID.Zero)
3357 presence.Animator.AddAnimation(anim, m_host.UUID); 3285 presence.Animator.AddAnimation(anim, m_host.UUID);
3358 else 3286 else
@@ -3374,7 +3302,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3374 3302
3375 if (presence != null) 3303 if (presence != null)
3376 { 3304 {
3377 UUID animID = KeyOrName(anim); 3305 UUID animID = ScriptUtils.GetAssetIdFromKeyOrItemName(m_host, anim);
3378 3306
3379 if (animID == UUID.Zero) 3307 if (animID == UUID.Zero)
3380 presence.Animator.RemoveAnimation(anim); 3308 presence.Animator.RemoveAnimation(anim);
@@ -4319,7 +4247,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4319 4247
4320 private void DoLLTeleport(ScenePresence sp, string destination, Vector3 targetPos, Vector3 targetLookAt) 4248 private void DoLLTeleport(ScenePresence sp, string destination, Vector3 targetPos, Vector3 targetLookAt)
4321 { 4249 {
4322 UUID assetID = KeyOrName(destination); 4250 UUID assetID = ScriptUtils.GetAssetIdFromKeyOrItemName(m_host, destination);
4323 4251
4324 // The destinaion is not an asset ID and also doesn't name a landmark. 4252 // The destinaion is not an asset ID and also doesn't name a landmark.
4325 // Use it as a sim name 4253 // Use it as a sim name
@@ -4386,7 +4314,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4386 m_host.AddScriptLPS(1); 4314 m_host.AddScriptLPS(1);
4387 4315
4388 // TODO: Parameter check logic required. 4316 // TODO: Parameter check logic required.
4389 m_host.CollisionSound = KeyOrName(impact_sound, AssetType.Sound); 4317 m_host.CollisionSound = ScriptUtils.GetAssetIdFromKeyOrItemName(m_host, impact_sound, AssetType.Sound);
4390 m_host.CollisionSoundVolume = (float)impact_volume; 4318 m_host.CollisionSoundVolume = (float)impact_volume;
4391 } 4319 }
4392 4320
@@ -5912,7 +5840,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
5912 if (m_SoundModule != null) 5840 if (m_SoundModule != null)
5913 { 5841 {
5914 m_SoundModule.TriggerSoundLimited(m_host.UUID, 5842 m_SoundModule.TriggerSoundLimited(m_host.UUID,
5915 KeyOrName(sound, AssetType.Sound), volume, 5843 ScriptUtils.GetAssetIdFromKeyOrItemName(m_host, sound, AssetType.Sound), volume,
5916 bottom_south_west, top_north_east); 5844 bottom_south_west, top_north_east);
5917 } 5845 }
5918 } 5846 }
@@ -6346,7 +6274,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6346 break; 6274 break;
6347 6275
6348 case (int)ScriptBaseClass.PSYS_SRC_TEXTURE: 6276 case (int)ScriptBaseClass.PSYS_SRC_TEXTURE:
6349 prules.Texture = KeyOrName(rules.GetLSLStringItem(i + 1)); 6277 prules.Texture = ScriptUtils.GetAssetIdFromKeyOrItemName(m_host, rules.GetLSLStringItem(i + 1));
6350 break; 6278 break;
6351 6279
6352 case (int)ScriptBaseClass.PSYS_SRC_BURST_RATE: 6280 case (int)ScriptBaseClass.PSYS_SRC_BURST_RATE:
@@ -7269,9 +7197,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7269 UUID sculptId; 7197 UUID sculptId;
7270 7198
7271 if (!UUID.TryParse(map, out sculptId)) 7199 if (!UUID.TryParse(map, out sculptId))
7272 { 7200 sculptId = ScriptUtils.GetAssetIdFromItemName(m_host, map, (int)AssetType.Texture);
7273 sculptId = InventoryKey(map, (int)AssetType.Texture);
7274 }
7275 7201
7276 if (sculptId == UUID.Zero) 7202 if (sculptId == UUID.Zero)
7277 return; 7203 return;
@@ -7668,6 +7594,22 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7668 part.ScriptSetPhysicsStatus(physics); 7594 part.ScriptSetPhysicsStatus(physics);
7669 break; 7595 break;
7670 7596
7597 case (int)ScriptBaseClass.PRIM_PHYSICS_SHAPE_TYPE:
7598 if (remain < 1)
7599 return null;
7600
7601 int shape_type = rules.GetLSLIntegerItem(idx++);
7602
7603 ExtraPhysicsData physdata = new ExtraPhysicsData();
7604 physdata.Density = part.Density;
7605 physdata.Bounce = part.Restitution;
7606 physdata.GravitationModifier = part.GravityModifier;
7607 physdata.PhysShapeType = (PhysShapeType)shape_type;
7608
7609 part.UpdateExtraPhysics(physdata);
7610
7611 break;
7612
7671 case (int)ScriptBaseClass.PRIM_TEMP_ON_REZ: 7613 case (int)ScriptBaseClass.PRIM_TEMP_ON_REZ:
7672 if (remain < 1) 7614 if (remain < 1)
7673 return null; 7615 return null;