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.cs3
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs677
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LS_Api.cs13
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs73
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs143
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs80
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/Timer.cs52
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Properties/AssemblyInfo.cs4
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs1
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs17
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs5
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Runtime/Properties/AssemblyInfo.cs2
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/Properties/AssemblyInfo.cs2
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/CodeTools/CSCodeGenerator.cs147
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs84
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/CodeTools/Properties/AssemblyInfo.cs4
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/CodeTools/Tests/CSCodeGeneratorTest.cs2
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/CodeTools/Tests/CompilerTest.cs2
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Helpers.cs18
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Instance/Properties/AssemblyInfo.cs4
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs256
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Instance/Tests/CoopTerminationTests.cs513
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs29
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Properties/AssemblyInfo.cs2
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiHttpTests.cs249
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiInventoryTests.cs13
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiLinkingTests.cs15
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiListTests.cs9
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiNotecardTests.cs270
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiTest.cs3
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Tests/LSL_TypesTestLSLFloat.cs2
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Tests/LSL_TypesTestLSLInteger.cs2
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Tests/LSL_TypesTestLSLString.cs2
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Tests/LSL_TypesTestList.cs2
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Tests/LSL_TypesTestVector3.cs2
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAppearanceTest.cs11
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAttachmentTests.cs18
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs23
38 files changed, 2167 insertions, 587 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/CM_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/CM_Api.cs
index b5fa6de..fce8ff8 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/CM_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/CM_Api.cs
@@ -26,6 +26,7 @@
26 */ 26 */
27 27
28using System; 28using System;
29using System.Threading;
29using System.Reflection; 30using System.Reflection;
30using System.Collections; 31using System.Collections;
31using System.Collections.Generic; 32using System.Collections.Generic;
@@ -62,7 +63,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
62 internal TaskInventoryItem m_item; 63 internal TaskInventoryItem m_item;
63 internal bool m_CMFunctionsEnabled = false; 64 internal bool m_CMFunctionsEnabled = false;
64 65
65 public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, TaskInventoryItem item) 66 public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, TaskInventoryItem item, WaitHandle coopSleepHandle)
66 { 67 {
67 m_ScriptEngine = ScriptEngine; 68 m_ScriptEngine = ScriptEngine;
68 m_host = host; 69 m_host = host;
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 7be64eb..1fbfc52 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -48,6 +48,7 @@ using OpenSim.Region.Framework.Interfaces;
48using OpenSim.Region.Framework.Scenes; 48using OpenSim.Region.Framework.Scenes;
49using OpenSim.Region.Framework.Scenes.Serialization; 49using OpenSim.Region.Framework.Scenes.Serialization;
50using OpenSim.Region.Framework.Scenes.Animation; 50using OpenSim.Region.Framework.Scenes.Animation;
51using OpenSim.Region.Framework.Scenes.Scripting;
51using OpenSim.Region.Physics.Manager; 52using OpenSim.Region.Physics.Manager;
52using OpenSim.Region.ScriptEngine.Shared; 53using OpenSim.Region.ScriptEngine.Shared;
53using OpenSim.Region.ScriptEngine.Shared.Api.Plugins; 54using OpenSim.Region.ScriptEngine.Shared.Api.Plugins;
@@ -87,10 +88,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
87 public class LSL_Api : MarshalByRefObject, ILSL_Api, IScriptApi 88 public class LSL_Api : MarshalByRefObject, ILSL_Api, IScriptApi
88 { 89 {
89 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 90 private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
91
90 protected IScriptEngine m_ScriptEngine; 92 protected IScriptEngine m_ScriptEngine;
91 protected SceneObjectPart m_host; 93 protected SceneObjectPart m_host;
92 94
93 /// <summary> 95 /// <summary>
96 /// Used for script sleeps when we are using co-operative script termination.
97 /// </summary>
98 /// <remarks>null if co-operative script termination is not active</remarks>
99 WaitHandle m_coopSleepHandle;
100
101 /// <summary>
94 /// The item that hosts this script 102 /// The item that hosts this script
95 /// </summary> 103 /// </summary>
96 protected TaskInventoryItem m_item; 104 protected TaskInventoryItem m_item;
@@ -100,6 +108,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
100 protected float m_ScriptDelayFactor = 1.0f; 108 protected float m_ScriptDelayFactor = 1.0f;
101 protected float m_ScriptDistanceFactor = 1.0f; 109 protected float m_ScriptDistanceFactor = 1.0f;
102 protected float m_MinTimerInterval = 0.5f; 110 protected float m_MinTimerInterval = 0.5f;
111 protected float m_recoilScaleFactor = 0.0f;
103 112
104 protected DateTime m_timer = DateTime.Now; 113 protected DateTime m_timer = DateTime.Now;
105 protected bool m_waitingForScriptAnswer = false; 114 protected bool m_waitingForScriptAnswer = false;
@@ -141,33 +150,31 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
141 {"TURNRIGHT", "Turning Right"} 150 {"TURNRIGHT", "Turning Right"}
142 }; 151 };
143 152
144 public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, TaskInventoryItem item) 153 public void Initialize(
154 IScriptEngine scriptEngine, SceneObjectPart host, TaskInventoryItem item, WaitHandle coopSleepHandle)
145 { 155 {
146/*
147 m_ShoutSayTimer = new Timer(1000);
148 m_ShoutSayTimer.Elapsed += SayShoutTimerElapsed;
149 m_ShoutSayTimer.AutoReset = true;
150 m_ShoutSayTimer.Start();
151*/
152 m_lastSayShoutCheck = DateTime.UtcNow; 156 m_lastSayShoutCheck = DateTime.UtcNow;
153 157
154 m_ScriptEngine = ScriptEngine; 158 m_ScriptEngine = scriptEngine;
155 m_host = host; 159 m_host = host;
156 m_item = item; 160 m_item = item;
157 m_debuggerSafe = m_ScriptEngine.Config.GetBoolean("DebuggerSafe", false); 161 m_debuggerSafe = m_ScriptEngine.Config.GetBoolean("DebuggerSafe", false);
162 m_coopSleepHandle = coopSleepHandle;
158 163
159 LoadLimits(); // read script limits from config. 164 LoadConfig();
160 165
161 m_TransferModule = 166 m_TransferModule =
162 m_ScriptEngine.World.RequestModuleInterface<IMessageTransferModule>(); 167 m_ScriptEngine.World.RequestModuleInterface<IMessageTransferModule>();
163 m_UrlModule = m_ScriptEngine.World.RequestModuleInterface<IUrlModule>(); 168 m_UrlModule = m_ScriptEngine.World.RequestModuleInterface<IUrlModule>();
164 m_SoundModule = m_ScriptEngine.World.RequestModuleInterface<ISoundModule>(); 169 m_SoundModule = m_ScriptEngine.World.RequestModuleInterface<ISoundModule>();
165 170
166 AsyncCommands = new AsyncCommandManager(ScriptEngine); 171 AsyncCommands = new AsyncCommandManager(m_ScriptEngine);
167 } 172 }
168 173
169 /* load configuration items that affect script, object and run-time behavior. */ 174 /// <summary>
170 private void LoadLimits() 175 /// Load configuration items that affect script, object and run-time behavior. */
176 /// </summary>
177 private void LoadConfig()
171 { 178 {
172 m_ScriptDelayFactor = 179 m_ScriptDelayFactor =
173 m_ScriptEngine.Config.GetFloat("ScriptDelayFactor", 1.0f); 180 m_ScriptEngine.Config.GetFloat("ScriptDelayFactor", 1.0f);
@@ -181,12 +188,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
181 m_ScriptEngine.Config.GetInt("NotecardLineReadCharsMax", 255); 188 m_ScriptEngine.Config.GetInt("NotecardLineReadCharsMax", 255);
182 if (m_notecardLineReadCharsMax > 65535) 189 if (m_notecardLineReadCharsMax > 65535)
183 m_notecardLineReadCharsMax = 65535; 190 m_notecardLineReadCharsMax = 65535;
191
184 // load limits for particular subsystems. 192 // load limits for particular subsystems.
185 IConfig SMTPConfig; 193 IConfig SMTPConfig;
186 if ((SMTPConfig = m_ScriptEngine.ConfigSource.Configs["SMTP"]) != null) { 194 if ((SMTPConfig = m_ScriptEngine.ConfigSource.Configs["SMTP"]) != null) {
187 // there's an smtp config, so load in the snooze time. 195 // there's an smtp config, so load in the snooze time.
188 EMAIL_PAUSE_TIME = SMTPConfig.GetInt("email_pause_time", EMAIL_PAUSE_TIME); 196 EMAIL_PAUSE_TIME = SMTPConfig.GetInt("email_pause_time", EMAIL_PAUSE_TIME);
189 } 197 }
198
199 // Rezzing an object with a velocity can create recoil. This feature seems to have been
200 // removed from recent versions of SL. The code computes recoil (vel*mass) and scales
201 // it by this factor. May be zero to turn off recoil all together.
202 m_recoilScaleFactor = m_ScriptEngine.Config.GetFloat("RecoilScaleFactor", m_recoilScaleFactor);
190 } 203 }
191 204
192 public override Object InitializeLifetimeService() 205 public override Object InitializeLifetimeService()
@@ -207,7 +220,26 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
207 delay = (int)((float)delay * m_ScriptDelayFactor); 220 delay = (int)((float)delay * m_ScriptDelayFactor);
208 if (delay == 0) 221 if (delay == 0)
209 return; 222 return;
210 System.Threading.Thread.Sleep(delay); 223
224 Sleep(delay);
225 }
226
227 protected virtual void Sleep(int delay)
228 {
229 if (m_coopSleepHandle == null)
230 System.Threading.Thread.Sleep(delay);
231 else
232 CheckForCoopTermination(delay);
233 }
234
235 /// <summary>
236 /// Check for co-operative termination.
237 /// </summary>
238 /// <param name='delay'>If called with 0, then just the check is performed with no wait.</param>
239 protected virtual void CheckForCoopTermination(int delay)
240 {
241 if (m_coopSleepHandle.WaitOne(delay))
242 throw new ScriptCoopStopException();
211 } 243 }
212 244
213 public Scene World 245 public Scene World
@@ -339,6 +371,80 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
339 } 371 }
340 } 372 }
341 373
374 /// <summary>
375 /// Get a given link entity from a linkset (linked objects and any sitting avatars).
376 /// </summary>
377 /// <remarks>
378 /// If there are any ScenePresence's in the linkset (i.e. because they are sat upon one of the prims), then
379 /// these are counted as extra entities that correspond to linknums beyond the number of prims in the linkset.
380 /// The ScenePresences receive linknums in the order in which they sat.
381 /// </remarks>
382 /// <returns>
383 /// The link entity. null if not found.
384 /// </returns>
385 /// <param name='linknum'>
386 /// Can be either a non-negative integer or ScriptBaseClass.LINK_THIS (-4).
387 /// If ScriptBaseClass.LINK_THIS then the entity containing the script is returned.
388 /// If the linkset has one entity and a linknum of zero is given, then the single entity is returned. If any
389 /// positive integer is given in this case then null is returned.
390 /// If the linkset has more than one entity and a linknum greater than zero but equal to or less than the number
391 /// of entities, then the entity which corresponds to that linknum is returned.
392 /// Otherwise, if a positive linknum is given which is greater than the number of entities in the linkset, then
393 /// null is returned.
394 /// </param>
395 public ISceneEntity GetLinkEntity(int linknum)
396 {
397 if (linknum < 0)
398 {
399 if (linknum == ScriptBaseClass.LINK_THIS)
400 return m_host;
401 else
402 return null;
403 }
404
405 int actualPrimCount = m_host.ParentGroup.PrimCount;
406 List<UUID> sittingAvatarIds = m_host.ParentGroup.GetSittingAvatars();
407 int adjustedPrimCount = actualPrimCount + sittingAvatarIds.Count;
408
409 // Special case for a single prim. In this case the linknum is zero. However, this will not match a single
410 // prim that has any avatars sat upon it (in which case the root prim is link 1).
411 if (linknum == 0)
412 {
413 if (actualPrimCount == 1 && sittingAvatarIds.Count == 0)
414 return m_host;
415
416 return null;
417 }
418 // Special case to handle a single prim with sitting avatars. GetLinkPart() would only match zero but
419 // here we must match 1 (ScriptBaseClass.LINK_ROOT).
420 else if (linknum == ScriptBaseClass.LINK_ROOT && actualPrimCount == 1)
421 {
422 if (sittingAvatarIds.Count > 0)
423 return m_host.ParentGroup.RootPart;
424 else
425 return null;
426 }
427 else if (linknum <= adjustedPrimCount)
428 {
429 if (linknum <= actualPrimCount)
430 {
431 return m_host.ParentGroup.GetLinkNumPart(linknum);
432 }
433 else
434 {
435 ScenePresence sp = World.GetScenePresence(sittingAvatarIds[linknum - actualPrimCount - 1]);
436 if (sp != null)
437 return sp;
438 else
439 return null;
440 }
441 }
442 else
443 {
444 return null;
445 }
446 }
447
342 public List<SceneObjectPart> GetLinkParts(int linkType) 448 public List<SceneObjectPart> GetLinkParts(int linkType)
343 { 449 {
344 return GetLinkParts(m_host, linkType); 450 return GetLinkParts(m_host, linkType);
@@ -392,79 +498,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
392 } 498 }
393 } 499 }
394 500
395 protected UUID InventoryKey(string name, int type)
396 {
397 TaskInventoryItem item = m_host.Inventory.GetInventoryItem(name);
398
399 if (item != null && item.Type == type)
400 return item.AssetID;
401 else
402 return UUID.Zero;
403 }
404
405 /// <summary>
406 /// accepts a valid UUID, -or- a name of an inventory item.
407 /// Returns a valid UUID or UUID.Zero if key invalid and item not found
408 /// in prim inventory.
409 /// </summary>
410 /// <param name="k"></param>
411 /// <returns></returns>
412 protected UUID KeyOrName(string k)
413 {
414 UUID key;
415
416 // if we can parse the string as a key, use it.
417 // else try to locate the name in inventory of object. found returns key,
418 // not found returns UUID.Zero
419 if (!UUID.TryParse(k, out key))
420 {
421 TaskInventoryItem item = m_host.Inventory.GetInventoryItem(k);
422
423 if (item != null)
424 key = item.AssetID;
425 else
426 key = UUID.Zero;
427 }
428
429 return key;
430 }
431
432 /// <summary>
433 /// Return the UUID of the asset matching the specified key or name
434 /// and asset type.
435 /// </summary>
436 /// <param name="k"></param>
437 /// <param name="type"></param>
438 /// <returns></returns>
439 protected UUID KeyOrName(string k, AssetType type)
440 {
441 UUID key;
442
443 if (!UUID.TryParse(k, out key))
444 {
445 TaskInventoryItem item = m_host.Inventory.GetInventoryItem(k);
446 if (item != null && item.Type == (int)type)
447 key = item.AssetID;
448 }
449 else
450 {
451 lock (m_host.TaskInventory)
452 {
453 foreach (KeyValuePair<UUID, TaskInventoryItem> item in m_host.TaskInventory)
454 {
455 if (item.Value.Type == (int)type && item.Value.Name == k)
456 {
457 key = item.Value.ItemID;
458 break;
459 }
460 }
461 }
462 }
463
464
465 return key;
466 }
467
468 //These are the implementations of the various ll-functions used by the LSL scripts. 501 //These are the implementations of the various ll-functions used by the LSL scripts.
469 public LSL_Float llSin(double f) 502 public LSL_Float llSin(double f)
470 { 503 {
@@ -1483,19 +1516,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1483 return 0; 1516 return 0;
1484 1517
1485 case ScriptBaseClass.STATUS_ROTATE_X: 1518 case ScriptBaseClass.STATUS_ROTATE_X:
1486 if (m_host.GetAxisRotation(2) == 2) 1519 // if (m_host.GetAxisRotation(2) != 0)
1520 if (m_host.GetAxisRotation((int)SceneObjectGroup.axisSelect.STATUS_ROTATE_X) != 0)
1487 return 1; 1521 return 1;
1488 else 1522 else
1489 return 0; 1523 return 0;
1490 1524
1491 case ScriptBaseClass.STATUS_ROTATE_Y: 1525 case ScriptBaseClass.STATUS_ROTATE_Y:
1492 if (m_host.GetAxisRotation(4) == 4) 1526 if (m_host.GetAxisRotation((int)SceneObjectGroup.axisSelect.STATUS_ROTATE_Y) != 0)
1493 return 1; 1527 return 1;
1494 else 1528 else
1495 return 0; 1529 return 0;
1496 1530
1497 case ScriptBaseClass.STATUS_ROTATE_Z: 1531 case ScriptBaseClass.STATUS_ROTATE_Z:
1498 if (m_host.GetAxisRotation(8) == 8) 1532 if (m_host.GetAxisRotation((int)SceneObjectGroup.axisSelect.STATUS_ROTATE_Z) != 0)
1499 return 1; 1533 return 1;
1500 else 1534 else
1501 return 0; 1535 return 0;
@@ -1875,10 +1909,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1875 part.Shape.FlexiForceX = (float)Force.x; 1909 part.Shape.FlexiForceX = (float)Force.x;
1876 part.Shape.FlexiForceY = (float)Force.y; 1910 part.Shape.FlexiForceY = (float)Force.y;
1877 part.Shape.FlexiForceZ = (float)Force.z; 1911 part.Shape.FlexiForceZ = (float)Force.z;
1878 part.Shape.PathCurve = 0x80; 1912 part.Shape.PathCurve = (byte)Extrusion.Flexible;
1879 part.ParentGroup.HasGroupChanged = true; 1913 }
1880 part.ScheduleFullUpdate(); 1914 else
1915 {
1916 // Other values not set, they do not seem to be sent to the viewer
1917 // Setting PathCurve appears to be what actually toggles the check box and turns Flexi on and off
1918 part.Shape.PathCurve = (byte)Extrusion.Straight;
1919 part.Shape.FlexiEntry = false;
1881 } 1920 }
1921 part.ParentGroup.HasGroupChanged = true;
1922 part.ScheduleFullUpdate();
1882 } 1923 }
1883 1924
1884 /// <summary> 1925 /// <summary>
@@ -1996,7 +2037,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1996 2037
1997 UUID textureID = new UUID(); 2038 UUID textureID = new UUID();
1998 2039
1999 textureID = InventoryKey(texture, (int)AssetType.Texture); 2040 textureID = ScriptUtils.GetAssetIdFromItemName(m_host, texture, (int)AssetType.Texture);
2000 if (textureID == UUID.Zero) 2041 if (textureID == UUID.Zero)
2001 { 2042 {
2002 if (!UUID.TryParse(texture, out textureID)) 2043 if (!UUID.TryParse(texture, out textureID))
@@ -2474,14 +2515,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2474 if ((avatar.AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK) != 0) 2515 if ((avatar.AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK) != 0)
2475 q = avatar.CameraRotation; // Mouselook 2516 q = avatar.CameraRotation; // Mouselook
2476 else 2517 else
2477 q = avatar.Rotation; // Currently infrequently updated so may be inaccurate 2518 q = avatar.GetWorldRotation(); // Currently infrequently updated so may be inaccurate
2478 } 2519 }
2479 else 2520 else
2480 q = part.ParentGroup.GroupRotation; // Likely never get here but just in case 2521 q = part.ParentGroup.GroupRotation; // Likely never get here but just in case
2481 } 2522 }
2482 else 2523 else
2483 q = part.ParentGroup.GroupRotation; // just the group rotation 2524 q = part.ParentGroup.GroupRotation; // just the group rotation
2484 return new LSL_Rotation(q.X, q.Y, q.Z, q.W); 2525
2526 return new LSL_Rotation(q);
2485 } 2527 }
2486 2528
2487 q = part.GetWorldRotation(); 2529 q = part.GetWorldRotation();
@@ -2605,8 +2647,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2605 public LSL_Vector llGetTorque() 2647 public LSL_Vector llGetTorque()
2606 { 2648 {
2607 m_host.AddScriptLPS(1); 2649 m_host.AddScriptLPS(1);
2608 Vector3 torque = m_host.ParentGroup.GetTorque(); 2650
2609 return new LSL_Vector(torque.X,torque.Y,torque.Z); 2651 return new LSL_Vector(m_host.ParentGroup.GetTorque());
2610 } 2652 }
2611 2653
2612 public void llSetForceAndTorque(LSL_Vector force, LSL_Vector torque, int local) 2654 public void llSetForceAndTorque(LSL_Vector force, LSL_Vector torque, int local)
@@ -2639,13 +2681,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2639 vel = m_host.ParentGroup.RootPart.Velocity; 2681 vel = m_host.ParentGroup.RootPart.Velocity;
2640 } 2682 }
2641 2683
2642 return new LSL_Vector(vel.X, vel.Y, vel.Z); 2684 return new LSL_Vector(vel);
2643 } 2685 }
2644 2686
2645 public LSL_Vector llGetAccel() 2687 public LSL_Vector llGetAccel()
2646 { 2688 {
2647 m_host.AddScriptLPS(1); 2689 m_host.AddScriptLPS(1);
2648 return new LSL_Vector(m_host.Acceleration.X, m_host.Acceleration.Y, m_host.Acceleration.Z); 2690
2691 return new LSL_Vector(m_host.Acceleration);
2649 } 2692 }
2650 2693
2651 public void llSetAngularVelocity(LSL_Vector avel, int local) 2694 public void llSetAngularVelocity(LSL_Vector avel, int local)
@@ -2712,7 +2755,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2712 if (m_SoundModule != null) 2755 if (m_SoundModule != null)
2713 { 2756 {
2714 m_SoundModule.SendSound(m_host.UUID, 2757 m_SoundModule.SendSound(m_host.UUID,
2715 KeyOrName(sound, AssetType.Sound), volume, false, 0, 2758 ScriptUtils.GetAssetIdFromKeyOrItemName(m_host, sound, AssetType.Sound), volume, false, 0,
2716 0, false, false); 2759 0, false, false);
2717 } 2760 }
2718 } 2761 }
@@ -2722,7 +2765,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2722 m_host.AddScriptLPS(1); 2765 m_host.AddScriptLPS(1);
2723 if (m_SoundModule != null) 2766 if (m_SoundModule != null)
2724 { 2767 {
2725 m_SoundModule.LoopSound(m_host.UUID, KeyOrName(sound), 2768 m_SoundModule.LoopSound(m_host.UUID, ScriptUtils.GetAssetIdFromKeyOrItemName(m_host, sound),
2726 volume, 20, false); 2769 volume, 20, false);
2727 } 2770 }
2728 } 2771 }
@@ -2732,7 +2775,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2732 m_host.AddScriptLPS(1); 2775 m_host.AddScriptLPS(1);
2733 if (m_SoundModule != null) 2776 if (m_SoundModule != null)
2734 { 2777 {
2735 m_SoundModule.LoopSound(m_host.UUID, KeyOrName(sound), 2778 m_SoundModule.LoopSound(m_host.UUID, ScriptUtils.GetAssetIdFromKeyOrItemName(m_host, sound),
2736 volume, 20, true); 2779 volume, 20, true);
2737 } 2780 }
2738 } 2781 }
@@ -2754,7 +2797,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2754 if (m_SoundModule != null) 2797 if (m_SoundModule != null)
2755 { 2798 {
2756 m_SoundModule.SendSound(m_host.UUID, 2799 m_SoundModule.SendSound(m_host.UUID,
2757 KeyOrName(sound, AssetType.Sound), volume, false, 0, 2800 ScriptUtils.GetAssetIdFromKeyOrItemName(m_host, sound, AssetType.Sound), volume, false, 0,
2758 0, true, false); 2801 0, true, false);
2759 } 2802 }
2760 } 2803 }
@@ -2766,7 +2809,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2766 if (m_SoundModule != null) 2809 if (m_SoundModule != null)
2767 { 2810 {
2768 m_SoundModule.SendSound(m_host.UUID, 2811 m_SoundModule.SendSound(m_host.UUID,
2769 KeyOrName(sound, AssetType.Sound), volume, true, 0, 0, 2812 ScriptUtils.GetAssetIdFromKeyOrItemName(m_host, sound, AssetType.Sound), volume, true, 0, 0,
2770 false, false); 2813 false, false);
2771 } 2814 }
2772 } 2815 }
@@ -2783,7 +2826,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2783 { 2826 {
2784 m_host.AddScriptLPS(1); 2827 m_host.AddScriptLPS(1);
2785 if (m_SoundModule != null) 2828 if (m_SoundModule != null)
2786 m_SoundModule.PreloadSound(m_host.UUID, KeyOrName(sound), 0); 2829 m_SoundModule.PreloadSound(m_host.UUID, ScriptUtils.GetAssetIdFromKeyOrItemName(m_host, sound), 0);
2787 ScriptSleep(1000); 2830 ScriptSleep(1000);
2788 } 2831 }
2789 2832
@@ -3141,11 +3184,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3141 3184
3142 PhysicsActor pa = new_group.RootPart.PhysActor; 3185 PhysicsActor pa = new_group.RootPart.PhysActor;
3143 3186
3187 //Recoil.
3144 if (pa != null && pa.IsPhysical && (Vector3)vel != Vector3.Zero) 3188 if (pa != null && pa.IsPhysical && (Vector3)vel != Vector3.Zero)
3145 { 3189 {
3146 float groupmass = new_group.GetMass(); 3190 float groupmass = new_group.GetMass();
3147 vel *= -groupmass; 3191 Vector3 recoil = -vel * groupmass * m_recoilScaleFactor;
3148 llApplyImpulse(vel, 0); 3192 if (recoil != Vector3.Zero)
3193 {
3194 llApplyImpulse(recoil, 0);
3195 }
3149 } 3196 }
3150 // Variable script delay? (see (http://wiki.secondlife.com/wiki/LSL_Delay) 3197 // Variable script delay? (see (http://wiki.secondlife.com/wiki/LSL_Delay)
3151 return; 3198 return;
@@ -3220,7 +3267,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3220 { 3267 {
3221// m_log.Info("llSleep snoozing " + sec + "s."); 3268// m_log.Info("llSleep snoozing " + sec + "s.");
3222 m_host.AddScriptLPS(1); 3269 m_host.AddScriptLPS(1);
3223 Thread.Sleep((int)(sec * 1000)); 3270
3271 Sleep((int)(sec * 1000));
3224 } 3272 }
3225 3273
3226 public LSL_Float llGetMass() 3274 public LSL_Float llGetMass()
@@ -3322,7 +3370,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3322 /// <summary> 3370 /// <summary>
3323 /// Attach the object containing this script to the avatar that owns it. 3371 /// Attach the object containing this script to the avatar that owns it.
3324 /// </summary> 3372 /// </summary>
3325 /// <param name='attachment'>The attachment point (e.g. ATTACH_CHEST)</param> 3373 /// <param name='attachmentPoint'>
3374 /// The attachment point (e.g. <see cref="OpenSim.Region.ScriptEngine.Shared.ScriptBase.ScriptBaseClass.ATTACH_CHEST">ATTACH_CHEST</see>)
3375 /// </param>
3326 /// <returns>true if the attach suceeded, false if it did not</returns> 3376 /// <returns>true if the attach suceeded, false if it did not</returns>
3327 public bool AttachToAvatar(int attachmentPoint) 3377 public bool AttachToAvatar(int attachmentPoint)
3328 { 3378 {
@@ -3473,14 +3523,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3473 msg.offline = (byte)0; //offline; 3523 msg.offline = (byte)0; //offline;
3474 msg.ParentEstateID = World.RegionInfo.EstateSettings.EstateID; 3524 msg.ParentEstateID = World.RegionInfo.EstateSettings.EstateID;
3475 msg.Position = new Vector3(m_host.AbsolutePosition); 3525 msg.Position = new Vector3(m_host.AbsolutePosition);
3476 msg.RegionID = World.RegionInfo.RegionID.Guid; 3526 msg.RegionID = World.RegionInfo.RegionID.Guid;//RegionID.Guid;
3527
3528 Vector3 pos = m_host.AbsolutePosition;
3477 msg.binaryBucket 3529 msg.binaryBucket
3478 = Util.StringToBytes256( 3530 = Util.StringToBytes256(
3479 "{0}/{1}/{2}/{3}", 3531 "{0}/{1}/{2}/{3}",
3480 World.RegionInfo.RegionName, 3532 World.RegionInfo.RegionName,
3481 (int)Math.Floor(m_host.AbsolutePosition.X), 3533 (int)Math.Floor(pos.X),
3482 (int)Math.Floor(m_host.AbsolutePosition.Y), 3534 (int)Math.Floor(pos.Y),
3483 (int)Math.Floor(m_host.AbsolutePosition.Z)); 3535 (int)Math.Floor(pos.Z));
3484 3536
3485 if (m_TransferModule != null) 3537 if (m_TransferModule != null)
3486 { 3538 {
@@ -3653,7 +3705,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3653 if (presence != null) 3705 if (presence != null)
3654 { 3706 {
3655 // Do NOT try to parse UUID, animations cannot be triggered by ID 3707 // Do NOT try to parse UUID, animations cannot be triggered by ID
3656 UUID animID = InventoryKey(anim, (int)AssetType.Animation); 3708 UUID animID = ScriptUtils.GetAssetIdFromItemName(m_host, anim, (int)AssetType.Animation);
3657 if (animID == UUID.Zero) 3709 if (animID == UUID.Zero)
3658 presence.Animator.AddAnimation(anim, m_host.UUID); 3710 presence.Animator.AddAnimation(anim, m_host.UUID);
3659 else 3711 else
@@ -3675,12 +3727,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3675 3727
3676 if (presence != null) 3728 if (presence != null)
3677 { 3729 {
3678 UUID animID = KeyOrName(anim); 3730 UUID animID = ScriptUtils.GetAssetIdFromKeyOrItemName(m_host, anim);
3679 3731
3680 if (animID == UUID.Zero) 3732 if (animID == UUID.Zero)
3681 presence.Animator.RemoveAnimation(anim); 3733 presence.Animator.RemoveAnimation(anim);
3682 else 3734 else
3683 presence.Animator.RemoveAnimation(animID); 3735 presence.Animator.RemoveAnimation(animID, true);
3684 } 3736 }
3685 } 3737 }
3686 } 3738 }
@@ -3753,21 +3805,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3753 } 3805 }
3754 else 3806 else
3755 { 3807 {
3756 bool sitting = false; 3808 if (m_host.ParentGroup.GetSittingAvatars().Contains(agentID))
3757 if (m_host.SitTargetAvatar == agentID)
3758 {
3759 sitting = true;
3760 }
3761 else
3762 {
3763 foreach (SceneObjectPart p in m_host.ParentGroup.Parts)
3764 {
3765 if (p.SitTargetAvatar == agentID)
3766 sitting = true;
3767 }
3768 }
3769
3770 if (sitting)
3771 { 3809 {
3772 // When agent is sitting, certain permissions are implicit if requested from sitting agent 3810 // When agent is sitting, certain permissions are implicit if requested from sitting agent
3773 implicitPerms = ScriptBaseClass.PERMISSION_TRIGGER_ANIMATION | 3811 implicitPerms = ScriptBaseClass.PERMISSION_TRIGGER_ANIMATION |
@@ -3809,7 +3847,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3809 INPCModule npcModule = World.RequestModuleInterface<INPCModule>(); 3847 INPCModule npcModule = World.RequestModuleInterface<INPCModule>();
3810 if (npcModule != null && npcModule.IsNPC(agentID, World)) 3848 if (npcModule != null && npcModule.IsNPC(agentID, World))
3811 { 3849 {
3812 if (agentID == m_host.ParentGroup.OwnerID || npcModule.GetOwner(agentID) == m_host.ParentGroup.OwnerID) 3850 if (npcModule.CheckPermissions(agentID, m_host.OwnerID))
3813 { 3851 {
3814 lock (m_host.TaskInventory) 3852 lock (m_host.TaskInventory)
3815 { 3853 {
@@ -4184,62 +4222,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4184 public LSL_String llGetLinkName(int linknum) 4222 public LSL_String llGetLinkName(int linknum)
4185 { 4223 {
4186 m_host.AddScriptLPS(1); 4224 m_host.AddScriptLPS(1);
4187 // simplest case, this prims link number
4188 if (linknum == m_host.LinkNum || linknum == ScriptBaseClass.LINK_THIS)
4189 return m_host.Name;
4190 4225
4191 // parse for sitting avatare-names 4226 ISceneEntity entity = GetLinkEntity(linknum);
4192 List<String> nametable = new List<String>();
4193 World.ForEachRootScenePresence(delegate(ScenePresence presence)
4194 {
4195 SceneObjectPart sitPart = presence.ParentPart;
4196 if (sitPart != null && m_host.ParentGroup.ContainsPart(sitPart.LocalId))
4197 nametable.Add(presence.ControllingClient.Name);
4198 });
4199 4227
4200 int totalprims = m_host.ParentGroup.PrimCount + nametable.Count; 4228 if (entity != null)
4201 if (totalprims > m_host.ParentGroup.PrimCount) 4229 return entity.Name;
4202 {
4203 // sitting Avatar-Name with negativ linknum / SinglePrim
4204 if (linknum < 0 && m_host.ParentGroup.PrimCount == 1 && nametable.Count == 1)
4205 return nametable[0];
4206 // Prim-Name / SinglePrim Sitting Avatar
4207 if (linknum == 1 && m_host.ParentGroup.PrimCount == 1 && nametable.Count == 1)
4208 return m_host.Name;
4209 // LinkNumber > of Real PrimSet = AvatarName
4210 if (linknum > m_host.ParentGroup.PrimCount && linknum <= totalprims)
4211 return nametable[totalprims - linknum];
4212 }
4213
4214 // Single prim
4215 if (m_host.LinkNum == 0)
4216 {
4217 if (linknum == 0 || linknum == ScriptBaseClass.LINK_ROOT)
4218 return m_host.Name;
4219 else
4220 return UUID.Zero.ToString();
4221 }
4222
4223 // Link set
4224 SceneObjectPart part = null;
4225 if (m_host.LinkNum == 1) // this is the Root prim
4226 {
4227 if (linknum < 0)
4228 part = m_host.ParentGroup.GetLinkNumPart(2);
4229 else
4230 part = m_host.ParentGroup.GetLinkNumPart(linknum);
4231 }
4232 else // this is a child prim
4233 {
4234 if (linknum < 2)
4235 part = m_host.ParentGroup.GetLinkNumPart(1);
4236 else
4237 part = m_host.ParentGroup.GetLinkNumPart(linknum);
4238 }
4239 if (part != null)
4240 return part.Name;
4241 else 4230 else
4242 return UUID.Zero.ToString(); 4231 return ScriptBaseClass.NULL_KEY;
4243 } 4232 }
4244 4233
4245 public LSL_Integer llGetInventoryNumber(int type) 4234 public LSL_Integer llGetInventoryNumber(int type)
@@ -4604,8 +4593,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4604 if (presence.UserLevel >= 200) return; 4593 if (presence.UserLevel >= 200) return;
4605 4594
4606 // agent must be over the owners land 4595 // agent must be over the owners land
4607 if (m_host.OwnerID == World.LandChannel.GetLandObject( 4596 if (m_host.OwnerID == World.LandChannel.GetLandObject(presence.AbsolutePosition).LandData.OwnerID)
4608 presence.AbsolutePosition.X, presence.AbsolutePosition.Y).LandData.OwnerID)
4609 { 4597 {
4610 if (!World.TeleportClientHome(agentId, presence.ControllingClient)) 4598 if (!World.TeleportClientHome(agentId, presence.ControllingClient))
4611 { 4599 {
@@ -4621,6 +4609,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4621 } 4609 }
4622 } 4610 }
4623 } 4611 }
4612
4624 ScriptSleep(5000); 4613 ScriptSleep(5000);
4625 } 4614 }
4626 4615
@@ -4641,8 +4630,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4641 destination = World.RegionInfo.RegionName; 4630 destination = World.RegionInfo.RegionName;
4642 4631
4643 // agent must be over the owners land 4632 // agent must be over the owners land
4644 if (m_host.OwnerID == World.LandChannel.GetLandObject( 4633 if (m_host.OwnerID == World.LandChannel.GetLandObject(presence.AbsolutePosition).LandData.OwnerID)
4645 presence.AbsolutePosition.X, presence.AbsolutePosition.Y).LandData.OwnerID)
4646 { 4634 {
4647 DoLLTeleport(presence, destination, targetPos, targetLookAt); 4635 DoLLTeleport(presence, destination, targetPos, targetLookAt);
4648 } 4636 }
@@ -4673,8 +4661,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4673 if (presence.GodLevel >= 200) return; 4661 if (presence.GodLevel >= 200) return;
4674 4662
4675 // agent must be over the owners land 4663 // agent must be over the owners land
4676 if (m_host.OwnerID == World.LandChannel.GetLandObject( 4664 if (m_host.OwnerID == World.LandChannel.GetLandObject(presence.AbsolutePosition).LandData.OwnerID)
4677 presence.AbsolutePosition.X, presence.AbsolutePosition.Y).LandData.OwnerID)
4678 { 4665 {
4679 World.RequestTeleportLocation(presence.ControllingClient, regionHandle, targetPos, targetLookAt, (uint)TeleportFlags.ViaLocation); 4666 World.RequestTeleportLocation(presence.ControllingClient, regionHandle, targetPos, targetLookAt, (uint)TeleportFlags.ViaLocation);
4680 } 4667 }
@@ -4691,7 +4678,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4691 4678
4692 private void DoLLTeleport(ScenePresence sp, string destination, Vector3 targetPos, Vector3 targetLookAt) 4679 private void DoLLTeleport(ScenePresence sp, string destination, Vector3 targetPos, Vector3 targetLookAt)
4693 { 4680 {
4694 UUID assetID = KeyOrName(destination); 4681 UUID assetID = ScriptUtils.GetAssetIdFromKeyOrItemName(m_host, destination);
4695 4682
4696 // The destinaion is not an asset ID and also doesn't name a landmark. 4683 // The destinaion is not an asset ID and also doesn't name a landmark.
4697 // Use it as a sim name 4684 // Use it as a sim name
@@ -4764,7 +4751,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4764 return; 4751 return;
4765 } 4752 }
4766 // TODO: Parameter check logic required. 4753 // TODO: Parameter check logic required.
4767 m_host.CollisionSound = KeyOrName(impact_sound, AssetType.Sound); 4754 m_host.CollisionSound = ScriptUtils.GetAssetIdFromKeyOrItemName(m_host, impact_sound, AssetType.Sound);
4768 m_host.CollisionSoundVolume = (float)impact_volume; 4755 m_host.CollisionSoundVolume = (float)impact_volume;
4769 m_host.CollisionSoundType = 1; 4756 m_host.CollisionSoundType = 1;
4770 } 4757 }
@@ -4889,7 +4876,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4889 { 4876 {
4890 if (pushrestricted) 4877 if (pushrestricted)
4891 { 4878 {
4892 ILandObject targetlandObj = World.LandChannel.GetLandObject(PusheePos.X, PusheePos.Y); 4879 ILandObject targetlandObj = World.LandChannel.GetLandObject(PusheePos);
4893 4880
4894 // We didn't find the parcel but region is push restricted so assume it is NOT ok 4881 // We didn't find the parcel but region is push restricted so assume it is NOT ok
4895 if (targetlandObj == null) 4882 if (targetlandObj == null)
@@ -4904,7 +4891,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4904 } 4891 }
4905 else 4892 else
4906 { 4893 {
4907 ILandObject targetlandObj = World.LandChannel.GetLandObject(PusheePos.X, PusheePos.Y); 4894 ILandObject targetlandObj = World.LandChannel.GetLandObject(PusheePos);
4908 if (targetlandObj == null) 4895 if (targetlandObj == null)
4909 { 4896 {
4910 // We didn't find the parcel but region isn't push restricted so assume it's ok 4897 // We didn't find the parcel but region isn't push restricted so assume it's ok
@@ -4934,6 +4921,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4934 } 4921 }
4935 } 4922 }
4936 } 4923 }
4924
4937 if (pushAllowed) 4925 if (pushAllowed)
4938 { 4926 {
4939 float distance = (PusheePos - m_host.AbsolutePosition).Length(); 4927 float distance = (PusheePos - m_host.AbsolutePosition).Length();
@@ -4963,17 +4951,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
4963 applied_linear_impulse *= scaling_factor; 4951 applied_linear_impulse *= scaling_factor;
4964 4952
4965 } 4953 }
4954
4966 if (pusheeIsAvatar) 4955 if (pusheeIsAvatar)
4967 { 4956 {
4968 if (pusheeav != null) 4957 if (pusheeav != null)
4969 { 4958 {
4970 if (pusheeav.PhysicsActor != null) 4959 PhysicsActor pa = pusheeav.PhysicsActor;
4960
4961 if (pa != null)
4971 { 4962 {
4972 if (local != 0) 4963 if (local != 0)
4973 { 4964 {
4974 applied_linear_impulse *= m_host.GetWorldRotation(); 4965 applied_linear_impulse *= m_host.GetWorldRotation();
4975 } 4966 }
4976 pusheeav.PhysicsActor.AddForce(applied_linear_impulse, true); 4967
4968 pa.AddForce(applied_linear_impulse, true);
4977 } 4969 }
4978 } 4970 }
4979 } 4971 }
@@ -5323,8 +5315,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
5323 public LSL_Vector llGetCenterOfMass() 5315 public LSL_Vector llGetCenterOfMass()
5324 { 5316 {
5325 m_host.AddScriptLPS(1); 5317 m_host.AddScriptLPS(1);
5326 Vector3 center = m_host.GetCenterOfMass(); 5318
5327 return new LSL_Vector(center.X,center.Y,center.Z); 5319 return new LSL_Vector(m_host.GetCenterOfMass());
5328 } 5320 }
5329 5321
5330 public LSL_List llListSort(LSL_List src, int stride, int ascending) 5322 public LSL_List llListSort(LSL_List src, int stride, int ascending)
@@ -5851,9 +5843,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
5851 } 5843 }
5852 5844
5853 /// <summary> 5845 /// <summary>
5854 /// Insert the list identified by <src> into the 5846 /// Insert the list identified by <paramref name="src"/> into the
5855 /// list designated by <dest> such that the first 5847 /// list designated by <paramref name="dest"/> such that the first
5856 /// new element has the index specified by <index> 5848 /// new element has the index specified by <paramref name="index"/>
5857 /// </summary> 5849 /// </summary>
5858 5850
5859 public LSL_List llListInsertList(LSL_List dest, LSL_List src, int index) 5851 public LSL_List llListInsertList(LSL_List dest, LSL_List src, int index)
@@ -6181,12 +6173,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6181 } 6173 }
6182 6174
6183 ILandObject land; 6175 ILandObject land;
6184 Vector3 pos;
6185 UUID id = UUID.Zero; 6176 UUID id = UUID.Zero;
6177
6186 if (parcel || parcelOwned) 6178 if (parcel || parcelOwned)
6187 { 6179 {
6188 pos = m_host.ParentGroup.RootPart.GetWorldPosition(); 6180 land = World.LandChannel.GetLandObject(m_host.ParentGroup.RootPart.GetWorldPosition());
6189 land = World.LandChannel.GetLandObject(pos.X, pos.Y);
6190 if (land == null) 6181 if (land == null)
6191 { 6182 {
6192 id = UUID.Zero; 6183 id = UUID.Zero;
@@ -6212,20 +6203,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6212 { 6203 {
6213 if (!regionWide) 6204 if (!regionWide)
6214 { 6205 {
6215 pos = ssp.AbsolutePosition; 6206 land = World.LandChannel.GetLandObject(ssp.AbsolutePosition);
6216 land = World.LandChannel.GetLandObject(pos.X, pos.Y);
6217 if (land != null) 6207 if (land != null)
6218 { 6208 {
6219 if (parcelOwned && land.LandData.OwnerID == id || 6209 if (parcelOwned && land.LandData.OwnerID == id ||
6220 parcel && land.LandData.GlobalID == id) 6210 parcel && land.LandData.GlobalID == id)
6221 { 6211 {
6222 result.Add(ssp.UUID.ToString()); 6212 result.Add(new LSL_Key(ssp.UUID.ToString()));
6223 } 6213 }
6224 } 6214 }
6225 } 6215 }
6226 else 6216 else
6227 { 6217 {
6228 result.Add(ssp.UUID.ToString()); 6218 result.Add(new LSL_Key(ssp.UUID.ToString()));
6229 } 6219 }
6230 } 6220 }
6231 // Maximum of 100 results 6221 // Maximum of 100 results
@@ -6329,7 +6319,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6329 if (m_SoundModule != null) 6319 if (m_SoundModule != null)
6330 { 6320 {
6331 m_SoundModule.TriggerSoundLimited(m_host.UUID, 6321 m_SoundModule.TriggerSoundLimited(m_host.UUID,
6332 KeyOrName(sound, AssetType.Sound), volume, 6322 ScriptUtils.GetAssetIdFromKeyOrItemName(m_host, sound, AssetType.Sound), volume,
6333 bottom_south_west, top_north_east); 6323 bottom_south_west, top_north_east);
6334 } 6324 }
6335 } 6325 }
@@ -6344,14 +6334,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6344 if (presence != null) 6334 if (presence != null)
6345 { 6335 {
6346 // agent must be over the owners land 6336 // agent must be over the owners land
6347 ILandObject land = World.LandChannel.GetLandObject(presence.AbsolutePosition.X, presence.AbsolutePosition.Y); 6337 ILandObject land = World.LandChannel.GetLandObject(presence.AbsolutePosition);
6348 if (land == null) 6338 if (land == null)
6349 return; 6339 return;
6350 6340
6351 if (m_host.OwnerID == land.LandData.OwnerID) 6341 if (m_host.OwnerID == land.LandData.OwnerID)
6352 { 6342 {
6353 Vector3 pos = World.GetNearestAllowedPosition(presence, land); 6343 Vector3 p = World.GetNearestAllowedPosition(presence, land);
6354 presence.TeleportWithMomentum(pos, null); 6344 presence.TeleportWithMomentum(p, null);
6355 presence.ControllingClient.SendAlertMessage("You have been ejected from this land"); 6345 presence.ControllingClient.SendAlertMessage("You have been ejected from this land");
6356 } 6346 }
6357 } 6347 }
@@ -6373,19 +6363,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6373 ScenePresence presence = World.GetScenePresence(key); 6363 ScenePresence presence = World.GetScenePresence(key);
6374 if (presence != null) // object is an avatar 6364 if (presence != null) // object is an avatar
6375 { 6365 {
6376 if (m_host.OwnerID 6366 if (m_host.OwnerID == World.LandChannel.GetLandObject(presence.AbsolutePosition).LandData.OwnerID)
6377 == World.LandChannel.GetLandObject(
6378 presence.AbsolutePosition.X, presence.AbsolutePosition.Y).LandData.OwnerID)
6379 return 1; 6367 return 1;
6380 } 6368 }
6381 else // object is not an avatar 6369 else // object is not an avatar
6382 { 6370 {
6383 SceneObjectPart obj = World.GetSceneObjectPart(key); 6371 SceneObjectPart obj = World.GetSceneObjectPart(key);
6372
6384 if (obj != null) 6373 if (obj != null)
6385 if (m_host.OwnerID 6374 {
6386 == World.LandChannel.GetLandObject( 6375 if (m_host.OwnerID == World.LandChannel.GetLandObject(obj.AbsolutePosition).LandData.OwnerID)
6387 obj.AbsolutePosition.X, obj.AbsolutePosition.Y).LandData.OwnerID)
6388 return 1; 6376 return 1;
6377 }
6389 } 6378 }
6390 } 6379 }
6391 6380
@@ -6493,8 +6482,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6493 // if the land is group owned and the object is group owned by the same group 6482 // if the land is group owned and the object is group owned by the same group
6494 // or 6483 // or
6495 // if the object is owned by a person with estate access. 6484 // if the object is owned by a person with estate access.
6496 6485 ILandObject parcel = World.LandChannel.GetLandObject(av.AbsolutePosition);
6497 ILandObject parcel = World.LandChannel.GetLandObject(av.AbsolutePosition.X, av.AbsolutePosition.Y);
6498 if (parcel != null) 6486 if (parcel != null)
6499 { 6487 {
6500 if (m_host.OwnerID == parcel.LandData.OwnerID || 6488 if (m_host.OwnerID == parcel.LandData.OwnerID ||
@@ -6506,14 +6494,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6506 } 6494 }
6507 } 6495 }
6508 } 6496 }
6509
6510 } 6497 }
6511
6512 } 6498 }
6513 6499
6514 public LSL_Vector llGroundSlope(LSL_Vector offset) 6500 public LSL_Vector llGroundSlope(LSL_Vector offset)
6515 { 6501 {
6516 m_host.AddScriptLPS(1); 6502 m_host.AddScriptLPS(1);
6503
6517 //Get the slope normal. This gives us the equation of the plane tangent to the slope. 6504 //Get the slope normal. This gives us the equation of the plane tangent to the slope.
6518 LSL_Vector vsn = llGroundNormal(offset); 6505 LSL_Vector vsn = llGroundNormal(offset);
6519 6506
@@ -6524,7 +6511,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6524 vsl.Normalize(); 6511 vsl.Normalize();
6525 //Normalization might be overkill here 6512 //Normalization might be overkill here
6526 6513
6527 return new LSL_Vector(vsl.X, vsl.Y, vsl.Z); 6514 vsn.x = vsl.X;
6515 vsn.y = vsl.Y;
6516 vsn.z = vsl.Z;
6517
6518 return vsn;
6528 } 6519 }
6529 6520
6530 public LSL_Vector llGroundNormal(LSL_Vector offset) 6521 public LSL_Vector llGroundNormal(LSL_Vector offset)
@@ -6574,7 +6565,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6574 //I believe the crossproduct of two normalized vectors is a normalized vector so 6565 //I believe the crossproduct of two normalized vectors is a normalized vector so
6575 //this normalization may be overkill 6566 //this normalization may be overkill
6576 6567
6577 return new LSL_Vector(vsn.X, vsn.Y, vsn.Z); 6568 return new LSL_Vector(vsn);
6578 } 6569 }
6579 6570
6580 public LSL_Vector llGroundContour(LSL_Vector offset) 6571 public LSL_Vector llGroundContour(LSL_Vector offset)
@@ -6686,6 +6677,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6686 ps.BurstSpeedMax = 1.0f; 6677 ps.BurstSpeedMax = 1.0f;
6687 ps.BurstRate = 0.1f; 6678 ps.BurstRate = 0.1f;
6688 ps.PartMaxAge = 10.0f; 6679 ps.PartMaxAge = 10.0f;
6680 ps.BurstPartCount = 1;
6689 return ps; 6681 return ps;
6690 } 6682 }
6691 6683
@@ -6707,10 +6699,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6707 SetParticleSystem(m_host, rules); 6699 SetParticleSystem(m_host, rules);
6708 } 6700 }
6709 6701
6710 private void SetParticleSystem(SceneObjectPart part, LSL_List rules) 6702 private void SetParticleSystem(SceneObjectPart part, LSL_List rules)
6711 { 6703 {
6712
6713
6714 if (rules.Length == 0) 6704 if (rules.Length == 0)
6715 { 6705 {
6716 part.RemoveParticleSystem(); 6706 part.RemoveParticleSystem();
@@ -6801,7 +6791,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
6801 break; 6791 break;
6802 6792
6803 case (int)ScriptBaseClass.PSYS_SRC_TEXTURE: 6793 case (int)ScriptBaseClass.PSYS_SRC_TEXTURE:
6804 prules.Texture = KeyOrName(rules.GetLSLStringItem(i + 1)); 6794 prules.Texture = ScriptUtils.GetAssetIdFromKeyOrItemName(m_host, rules.GetLSLStringItem(i + 1));
6805 break; 6795 break;
6806 6796
6807 case (int)ScriptBaseClass.PSYS_SRC_BURST_RATE: 6797 case (int)ScriptBaseClass.PSYS_SRC_BURST_RATE:
@@ -7079,7 +7069,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7079 { 7069 {
7080 m_host.AddScriptLPS(1); 7070 m_host.AddScriptLPS(1);
7081 UUID key; 7071 UUID key;
7082 ILandObject land = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y); 7072 ILandObject land = World.LandChannel.GetLandObject(m_host.AbsolutePosition);
7073
7083 if (World.Permissions.CanEditParcelProperties(m_host.OwnerID, land, GroupPowers.LandManageBanned)) 7074 if (World.Permissions.CanEditParcelProperties(m_host.OwnerID, land, GroupPowers.LandManageBanned))
7084 { 7075 {
7085 int expires = 0; 7076 int expires = 0;
@@ -7373,6 +7364,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7373 public void llCloseRemoteDataChannel(string channel) 7364 public void llCloseRemoteDataChannel(string channel)
7374 { 7365 {
7375 m_host.AddScriptLPS(1); 7366 m_host.AddScriptLPS(1);
7367
7368 IXmlRpcRouter xmlRpcRouter = m_ScriptEngine.World.RequestModuleInterface<IXmlRpcRouter>();
7369 if (xmlRpcRouter != null)
7370 {
7371 xmlRpcRouter.UnRegisterReceiver(channel, m_item.ItemID);
7372 }
7373
7376 IXMLRPC xmlrpcMod = m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>(); 7374 IXMLRPC xmlrpcMod = m_ScriptEngine.World.RequestModuleInterface<IXMLRPC>();
7377 if (xmlrpcMod != null) 7375 if (xmlrpcMod != null)
7378 xmlrpcMod.CloseXMLRPCChannel((UUID)channel); 7376 xmlrpcMod.CloseXMLRPCChannel((UUID)channel);
@@ -7746,9 +7744,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
7746 UUID sculptId; 7744 UUID sculptId;
7747 7745
7748 if (!UUID.TryParse(map, out sculptId)) 7746 if (!UUID.TryParse(map, out sculptId))
7749 { 7747 sculptId = ScriptUtils.GetAssetIdFromItemName(m_host, map, (int)AssetType.Texture);
7750 sculptId = InventoryKey(map, (int)AssetType.Texture);
7751 }
7752 7748
7753 if (sculptId == UUID.Zero) 7749 if (sculptId == UUID.Zero)
7754 return; 7750 return;
@@ -8511,7 +8507,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8511 { 8507 {
8512 m_host.AddScriptLPS(1); 8508 m_host.AddScriptLPS(1);
8513 8509
8514 ILandObject land = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y); 8510 ILandObject land = World.LandChannel.GetLandObject(m_host.AbsolutePosition);
8515 8511
8516 if (land.LandData.OwnerID != m_host.OwnerID) 8512 if (land.LandData.OwnerID != m_host.OwnerID)
8517 return; 8513 return;
@@ -8525,7 +8521,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8525 { 8521 {
8526 m_host.AddScriptLPS(1); 8522 m_host.AddScriptLPS(1);
8527 8523
8528 ILandObject land = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y); 8524 ILandObject land = World.LandChannel.GetLandObject(m_host.AbsolutePosition);
8529 8525
8530 if (land.LandData.OwnerID != m_host.OwnerID) 8526 if (land.LandData.OwnerID != m_host.OwnerID)
8531 return String.Empty; 8527 return String.Empty;
@@ -8536,8 +8532,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8536 public LSL_Vector llGetRootPosition() 8532 public LSL_Vector llGetRootPosition()
8537 { 8533 {
8538 m_host.AddScriptLPS(1); 8534 m_host.AddScriptLPS(1);
8539 return new LSL_Vector(m_host.ParentGroup.AbsolutePosition.X, m_host.ParentGroup.AbsolutePosition.Y, 8535
8540 m_host.ParentGroup.AbsolutePosition.Z); 8536 return new LSL_Vector(m_host.ParentGroup.AbsolutePosition);
8541 } 8537 }
8542 8538
8543 /// <summary> 8539 /// <summary>
@@ -8560,13 +8556,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8560 if ((avatar.AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK) != 0) 8556 if ((avatar.AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK) != 0)
8561 q = avatar.CameraRotation; // Mouselook 8557 q = avatar.CameraRotation; // Mouselook
8562 else 8558 else
8563 q = avatar.Rotation; // Currently infrequently updated so may be inaccurate 8559 q = avatar.GetWorldRotation(); // Currently infrequently updated so may be inaccurate
8564 else 8560 else
8565 q = m_host.ParentGroup.GroupRotation; // Likely never get here but just in case 8561 q = m_host.ParentGroup.GroupRotation; // Likely never get here but just in case
8566 } 8562 }
8567 else 8563 else
8568 q = m_host.ParentGroup.GroupRotation; // just the group rotation 8564 q = m_host.ParentGroup.GroupRotation; // just the group rotation
8569 return new LSL_Rotation(q.X, q.Y, q.Z, q.W); 8565
8566 return new LSL_Rotation(q);
8570 } 8567 }
8571 8568
8572 public LSL_String llGetObjectDesc() 8569 public LSL_String llGetObjectDesc()
@@ -8733,8 +8730,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8733 8730
8734 public LSL_Vector llGetGeometricCenter() 8731 public LSL_Vector llGetGeometricCenter()
8735 { 8732 {
8736 Vector3 tmp = m_host.GetGeometricCenter(); 8733 return new LSL_Vector(m_host.GetGeometricCenter());
8737 return new LSL_Vector(tmp.X, tmp.Y, tmp.Z);
8738 } 8734 }
8739 8735
8740 public LSL_List llGetPrimitiveParams(LSL_List rules) 8736 public LSL_List llGetPrimitiveParams(LSL_List rules)
@@ -8841,9 +8837,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
8841 break; 8837 break;
8842 8838
8843 case (int)ScriptBaseClass.PRIM_SIZE: 8839 case (int)ScriptBaseClass.PRIM_SIZE:
8844 res.Add(new LSL_Vector(part.Scale.X, 8840 res.Add(new LSL_Vector(part.Scale));
8845 part.Scale.Y,
8846 part.Scale.Z));
8847 break; 8841 break;
8848 8842
8849 case (int)ScriptBaseClass.PRIM_ROTATION: 8843 case (int)ScriptBaseClass.PRIM_ROTATION:
@@ -9204,9 +9198,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
9204 case (int)ScriptBaseClass.PRIM_DESC: 9198 case (int)ScriptBaseClass.PRIM_DESC:
9205 res.Add(new LSL_String(part.Description)); 9199 res.Add(new LSL_String(part.Description));
9206 break; 9200 break;
9207 9201 case (int)ScriptBaseClass.PRIM_ROT_LOCAL:
9208 case (int)ScriptBaseClass.PRIM_ROT_LOCAL: 9202 res.Add(new LSL_Rotation(part.RotationOffset));
9209 res.Add(new LSL_Rotation(part.RotationOffset.X, part.RotationOffset.Y, part.RotationOffset.Z, part.RotationOffset.W));
9210 break; 9203 break;
9211 9204
9212 case (int)ScriptBaseClass.PRIM_POS_LOCAL: 9205 case (int)ScriptBaseClass.PRIM_POS_LOCAL:
@@ -10238,6 +10231,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10238 return UUID.Zero.ToString(); 10231 return UUID.Zero.ToString();
10239 } 10232 }
10240 } 10233 }
10234
10241 public LSL_String llRequestURL() 10235 public LSL_String llRequestURL()
10242 { 10236 {
10243 m_host.AddScriptLPS(1); 10237 m_host.AddScriptLPS(1);
@@ -10389,7 +10383,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10389 10383
10390 // according to the docs, this command only works if script owner and land owner are the same 10384 // according to the docs, this command only works if script owner and land owner are the same
10391 // lets add estate owners and gods, too, and use the generic permission check. 10385 // lets add estate owners and gods, too, and use the generic permission check.
10392 ILandObject landObject = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y); 10386 ILandObject landObject = World.LandChannel.GetLandObject(m_host.AbsolutePosition);
10393 if (!World.Permissions.CanEditParcelProperties(m_host.OwnerID, landObject, GroupPowers.ChangeMedia)) return; 10387 if (!World.Permissions.CanEditParcelProperties(m_host.OwnerID, landObject, GroupPowers.ChangeMedia)) return;
10394 10388
10395 bool update = false; // send a ParcelMediaUpdate (and possibly change the land's media URL)? 10389 bool update = false; // send a ParcelMediaUpdate (and possibly change the land's media URL)?
@@ -10712,22 +10706,23 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10712 m_host.AddScriptLPS(1); 10706 m_host.AddScriptLPS(1);
10713 10707
10714 if (m_item.PermsGranter == UUID.Zero) 10708 if (m_item.PermsGranter == UUID.Zero)
10715 return new LSL_Vector(); 10709 return Vector3.Zero;
10716 10710
10717 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0) 10711 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0)
10718 { 10712 {
10719 ShoutError("No permissions to track the camera"); 10713 ShoutError("No permissions to track the camera");
10720 return new LSL_Vector(); 10714 return Vector3.Zero;
10721 } 10715 }
10722 10716
10723// ScenePresence presence = World.GetScenePresence(m_host.OwnerID); 10717// ScenePresence presence = World.GetScenePresence(m_host.OwnerID);
10724 ScenePresence presence = World.GetScenePresence(m_item.PermsGranter); 10718 ScenePresence presence = World.GetScenePresence(m_item.PermsGranter);
10725 if (presence != null) 10719 if (presence != null)
10726 { 10720 {
10727 LSL_Vector pos = new LSL_Vector(presence.CameraPosition.X, presence.CameraPosition.Y, presence.CameraPosition.Z); 10721 LSL_Vector pos = new LSL_Vector(presence.CameraPosition);
10728 return pos; 10722 return pos;
10729 } 10723 }
10730 return new LSL_Vector(); 10724
10725 return Vector3.Zero;
10731 } 10726 }
10732 10727
10733 public LSL_Rotation llGetCameraRot() 10728 public LSL_Rotation llGetCameraRot()
@@ -10735,22 +10730,22 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10735 m_host.AddScriptLPS(1); 10730 m_host.AddScriptLPS(1);
10736 10731
10737 if (m_item.PermsGranter == UUID.Zero) 10732 if (m_item.PermsGranter == UUID.Zero)
10738 return new LSL_Rotation(); 10733 return Quaternion.Identity;
10739 10734
10740 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0) 10735 if ((m_item.PermsMask & ScriptBaseClass.PERMISSION_TRACK_CAMERA) == 0)
10741 { 10736 {
10742 ShoutError("No permissions to track the camera"); 10737 ShoutError("No permissions to track the camera");
10743 return new LSL_Rotation(); 10738 return Quaternion.Identity;
10744 } 10739 }
10745 10740
10746// ScenePresence presence = World.GetScenePresence(m_host.OwnerID); 10741// ScenePresence presence = World.GetScenePresence(m_host.OwnerID);
10747 ScenePresence presence = World.GetScenePresence(m_item.PermsGranter); 10742 ScenePresence presence = World.GetScenePresence(m_item.PermsGranter);
10748 if (presence != null) 10743 if (presence != null)
10749 { 10744 {
10750 return new LSL_Rotation(presence.CameraRotation.X, presence.CameraRotation.Y, presence.CameraRotation.Z, presence.CameraRotation.W); 10745 return new LSL_Rotation(presence.CameraRotation);
10751 } 10746 }
10752 10747
10753 return new LSL_Rotation(); 10748 return Quaternion.Identity;
10754 } 10749 }
10755 10750
10756 /// <summary> 10751 /// <summary>
@@ -10831,7 +10826,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10831 { 10826 {
10832 m_host.AddScriptLPS(1); 10827 m_host.AddScriptLPS(1);
10833 UUID key; 10828 UUID key;
10834 ILandObject land = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y); 10829 ILandObject land = World.LandChannel.GetLandObject(m_host.AbsolutePosition);
10835 if (World.Permissions.CanEditParcelProperties(m_host.OwnerID, land, GroupPowers.LandManageBanned)) 10830 if (World.Permissions.CanEditParcelProperties(m_host.OwnerID, land, GroupPowers.LandManageBanned))
10836 { 10831 {
10837 int expires = 0; 10832 int expires = 0;
@@ -10872,7 +10867,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10872 { 10867 {
10873 m_host.AddScriptLPS(1); 10868 m_host.AddScriptLPS(1);
10874 UUID key; 10869 UUID key;
10875 ILandObject land = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y); 10870 ILandObject land = World.LandChannel.GetLandObject(m_host.AbsolutePosition);
10876 if (World.Permissions.CanEditParcelProperties(m_host.OwnerID, land, GroupPowers.LandManageAllowed)) 10871 if (World.Permissions.CanEditParcelProperties(m_host.OwnerID, land, GroupPowers.LandManageAllowed))
10877 { 10872 {
10878 if (UUID.TryParse(avatar, out key)) 10873 if (UUID.TryParse(avatar, out key))
@@ -10899,7 +10894,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
10899 { 10894 {
10900 m_host.AddScriptLPS(1); 10895 m_host.AddScriptLPS(1);
10901 UUID key; 10896 UUID key;
10902 ILandObject land = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y); 10897 ILandObject land = World.LandChannel.GetLandObject(m_host.AbsolutePosition);
10903 if (World.Permissions.CanEditParcelProperties(m_host.OwnerID, land, GroupPowers.LandManageBanned)) 10898 if (World.Permissions.CanEditParcelProperties(m_host.OwnerID, land, GroupPowers.LandManageBanned))
10904 { 10899 {
10905 if (UUID.TryParse(avatar, out key)) 10900 if (UUID.TryParse(avatar, out key))
@@ -11265,7 +11260,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11265 public void llResetLandBanList() 11260 public void llResetLandBanList()
11266 { 11261 {
11267 m_host.AddScriptLPS(1); 11262 m_host.AddScriptLPS(1);
11268 LandData land = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y).LandData; 11263 LandData land = World.LandChannel.GetLandObject(m_host.AbsolutePosition).LandData;
11269 if (land.OwnerID == m_host.OwnerID) 11264 if (land.OwnerID == m_host.OwnerID)
11270 { 11265 {
11271 foreach (LandAccessEntry entry in land.ParcelAccessList) 11266 foreach (LandAccessEntry entry in land.ParcelAccessList)
@@ -11282,7 +11277,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11282 public void llResetLandPassList() 11277 public void llResetLandPassList()
11283 { 11278 {
11284 m_host.AddScriptLPS(1); 11279 m_host.AddScriptLPS(1);
11285 LandData land = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y).LandData; 11280 LandData land = World.LandChannel.GetLandObject(m_host.AbsolutePosition).LandData;
11286 if (land.OwnerID == m_host.OwnerID) 11281 if (land.OwnerID == m_host.OwnerID)
11287 { 11282 {
11288 foreach (LandAccessEntry entry in land.ParcelAccessList) 11283 foreach (LandAccessEntry entry in land.ParcelAccessList)
@@ -11519,6 +11514,35 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11519 case ScriptBaseClass.OBJECT_PHYSICS_COST: 11514 case ScriptBaseClass.OBJECT_PHYSICS_COST:
11520 ret.Add(new LSL_Float(0)); 11515 ret.Add(new LSL_Float(0));
11521 break; 11516 break;
11517 case ScriptBaseClass.OBJECT_CHARACTER_TIME: // Pathfinding
11518 ret.Add(new LSL_Float(0));
11519 break;
11520 case ScriptBaseClass.OBJECT_ROOT:
11521 SceneObjectPart p = av.ParentPart;
11522 if (p != null)
11523 {
11524 ret.Add(new LSL_String(p.ParentGroup.RootPart.UUID.ToString()));
11525 }
11526 else
11527 {
11528 ret.Add(new LSL_String(id));
11529 }
11530 break;
11531 case ScriptBaseClass.OBJECT_ATTACHED_POINT:
11532 ret.Add(new LSL_Integer(0));
11533 break;
11534 case ScriptBaseClass.OBJECT_PATHFINDING_TYPE: // Pathfinding
11535 ret.Add(new LSL_Integer(ScriptBaseClass.OPT_AVATAR));
11536 break;
11537 case ScriptBaseClass.OBJECT_PHYSICS:
11538 ret.Add(new LSL_Integer(0));
11539 break;
11540 case ScriptBaseClass.OBJECT_PHANTOM:
11541 ret.Add(new LSL_Integer(0));
11542 break;
11543 case ScriptBaseClass.OBJECT_TEMP_ON_REZ:
11544 ret.Add(new LSL_Integer(0));
11545 break;
11522 default: 11546 default:
11523 // Invalid or unhandled constant. 11547 // Invalid or unhandled constant.
11524 ret.Add(new LSL_Integer(ScriptBaseClass.OBJECT_UNKNOWN_DETAIL)); 11548 ret.Add(new LSL_Integer(ScriptBaseClass.OBJECT_UNKNOWN_DETAIL));
@@ -11610,6 +11634,52 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11610 // The value returned in SL for normal prims is prim count 11634 // The value returned in SL for normal prims is prim count
11611 ret.Add(new LSL_Float(obj.PhysicsCost)); 11635 ret.Add(new LSL_Float(obj.PhysicsCost));
11612 break; 11636 break;
11637 case ScriptBaseClass.OBJECT_CHARACTER_TIME: // Pathfinding
11638 ret.Add(new LSL_Float(0));
11639 break;
11640 case ScriptBaseClass.OBJECT_ROOT:
11641 ret.Add(new LSL_String(obj.ParentGroup.RootPart.UUID.ToString()));
11642 break;
11643 case ScriptBaseClass.OBJECT_ATTACHED_POINT:
11644 ret.Add(new LSL_Integer(obj.ParentGroup.AttachmentPoint));
11645 break;
11646 case ScriptBaseClass.OBJECT_PATHFINDING_TYPE:
11647 byte pcode = obj.Shape.PCode;
11648 if (obj.ParentGroup.AttachmentPoint != 0
11649 || pcode == (byte)PCode.Grass
11650 || pcode == (byte)PCode.Tree
11651 || pcode == (byte)PCode.NewTree)
11652 {
11653 ret.Add(new LSL_Integer(ScriptBaseClass.OPT_OTHER));
11654 }
11655 else
11656 {
11657 ret.Add(new LSL_Integer(ScriptBaseClass.OPT_LEGACY_LINKSET));
11658 }
11659 break;
11660 case ScriptBaseClass.OBJECT_PHYSICS:
11661 if (obj.ParentGroup.AttachmentPoint != 0)
11662 {
11663 ret.Add(new LSL_Integer(0)); // Always false if attached
11664 }
11665 else
11666 {
11667 ret.Add(new LSL_Integer(obj.ParentGroup.UsesPhysics ? 1 : 0));
11668 }
11669 break;
11670 case ScriptBaseClass.OBJECT_PHANTOM:
11671 if (obj.ParentGroup.AttachmentPoint != 0)
11672 {
11673 ret.Add(new LSL_Integer(0)); // Always false if attached
11674 }
11675 else
11676 {
11677 ret.Add(new LSL_Integer(obj.ParentGroup.IsPhantom ? 1 : 0));
11678 }
11679 break;
11680 case ScriptBaseClass.OBJECT_TEMP_ON_REZ:
11681 ret.Add(new LSL_Integer(obj.ParentGroup.IsTemporary ? 1 : 0));
11682 break;
11613 default: 11683 default:
11614 // Invalid or unhandled constant. 11684 // Invalid or unhandled constant.
11615 ret.Add(new LSL_Integer(ScriptBaseClass.OBJECT_UNKNOWN_DETAIL)); 11685 ret.Add(new LSL_Integer(ScriptBaseClass.OBJECT_UNKNOWN_DETAIL));
@@ -11689,14 +11759,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11689 return UUID.Zero.ToString(); 11759 return UUID.Zero.ToString();
11690 } 11760 }
11691 11761
11762 string reqIdentifier = UUID.Random().ToString();
11763
11692 // was: UUID tid = tid = AsyncCommands. 11764 // was: UUID tid = tid = AsyncCommands.
11693 UUID tid = AsyncCommands.DataserverPlugin.RegisterRequest(m_host.LocalId, m_item.ItemID, assetID.ToString()); 11765 UUID tid = AsyncCommands.DataserverPlugin.RegisterRequest(m_host.LocalId, m_item.ItemID, reqIdentifier);
11694 11766
11695 if (NotecardCache.IsCached(assetID)) 11767 if (NotecardCache.IsCached(assetID))
11696 { 11768 {
11697 AsyncCommands. 11769 AsyncCommands.DataserverPlugin.DataserverReply(reqIdentifier, NotecardCache.GetLines(assetID).ToString());
11698 DataserverPlugin.DataserverReply(assetID.ToString(), 11770
11699 NotecardCache.GetLines(assetID).ToString());
11700 ScriptSleep(100); 11771 ScriptSleep(100);
11701 return tid.ToString(); 11772 return tid.ToString();
11702 } 11773 }
@@ -11712,9 +11783,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11712 string data = Encoding.UTF8.GetString(a.Data); 11783 string data = Encoding.UTF8.GetString(a.Data);
11713 //m_log.Debug(data); 11784 //m_log.Debug(data);
11714 NotecardCache.Cache(id, data); 11785 NotecardCache.Cache(id, data);
11715 AsyncCommands. 11786 AsyncCommands.DataserverPlugin.DataserverReply(reqIdentifier, NotecardCache.GetLines(id).ToString());
11716 DataserverPlugin.DataserverReply(id.ToString(),
11717 NotecardCache.GetLines(id).ToString());
11718 }); 11787 });
11719 11788
11720 ScriptSleep(100); 11789 ScriptSleep(100);
@@ -11743,13 +11812,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11743 return UUID.Zero.ToString(); 11812 return UUID.Zero.ToString();
11744 } 11813 }
11745 11814
11815 string reqIdentifier = UUID.Random().ToString();
11816
11746 // was: UUID tid = tid = AsyncCommands. 11817 // was: UUID tid = tid = AsyncCommands.
11747 UUID tid = AsyncCommands.DataserverPlugin.RegisterRequest(m_host.LocalId, m_item.ItemID, assetID.ToString()); 11818 UUID tid = AsyncCommands.DataserverPlugin.RegisterRequest(m_host.LocalId, m_item.ItemID, reqIdentifier);
11748 11819
11749 if (NotecardCache.IsCached(assetID)) 11820 if (NotecardCache.IsCached(assetID))
11750 { 11821 {
11751 AsyncCommands.DataserverPlugin.DataserverReply(assetID.ToString(), 11822 AsyncCommands.DataserverPlugin.DataserverReply(
11752 NotecardCache.GetLine(assetID, line, m_notecardLineReadCharsMax)); 11823 reqIdentifier, NotecardCache.GetLine(assetID, line, m_notecardLineReadCharsMax));
11824
11753 ScriptSleep(100); 11825 ScriptSleep(100);
11754 return tid.ToString(); 11826 return tid.ToString();
11755 } 11827 }
@@ -11765,8 +11837,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11765 string data = Encoding.UTF8.GetString(a.Data); 11837 string data = Encoding.UTF8.GetString(a.Data);
11766 //m_log.Debug(data); 11838 //m_log.Debug(data);
11767 NotecardCache.Cache(id, data); 11839 NotecardCache.Cache(id, data);
11768 AsyncCommands.DataserverPlugin.DataserverReply(id.ToString(), 11840 AsyncCommands.DataserverPlugin.DataserverReply(
11769 NotecardCache.GetLine(id, line, m_notecardLineReadCharsMax)); 11841 reqIdentifier, NotecardCache.GetLine(assetID, line, m_notecardLineReadCharsMax));
11770 }); 11842 });
11771 11843
11772 ScriptSleep(100); 11844 ScriptSleep(100);
@@ -11801,7 +11873,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11801 11873
11802 LSL_List result = new LSL_List(); 11874 LSL_List result = new LSL_List();
11803 11875
11804 if (obj != null && obj.OwnerID != m_host.OwnerID) 11876 if (obj != null && obj.OwnerID == m_host.OwnerID)
11805 { 11877 {
11806 LSL_List remaining = GetPrimParams(obj, rules, ref result); 11878 LSL_List remaining = GetPrimParams(obj, rules, ref result);
11807 11879
@@ -11905,7 +11977,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11905 World.ForEachScenePresence(delegate(ScenePresence sp) 11977 World.ForEachScenePresence(delegate(ScenePresence sp)
11906 { 11978 {
11907 Vector3 ac = sp.AbsolutePosition - rayStart; 11979 Vector3 ac = sp.AbsolutePosition - rayStart;
11908 Vector3 bc = sp.AbsolutePosition - rayEnd; 11980// Vector3 bc = sp.AbsolutePosition - rayEnd;
11909 11981
11910 double d = Math.Abs(Vector3.Mag(Vector3.Cross(ab, ac)) / Vector3.Distance(rayStart, rayEnd)); 11982 double d = Math.Abs(Vector3.Mag(Vector3.Cross(ab, ac)) / Vector3.Distance(rayStart, rayEnd));
11911 11983
@@ -11993,12 +12065,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
11993 radius = Math.Abs(maxY); 12065 radius = Math.Abs(maxY);
11994 if (Math.Abs(maxZ) > radius) 12066 if (Math.Abs(maxZ) > radius)
11995 radius = Math.Abs(maxZ); 12067 radius = Math.Abs(maxZ);
11996 12068 radius = radius*1.413f;
11997 Vector3 ac = group.AbsolutePosition - rayStart; 12069 Vector3 ac = group.AbsolutePosition - rayStart;
11998 Vector3 bc = group.AbsolutePosition - rayEnd; 12070// Vector3 bc = group.AbsolutePosition - rayEnd;
11999 12071
12000 double d = Math.Abs(Vector3.Mag(Vector3.Cross(ab, ac)) / Vector3.Distance(rayStart, rayEnd)); 12072 double d = Math.Abs(Vector3.Mag(Vector3.Cross(ab, ac)) / Vector3.Distance(rayStart, rayEnd));
12001 12073
12002 // Too far off ray, don't bother 12074 // Too far off ray, don't bother
12003 if (d > radius) 12075 if (d > radius)
12004 return; 12076 return;
@@ -12008,11 +12080,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12008 if (d2 > 0) 12080 if (d2 > 0)
12009 return; 12081 return;
12010 12082
12083 ray = new Ray(rayStart, Vector3.Normalize(rayEnd - rayStart));
12011 EntityIntersection intersection = group.TestIntersection(ray, true, false); 12084 EntityIntersection intersection = group.TestIntersection(ray, true, false);
12012 // Miss. 12085 // Miss.
12013 if (!intersection.HitTF) 12086 if (!intersection.HitTF)
12014 return; 12087 return;
12015 12088
12089 Vector3 b1 = group.AbsolutePosition + new Vector3(minX, minY, minZ);
12090 Vector3 b2 = group.AbsolutePosition + new Vector3(maxX, maxY, maxZ);
12091 //m_log.DebugFormat("[LLCASTRAY]: min<{0},{1},{2}>, max<{3},{4},{5}> = hitp<{6},{7},{8}>", b1.X,b1.Y,b1.Z,b2.X,b2.Y,b2.Z,intersection.ipoint.X,intersection.ipoint.Y,intersection.ipoint.Z);
12092 if (!(intersection.ipoint.X >= b1.X && intersection.ipoint.X <= b2.X &&
12093 intersection.ipoint.Y >= b1.Y && intersection.ipoint.Y <= b2.Y &&
12094 intersection.ipoint.Z >= b1.Z && intersection.ipoint.Z <= b2.Z))
12095 return;
12096
12016 ContactResult result = new ContactResult (); 12097 ContactResult result = new ContactResult ();
12017 result.ConsumerID = group.LocalId; 12098 result.ConsumerID = group.LocalId;
12018// result.Depth = intersection.distance; 12099// result.Depth = intersection.distance;
@@ -12228,7 +12309,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12228 if (checkNonPhysical) 12309 if (checkNonPhysical)
12229 rayfilter |= RayFilterFlags.nonphysical; 12310 rayfilter |= RayFilterFlags.nonphysical;
12230 if (detectPhantom) 12311 if (detectPhantom)
12231 rayfilter |= RayFilterFlags.LSLPhanton; 12312 rayfilter |= RayFilterFlags.LSLPhantom;
12232 12313
12233 Vector3 direction = dir * ( 1/dist); 12314 Vector3 direction = dir * ( 1/dist);
12234 12315
@@ -12286,8 +12367,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12286 if (checkPhysical || checkNonPhysical || detectPhantom) 12367 if (checkPhysical || checkNonPhysical || detectPhantom)
12287 { 12368 {
12288 ContactResult[] objectHits = ObjectIntersection(rayStart, rayEnd, checkPhysical, checkNonPhysical, detectPhantom); 12369 ContactResult[] objectHits = ObjectIntersection(rayStart, rayEnd, checkPhysical, checkNonPhysical, detectPhantom);
12289 foreach (ContactResult r in objectHits) 12370 for (int iter = 0; iter < objectHits.Length; iter++)
12290 results.Add(r); 12371 {
12372 // Redistance the Depth because the Scene RayCaster returns distance from center to make the rezzing code simpler.
12373 objectHits[iter].Depth = Vector3.Distance(objectHits[iter].Pos, rayStart);
12374 results.Add(objectHits[iter]);
12375 }
12291 } 12376 }
12292 } 12377 }
12293 12378
@@ -12360,7 +12445,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
12360 list.Add(new LSL_Integer(linkNum)); 12445 list.Add(new LSL_Integer(linkNum));
12361 12446
12362 if ((dataFlags & ScriptBaseClass.RC_GET_NORMAL) == ScriptBaseClass.RC_GET_NORMAL) 12447 if ((dataFlags & ScriptBaseClass.RC_GET_NORMAL) == ScriptBaseClass.RC_GET_NORMAL)
12363 list.Add(new LSL_Vector(result.Normal.X, result.Normal.Y, result.Normal.Z)); 12448 list.Add(new LSL_Vector(result.Normal));
12364 12449
12365 values++; 12450 values++;
12366 if (values >= count) 12451 if (values >= count)
@@ -13235,7 +13320,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
13235 13320
13236 public static void Cache(UUID assetID, string text) 13321 public static void Cache(UUID assetID, string text)
13237 { 13322 {
13238 CacheCheck(); 13323 CheckCache();
13239 13324
13240 lock (m_Notecards) 13325 lock (m_Notecards)
13241 { 13326 {
@@ -13273,7 +13358,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
13273 /// Get a notecard line. 13358 /// Get a notecard line.
13274 /// </summary> 13359 /// </summary>
13275 /// <param name="assetID"></param> 13360 /// <param name="assetID"></param>
13276 /// <param name="line">Lines start at index 0</param> 13361 /// <param name="lineNumber">Lines start at index 0</param>
13277 /// <returns></returns> 13362 /// <returns></returns>
13278 public static string GetLine(UUID assetID, int lineNumber) 13363 public static string GetLine(UUID assetID, int lineNumber)
13279 { 13364 {
@@ -13302,9 +13387,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
13302 /// Get a notecard line. 13387 /// Get a notecard line.
13303 /// </summary> 13388 /// </summary>
13304 /// <param name="assetID"></param> 13389 /// <param name="assetID"></param>
13305 /// <param name="line">Lines start at index 0</param> 13390 /// <param name="lineNumber">Lines start at index 0</param>
13306 /// <param name="maxLength">Maximum length of the returned line. Longer lines will be truncated</para> 13391 /// <param name="maxLength">
13307 /// <returns></returns> 13392 /// Maximum length of the returned line.
13393 /// </param>
13394 /// <returns>
13395 /// If the line length is longer than <paramref name="maxLength"/>,
13396 /// the return string will be truncated.
13397 /// </returns>
13308 public static string GetLine(UUID assetID, int lineNumber, int maxLength) 13398 public static string GetLine(UUID assetID, int lineNumber, int maxLength)
13309 { 13399 {
13310 string line = GetLine(assetID, lineNumber); 13400 string line = GetLine(assetID, lineNumber);
@@ -13315,13 +13405,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
13315 return line; 13405 return line;
13316 } 13406 }
13317 13407
13318 public static void CacheCheck() 13408 public static void CheckCache()
13319 { 13409 {
13320 foreach (UUID key in new List<UUID>(m_Notecards.Keys)) 13410 lock (m_Notecards)
13321 { 13411 {
13322 Notecard nc = m_Notecards[key]; 13412 foreach (UUID key in new List<UUID>(m_Notecards.Keys))
13323 if (nc.lastRef.AddSeconds(30) < DateTime.Now) 13413 {
13324 m_Notecards.Remove(key); 13414 Notecard nc = m_Notecards[key];
13415 if (nc.lastRef.AddSeconds(30) < DateTime.Now)
13416 m_Notecards.Remove(key);
13417 }
13325 } 13418 }
13326 } 13419 }
13327 } 13420 }
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LS_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LS_Api.cs
index ceb4660..1d6cb6d 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LS_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LS_Api.cs
@@ -30,6 +30,7 @@ using System.Reflection;
30using System.Collections; 30using System.Collections;
31using System.Collections.Generic; 31using System.Collections.Generic;
32using System.Runtime.Remoting.Lifetime; 32using System.Runtime.Remoting.Lifetime;
33using System.Threading;
33using OpenMetaverse; 34using OpenMetaverse;
34using Nini.Config; 35using Nini.Config;
35using OpenSim; 36using OpenSim;
@@ -61,9 +62,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
61 internal bool m_LSFunctionsEnabled = false; 62 internal bool m_LSFunctionsEnabled = false;
62 internal IScriptModuleComms m_comms = null; 63 internal IScriptModuleComms m_comms = null;
63 64
64 public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, TaskInventoryItem item) 65 public void Initialize(
66 IScriptEngine scriptEngine, SceneObjectPart host, TaskInventoryItem item, WaitHandle coopSleepHandle)
65 { 67 {
66 m_ScriptEngine = ScriptEngine; 68 m_ScriptEngine = scriptEngine;
67 m_host = host; 69 m_host = host;
68 70
69 if (m_ScriptEngine.Config.GetBoolean("AllowLightShareFunctions", false)) 71 if (m_ScriptEngine.Config.GetBoolean("AllowLightShareFunctions", false))
@@ -92,10 +94,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
92 get { return m_ScriptEngine.World; } 94 get { return m_ScriptEngine.World; }
93 } 95 }
94 96
95 // 97 /// <summary>
96 //Dumps an error message on the debug console. 98 /// Dumps an error message on the debug console.
97 // 99 /// </summary>
98
99 internal void LSShoutError(string message) 100 internal void LSShoutError(string message)
100 { 101 {
101 if (message.Length > 1023) 102 if (message.Length > 1023)
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs
index ee89f9d..bd776b6 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/MOD_Api.cs
@@ -30,6 +30,8 @@ using System.Reflection;
30using System.Collections; 30using System.Collections;
31using System.Collections.Generic; 31using System.Collections.Generic;
32using System.Runtime.Remoting.Lifetime; 32using System.Runtime.Remoting.Lifetime;
33using System.Threading;
34using log4net;
33using OpenMetaverse; 35using OpenMetaverse;
34using Nini.Config; 36using Nini.Config;
35using OpenSim; 37using OpenSim;
@@ -55,15 +57,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
55 [Serializable] 57 [Serializable]
56 public class MOD_Api : MarshalByRefObject, IMOD_Api, IScriptApi 58 public class MOD_Api : MarshalByRefObject, IMOD_Api, IScriptApi
57 { 59 {
60// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
61
58 internal IScriptEngine m_ScriptEngine; 62 internal IScriptEngine m_ScriptEngine;
59 internal SceneObjectPart m_host; 63 internal SceneObjectPart m_host;
60 internal TaskInventoryItem m_item; 64 internal TaskInventoryItem m_item;
61 internal bool m_MODFunctionsEnabled = false; 65 internal bool m_MODFunctionsEnabled = false;
62 internal IScriptModuleComms m_comms = null; 66 internal IScriptModuleComms m_comms = null;
63 67
64 public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, TaskInventoryItem item) 68 public void Initialize(
69 IScriptEngine scriptEngine, SceneObjectPart host, TaskInventoryItem item, WaitHandle coopSleepHandle)
65 { 70 {
66 m_ScriptEngine = ScriptEngine; 71 m_ScriptEngine = scriptEngine;
67 m_host = host; 72 m_host = host;
68 m_item = item; 73 m_item = item;
69 74
@@ -107,8 +112,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
107 if (message.Length > 1023) 112 if (message.Length > 1023)
108 message = message.Substring(0, 1023); 113 message = message.Substring(0, 1023);
109 114
110 World.SimChat(Utils.StringToBytes(message), 115 World.SimChat(
111 ChatTypeEnum.Shout, ScriptBaseClass.DEBUG_CHANNEL, m_host.ParentGroup.RootPart.AbsolutePosition, m_host.Name, m_host.UUID, true); 116 Utils.StringToBytes(message),
117 ChatTypeEnum.Shout, ScriptBaseClass.DEBUG_CHANNEL,
118 m_host.ParentGroup.RootPart.AbsolutePosition, m_host.Name, m_host.UUID, false);
112 119
113 IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); 120 IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>();
114 wComm.DeliverMessage(ChatTypeEnum.Shout, ScriptBaseClass.DEBUG_CHANNEL, m_host.Name, m_host.UUID, message); 121 wComm.DeliverMessage(ChatTypeEnum.Shout, ScriptBaseClass.DEBUG_CHANNEL, m_host.Name, m_host.UUID, message);
@@ -122,6 +129,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
122 /// <returns>string result of the invocation</returns> 129 /// <returns>string result of the invocation</returns>
123 public void modInvokeN(string fname, params object[] parms) 130 public void modInvokeN(string fname, params object[] parms)
124 { 131 {
132// m_log.DebugFormat(
133// "[MOD API]: Invoking dynamic function {0}, args '{1}' with {2} return type",
134// fname,
135// string.Join(",", Array.ConvertAll<object, string>(parms, o => o.ToString())),
136// ((MethodInfo)MethodBase.GetCurrentMethod()).ReturnType);
137
125 Type returntype = m_comms.LookupReturnType(fname); 138 Type returntype = m_comms.LookupReturnType(fname);
126 if (returntype != typeof(void)) 139 if (returntype != typeof(void))
127 MODError(String.Format("return type mismatch for {0}",fname)); 140 MODError(String.Format("return type mismatch for {0}",fname));
@@ -131,6 +144,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
131 144
132 public LSL_String modInvokeS(string fname, params object[] parms) 145 public LSL_String modInvokeS(string fname, params object[] parms)
133 { 146 {
147// m_log.DebugFormat(
148// "[MOD API]: Invoking dynamic function {0}, args '{1}' with {2} return type",
149// fname,
150// string.Join(",", Array.ConvertAll<object, string>(parms, o => o.ToString())),
151// ((MethodInfo)MethodBase.GetCurrentMethod()).ReturnType);
152
134 Type returntype = m_comms.LookupReturnType(fname); 153 Type returntype = m_comms.LookupReturnType(fname);
135 if (returntype != typeof(string)) 154 if (returntype != typeof(string))
136 MODError(String.Format("return type mismatch for {0}",fname)); 155 MODError(String.Format("return type mismatch for {0}",fname));
@@ -141,6 +160,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
141 160
142 public LSL_Integer modInvokeI(string fname, params object[] parms) 161 public LSL_Integer modInvokeI(string fname, params object[] parms)
143 { 162 {
163// m_log.DebugFormat(
164// "[MOD API]: Invoking dynamic function {0}, args '{1}' with {2} return type",
165// fname,
166// string.Join(",", Array.ConvertAll<object, string>(parms, o => o.ToString())),
167// ((MethodInfo)MethodBase.GetCurrentMethod()).ReturnType);
168
144 Type returntype = m_comms.LookupReturnType(fname); 169 Type returntype = m_comms.LookupReturnType(fname);
145 if (returntype != typeof(int)) 170 if (returntype != typeof(int))
146 MODError(String.Format("return type mismatch for {0}",fname)); 171 MODError(String.Format("return type mismatch for {0}",fname));
@@ -151,6 +176,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
151 176
152 public LSL_Float modInvokeF(string fname, params object[] parms) 177 public LSL_Float modInvokeF(string fname, params object[] parms)
153 { 178 {
179// m_log.DebugFormat(
180// "[MOD API]: Invoking dynamic function {0}, args '{1}' with {2} return type",
181// fname,
182// string.Join(",", Array.ConvertAll<object, string>(parms, o => o.ToString())),
183// ((MethodInfo)MethodBase.GetCurrentMethod()).ReturnType);
184
154 Type returntype = m_comms.LookupReturnType(fname); 185 Type returntype = m_comms.LookupReturnType(fname);
155 if (returntype != typeof(float)) 186 if (returntype != typeof(float))
156 MODError(String.Format("return type mismatch for {0}",fname)); 187 MODError(String.Format("return type mismatch for {0}",fname));
@@ -161,6 +192,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
161 192
162 public LSL_Key modInvokeK(string fname, params object[] parms) 193 public LSL_Key modInvokeK(string fname, params object[] parms)
163 { 194 {
195// m_log.DebugFormat(
196// "[MOD API]: Invoking dynamic function {0}, args '{1}' with {2} return type",
197// fname,
198// string.Join(",", Array.ConvertAll<object, string>(parms, o => o.ToString())),
199// ((MethodInfo)MethodBase.GetCurrentMethod()).ReturnType);
200
164 Type returntype = m_comms.LookupReturnType(fname); 201 Type returntype = m_comms.LookupReturnType(fname);
165 if (returntype != typeof(UUID)) 202 if (returntype != typeof(UUID))
166 MODError(String.Format("return type mismatch for {0}",fname)); 203 MODError(String.Format("return type mismatch for {0}",fname));
@@ -171,6 +208,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
171 208
172 public LSL_Vector modInvokeV(string fname, params object[] parms) 209 public LSL_Vector modInvokeV(string fname, params object[] parms)
173 { 210 {
211// m_log.DebugFormat(
212// "[MOD API]: Invoking dynamic function {0}, args '{1}' with {2} return type",
213// fname,
214// string.Join(",", Array.ConvertAll<object, string>(parms, o => o.ToString())),
215// ((MethodInfo)MethodBase.GetCurrentMethod()).ReturnType);
216
174 Type returntype = m_comms.LookupReturnType(fname); 217 Type returntype = m_comms.LookupReturnType(fname);
175 if (returntype != typeof(OpenMetaverse.Vector3)) 218 if (returntype != typeof(OpenMetaverse.Vector3))
176 MODError(String.Format("return type mismatch for {0}",fname)); 219 MODError(String.Format("return type mismatch for {0}",fname));
@@ -181,6 +224,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
181 224
182 public LSL_Rotation modInvokeR(string fname, params object[] parms) 225 public LSL_Rotation modInvokeR(string fname, params object[] parms)
183 { 226 {
227// m_log.DebugFormat(
228// "[MOD API]: Invoking dynamic function {0}, args '{1}' with {2} return type",
229// fname,
230// string.Join(",", Array.ConvertAll<object, string>(parms, o => o.ToString())),
231// ((MethodInfo)MethodBase.GetCurrentMethod()).ReturnType);
232
184 Type returntype = m_comms.LookupReturnType(fname); 233 Type returntype = m_comms.LookupReturnType(fname);
185 if (returntype != typeof(OpenMetaverse.Quaternion)) 234 if (returntype != typeof(OpenMetaverse.Quaternion))
186 MODError(String.Format("return type mismatch for {0}",fname)); 235 MODError(String.Format("return type mismatch for {0}",fname));
@@ -191,6 +240,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
191 240
192 public LSL_List modInvokeL(string fname, params object[] parms) 241 public LSL_List modInvokeL(string fname, params object[] parms)
193 { 242 {
243// m_log.DebugFormat(
244// "[MOD API]: Invoking dynamic function {0}, args '{1}' with {2} return type",
245// fname,
246// string.Join(",", Array.ConvertAll<object, string>(parms, o => o.ToString())),
247// ((MethodInfo)MethodBase.GetCurrentMethod()).ReturnType);
248
194 Type returntype = m_comms.LookupReturnType(fname); 249 Type returntype = m_comms.LookupReturnType(fname);
195 if (returntype != typeof(object[])) 250 if (returntype != typeof(object[]))
196 MODError(String.Format("return type mismatch for {0}",fname)); 251 MODError(String.Format("return type mismatch for {0}",fname));
@@ -211,6 +266,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
211 { 266 {
212 llist[i] = new LSL_Float((float)result[i]); 267 llist[i] = new LSL_Float((float)result[i]);
213 } 268 }
269 else if (result[i] is double)
270 {
271 llist[i] = new LSL_Float((double)result[i]);
272 }
214 else if (result[i] is UUID) 273 else if (result[i] is UUID)
215 { 274 {
216 llist[i] = new LSL_Key(result[i].ToString()); 275 llist[i] = new LSL_Key(result[i].ToString());
@@ -248,6 +307,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
248 return ""; 307 return "";
249 } 308 }
250 309
310// m_log.DebugFormat(
311// "[MOD API]: Invoking dynamic function {0}, args '{1}' with {2} return type",
312// fname,
313// string.Join(",", Array.ConvertAll<object, string>(parms, o => o.ToString())),
314// ((MethodInfo)MethodBase.GetCurrentMethod()).ReturnType);
315
251 Type[] signature = m_comms.LookupTypeSignature(fname); 316 Type[] signature = m_comms.LookupTypeSignature(fname);
252 if (signature.Length != parms.Length) 317 if (signature.Length != parms.Length)
253 MODError(String.Format("wrong number of parameters to function {0}",fname)); 318 MODError(String.Format("wrong number of parameters to function {0}",fname));
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
index 8aac33f..234ba34 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
@@ -143,9 +143,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
143 143
144 protected IUrlModule m_UrlModule = null; 144 protected IUrlModule m_UrlModule = null;
145 145
146 public void Initialize(IScriptEngine ScriptEngine, SceneObjectPart host, TaskInventoryItem item) 146 public void Initialize(
147 IScriptEngine scriptEngine, SceneObjectPart host, TaskInventoryItem item, WaitHandle coopSleepHandle)
147 { 148 {
148 m_ScriptEngine = ScriptEngine; 149 m_ScriptEngine = scriptEngine;
149 m_host = host; 150 m_host = host;
150 m_item = item; 151 m_item = item;
151 m_debuggerSafe = m_ScriptEngine.Config.GetBoolean("DebuggerSafe", false); 152 m_debuggerSafe = m_ScriptEngine.Config.GetBoolean("DebuggerSafe", false);
@@ -254,11 +255,23 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
254 wComm.DeliverMessage(ChatTypeEnum.Shout, ScriptBaseClass.DEBUG_CHANNEL, m_host.Name, m_host.UUID, message); 255 wComm.DeliverMessage(ChatTypeEnum.Shout, ScriptBaseClass.DEBUG_CHANNEL, m_host.Name, m_host.UUID, message);
255 } 256 }
256 257
258 // Returns of the function is allowed. Throws a script exception if not allowed.
257 public void CheckThreatLevel(ThreatLevel level, string function) 259 public void CheckThreatLevel(ThreatLevel level, string function)
258 { 260 {
259 if (!m_OSFunctionsEnabled) 261 if (!m_OSFunctionsEnabled)
260 OSSLError(String.Format("{0} permission denied. All OS functions are disabled.", function)); // throws 262 OSSLError(String.Format("{0} permission denied. All OS functions are disabled.", function)); // throws
261 263
264 string reasonWhyNot = CheckThreatLevelTest(level, function);
265 if (!String.IsNullOrEmpty(reasonWhyNot))
266 {
267 OSSLError(reasonWhyNot);
268 }
269 }
270
271 // Check to see if function is allowed. Returns an empty string if function permitted
272 // or a string explaining why this function can't be used.
273 private string CheckThreatLevelTest(ThreatLevel level, string function)
274 {
262 if (!m_FunctionPerms.ContainsKey(function)) 275 if (!m_FunctionPerms.ContainsKey(function))
263 { 276 {
264 FunctionPerms perms = new FunctionPerms(); 277 FunctionPerms perms = new FunctionPerms();
@@ -338,10 +351,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
338 { 351 {
339 // Allow / disallow by threat level 352 // Allow / disallow by threat level
340 if (level > m_MaxThreatLevel) 353 if (level > m_MaxThreatLevel)
341 OSSLError( 354 return
342 String.Format( 355 String.Format(
343 "{0} permission denied. Allowed threat level is {1} but function threat level is {2}.", 356 "{0} permission denied. Allowed threat level is {1} but function threat level is {2}.",
344 function, m_MaxThreatLevel, level)); 357 function, m_MaxThreatLevel, level);
345 } 358 }
346 else 359 else
347 { 360 {
@@ -351,7 +364,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
351 if (m_FunctionPerms[function].AllowedOwners.Contains(m_host.OwnerID)) 364 if (m_FunctionPerms[function].AllowedOwners.Contains(m_host.OwnerID))
352 { 365 {
353 // prim owner is in the list of allowed owners 366 // prim owner is in the list of allowed owners
354 return; 367 return String.Empty;
355 } 368 }
356 369
357 UUID ownerID = m_item.OwnerID; 370 UUID ownerID = m_item.OwnerID;
@@ -359,22 +372,22 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
359 //OSSL only may be used if object is in the same group as the parcel 372 //OSSL only may be used if object is in the same group as the parcel
360 if (m_FunctionPerms[function].AllowedOwnerClasses.Contains("PARCEL_GROUP_MEMBER")) 373 if (m_FunctionPerms[function].AllowedOwnerClasses.Contains("PARCEL_GROUP_MEMBER"))
361 { 374 {
362 ILandObject land = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y); 375 ILandObject land = World.LandChannel.GetLandObject(m_host.AbsolutePosition);
363 376
364 if (land.LandData.GroupID == m_item.GroupID && land.LandData.GroupID != UUID.Zero) 377 if (land.LandData.GroupID == m_item.GroupID && land.LandData.GroupID != UUID.Zero)
365 { 378 {
366 return; 379 return String.Empty;
367 } 380 }
368 } 381 }
369 382
370 //Only Parcelowners may use the function 383 //Only Parcelowners may use the function
371 if (m_FunctionPerms[function].AllowedOwnerClasses.Contains("PARCEL_OWNER")) 384 if (m_FunctionPerms[function].AllowedOwnerClasses.Contains("PARCEL_OWNER"))
372 { 385 {
373 ILandObject land = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y); 386 ILandObject land = World.LandChannel.GetLandObject(m_host.AbsolutePosition);
374 387
375 if (land.LandData.OwnerID == ownerID) 388 if (land.LandData.OwnerID == ownerID)
376 { 389 {
377 return; 390 return String.Empty;
378 } 391 }
379 } 392 }
380 393
@@ -384,7 +397,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
384 //Only Estate Managers may use the function 397 //Only Estate Managers may use the function
385 if (World.RegionInfo.EstateSettings.IsEstateManagerOrOwner(ownerID) && World.RegionInfo.EstateSettings.EstateOwner != ownerID) 398 if (World.RegionInfo.EstateSettings.IsEstateManagerOrOwner(ownerID) && World.RegionInfo.EstateSettings.EstateOwner != ownerID)
386 { 399 {
387 return; 400 return String.Empty;
388 } 401 }
389 } 402 }
390 403
@@ -393,25 +406,24 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
393 { 406 {
394 if (World.RegionInfo.EstateSettings.EstateOwner == ownerID) 407 if (World.RegionInfo.EstateSettings.EstateOwner == ownerID)
395 { 408 {
396 return; 409 return String.Empty;
397 } 410 }
398 } 411 }
399 412
400 if (!m_FunctionPerms[function].AllowedCreators.Contains(m_item.CreatorID)) 413 if (!m_FunctionPerms[function].AllowedCreators.Contains(m_item.CreatorID))
401 OSSLError( 414 return(
402 String.Format("{0} permission denied. Script creator is not in the list of users allowed to execute this function and prim owner also has no permission.", 415 String.Format("{0} permission denied. Script creator is not in the list of users allowed to execute this function and prim owner also has no permission.",
403 function)); 416 function));
404 417
405 if (m_item.CreatorID != ownerID) 418 if (m_item.CreatorID != ownerID)
406 { 419 {
407 if ((m_item.CurrentPermissions & (uint)PermissionMask.Modify) != 0) 420 if ((m_item.CurrentPermissions & (uint)PermissionMask.Modify) != 0)
408 OSSLError( 421 return String.Format("{0} permission denied. Script permissions error.", function);
409 String.Format("{0} permission denied. Script permissions error.",
410 function));
411 422
412 } 423 }
413 } 424 }
414 } 425 }
426 return String.Empty;
415 } 427 }
416 428
417 internal void OSSLDeprecated(string function, string replacement) 429 internal void OSSLDeprecated(string function, string replacement)
@@ -983,7 +995,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
983 if (animID == UUID.Zero) 995 if (animID == UUID.Zero)
984 target.Animator.RemoveAnimation(animation); 996 target.Animator.RemoveAnimation(animation);
985 else 997 else
986 target.Animator.RemoveAnimation(animID); 998 target.Animator.RemoveAnimation(animID, true);
987 } 999 }
988 } 1000 }
989 } 1001 }
@@ -1214,12 +1226,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1214 sunHour += 24.0; 1226 sunHour += 24.0;
1215 1227
1216 World.RegionInfo.RegionSettings.UseEstateSun = useEstateSun; 1228 World.RegionInfo.RegionSettings.UseEstateSun = useEstateSun;
1217 World.RegionInfo.RegionSettings.SunPosition = sunHour + 6; // LL Region Sun Hour is 6 to 30 1229 World.RegionInfo.RegionSettings.SunPosition = sunHour + 6; // LL Region Sun Hour is 6 to 30
1218 World.RegionInfo.RegionSettings.FixedSun = sunFixed; 1230 World.RegionInfo.RegionSettings.FixedSun = sunFixed;
1219 World.RegionInfo.RegionSettings.Save(); 1231 World.RegionInfo.RegionSettings.Save();
1220 1232
1221 World.EventManager.TriggerEstateToolsSunUpdate( 1233 World.EventManager.TriggerEstateToolsSunUpdate(World.RegionInfo.RegionHandle);
1222 World.RegionInfo.RegionHandle, sunFixed, useEstateSun, (float)sunHour);
1223 } 1234 }
1224 1235
1225 /// <summary> 1236 /// <summary>
@@ -1244,8 +1255,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1244 World.RegionInfo.EstateSettings.FixedSun = sunFixed; 1255 World.RegionInfo.EstateSettings.FixedSun = sunFixed;
1245 World.RegionInfo.EstateSettings.Save(); 1256 World.RegionInfo.EstateSettings.Save();
1246 1257
1247 World.EventManager.TriggerEstateToolsSunUpdate( 1258 World.EventManager.TriggerEstateToolsSunUpdate(World.RegionInfo.RegionHandle);
1248 World.RegionInfo.RegionHandle, sunFixed, World.RegionInfo.RegionSettings.UseEstateSun, (float)sunHour);
1249 } 1259 }
1250 1260
1251 /// <summary> 1261 /// <summary>
@@ -1501,8 +1511,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1501 1511
1502 m_host.AddScriptLPS(1); 1512 m_host.AddScriptLPS(1);
1503 1513
1504 ILandObject land 1514 ILandObject land = World.LandChannel.GetLandObject(m_host.AbsolutePosition);
1505 = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y);
1506 1515
1507 if (land.LandData.OwnerID != m_host.OwnerID) 1516 if (land.LandData.OwnerID != m_host.OwnerID)
1508 return; 1517 return;
@@ -1518,8 +1527,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1518 1527
1519 m_host.AddScriptLPS(1); 1528 m_host.AddScriptLPS(1);
1520 1529
1521 ILandObject land 1530 ILandObject land = World.LandChannel.GetLandObject(m_host.AbsolutePosition);
1522 = World.LandChannel.GetLandObject(m_host.AbsolutePosition.X, m_host.AbsolutePosition.Y);
1523 1531
1524 if (land.LandData.OwnerID != m_host.OwnerID) 1532 if (land.LandData.OwnerID != m_host.OwnerID)
1525 { 1533 {
@@ -1569,6 +1577,32 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
1569 } 1577 }
1570 } 1578 }
1571 1579
1580 public string osGetPhysicsEngineType()
1581 {
1582 // High because it can be used to target attacks to known weaknesses
1583 // This would allow a new class of griefer scripts that don't even
1584 // require their user to know what they are doing (see script
1585 // kiddie)
1586 // Because it would be nice if scripts didn't blow up if the information
1587 // about the physics engine, this function returns an empty string if
1588 // the user does not have permission to see it. This as opposed to
1589 // throwing an exception.
1590 m_host.AddScriptLPS(1);
1591 string ret = String.Empty;
1592 if (String.IsNullOrEmpty(CheckThreatLevelTest(ThreatLevel.High, "osGetPhysicsEngineType")))
1593 {
1594 if (m_ScriptEngine.World.PhysicsScene != null)
1595 {
1596 ret = m_ScriptEngine.World.PhysicsScene.EngineType;
1597 // An old physics engine might have an uninitialized engine type
1598 if (ret == null)
1599 ret = "unknown";
1600 }
1601 }
1602
1603 return ret;
1604 }
1605
1572 public string osGetSimulatorVersion() 1606 public string osGetSimulatorVersion()
1573 { 1607 {
1574 // High because it can be used to target attacks to known weaknesses 1608 // High because it can be used to target attacks to known weaknesses
@@ -2136,9 +2170,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2136 CheckThreatLevel(ThreatLevel.Moderate, "osGetGridHomeURI"); 2170 CheckThreatLevel(ThreatLevel.Moderate, "osGetGridHomeURI");
2137 m_host.AddScriptLPS(1); 2171 m_host.AddScriptLPS(1);
2138 2172
2139 string HomeURI = String.Empty;
2140 IConfigSource config = m_ScriptEngine.ConfigSource; 2173 IConfigSource config = m_ScriptEngine.ConfigSource;
2174 string HomeURI = Util.GetConfigVarFromSections<string>(config, "HomeURI",
2175 new string[] { "Startup", "Hypergrid" }, String.Empty);
2176
2177 if (!string.IsNullOrEmpty(HomeURI))
2178 return HomeURI;
2141 2179
2180 // Legacy. Remove soon!
2142 if (config.Configs["LoginService"] != null) 2181 if (config.Configs["LoginService"] != null)
2143 HomeURI = config.Configs["LoginService"].GetString("SRV_HomeURI", HomeURI); 2182 HomeURI = config.Configs["LoginService"].GetString("SRV_HomeURI", HomeURI);
2144 2183
@@ -2153,9 +2192,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2153 CheckThreatLevel(ThreatLevel.Moderate, "osGetGridGatekeeperURI"); 2192 CheckThreatLevel(ThreatLevel.Moderate, "osGetGridGatekeeperURI");
2154 m_host.AddScriptLPS(1); 2193 m_host.AddScriptLPS(1);
2155 2194
2156 string gatekeeperURI = String.Empty;
2157 IConfigSource config = m_ScriptEngine.ConfigSource; 2195 IConfigSource config = m_ScriptEngine.ConfigSource;
2196 string gatekeeperURI = Util.GetConfigVarFromSections<string>(config, "GatekeeperURI",
2197 new string[] { "Startup", "Hypergrid" }, String.Empty);
2198
2199 if (!string.IsNullOrEmpty(gatekeeperURI))
2200 return gatekeeperURI;
2158 2201
2202 // Legacy. Remove soon!
2159 if (config.Configs["GridService"] != null) 2203 if (config.Configs["GridService"] != null)
2160 gatekeeperURI = config.Configs["GridService"].GetString("Gatekeeper", gatekeeperURI); 2204 gatekeeperURI = config.Configs["GridService"].GetString("Gatekeeper", gatekeeperURI);
2161 2205
@@ -2532,13 +2576,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2532 ScenePresence sp = World.GetScenePresence(npcId); 2576 ScenePresence sp = World.GetScenePresence(npcId);
2533 2577
2534 if (sp != null) 2578 if (sp != null)
2535 { 2579 return new LSL_Vector(sp.AbsolutePosition);
2536 Vector3 pos = sp.AbsolutePosition;
2537 return new LSL_Vector(pos.X, pos.Y, pos.Z);
2538 }
2539 } 2580 }
2540 2581
2541 return new LSL_Vector(0, 0, 0); 2582 return Vector3.Zero;
2542 } 2583 }
2543 2584
2544 public void osNpcMoveTo(LSL_Key npc, LSL_Vector pos) 2585 public void osNpcMoveTo(LSL_Key npc, LSL_Vector pos)
@@ -2595,21 +2636,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
2595 { 2636 {
2596 UUID npcId; 2637 UUID npcId;
2597 if (!UUID.TryParse(npc.m_string, out npcId)) 2638 if (!UUID.TryParse(npc.m_string, out npcId))
2598 return new LSL_Rotation(Quaternion.Identity.X, Quaternion.Identity.Y, Quaternion.Identity.Z, Quaternion.Identity.W); 2639 return new LSL_Rotation(Quaternion.Identity);
2599 2640
2600 if (!npcModule.CheckPermissions(npcId, m_host.OwnerID)) 2641 if (!npcModule.CheckPermissions(npcId, m_host.OwnerID))
2601 return new LSL_Rotation(Quaternion.Identity.X, Quaternion.Identity.Y, Quaternion.Identity.Z, Quaternion.Identity.W); 2642 return new LSL_Rotation(Quaternion.Identity);
2602 2643
2603 ScenePresence sp = World.GetScenePresence(npcId); 2644 ScenePresence sp = World.GetScenePresence(npcId);
2604 2645
2605 if (sp != null) 2646 if (sp != null)
2606 { 2647 return new LSL_Rotation(sp.GetWorldRotation());
2607 Quaternion rot = sp.Rotation;
2608 return new LSL_Rotation(rot.X, rot.Y, rot.Z, rot.W);
2609 }
2610 } 2648 }
2611 2649
2612 return new LSL_Rotation(Quaternion.Identity.X, Quaternion.Identity.Y, Quaternion.Identity.Z, Quaternion.Identity.W); 2650 return Quaternion.Identity;
2613 } 2651 }
2614 2652
2615 public void osNpcSetRot(LSL_Key npc, LSL_Rotation rotation) 2653 public void osNpcSetRot(LSL_Key npc, LSL_Rotation rotation)
@@ -3055,20 +3093,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3055 3093
3056 UUID avatarId = new UUID(avatar); 3094 UUID avatarId = new UUID(avatar);
3057 ScenePresence presence = World.GetScenePresence(avatarId); 3095 ScenePresence presence = World.GetScenePresence(avatarId);
3058 Vector3 pos = m_host.GetWorldPosition(); 3096
3059 bool result = World.ScriptDanger(m_host.LocalId, new Vector3((float)pos.X, (float)pos.Y, (float)pos.Z)); 3097 if (presence != null && World.ScriptDanger(m_host.LocalId, m_host.GetWorldPosition()))
3060 if (result)
3061 { 3098 {
3062 if (presence != null) 3099 float health = presence.Health;
3063 { 3100 health += (float)healing;
3064 float health = presence.Health; 3101
3065 health += (float)healing; 3102 if (health >= 100)
3066 if (health >= 100) 3103 health = 100;
3067 { 3104
3068 health = 100; 3105 presence.setHealthWithUpdate(health);
3069 }
3070 presence.setHealthWithUpdate(health);
3071 }
3072 } 3106 }
3073 } 3107 }
3074 3108
@@ -3145,8 +3179,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
3145 if (avatar != null && avatar.UUID != m_host.OwnerID) 3179 if (avatar != null && avatar.UUID != m_host.OwnerID)
3146 { 3180 {
3147 result.Add(new LSL_String(avatar.UUID.ToString())); 3181 result.Add(new LSL_String(avatar.UUID.ToString()));
3148 OpenMetaverse.Vector3 ap = avatar.AbsolutePosition; 3182 result.Add(new LSL_Vector(avatar.AbsolutePosition));
3149 result.Add(new LSL_Vector(ap.X, ap.Y, ap.Z));
3150 result.Add(new LSL_String(avatar.Name)); 3183 result.Add(new LSL_String(avatar.Name));
3151 } 3184 }
3152 }); 3185 });
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs
index 4dd795d..884f07c 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/SensorRepeat.cs
@@ -42,6 +42,29 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
42 { 42 {
43// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 43// private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
44 44
45 /// <summary>
46 /// Used by one-off and repeated sensors
47 /// </summary>
48 public class SensorInfo
49 {
50 public uint localID;
51 public UUID itemID;
52 public double interval;
53 public DateTime next;
54
55 public string name;
56 public UUID keyID;
57 public int type;
58 public double range;
59 public double arc;
60 public SceneObjectPart host;
61
62 public SensorInfo Clone()
63 {
64 return (SensorInfo)this.MemberwiseClone();
65 }
66 }
67
45 public AsyncCommandManager m_CmdManager; 68 public AsyncCommandManager m_CmdManager;
46 69
47 /// <summary> 70 /// <summary>
@@ -78,24 +101,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
78 private int maximumToReturn = 16; 101 private int maximumToReturn = 16;
79 102
80 // 103 //
81 // SenseRepeater and Sensors
82 //
83 private class SenseRepeatClass
84 {
85 public uint localID;
86 public UUID itemID;
87 public double interval;
88 public DateTime next;
89
90 public string name;
91 public UUID keyID;
92 public int type;
93 public double range;
94 public double arc;
95 public SceneObjectPart host;
96 }
97
98 //
99 // Sensed entity 104 // Sensed entity
100 // 105 //
101 private class SensedEntity : IComparable 106 private class SensedEntity : IComparable
@@ -127,7 +132,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
127 /// 132 ///
128 /// Always lock SenseRepeatListLock when updating this list. 133 /// Always lock SenseRepeatListLock when updating this list.
129 /// </remarks> 134 /// </remarks>
130 private List<SenseRepeatClass> SenseRepeaters = new List<SenseRepeatClass>(); 135 private List<SensorInfo> SenseRepeaters = new List<SensorInfo>();
131 private object SenseRepeatListLock = new object(); 136 private object SenseRepeatListLock = new object();
132 137
133 public void SetSenseRepeatEvent(uint m_localID, UUID m_itemID, 138 public void SetSenseRepeatEvent(uint m_localID, UUID m_itemID,
@@ -141,7 +146,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
141 return; 146 return;
142 147
143 // Add to timer 148 // Add to timer
144 SenseRepeatClass ts = new SenseRepeatClass(); 149 SensorInfo ts = new SensorInfo();
145 ts.localID = m_localID; 150 ts.localID = m_localID;
146 ts.itemID = m_itemID; 151 ts.itemID = m_itemID;
147 ts.interval = sec; 152 ts.interval = sec;
@@ -160,11 +165,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
160 AddSenseRepeater(ts); 165 AddSenseRepeater(ts);
161 } 166 }
162 167
163 private void AddSenseRepeater(SenseRepeatClass senseRepeater) 168 private void AddSenseRepeater(SensorInfo senseRepeater)
164 { 169 {
165 lock (SenseRepeatListLock) 170 lock (SenseRepeatListLock)
166 { 171 {
167 List<SenseRepeatClass> newSenseRepeaters = new List<SenseRepeatClass>(SenseRepeaters); 172 List<SensorInfo> newSenseRepeaters = new List<SensorInfo>(SenseRepeaters);
168 newSenseRepeaters.Add(senseRepeater); 173 newSenseRepeaters.Add(senseRepeater);
169 SenseRepeaters = newSenseRepeaters; 174 SenseRepeaters = newSenseRepeaters;
170 } 175 }
@@ -175,8 +180,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
175 // Remove from timer 180 // Remove from timer
176 lock (SenseRepeatListLock) 181 lock (SenseRepeatListLock)
177 { 182 {
178 List<SenseRepeatClass> newSenseRepeaters = new List<SenseRepeatClass>(); 183 List<SensorInfo> newSenseRepeaters = new List<SensorInfo>();
179 foreach (SenseRepeatClass ts in SenseRepeaters) 184 foreach (SensorInfo ts in SenseRepeaters)
180 { 185 {
181 if (ts.localID != m_localID || ts.itemID != m_itemID) 186 if (ts.localID != m_localID || ts.itemID != m_itemID)
182 { 187 {
@@ -191,7 +196,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
191 public void CheckSenseRepeaterEvents() 196 public void CheckSenseRepeaterEvents()
192 { 197 {
193 // Go through all timers 198 // Go through all timers
194 foreach (SenseRepeatClass ts in SenseRepeaters) 199 foreach (SensorInfo ts in SenseRepeaters)
195 { 200 {
196 // Time has passed? 201 // Time has passed?
197 if (ts.next.ToUniversalTime() < DateTime.Now.ToUniversalTime()) 202 if (ts.next.ToUniversalTime() < DateTime.Now.ToUniversalTime())
@@ -208,7 +213,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
208 double range, double arc, SceneObjectPart host) 213 double range, double arc, SceneObjectPart host)
209 { 214 {
210 // Add to timer 215 // Add to timer
211 SenseRepeatClass ts = new SenseRepeatClass(); 216 SensorInfo ts = new SensorInfo();
212 ts.localID = m_localID; 217 ts.localID = m_localID;
213 ts.itemID = m_itemID; 218 ts.itemID = m_itemID;
214 ts.interval = 0; 219 ts.interval = 0;
@@ -224,7 +229,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
224 SensorSweep(ts); 229 SensorSweep(ts);
225 } 230 }
226 231
227 private void SensorSweep(SenseRepeatClass ts) 232 private void SensorSweep(SensorInfo ts)
228 { 233 {
229 if (ts.host == null) 234 if (ts.host == null)
230 { 235 {
@@ -300,7 +305,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
300 } 305 }
301 } 306 }
302 307
303 private List<SensedEntity> doObjectSensor(SenseRepeatClass ts) 308 private List<SensedEntity> doObjectSensor(SensorInfo ts)
304 { 309 {
305 List<EntityBase> Entities; 310 List<EntityBase> Entities;
306 List<SensedEntity> sensedEntities = new List<SensedEntity>(); 311 List<SensedEntity> sensedEntities = new List<SensedEntity>();
@@ -451,7 +456,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
451 return sensedEntities; 456 return sensedEntities;
452 } 457 }
453 458
454 private List<SensedEntity> doAgentSensor(SenseRepeatClass ts) 459 private List<SensedEntity> doAgentSensor(SensorInfo ts)
455 { 460 {
456 List<SensedEntity> sensedEntities = new List<SensedEntity>(); 461 List<SensedEntity> sensedEntities = new List<SensedEntity>();
457 462
@@ -630,7 +635,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
630 { 635 {
631 List<Object> data = new List<Object>(); 636 List<Object> data = new List<Object>();
632 637
633 foreach (SenseRepeatClass ts in SenseRepeaters) 638 foreach (SensorInfo ts in SenseRepeaters)
634 { 639 {
635 if (ts.itemID == itemID) 640 if (ts.itemID == itemID)
636 { 641 {
@@ -660,7 +665,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
660 665
661 while (idx < data.Length) 666 while (idx < data.Length)
662 { 667 {
663 SenseRepeatClass ts = new SenseRepeatClass(); 668 SensorInfo ts = new SensorInfo();
664 669
665 ts.localID = localID; 670 ts.localID = localID;
666 ts.itemID = itemID; 671 ts.itemID = itemID;
@@ -681,5 +686,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
681 idx += 6; 686 idx += 6;
682 } 687 }
683 } 688 }
689
690 public List<SensorInfo> GetSensorInfo()
691 {
692 List<SensorInfo> retList = new List<SensorInfo>();
693
694 lock (SenseRepeatListLock)
695 {
696 foreach (SensorInfo i in SenseRepeaters)
697 retList.Add(i.Clone());
698 }
699
700 return retList;
701 }
684 } 702 }
685} 703}
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/Timer.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/Timer.cs
index 9ee6946..68aacd2 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/Timer.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Plugins/Timer.cs
@@ -35,6 +35,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
35{ 35{
36 public class Timer 36 public class Timer
37 { 37 {
38 public class TimerInfo
39 {
40 public uint localID;
41 public UUID itemID;
42 //public double interval;
43 public long interval;
44 //public DateTime next;
45 public long next;
46
47 public TimerInfo Clone()
48 {
49 return (TimerInfo)this.MemberwiseClone();
50 }
51 }
52
38 public AsyncCommandManager m_CmdManager; 53 public AsyncCommandManager m_CmdManager;
39 54
40 public int TimersCount 55 public int TimersCount
@@ -59,17 +74,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
59 return localID.ToString() + itemID.ToString(); 74 return localID.ToString() + itemID.ToString();
60 } 75 }
61 76
62 private class TimerClass 77 private Dictionary<string,TimerInfo> Timers = new Dictionary<string,TimerInfo>();
63 {
64 public uint localID;
65 public UUID itemID;
66 //public double interval;
67 public long interval;
68 //public DateTime next;
69 public long next;
70 }
71
72 private Dictionary<string,TimerClass> Timers = new Dictionary<string,TimerClass>();
73 private object TimerListLock = new object(); 78 private object TimerListLock = new object();
74 79
75 public void SetTimerEvent(uint m_localID, UUID m_itemID, double sec) 80 public void SetTimerEvent(uint m_localID, UUID m_itemID, double sec)
@@ -81,7 +86,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
81 } 86 }
82 87
83 // Add to timer 88 // Add to timer
84 TimerClass ts = new TimerClass(); 89 TimerInfo ts = new TimerInfo();
85 ts.localID = m_localID; 90 ts.localID = m_localID;
86 ts.itemID = m_itemID; 91 ts.itemID = m_itemID;
87 ts.interval = Convert.ToInt64(sec * 10000000); // How many 100 nanoseconds (ticks) should we wait 92 ts.interval = Convert.ToInt64(sec * 10000000); // How many 100 nanoseconds (ticks) should we wait
@@ -118,14 +123,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
118 if (Timers.Count == 0) 123 if (Timers.Count == 0)
119 return; 124 return;
120 125
121 Dictionary<string, TimerClass>.ValueCollection tvals; 126 Dictionary<string, TimerInfo>.ValueCollection tvals;
122 lock (TimerListLock) 127 lock (TimerListLock)
123 { 128 {
124 // Go through all timers 129 // Go through all timers
125 tvals = Timers.Values; 130 tvals = Timers.Values;
126 } 131 }
127 132
128 foreach (TimerClass ts in tvals) 133 foreach (TimerInfo ts in tvals)
129 { 134 {
130 // Time has passed? 135 // Time has passed?
131 if (ts.next < DateTime.Now.Ticks) 136 if (ts.next < DateTime.Now.Ticks)
@@ -149,8 +154,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
149 154
150 lock (TimerListLock) 155 lock (TimerListLock)
151 { 156 {
152 Dictionary<string, TimerClass>.ValueCollection tvals = Timers.Values; 157 Dictionary<string, TimerInfo>.ValueCollection tvals = Timers.Values;
153 foreach (TimerClass ts in tvals) 158 foreach (TimerInfo ts in tvals)
154 { 159 {
155 if (ts.itemID == itemID) 160 if (ts.itemID == itemID)
156 { 161 {
@@ -169,7 +174,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
169 174
170 while (idx < data.Length) 175 while (idx < data.Length)
171 { 176 {
172 TimerClass ts = new TimerClass(); 177 TimerInfo ts = new TimerInfo();
173 178
174 ts.localID = localID; 179 ts.localID = localID;
175 ts.itemID = itemID; 180 ts.itemID = itemID;
@@ -183,5 +188,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
183 } 188 }
184 } 189 }
185 } 190 }
191
192 public List<TimerInfo> GetTimersInfo()
193 {
194 List<TimerInfo> retList = new List<TimerInfo>();
195
196 lock (TimerListLock)
197 {
198 foreach (TimerInfo i in Timers.Values)
199 retList.Add(i.Clone());
200 }
201
202 return retList;
203 }
186 } 204 }
187} 205}
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Properties/AssemblyInfo.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Properties/AssemblyInfo.cs
index d173db0..6d218a6 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Properties/AssemblyInfo.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/Properties/AssemblyInfo.cs
@@ -29,5 +29,5 @@ using System.Runtime.InteropServices;
29// Build Number 29// Build Number
30// Revision 30// Revision
31// 31//
32[assembly: AssemblyVersion("0.7.5.*")] 32[assembly: AssemblyVersion("0.7.6.*")]
33[assembly: AssemblyFileVersion("1.0.0.0")] 33
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs
index 8aa1249..a652cb8 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs
@@ -259,6 +259,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
259 259
260 string osGetScriptEngineName(); 260 string osGetScriptEngineName();
261 string osGetSimulatorVersion(); 261 string osGetSimulatorVersion();
262 string osGetPhysicsEngineType();
262 Hashtable osParseJSON(string JSON); 263 Hashtable osParseJSON(string JSON);
263 264
264 void osMessageObject(key objectUUID,string message); 265 void osMessageObject(key objectUUID,string message);
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs
index 0dd5a57..da3b31f 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs
@@ -557,6 +557,23 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
557 public const int OBJECT_SERVER_COST = 14; 557 public const int OBJECT_SERVER_COST = 14;
558 public const int OBJECT_STREAMING_COST = 15; 558 public const int OBJECT_STREAMING_COST = 15;
559 public const int OBJECT_PHYSICS_COST = 16; 559 public const int OBJECT_PHYSICS_COST = 16;
560 public const int OBJECT_CHARACTER_TIME = 17;
561 public const int OBJECT_ROOT = 18;
562 public const int OBJECT_ATTACHED_POINT = 19;
563 public const int OBJECT_PATHFINDING_TYPE = 20;
564 public const int OBJECT_PHYSICS = 21;
565 public const int OBJECT_PHANTOM = 22;
566 public const int OBJECT_TEMP_ON_REZ = 23;
567
568 // Pathfinding types
569 public const int OPT_OTHER = -1;
570 public const int OPT_LEGACY_LINKSET = 0;
571 public const int OPT_AVATAR = 1;
572 public const int OPT_CHARACTER = 2;
573 public const int OPT_WALKABLE = 3;
574 public const int OPT_STATIC_OBSTACLE = 4;
575 public const int OPT_MATERIAL_VOLUME = 5;
576 public const int OPT_EXCLUSION_VOLUME = 6;
560 577
561 // for llGetAgentList 578 // for llGetAgentList
562 public const int AGENT_LIST_PARCEL = 1; 579 public const int AGENT_LIST_PARCEL = 1;
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs
index 95dff18..b63773b 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs
@@ -420,6 +420,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
420 return m_OSSL_Functions.osGetScriptEngineName(); 420 return m_OSSL_Functions.osGetScriptEngineName();
421 } 421 }
422 422
423 public string osGetPhysicsEngineType()
424 {
425 return m_OSSL_Functions.osGetPhysicsEngineType();
426 }
427
423 public string osGetSimulatorVersion() 428 public string osGetSimulatorVersion()
424 { 429 {
425 return m_OSSL_Functions.osGetSimulatorVersion(); 430 return m_OSSL_Functions.osGetSimulatorVersion();
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/Properties/AssemblyInfo.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/Properties/AssemblyInfo.cs
index 573a803..b1825ac 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/Properties/AssemblyInfo.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/Properties/AssemblyInfo.cs
@@ -29,5 +29,5 @@ using System.Runtime.InteropServices;
29// Build Number 29// Build Number
30// Revision 30// Revision
31// 31//
32[assembly: AssemblyVersion("0.7.5.*")] 32[assembly: AssemblyVersion("0.7.6.*")]
33[assembly: AssemblyFileVersion("1.0.0.0")] 33[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/Properties/AssemblyInfo.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/Properties/AssemblyInfo.cs
index f6d5d41..342dbff 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/Properties/AssemblyInfo.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/YieldProlog/Properties/AssemblyInfo.cs
@@ -29,5 +29,5 @@ using System.Runtime.InteropServices;
29// Build Number 29// Build Number
30// Revision 30// Revision
31// 31//
32[assembly: AssemblyVersion("0.7.5.*")] 32[assembly: AssemblyVersion("0.7.6.*")]
33[assembly: AssemblyFileVersion("1.0.0.0")] 33[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/OpenSim/Region/ScriptEngine/Shared/CodeTools/CSCodeGenerator.cs b/OpenSim/Region/ScriptEngine/Shared/CodeTools/CSCodeGenerator.cs
index 97dd0f6..9e32f40 100644
--- a/OpenSim/Region/ScriptEngine/Shared/CodeTools/CSCodeGenerator.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/CodeTools/CSCodeGenerator.cs
@@ -31,7 +31,6 @@ using System.Collections.Generic;
31using System.Reflection; 31using System.Reflection;
32using log4net; 32using log4net;
33using Tools; 33using Tools;
34
35using OpenSim.Region.Framework.Interfaces; 34using OpenSim.Region.Framework.Interfaces;
36 35
37namespace OpenSim.Region.ScriptEngine.Shared.CodeTools 36namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
@@ -49,6 +48,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
49 private List<string> m_warnings = new List<string>(); 48 private List<string> m_warnings = new List<string>();
50 private IScriptModuleComms m_comms = null; 49 private IScriptModuleComms m_comms = null;
51 50
51 private bool m_insertCoopTerminationChecks;
52 private static string m_coopTerminationCheck = "opensim_reserved_CheckForCoopTermination();";
53
54 /// <summary>
55 /// Keep a record of the previous node when we do the parsing.
56 /// </summary>
57 /// <remarks>
58 /// We do this here because the parser generated by CSTools does not retain a reference to its parent node.
59 /// The previous node is required so we can correctly insert co-op termination checks when required.
60 /// </remarks>
61// private SYMBOL m_previousNode;
62
52 /// <summary> 63 /// <summary>
53 /// Creates an 'empty' CSCodeGenerator instance. 64 /// Creates an 'empty' CSCodeGenerator instance.
54 /// </summary> 65 /// </summary>
@@ -58,9 +69,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
58 ResetCounters(); 69 ResetCounters();
59 } 70 }
60 71
61 public CSCodeGenerator(IScriptModuleComms comms) 72 public CSCodeGenerator(IScriptModuleComms comms, bool insertCoopTerminationChecks)
62 { 73 {
63 m_comms = comms; 74 m_comms = comms;
75 m_insertCoopTerminationChecks = insertCoopTerminationChecks;
64 ResetCounters(); 76 ResetCounters();
65 } 77 }
66 78
@@ -155,7 +167,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
155 // here's the payload 167 // here's the payload
156 retstr += GenerateLine(); 168 retstr += GenerateLine();
157 foreach (SYMBOL s in m_astRoot.kids) 169 foreach (SYMBOL s in m_astRoot.kids)
158 retstr += GenerateNode(s); 170 retstr += GenerateNode(m_astRoot, s);
159 171
160 // close braces! 172 // close braces!
161 m_braceCount--; 173 m_braceCount--;
@@ -165,7 +177,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
165 177
166 // Removes all carriage return characters which may be generated in Windows platform. Is there 178 // Removes all carriage return characters which may be generated in Windows platform. Is there
167 // cleaner way of doing this? 179 // cleaner way of doing this?
168 retstr=retstr.Replace("\r", ""); 180 retstr = retstr.Replace("\r", "");
169 181
170 return retstr; 182 return retstr;
171 } 183 }
@@ -191,9 +203,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
191 /// Recursively called to generate each type of node. Will generate this 203 /// Recursively called to generate each type of node. Will generate this
192 /// node, then all it's children. 204 /// node, then all it's children.
193 /// </summary> 205 /// </summary>
206 /// <param name="previousSymbol">The parent node.</param>
194 /// <param name="s">The current node to generate code for.</param> 207 /// <param name="s">The current node to generate code for.</param>
195 /// <returns>String containing C# code for SYMBOL s.</returns> 208 /// <returns>String containing C# code for SYMBOL s.</returns>
196 private string GenerateNode(SYMBOL s) 209 private string GenerateNode(SYMBOL previousSymbol, SYMBOL s)
197 { 210 {
198 string retstr = String.Empty; 211 string retstr = String.Empty;
199 212
@@ -207,11 +220,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
207 else if (s is State) 220 else if (s is State)
208 retstr += GenerateState((State) s); 221 retstr += GenerateState((State) s);
209 else if (s is CompoundStatement) 222 else if (s is CompoundStatement)
210 retstr += GenerateCompoundStatement((CompoundStatement) s); 223 retstr += GenerateCompoundStatement(previousSymbol, (CompoundStatement) s);
211 else if (s is Declaration) 224 else if (s is Declaration)
212 retstr += GenerateDeclaration((Declaration) s); 225 retstr += GenerateDeclaration((Declaration) s);
213 else if (s is Statement) 226 else if (s is Statement)
214 retstr += GenerateStatement((Statement) s); 227 retstr += GenerateStatement(previousSymbol, (Statement) s);
215 else if (s is ReturnStatement) 228 else if (s is ReturnStatement)
216 retstr += GenerateReturnStatement((ReturnStatement) s); 229 retstr += GenerateReturnStatement((ReturnStatement) s);
217 else if (s is JumpLabel) 230 else if (s is JumpLabel)
@@ -261,7 +274,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
261 else 274 else
262 { 275 {
263 foreach (SYMBOL kid in s.kids) 276 foreach (SYMBOL kid in s.kids)
264 retstr += GenerateNode(kid); 277 retstr += GenerateNode(s, kid);
265 } 278 }
266 279
267 return retstr; 280 return retstr;
@@ -295,7 +308,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
295 retstr += GenerateLine(")"); 308 retstr += GenerateLine(")");
296 309
297 foreach (SYMBOL kid in remainingKids) 310 foreach (SYMBOL kid in remainingKids)
298 retstr += GenerateNode(kid); 311 retstr += GenerateNode(gf, kid);
299 312
300 return retstr; 313 return retstr;
301 } 314 }
@@ -312,7 +325,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
312 foreach (SYMBOL s in gv.kids) 325 foreach (SYMBOL s in gv.kids)
313 { 326 {
314 retstr += Indent(); 327 retstr += Indent();
315 retstr += GenerateNode(s); 328 retstr += GenerateNode(gv, s);
316 retstr += GenerateLine(";"); 329 retstr += GenerateLine(";");
317 } 330 }
318 331
@@ -365,7 +378,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
365 retstr += GenerateLine(")"); 378 retstr += GenerateLine(")");
366 379
367 foreach (SYMBOL kid in remainingKids) 380 foreach (SYMBOL kid in remainingKids)
368 retstr += GenerateNode(kid); 381 retstr += GenerateNode(se, kid);
369 382
370 return retstr; 383 return retstr;
371 } 384 }
@@ -404,7 +417,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
404 417
405 foreach (SYMBOL s in al.kids) 418 foreach (SYMBOL s in al.kids)
406 { 419 {
407 retstr += GenerateNode(s); 420 retstr += GenerateNode(al, s);
408 if (0 < comma--) 421 if (0 < comma--)
409 retstr += Generate(", "); 422 retstr += Generate(", ");
410 } 423 }
@@ -417,7 +430,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
417 /// </summary> 430 /// </summary>
418 /// <param name="cs">The CompoundStatement node.</param> 431 /// <param name="cs">The CompoundStatement node.</param>
419 /// <returns>String containing C# code for CompoundStatement cs.</returns> 432 /// <returns>String containing C# code for CompoundStatement cs.</returns>
420 private string GenerateCompoundStatement(CompoundStatement cs) 433 private string GenerateCompoundStatement(SYMBOL previousSymbol, CompoundStatement cs)
421 { 434 {
422 string retstr = String.Empty; 435 string retstr = String.Empty;
423 436
@@ -425,8 +438,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
425 retstr += GenerateIndentedLine("{"); 438 retstr += GenerateIndentedLine("{");
426 m_braceCount++; 439 m_braceCount++;
427 440
441 if (m_insertCoopTerminationChecks)
442 {
443 // We have to check in event functions as well because the user can manually call these.
444 if (previousSymbol is GlobalFunctionDefinition
445 || previousSymbol is WhileStatement
446 || previousSymbol is DoWhileStatement
447 || previousSymbol is ForLoop
448 || previousSymbol is StateEvent)
449 retstr += GenerateIndentedLine(m_coopTerminationCheck);
450 }
451
428 foreach (SYMBOL kid in cs.kids) 452 foreach (SYMBOL kid in cs.kids)
429 retstr += GenerateNode(kid); 453 retstr += GenerateNode(cs, kid);
430 454
431 // closing brace 455 // closing brace
432 m_braceCount--; 456 m_braceCount--;
@@ -450,10 +474,28 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
450 /// </summary> 474 /// </summary>
451 /// <param name="s">The Statement node.</param> 475 /// <param name="s">The Statement node.</param>
452 /// <returns>String containing C# code for Statement s.</returns> 476 /// <returns>String containing C# code for Statement s.</returns>
453 private string GenerateStatement(Statement s) 477 private string GenerateStatement(SYMBOL previousSymbol, Statement s)
454 { 478 {
455 string retstr = String.Empty; 479 string retstr = String.Empty;
456 bool printSemicolon = true; 480 bool printSemicolon = true;
481 bool transformToBlock = false;
482
483 if (m_insertCoopTerminationChecks)
484 {
485 // A non-braced single line do while structure cannot contain multiple statements.
486 // So to insert the termination check we change this to a braced control structure instead.
487 if (previousSymbol is WhileStatement
488 || previousSymbol is DoWhileStatement
489 || previousSymbol is ForLoop)
490 {
491 transformToBlock = true;
492
493 // FIXME: This will be wrongly indented because the previous for/while/dowhile will have already indented.
494 retstr += GenerateIndentedLine("{");
495
496 retstr += GenerateIndentedLine(m_coopTerminationCheck);
497 }
498 }
457 499
458 retstr += Indent(); 500 retstr += Indent();
459 501
@@ -466,12 +508,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
466 // (MONO) error. 508 // (MONO) error.
467 if (!(s.kids.Top is IdentExpression && 1 == s.kids.Count)) 509 if (!(s.kids.Top is IdentExpression && 1 == s.kids.Count))
468 foreach (SYMBOL kid in s.kids) 510 foreach (SYMBOL kid in s.kids)
469 retstr += GenerateNode(kid); 511 retstr += GenerateNode(s, kid);
470 } 512 }
471 513
472 if (printSemicolon) 514 if (printSemicolon)
473 retstr += GenerateLine(";"); 515 retstr += GenerateLine(";");
474 516
517 if (transformToBlock)
518 {
519 // FIXME: This will be wrongly indented because the for/while/dowhile is currently handling the unindent
520 retstr += GenerateIndentedLine("}");
521 }
522
475 return retstr; 523 return retstr;
476 } 524 }
477 525
@@ -487,10 +535,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
487 List<string> identifiers = new List<string>(); 535 List<string> identifiers = new List<string>();
488 checkForMultipleAssignments(identifiers, a); 536 checkForMultipleAssignments(identifiers, a);
489 537
490 retstr += GenerateNode((SYMBOL) a.kids.Pop()); 538 retstr += GenerateNode(a, (SYMBOL) a.kids.Pop());
491 retstr += Generate(String.Format(" {0} ", a.AssignmentType), a); 539 retstr += Generate(String.Format(" {0} ", a.AssignmentType), a);
492 foreach (SYMBOL kid in a.kids) 540 foreach (SYMBOL kid in a.kids)
493 retstr += GenerateNode(kid); 541 retstr += GenerateNode(a, kid);
494 542
495 return retstr; 543 return retstr;
496 } 544 }
@@ -563,7 +611,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
563 retstr += Generate("return ", rs); 611 retstr += Generate("return ", rs);
564 612
565 foreach (SYMBOL kid in rs.kids) 613 foreach (SYMBOL kid in rs.kids)
566 retstr += GenerateNode(kid); 614 retstr += GenerateNode(rs, kid);
567 615
568 return retstr; 616 return retstr;
569 } 617 }
@@ -575,7 +623,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
575 /// <returns>String containing C# code for JumpLabel jl.</returns> 623 /// <returns>String containing C# code for JumpLabel jl.</returns>
576 private string GenerateJumpLabel(JumpLabel jl) 624 private string GenerateJumpLabel(JumpLabel jl)
577 { 625 {
578 return Generate(String.Format("{0}:", CheckName(jl.LabelName)), jl) + " NoOp();\n"; 626 string labelStatement;
627
628 if (m_insertCoopTerminationChecks)
629 labelStatement = m_coopTerminationCheck + "\n";
630 else
631 labelStatement = "NoOp();\n";
632
633 return Generate(String.Format("{0}: ", CheckName(jl.LabelName)), jl) + labelStatement;
579 } 634 }
580 635
581 /// <summary> 636 /// <summary>
@@ -598,14 +653,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
598 string retstr = String.Empty; 653 string retstr = String.Empty;
599 654
600 retstr += GenerateIndented("if (", ifs); 655 retstr += GenerateIndented("if (", ifs);
601 retstr += GenerateNode((SYMBOL) ifs.kids.Pop()); 656 retstr += GenerateNode(ifs, (SYMBOL) ifs.kids.Pop());
602 retstr += GenerateLine(")"); 657 retstr += GenerateLine(")");
603 658
604 // CompoundStatement handles indentation itself but we need to do it 659 // CompoundStatement handles indentation itself but we need to do it
605 // otherwise. 660 // otherwise.
606 bool indentHere = ifs.kids.Top is Statement; 661 bool indentHere = ifs.kids.Top is Statement;
607 if (indentHere) m_braceCount++; 662 if (indentHere) m_braceCount++;
608 retstr += GenerateNode((SYMBOL) ifs.kids.Pop()); 663 retstr += GenerateNode(ifs, (SYMBOL) ifs.kids.Pop());
609 if (indentHere) m_braceCount--; 664 if (indentHere) m_braceCount--;
610 665
611 if (0 < ifs.kids.Count) // do it again for an else 666 if (0 < ifs.kids.Count) // do it again for an else
@@ -614,7 +669,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
614 669
615 indentHere = ifs.kids.Top is Statement; 670 indentHere = ifs.kids.Top is Statement;
616 if (indentHere) m_braceCount++; 671 if (indentHere) m_braceCount++;
617 retstr += GenerateNode((SYMBOL) ifs.kids.Pop()); 672 retstr += GenerateNode(ifs, (SYMBOL) ifs.kids.Pop());
618 if (indentHere) m_braceCount--; 673 if (indentHere) m_braceCount--;
619 } 674 }
620 675
@@ -641,14 +696,14 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
641 string retstr = String.Empty; 696 string retstr = String.Empty;
642 697
643 retstr += GenerateIndented("while (", ws); 698 retstr += GenerateIndented("while (", ws);
644 retstr += GenerateNode((SYMBOL) ws.kids.Pop()); 699 retstr += GenerateNode(ws, (SYMBOL) ws.kids.Pop());
645 retstr += GenerateLine(")"); 700 retstr += GenerateLine(")");
646 701
647 // CompoundStatement handles indentation itself but we need to do it 702 // CompoundStatement handles indentation itself but we need to do it
648 // otherwise. 703 // otherwise.
649 bool indentHere = ws.kids.Top is Statement; 704 bool indentHere = ws.kids.Top is Statement;
650 if (indentHere) m_braceCount++; 705 if (indentHere) m_braceCount++;
651 retstr += GenerateNode((SYMBOL) ws.kids.Pop()); 706 retstr += GenerateNode(ws, (SYMBOL) ws.kids.Pop());
652 if (indentHere) m_braceCount--; 707 if (indentHere) m_braceCount--;
653 708
654 return retstr; 709 return retstr;
@@ -669,11 +724,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
669 // otherwise. 724 // otherwise.
670 bool indentHere = dws.kids.Top is Statement; 725 bool indentHere = dws.kids.Top is Statement;
671 if (indentHere) m_braceCount++; 726 if (indentHere) m_braceCount++;
672 retstr += GenerateNode((SYMBOL) dws.kids.Pop()); 727 retstr += GenerateNode(dws, (SYMBOL) dws.kids.Pop());
673 if (indentHere) m_braceCount--; 728 if (indentHere) m_braceCount--;
674 729
675 retstr += GenerateIndented("while (", dws); 730 retstr += GenerateIndented("while (", dws);
676 retstr += GenerateNode((SYMBOL) dws.kids.Pop()); 731 retstr += GenerateNode(dws, (SYMBOL) dws.kids.Pop());
677 retstr += GenerateLine(");"); 732 retstr += GenerateLine(");");
678 733
679 return retstr; 734 return retstr;
@@ -702,7 +757,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
702 retstr += Generate("; "); 757 retstr += Generate("; ");
703 // for (x = 0; x < 10; x++) 758 // for (x = 0; x < 10; x++)
704 // ^^^^^^ 759 // ^^^^^^
705 retstr += GenerateNode((SYMBOL) fl.kids.Pop()); 760 retstr += GenerateNode(fl, (SYMBOL) fl.kids.Pop());
706 retstr += Generate("; "); 761 retstr += Generate("; ");
707 // for (x = 0; x < 10; x++) 762 // for (x = 0; x < 10; x++)
708 // ^^^ 763 // ^^^
@@ -713,7 +768,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
713 // otherwise. 768 // otherwise.
714 bool indentHere = fl.kids.Top is Statement; 769 bool indentHere = fl.kids.Top is Statement;
715 if (indentHere) m_braceCount++; 770 if (indentHere) m_braceCount++;
716 retstr += GenerateNode((SYMBOL) fl.kids.Pop()); 771 retstr += GenerateNode(fl, (SYMBOL) fl.kids.Pop());
717 if (indentHere) m_braceCount--; 772 if (indentHere) m_braceCount--;
718 773
719 return retstr; 774 return retstr;
@@ -758,7 +813,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
758 while (s is ParenthesisExpression) 813 while (s is ParenthesisExpression)
759 s = (SYMBOL)s.kids.Pop(); 814 s = (SYMBOL)s.kids.Pop();
760 815
761 retstr += GenerateNode(s); 816 retstr += GenerateNode(fls, s);
762 if (0 < comma--) 817 if (0 < comma--)
763 retstr += Generate(", "); 818 retstr += Generate(", ");
764 } 819 }
@@ -779,20 +834,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
779 { 834 {
780 // special case handling for logical and/or, see Mantis 3174 835 // special case handling for logical and/or, see Mantis 3174
781 retstr += "((bool)("; 836 retstr += "((bool)(";
782 retstr += GenerateNode((SYMBOL)be.kids.Pop()); 837 retstr += GenerateNode(be, (SYMBOL)be.kids.Pop());
783 retstr += "))"; 838 retstr += "))";
784 retstr += Generate(String.Format(" {0} ", be.ExpressionSymbol.Substring(0,1)), be); 839 retstr += Generate(String.Format(" {0} ", be.ExpressionSymbol.Substring(0,1)), be);
785 retstr += "((bool)("; 840 retstr += "((bool)(";
786 foreach (SYMBOL kid in be.kids) 841 foreach (SYMBOL kid in be.kids)
787 retstr += GenerateNode(kid); 842 retstr += GenerateNode(be, kid);
788 retstr += "))"; 843 retstr += "))";
789 } 844 }
790 else 845 else
791 { 846 {
792 retstr += GenerateNode((SYMBOL)be.kids.Pop()); 847 retstr += GenerateNode(be, (SYMBOL)be.kids.Pop());
793 retstr += Generate(String.Format(" {0} ", be.ExpressionSymbol), be); 848 retstr += Generate(String.Format(" {0} ", be.ExpressionSymbol), be);
794 foreach (SYMBOL kid in be.kids) 849 foreach (SYMBOL kid in be.kids)
795 retstr += GenerateNode(kid); 850 retstr += GenerateNode(be, kid);
796 } 851 }
797 852
798 return retstr; 853 return retstr;
@@ -808,7 +863,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
808 string retstr = String.Empty; 863 string retstr = String.Empty;
809 864
810 retstr += Generate(ue.UnarySymbol, ue); 865 retstr += Generate(ue.UnarySymbol, ue);
811 retstr += GenerateNode((SYMBOL) ue.kids.Pop()); 866 retstr += GenerateNode(ue, (SYMBOL) ue.kids.Pop());
812 867
813 return retstr; 868 return retstr;
814 } 869 }
@@ -824,7 +879,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
824 879
825 retstr += Generate("("); 880 retstr += Generate("(");
826 foreach (SYMBOL kid in pe.kids) 881 foreach (SYMBOL kid in pe.kids)
827 retstr += GenerateNode(kid); 882 retstr += GenerateNode(pe, kid);
828 retstr += Generate(")"); 883 retstr += Generate(")");
829 884
830 return retstr; 885 return retstr;
@@ -861,7 +916,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
861 916
862 // we wrap all typecasted statements in parentheses 917 // we wrap all typecasted statements in parentheses
863 retstr += Generate(String.Format("({0}) (", te.TypecastType), te); 918 retstr += Generate(String.Format("({0}) (", te.TypecastType), te);
864 retstr += GenerateNode((SYMBOL) te.kids.Pop()); 919 retstr += GenerateNode(te, (SYMBOL) te.kids.Pop());
865 retstr += Generate(")"); 920 retstr += Generate(")");
866 921
867 return retstr; 922 return retstr;
@@ -931,7 +986,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
931 } 986 }
932 987
933 foreach (SYMBOL kid in fc.kids) 988 foreach (SYMBOL kid in fc.kids)
934 retstr += GenerateNode(kid); 989 retstr += GenerateNode(fc, kid);
935 990
936 retstr += Generate(")"); 991 retstr += Generate(")");
937 992
@@ -980,11 +1035,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
980 string retstr = String.Empty; 1035 string retstr = String.Empty;
981 1036
982 retstr += Generate(String.Format("new {0}(", vc.Type), vc); 1037 retstr += Generate(String.Format("new {0}(", vc.Type), vc);
983 retstr += GenerateNode((SYMBOL) vc.kids.Pop()); 1038 retstr += GenerateNode(vc, (SYMBOL) vc.kids.Pop());
984 retstr += Generate(", "); 1039 retstr += Generate(", ");
985 retstr += GenerateNode((SYMBOL) vc.kids.Pop()); 1040 retstr += GenerateNode(vc, (SYMBOL) vc.kids.Pop());
986 retstr += Generate(", "); 1041 retstr += Generate(", ");
987 retstr += GenerateNode((SYMBOL) vc.kids.Pop()); 1042 retstr += GenerateNode(vc, (SYMBOL) vc.kids.Pop());
988 retstr += Generate(")"); 1043 retstr += Generate(")");
989 1044
990 return retstr; 1045 return retstr;
@@ -1000,13 +1055,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
1000 string retstr = String.Empty; 1055 string retstr = String.Empty;
1001 1056
1002 retstr += Generate(String.Format("new {0}(", rc.Type), rc); 1057 retstr += Generate(String.Format("new {0}(", rc.Type), rc);
1003 retstr += GenerateNode((SYMBOL) rc.kids.Pop()); 1058 retstr += GenerateNode(rc, (SYMBOL) rc.kids.Pop());
1004 retstr += Generate(", "); 1059 retstr += Generate(", ");
1005 retstr += GenerateNode((SYMBOL) rc.kids.Pop()); 1060 retstr += GenerateNode(rc, (SYMBOL) rc.kids.Pop());
1006 retstr += Generate(", "); 1061 retstr += Generate(", ");
1007 retstr += GenerateNode((SYMBOL) rc.kids.Pop()); 1062 retstr += GenerateNode(rc, (SYMBOL) rc.kids.Pop());
1008 retstr += Generate(", "); 1063 retstr += Generate(", ");
1009 retstr += GenerateNode((SYMBOL) rc.kids.Pop()); 1064 retstr += GenerateNode(rc, (SYMBOL) rc.kids.Pop());
1010 retstr += Generate(")"); 1065 retstr += Generate(")");
1011 1066
1012 return retstr; 1067 return retstr;
@@ -1024,7 +1079,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
1024 retstr += Generate(String.Format("new {0}(", lc.Type), lc); 1079 retstr += Generate(String.Format("new {0}(", lc.Type), lc);
1025 1080
1026 foreach (SYMBOL kid in lc.kids) 1081 foreach (SYMBOL kid in lc.kids)
1027 retstr += GenerateNode(kid); 1082 retstr += GenerateNode(lc, kid);
1028 1083
1029 retstr += Generate(")"); 1084 retstr += Generate(")");
1030 1085
diff --git a/OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs b/OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs
index 03be2ab..b71afe3 100644
--- a/OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/CodeTools/Compiler.cs
@@ -72,6 +72,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
72 private bool CompileWithDebugInformation; 72 private bool CompileWithDebugInformation;
73 private Dictionary<string, bool> AllowedCompilers = new Dictionary<string, bool>(StringComparer.CurrentCultureIgnoreCase); 73 private Dictionary<string, bool> AllowedCompilers = new Dictionary<string, bool>(StringComparer.CurrentCultureIgnoreCase);
74 private Dictionary<string, enumCompileType> LanguageMapping = new Dictionary<string, enumCompileType>(StringComparer.CurrentCultureIgnoreCase); 74 private Dictionary<string, enumCompileType> LanguageMapping = new Dictionary<string, enumCompileType>(StringComparer.CurrentCultureIgnoreCase);
75 private bool m_insertCoopTerminationCalls;
75 76
76 private string FilePrefix; 77 private string FilePrefix;
77 private string ScriptEnginesPath = null; 78 private string ScriptEnginesPath = null;
@@ -95,20 +96,22 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
95 private Dictionary<string, Dictionary<KeyValuePair<int, int>, KeyValuePair<int, int>>> m_lineMaps = 96 private Dictionary<string, Dictionary<KeyValuePair<int, int>, KeyValuePair<int, int>>> m_lineMaps =
96 new Dictionary<string, Dictionary<KeyValuePair<int, int>, KeyValuePair<int, int>>>(); 97 new Dictionary<string, Dictionary<KeyValuePair<int, int>, KeyValuePair<int, int>>>();
97 98
99 public bool in_startup = true;
100
98 public Compiler(IScriptEngine scriptEngine) 101 public Compiler(IScriptEngine scriptEngine)
99 { 102 {
100 m_scriptEngine = scriptEngine;; 103 m_scriptEngine = scriptEngine;
101 ScriptEnginesPath = scriptEngine.ScriptEnginePath; 104 ScriptEnginesPath = scriptEngine.ScriptEnginePath;
102 ReadConfig(); 105 ReadConfig();
103 } 106 }
104 107
105 public bool in_startup = true;
106 public void ReadConfig() 108 public void ReadConfig()
107 { 109 {
108 // Get some config 110 // Get some config
109 WriteScriptSourceToDebugFile = m_scriptEngine.Config.GetBoolean("WriteScriptSourceToDebugFile", false); 111 WriteScriptSourceToDebugFile = m_scriptEngine.Config.GetBoolean("WriteScriptSourceToDebugFile", false);
110 CompileWithDebugInformation = m_scriptEngine.Config.GetBoolean("CompileWithDebugInformation", true); 112 CompileWithDebugInformation = m_scriptEngine.Config.GetBoolean("CompileWithDebugInformation", true);
111 bool DeleteScriptsOnStartup = m_scriptEngine.Config.GetBoolean("DeleteScriptsOnStartup", true); 113 bool DeleteScriptsOnStartup = m_scriptEngine.Config.GetBoolean("DeleteScriptsOnStartup", true);
114 m_insertCoopTerminationCalls = m_scriptEngine.Config.GetString("ScriptStopStrategy", "abort") == "co-op";
112 115
113 // Get file prefix from scriptengine name and make it file system safe: 116 // Get file prefix from scriptengine name and make it file system safe:
114 FilePrefix = "CommonCompiler"; 117 FilePrefix = "CommonCompiler";
@@ -386,7 +389,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
386 if (language == enumCompileType.lsl) 389 if (language == enumCompileType.lsl)
387 { 390 {
388 // Its LSL, convert it to C# 391 // Its LSL, convert it to C#
389 LSL_Converter = (ICodeConverter)new CSCodeGenerator(comms); 392 LSL_Converter = (ICodeConverter)new CSCodeGenerator(comms, m_insertCoopTerminationCalls);
390 compileScript = LSL_Converter.Convert(Script); 393 compileScript = LSL_Converter.Convert(Script);
391 394
392 // copy converter warnings into our warnings. 395 // copy converter warnings into our warnings.
@@ -411,16 +414,22 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
411 { 414 {
412 case enumCompileType.cs: 415 case enumCompileType.cs:
413 case enumCompileType.lsl: 416 case enumCompileType.lsl:
414 compileScript = CreateCSCompilerScript(compileScript); 417 compileScript = CreateCSCompilerScript(
418 compileScript,
419 m_scriptEngine.ScriptClassName,
420 m_scriptEngine.ScriptBaseClassName,
421 m_scriptEngine.ScriptBaseClassParameters);
415 break; 422 break;
416 case enumCompileType.vb: 423 case enumCompileType.vb:
417 compileScript = CreateVBCompilerScript(compileScript); 424 compileScript = CreateVBCompilerScript(
425 compileScript, m_scriptEngine.ScriptClassName, m_scriptEngine.ScriptBaseClassName);
418 break; 426 break;
419// case enumCompileType.js: 427// case enumCompileType.js:
420// compileScript = CreateJSCompilerScript(compileScript); 428// compileScript = CreateJSCompilerScript(compileScript, m_scriptEngine.ScriptBaseClassName);
421// break; 429// break;
422 case enumCompileType.yp: 430 case enumCompileType.yp:
423 compileScript = CreateYPCompilerScript(compileScript); 431 compileScript = CreateYPCompilerScript(
432 compileScript, m_scriptEngine.ScriptClassName,m_scriptEngine.ScriptBaseClassName);
424 break; 433 break;
425 } 434 }
426 435
@@ -451,43 +460,60 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
451// return compileScript; 460// return compileScript;
452// } 461// }
453 462
454 private static string CreateCSCompilerScript(string compileScript) 463 private static string CreateCSCompilerScript(
464 string compileScript, string className, string baseClassName, ParameterInfo[] constructorParameters)
455 { 465 {
456 compileScript = String.Empty + 466 compileScript = string.Format(
457 "using OpenSim.Region.ScriptEngine.Shared; using System.Collections.Generic;\r\n" + 467@"using OpenSim.Region.ScriptEngine.Shared;
458 String.Empty + "namespace SecondLife { " + 468using System.Collections.Generic;
459 String.Empty + "public class Script : OpenSim.Region.ScriptEngine.Shared.ScriptBase.ScriptBaseClass { \r\n" + 469
460 @"public Script() { } " + 470namespace SecondLife
461 compileScript + 471{{
462 "} }\r\n"; 472 public class {0} : {1}
473 {{
474 public {0}({2}) : base({3}) {{}}
475{4}
476 }}
477}}",
478 className,
479 baseClassName,
480 constructorParameters != null
481 ? string.Join(", ", Array.ConvertAll<ParameterInfo, string>(constructorParameters, pi => pi.ToString()))
482 : "",
483 constructorParameters != null
484 ? string.Join(", ", Array.ConvertAll<ParameterInfo, string>(constructorParameters, pi => pi.Name))
485 : "",
486 compileScript);
487
463 return compileScript; 488 return compileScript;
464 } 489 }
465 490
466 private static string CreateYPCompilerScript(string compileScript) 491 private static string CreateYPCompilerScript(string compileScript, string className, string baseClassName)
467 { 492 {
468 compileScript = String.Empty + 493 compileScript = String.Empty +
469 "using OpenSim.Region.ScriptEngine.Shared.YieldProlog; " + 494 "using OpenSim.Region.ScriptEngine.Shared.YieldProlog; " +
470 "using OpenSim.Region.ScriptEngine.Shared; using System.Collections.Generic;\r\n" + 495 "using OpenSim.Region.ScriptEngine.Shared; using System.Collections.Generic;\r\n" +
471 String.Empty + "namespace SecondLife { " + 496 String.Empty + "namespace SecondLife { " +
472 String.Empty + "public class Script : OpenSim.Region.ScriptEngine.Shared.ScriptBase.ScriptBaseClass { \r\n" + 497 String.Empty + "public class " + className + " : " + baseClassName + " { \r\n" +
473 //@"public Script() { } " + 498 //@"public Script() { } " +
474 @"static OpenSim.Region.ScriptEngine.Shared.YieldProlog.YP YP=null; " + 499 @"static OpenSim.Region.ScriptEngine.Shared.YieldProlog.YP YP=null; " +
475 @"public Script() { YP= new OpenSim.Region.ScriptEngine.Shared.YieldProlog.YP(); } " + 500 @"public " + className + "() { YP= new OpenSim.Region.ScriptEngine.Shared.YieldProlog.YP(); } " +
476
477 compileScript + 501 compileScript +
478 "} }\r\n"; 502 "} }\r\n";
503
479 return compileScript; 504 return compileScript;
480 } 505 }
481 506
482 private static string CreateVBCompilerScript(string compileScript) 507 private static string CreateVBCompilerScript(string compileScript, string className, string baseClassName)
483 { 508 {
484 compileScript = String.Empty + 509 compileScript = String.Empty +
485 "Imports OpenSim.Region.ScriptEngine.Shared: Imports System.Collections.Generic: " + 510 "Imports OpenSim.Region.ScriptEngine.Shared: Imports System.Collections.Generic: " +
486 String.Empty + "NameSpace SecondLife:" + 511 String.Empty + "NameSpace SecondLife:" +
487 String.Empty + "Public Class Script: Inherits OpenSim.Region.ScriptEngine.Shared.ScriptBase.ScriptBaseClass: " + 512 String.Empty + "Public Class " + className + ": Inherits " + baseClassName +
488 "\r\nPublic Sub New()\r\nEnd Sub: " + 513 "\r\nPublic Sub New()\r\nEnd Sub: " +
489 compileScript + 514 compileScript +
490 ":End Class :End Namespace\r\n"; 515 ":End Class :End Namespace\r\n";
516
491 return compileScript; 517 return compileScript;
492 } 518 }
493 519
@@ -549,6 +575,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
549 parameters.ReferencedAssemblies.Add(Path.Combine(rootPath, 575 parameters.ReferencedAssemblies.Add(Path.Combine(rootPath,
550 "OpenMetaverseTypes.dll")); 576 "OpenMetaverseTypes.dll"));
551 577
578 if (m_scriptEngine.ScriptReferencedAssemblies != null)
579 Array.ForEach<string>(
580 m_scriptEngine.ScriptReferencedAssemblies,
581 a => parameters.ReferencedAssemblies.Add(Path.Combine(rootPath, a)));
582
552 if (lang == enumCompileType.yp) 583 if (lang == enumCompileType.yp)
553 { 584 {
554 parameters.ReferencedAssemblies.Add(Path.Combine(rootPath, 585 parameters.ReferencedAssemblies.Add(Path.Combine(rootPath,
@@ -631,13 +662,18 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
631 { 662 {
632 string severity = CompErr.IsWarning ? "Warning" : "Error"; 663 string severity = CompErr.IsWarning ? "Warning" : "Error";
633 664
634 KeyValuePair<int, int> lslPos; 665 KeyValuePair<int, int> errorPos;
635 666
636 // Show 5 errors max, but check entire list for errors 667 // Show 5 errors max, but check entire list for errors
637 668
638 if (severity == "Error") 669 if (severity == "Error")
639 { 670 {
640 lslPos = FindErrorPosition(CompErr.Line, CompErr.Column, m_lineMaps[assembly]); 671 // C# scripts will not have a linemap since theres no line translation involved.
672 if (!m_lineMaps.ContainsKey(assembly))
673 errorPos = new KeyValuePair<int, int>(CompErr.Line, CompErr.Column);
674 else
675 errorPos = FindErrorPosition(CompErr.Line, CompErr.Column, m_lineMaps[assembly]);
676
641 string text = CompErr.ErrorText; 677 string text = CompErr.ErrorText;
642 678
643 // Use LSL type names 679 // Use LSL type names
@@ -647,7 +683,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools
647 // The Second Life viewer's script editor begins 683 // The Second Life viewer's script editor begins
648 // countingn lines and columns at 0, so we subtract 1. 684 // countingn lines and columns at 0, so we subtract 1.
649 errtext += String.Format("({0},{1}): {4} {2}: {3}\n", 685 errtext += String.Format("({0},{1}): {4} {2}: {3}\n",
650 lslPos.Key - 1, lslPos.Value - 1, 686 errorPos.Key - 1, errorPos.Value - 1,
651 CompErr.ErrorNumber, text, severity); 687 CompErr.ErrorNumber, text, severity);
652 hadErrors = true; 688 hadErrors = true;
653 } 689 }
diff --git a/OpenSim/Region/ScriptEngine/Shared/CodeTools/Properties/AssemblyInfo.cs b/OpenSim/Region/ScriptEngine/Shared/CodeTools/Properties/AssemblyInfo.cs
index c65caa8..5b5c4fd 100644
--- a/OpenSim/Region/ScriptEngine/Shared/CodeTools/Properties/AssemblyInfo.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/CodeTools/Properties/AssemblyInfo.cs
@@ -29,5 +29,5 @@ using System.Runtime.InteropServices;
29// Build Number 29// Build Number
30// Revision 30// Revision
31// 31//
32[assembly: AssemblyVersion("0.7.5.*")] 32[assembly: AssemblyVersion("0.7.6.*")]
33[assembly: AssemblyFileVersion("1.0.0.0")] 33
diff --git a/OpenSim/Region/ScriptEngine/Shared/CodeTools/Tests/CSCodeGeneratorTest.cs b/OpenSim/Region/ScriptEngine/Shared/CodeTools/Tests/CSCodeGeneratorTest.cs
index 7763619..77e087c 100644
--- a/OpenSim/Region/ScriptEngine/Shared/CodeTools/Tests/CSCodeGeneratorTest.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/CodeTools/Tests/CSCodeGeneratorTest.cs
@@ -39,7 +39,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools.Tests
39 /// The generated C# code is compared against the expected C# code. 39 /// The generated C# code is compared against the expected C# code.
40 /// </summary> 40 /// </summary>
41 [TestFixture] 41 [TestFixture]
42 public class CSCodeGeneratorTest 42 public class CSCodeGeneratorTest : OpenSimTestCase
43 { 43 {
44 [Test] 44 [Test]
45 public void TestDefaultState() 45 public void TestDefaultState()
diff --git a/OpenSim/Region/ScriptEngine/Shared/CodeTools/Tests/CompilerTest.cs b/OpenSim/Region/ScriptEngine/Shared/CodeTools/Tests/CompilerTest.cs
index 1fa6954..05a8756 100644
--- a/OpenSim/Region/ScriptEngine/Shared/CodeTools/Tests/CompilerTest.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/CodeTools/Tests/CompilerTest.cs
@@ -41,7 +41,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.CodeTools.Tests
41 /// the LSL source. 41 /// the LSL source.
42 /// </summary> 42 /// </summary>
43 [TestFixture] 43 [TestFixture]
44 public class CompilerTest 44 public class CompilerTest : OpenSimTestCase
45 { 45 {
46 private string m_testDir; 46 private string m_testDir;
47 private CSharpCodeProvider m_CSCodeProvider; 47 private CSharpCodeProvider m_CSCodeProvider;
diff --git a/OpenSim/Region/ScriptEngine/Shared/Helpers.cs b/OpenSim/Region/ScriptEngine/Shared/Helpers.cs
index 22804f5..e44a106 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Helpers.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Helpers.cs
@@ -82,6 +82,24 @@ namespace OpenSim.Region.ScriptEngine.Shared
82 } 82 }
83 } 83 }
84 84
85 /// <summary>
86 /// Used to signal when the script is stopping in co-operation with the script engine
87 /// (instead of through Thread.Abort()).
88 /// </summary>
89 [Serializable]
90 public class ScriptCoopStopException : Exception
91 {
92 public ScriptCoopStopException()
93 {
94 }
95
96 protected ScriptCoopStopException(
97 SerializationInfo info,
98 StreamingContext context)
99 {
100 }
101 }
102
85 public class DetectParams 103 public class DetectParams
86 { 104 {
87 public const int AGENT = 1; 105 public const int AGENT = 1;
diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/Properties/AssemblyInfo.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/Properties/AssemblyInfo.cs
index 470e1a1..48964b6 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Instance/Properties/AssemblyInfo.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Instance/Properties/AssemblyInfo.cs
@@ -29,5 +29,5 @@ using System.Runtime.InteropServices;
29// Build Number 29// Build Number
30// Revision 30// Revision
31// 31//
32[assembly: AssemblyVersion("0.7.5.*")] 32[assembly: AssemblyVersion("0.7.6.*")]
33[assembly: AssemblyFileVersion("1.0.0.0")] 33
diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
index 771db0c..26850c4 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs
@@ -94,6 +94,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
94 private UUID m_CurrentStateHash; 94 private UUID m_CurrentStateHash;
95 private UUID m_RegionID; 95 private UUID m_RegionID;
96 96
97 public int DebugLevel { get; set; }
98
97 public Dictionary<KeyValuePair<int, int>, KeyValuePair<int, int>> LineMap { get; set; } 99 public Dictionary<KeyValuePair<int, int>, KeyValuePair<int, int>> LineMap { get; set; }
98 100
99 private Dictionary<string,IScriptApi> m_Apis = new Dictionary<string,IScriptApi>(); 101 private Dictionary<string,IScriptApi> m_Apis = new Dictionary<string,IScriptApi>();
@@ -156,6 +158,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
156 158
157 public UUID AppDomain { get; set; } 159 public UUID AppDomain { get; set; }
158 160
161 public SceneObjectPart Part { get; private set; }
162
159 public string PrimName { get; private set; } 163 public string PrimName { get; private set; }
160 164
161 public string ScriptName { get; private set; } 165 public string ScriptName { get; private set; }
@@ -174,6 +178,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
174 178
175 public Queue EventQueue { get; private set; } 179 public Queue EventQueue { get; private set; }
176 180
181 public long EventsQueued
182 {
183 get
184 {
185 lock (EventQueue)
186 return EventQueue.Count;
187 }
188 }
189
190 public long EventsProcessed { get; private set; }
191
177 public int StartParam { get; set; } 192 public int StartParam { get; set; }
178 193
179 public TaskInventoryItem ScriptTask { get; private set; } 194 public TaskInventoryItem ScriptTask { get; private set; }
@@ -186,66 +201,124 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
186 201
187 public static readonly long MaxMeasurementPeriod = 30 * TimeSpan.TicksPerMinute; 202 public static readonly long MaxMeasurementPeriod = 30 * TimeSpan.TicksPerMinute;
188 203
204 private bool m_coopTermination;
205
206 private EventWaitHandle m_coopSleepHandle;
207
189 public void ClearQueue() 208 public void ClearQueue()
190 { 209 {
191 m_TimerQueued = false; 210 m_TimerQueued = false;
192 EventQueue.Clear(); 211 EventQueue.Clear();
193 } 212 }
194 213
195 public ScriptInstance(IScriptEngine engine, SceneObjectPart part, 214 public ScriptInstance(
196 UUID itemID, UUID assetID, string assembly, 215 IScriptEngine engine, SceneObjectPart part, TaskInventoryItem item,
197 AppDomain dom, string primName, string scriptName, 216 int startParam, bool postOnRez,
198 int startParam, bool postOnRez, StateSource stateSource, 217 int maxScriptQueue)
199 int maxScriptQueue)
200 { 218 {
201 State = "default"; 219 State = "default";
202 EventQueue = new Queue(32); 220 EventQueue = new Queue(32);
203 221
204 Engine = engine; 222 Engine = engine;
205 LocalID = part.LocalId; 223 Part = part;
206 ObjectID = part.UUID; 224 ScriptTask = item;
207 RootLocalID = part.ParentGroup.LocalId; 225
208 RootObjectID = part.ParentGroup.UUID; 226 // This is currently only here to allow regression tests to get away without specifying any inventory
209 ItemID = itemID; 227 // item when they are testing script logic that doesn't require an item.
210 AssetID = assetID; 228 if (ScriptTask != null)
211 PrimName = primName; 229 {
212 ScriptName = scriptName; 230 ScriptName = ScriptTask.Name;
213 m_Assembly = assembly; 231 ItemID = ScriptTask.ItemID;
232 AssetID = ScriptTask.AssetID;
233 }
234
235 PrimName = part.ParentGroup.Name;
214 StartParam = startParam; 236 StartParam = startParam;
215 m_MaxScriptQueue = maxScriptQueue; 237 m_MaxScriptQueue = maxScriptQueue;
216 m_stateSource = stateSource;
217 m_postOnRez = postOnRez; 238 m_postOnRez = postOnRez;
218 m_AttachedAvatar = part.ParentGroup.AttachedAvatar; 239 m_AttachedAvatar = part.ParentGroup.AttachedAvatar;
219 m_RegionID = part.ParentGroup.Scene.RegionInfo.RegionID; 240 m_RegionID = part.ParentGroup.Scene.RegionInfo.RegionID;
220 241
221 if (part != null) 242 if (Engine.Config.GetString("ScriptStopStrategy", "abort") == "co-op")
222 { 243 {
223 part.TaskInventory.LockItemsForRead(true); 244 m_coopTermination = true;
224 if (part.TaskInventory.ContainsKey(ItemID)) 245 m_coopSleepHandle = new AutoResetEvent(false);
225 {
226 ScriptTask = part.TaskInventory[ItemID];
227 }
228 part.TaskInventory.LockItemsForRead(false);
229 } 246 }
247 }
248
249 /// <summary>
250 /// Load the script from an assembly into an AppDomain.
251 /// </summary>
252 /// <param name='dom'></param>
253 /// <param name='assembly'></param>
254 /// <param name='stateSource'></param>
255 /// <returns>false if load failed, true if suceeded</returns>
256 public bool Load(AppDomain dom, string assembly, StateSource stateSource)
257 {
258 m_Assembly = assembly;
259 m_stateSource = stateSource;
230 260
231 ApiManager am = new ApiManager(); 261 ApiManager am = new ApiManager();
232 262
233 foreach (string api in am.GetApis()) 263 foreach (string api in am.GetApis())
234 { 264 {
235 m_Apis[api] = am.CreateApi(api); 265 m_Apis[api] = am.CreateApi(api);
236 m_Apis[api].Initialize(engine, part, ScriptTask); 266 m_Apis[api].Initialize(Engine, Part, ScriptTask, m_coopSleepHandle);
237 } 267 }
238 268
239 try 269 try
240 { 270 {
271 object[] constructorParams;
272
273 Assembly scriptAssembly = dom.Load(Path.GetFileNameWithoutExtension(assembly));
274 Type scriptType = scriptAssembly.GetType("SecondLife.XEngineScript");
275
276 if (scriptType != null)
277 {
278 constructorParams = new object[] { m_coopSleepHandle };
279 }
280 else if (!m_coopTermination)
281 {
282 scriptType = scriptAssembly.GetType("SecondLife.Script");
283 constructorParams = null;
284 }
285 else
286 {
287 m_log.ErrorFormat(
288 "[SCRIPT INSTANCE]: Not starting script {0} (id {1}) in part {2} (id {3}) in object {4} in {5}. You must remove all existing {6}* script DLL files before using enabling co-op termination"
289 + ", either by setting DeleteScriptsOnStartup = true in [XEngine] for one run"
290 + " or by deleting these files manually.",
291 ScriptTask.Name, ScriptTask.ItemID, Part.Name, Part.UUID, Part.ParentGroup.Name, Engine.World.Name, assembly);
292
293 return false;
294 }
295
296// m_log.DebugFormat(
297// "[SCRIPT INSTANCE]: Looking to load {0} from assembly {1} in {2}",
298// scriptType.FullName, Path.GetFileNameWithoutExtension(assembly), Engine.World.Name);
299
241 if (dom != System.AppDomain.CurrentDomain) 300 if (dom != System.AppDomain.CurrentDomain)
242 m_Script = (IScript)dom.CreateInstanceAndUnwrap( 301 m_Script
302 = (IScript)dom.CreateInstanceAndUnwrap(
243 Path.GetFileNameWithoutExtension(assembly), 303 Path.GetFileNameWithoutExtension(assembly),
244 "SecondLife.Script"); 304 scriptType.FullName,
305 false,
306 BindingFlags.Default,
307 null,
308 constructorParams,
309 null,
310 null,
311 null);
245 else 312 else
246 m_Script = (IScript)Assembly.Load( 313 m_Script
247 Path.GetFileNameWithoutExtension(assembly)).CreateInstance( 314 = (IScript)scriptAssembly.CreateInstance(
248 "SecondLife.Script"); 315 scriptType.FullName,
316 false,
317 BindingFlags.Default,
318 null,
319 constructorParams,
320 null,
321 null);
249 322
250 //ILease lease = (ILease)RemotingServices.GetLifetimeService(m_Script as ScriptBaseClass); 323 //ILease lease = (ILease)RemotingServices.GetLifetimeService(m_Script as ScriptBaseClass);
251 //RemotingServices.GetLifetimeService(m_Script as ScriptBaseClass); 324 //RemotingServices.GetLifetimeService(m_Script as ScriptBaseClass);
@@ -254,8 +327,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
254 catch (Exception e) 327 catch (Exception e)
255 { 328 {
256 m_log.ErrorFormat( 329 m_log.ErrorFormat(
257 "[SCRIPT INSTANCE]: Error loading assembly {0}. Exception {1}{2}", 330 "[SCRIPT INSTANCE]: Not starting script {0} (id {1}) in part {2} (id {3}) in object {4} in {5}. Error loading assembly {6}. Exception {7}{8}",
258 assembly, e.Message, e.StackTrace); 331 ScriptTask.Name, ScriptTask.ItemID, Part.Name, Part.UUID, Part.ParentGroup.Name, Engine.World.Name, assembly, e.Message, e.StackTrace);
332
333 return false;
259 } 334 }
260 335
261 try 336 try
@@ -267,16 +342,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
267 342
268// // m_log.Debug("[Script] Script instance created"); 343// // m_log.Debug("[Script] Script instance created");
269 344
270 part.SetScriptEvents(ItemID, 345 Part.SetScriptEvents(ItemID,
271 (int)m_Script.GetStateEventFlags(State)); 346 (int)m_Script.GetStateEventFlags(State));
272 } 347 }
273 catch (Exception e) 348 catch (Exception e)
274 { 349 {
275 m_log.ErrorFormat( 350 m_log.ErrorFormat(
276 "[SCRIPT INSTANCE]: Error loading script instance from assembly {0}. Exception {1}{2}", 351 "[SCRIPT INSTANCE]: Not starting script {0} (id {1}) in part {2} (id {3}) in object {4} in {5}. Error initializing script instance. Exception {6}{7}",
277 assembly, e.Message, e.StackTrace); 352 ScriptTask.Name, ScriptTask.ItemID, Part.Name, Part.UUID, Part.ParentGroup.Name, Engine.World.Name, e.Message, e.StackTrace);
278 353
279 return; 354 return false;
280 } 355 }
281 356
282 m_SaveState = true; 357 m_SaveState = true;
@@ -309,7 +384,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
309 384
310// m_log.DebugFormat("[Script] Successfully retrieved state for script {0}.{1}", PrimName, m_ScriptName); 385// m_log.DebugFormat("[Script] Successfully retrieved state for script {0}.{1}", PrimName, m_ScriptName);
311 386
312 part.SetScriptEvents(ItemID, 387 Part.SetScriptEvents(ItemID,
313 (int)m_Script.GetStateEventFlags(State)); 388 (int)m_Script.GetStateEventFlags(State));
314 389
315 if (!Running) 390 if (!Running)
@@ -329,15 +404,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
329 else 404 else
330 { 405 {
331 m_log.WarnFormat( 406 m_log.WarnFormat(
332 "[SCRIPT INSTANCE]: Unable to load script state file {0} for script {1} {2} in {3} {4} (assembly {5}). Memory limit exceeded", 407 "[SCRIPT INSTANCE]: Not starting script {0} (id {1}) in part {2} (id {3}) in object {4} in {5}. Unable to load script state file {6}. Memory limit exceeded.",
333 savedState, ScriptName, ItemID, PrimName, ObjectID, assembly); 408 ScriptTask.Name, ScriptTask.ItemID, Part.Name, Part.UUID, Part.ParentGroup.Name, Engine.World.Name, savedState);
334 } 409 }
335 } 410 }
336 catch (Exception e) 411 catch (Exception e)
337 { 412 {
338 m_log.ErrorFormat( 413 m_log.ErrorFormat(
339 "[SCRIPT INSTANCE]: Unable to load script state file {0} for script {1} {2} in {3} {4} (assembly {5}). XML is {6}. Exception {7}{8}", 414 "[SCRIPT INSTANCE]: Not starting script {0} (id {1}) in part {2} (id {3}) in object {4} in {5}. Unable to load script state file {6}. XML is {7}. Exception {8}{9}",
340 savedState, ScriptName, ItemID, PrimName, ObjectID, assembly, xml, e.Message, e.StackTrace); 415 ScriptTask.Name, ScriptTask.ItemID, Part.Name, Part.UUID, Part.ParentGroup.Name, Engine.World.Name, savedState, xml, e.Message, e.StackTrace);
341 } 416 }
342 } 417 }
343// else 418// else
@@ -348,6 +423,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
348// presence.ControllingClient.SendAgentAlertMessage("Compile successful", false); 423// presence.ControllingClient.SendAgentAlertMessage("Compile successful", false);
349 424
350// } 425// }
426
427 return true;
351 } 428 }
352 429
353 public void Init() 430 public void Init()
@@ -521,9 +598,36 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
521 } 598 }
522 599
523 // Wait for the current event to complete. 600 // Wait for the current event to complete.
524 if (!m_InSelfDelete && workItem.Wait(new TimeSpan((long)timeout * 100000))) 601 if (!m_InSelfDelete)
525 { 602 {
526 return true; 603 if (!m_coopTermination)
604 {
605 // If we're not co-operative terminating then try and wait for the event to complete before stopping
606 if (workItem.Wait(timeout))
607 return true;
608 }
609 else
610 {
611 if (DebugLevel >= 1)
612 m_log.DebugFormat(
613 "[SCRIPT INSTANCE]: Co-operatively stopping script {0} {1} in {2} {3}",
614 ScriptName, ItemID, PrimName, ObjectID);
615
616 // This will terminate the event on next handle check by the script.
617 m_coopSleepHandle.Set();
618
619 // For now, we will wait forever since the event should always cleanly terminate once LSL loop
620 // checking is implemented. May want to allow a shorter timeout option later.
621 if (workItem.Wait(Timeout.Infinite))
622 {
623 if (DebugLevel >= 1)
624 m_log.DebugFormat(
625 "[SCRIPT INSTANCE]: Co-operatively stopped script {0} {1} in {2} {3}",
626 ScriptName, ItemID, PrimName, ObjectID);
627
628 return true;
629 }
630 }
527 } 631 }
528 632
529 lock (EventQueue) 633 lock (EventQueue)
@@ -536,11 +640,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
536 640
537 // If the event still hasn't stopped and we the stop isn't the result of script or object removal, then 641 // If the event still hasn't stopped and we the stop isn't the result of script or object removal, then
538 // forcibly abort the work item (this aborts the underlying thread). 642 // forcibly abort the work item (this aborts the underlying thread).
643 // Co-operative termination should never reach this point.
539 if (!m_InSelfDelete) 644 if (!m_InSelfDelete)
540 { 645 {
541// m_log.ErrorFormat( 646 m_log.DebugFormat(
542// "[SCRIPT INSTANCE]: Aborting script {0} {1} in prim {2} {3} {4} {5}", 647 "[SCRIPT INSTANCE]: Aborting unstopped script {0} {1} in prim {2}, localID {3}, timeout was {4} ms",
543// ScriptName, ItemID, PrimName, ObjectID, m_InSelfDelete, DateTime.Now.Ticks); 648 ScriptName, ItemID, PrimName, LocalID, timeout);
544 649
545 workItem.Abort(); 650 workItem.Abort();
546 } 651 }
@@ -696,19 +801,41 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
696 { 801 {
697 802
698// m_log.DebugFormat("[XEngine]: Processing event {0} for {1}", data.EventName, this); 803// m_log.DebugFormat("[XEngine]: Processing event {0} for {1}", data.EventName, this);
804 SceneObjectPart part = Engine.World.GetSceneObjectPart(LocalID);
805
806 if (DebugLevel >= 2)
807 m_log.DebugFormat(
808 "[SCRIPT INSTANCE]: Processing event {0} for {1}/{2}({3})/{4}({5}) @ {6}/{7}",
809 data.EventName,
810 ScriptName,
811 part.Name,
812 part.LocalId,
813 part.ParentGroup.Name,
814 part.ParentGroup.UUID,
815 part.AbsolutePosition,
816 part.ParentGroup.Scene.Name);
699 817
700 m_DetectParams = data.DetectParams; 818 m_DetectParams = data.DetectParams;
701 819
702 if (data.EventName == "state") // Hardcoded state change 820 if (data.EventName == "state") // Hardcoded state change
703 { 821 {
704 // m_log.DebugFormat("[Script] Script {0}.{1} state set to {2}",
705 // PrimName, ScriptName, data.Params[0].ToString());
706 State = data.Params[0].ToString(); 822 State = data.Params[0].ToString();
823
824 if (DebugLevel >= 1)
825 m_log.DebugFormat(
826 "[SCRIPT INSTANCE]: Changing state to {0} for {1}/{2}({3})/{4}({5}) @ {6}/{7}",
827 State,
828 ScriptName,
829 part.Name,
830 part.LocalId,
831 part.ParentGroup.Name,
832 part.ParentGroup.UUID,
833 part.AbsolutePosition,
834 part.ParentGroup.Scene.Name);
835
707 AsyncCommandManager.RemoveScript(Engine, 836 AsyncCommandManager.RemoveScript(Engine,
708 LocalID, ItemID); 837 LocalID, ItemID);
709 838
710 SceneObjectPart part = Engine.World.GetSceneObjectPart(
711 LocalID);
712 if (part != null) 839 if (part != null)
713 { 840 {
714 part.SetScriptEvents(ItemID, 841 part.SetScriptEvents(ItemID,
@@ -720,8 +847,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
720 if (Engine.World.PipeEventsForScript(LocalID) || 847 if (Engine.World.PipeEventsForScript(LocalID) ||
721 data.EventName == "control") // Don't freeze avies! 848 data.EventName == "control") // Don't freeze avies!
722 { 849 {
723 SceneObjectPart part = Engine.World.GetSceneObjectPart(
724 LocalID);
725 // m_log.DebugFormat("[Script] Delivered event {2} in state {3} to {0}.{1}", 850 // m_log.DebugFormat("[Script] Delivered event {2} in state {3} to {0}.{1}",
726 // PrimName, ScriptName, data.EventName, State); 851 // PrimName, ScriptName, data.EventName, State);
727 852
@@ -763,7 +888,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
763 m_InEvent = false; 888 m_InEvent = false;
764 m_CurrentEvent = String.Empty; 889 m_CurrentEvent = String.Empty;
765 890
766 if ((!(e is TargetInvocationException) || (!(e.InnerException is SelfDeleteException) && !(e.InnerException is ScriptDeleteException))) && !(e is ThreadAbortException)) 891 if ((!(e is TargetInvocationException)
892 || (!(e.InnerException is SelfDeleteException)
893 && !(e.InnerException is ScriptDeleteException)
894 && !(e.InnerException is ScriptCoopStopException)))
895 && !(e is ThreadAbortException))
767 { 896 {
768 try 897 try
769 { 898 {
@@ -776,6 +905,17 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
776 ChatTypeEnum.DebugChannel, 2147483647, 905 ChatTypeEnum.DebugChannel, 2147483647,
777 part.AbsolutePosition, 906 part.AbsolutePosition,
778 part.Name, part.UUID, false); 907 part.Name, part.UUID, false);
908
909
910 m_log.DebugFormat(
911 "[SCRIPT INSTANCE]: Runtime error in script {0}, part {1} {2} at {3} in {4}, displayed error {5}, actual exception {6}",
912 ScriptName,
913 PrimName,
914 part.UUID,
915 part.AbsolutePosition,
916 part.ParentGroup.Scene.Name,
917 text.Replace("\n", "\\n"),
918 e.InnerException);
779 } 919 }
780 catch (Exception) 920 catch (Exception)
781 { 921 {
@@ -802,6 +942,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
802 if (part != null) 942 if (part != null)
803 part.Inventory.RemoveInventoryItem(ItemID); 943 part.Inventory.RemoveInventoryItem(ItemID);
804 } 944 }
945 else if ((e is TargetInvocationException) && (e.InnerException is ScriptCoopStopException))
946 {
947 if (DebugLevel >= 1)
948 m_log.DebugFormat(
949 "[SCRIPT INSTANCE]: Script {0}.{1} in event {2}, state {3} stopped co-operatively.",
950 PrimName, ScriptName, data.EventName, State);
951 }
805 } 952 }
806 } 953 }
807 } 954 }
@@ -810,6 +957,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
810 // script engine to run the next event. 957 // script engine to run the next event.
811 lock (EventQueue) 958 lock (EventQueue)
812 { 959 {
960 EventsProcessed++;
961
813 if (EventQueue.Count > 0 && Running && !ShuttingDown) 962 if (EventQueue.Count > 0 && Running && !ShuttingDown)
814 { 963 {
815 m_CurrentWorkItem = Engine.QueueEventHandler(this); 964 m_CurrentWorkItem = Engine.QueueEventHandler(this);
@@ -834,7 +983,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
834 return (DateTime.Now - m_EventStart).Seconds; 983 return (DateTime.Now - m_EventStart).Seconds;
835 } 984 }
836 985
837 public void ResetScript() 986 public void ResetScript(int timeout)
838 { 987 {
839 if (m_Script == null) 988 if (m_Script == null)
840 return; 989 return;
@@ -844,7 +993,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
844 RemoveState(); 993 RemoveState();
845 ReleaseControls(); 994 ReleaseControls();
846 995
847 Stop(0); 996 Stop(timeout);
848 SceneObjectPart part = Engine.World.GetSceneObjectPart(LocalID); 997 SceneObjectPart part = Engine.World.GetSceneObjectPart(LocalID);
849 part.Inventory.GetInventoryItem(ItemID).PermsMask = 0; 998 part.Inventory.GetInventoryItem(ItemID).PermsMask = 0;
850 part.Inventory.GetInventoryItem(ItemID).PermsGranter = UUID.Zero; 999 part.Inventory.GetInventoryItem(ItemID).PermsGranter = UUID.Zero;
@@ -1015,7 +1164,6 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
1015 "({0}): {1}", scriptLine - 1, 1164 "({0}): {1}", scriptLine - 1,
1016 e.InnerException.Message); 1165 e.InnerException.Message);
1017 1166
1018 System.Console.WriteLine(e.ToString()+"\n");
1019 return message; 1167 return message;
1020 } 1168 }
1021 } 1169 }
diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/Tests/CoopTerminationTests.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/Tests/CoopTerminationTests.cs
new file mode 100644
index 0000000..ac822c6
--- /dev/null
+++ b/OpenSim/Region/ScriptEngine/Shared/Instance/Tests/CoopTerminationTests.cs
@@ -0,0 +1,513 @@
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.Collections.Generic;
30using System.Threading;
31using Nini.Config;
32using NUnit.Framework;
33using OpenMetaverse;
34using OpenSim.Framework;
35using OpenSim.Region.CoreModules.Scripting.WorldComm;
36using OpenSim.Region.Framework.Scenes;
37using OpenSim.Region.Framework.Interfaces;
38using OpenSim.Region.ScriptEngine.XEngine;
39using OpenSim.Tests.Common;
40using OpenSim.Tests.Common.Mock;
41
42namespace OpenSim.Region.ScriptEngine.Shared.Instance.Tests
43{
44 /// <summary>
45 /// Test that co-operative script thread termination is working correctly.
46 /// </summary>
47 [TestFixture]
48 public class CoopTerminationTests : OpenSimTestCase
49 {
50 private TestScene m_scene;
51 private OpenSim.Region.ScriptEngine.XEngine.XEngine m_xEngine;
52
53 private AutoResetEvent m_chatEvent;
54 private AutoResetEvent m_stoppedEvent;
55
56 private OSChatMessage m_osChatMessageReceived;
57
58 /// <summary>
59 /// Number of chat messages received so far. Reset before each test.
60 /// </summary>
61 private int m_chatMessagesReceived;
62
63 /// <summary>
64 /// Number of chat messages expected. m_chatEvent is not fired until this number is reached or exceeded.
65 /// </summary>
66 private int m_chatMessagesThreshold;
67
68 [SetUp]
69 public void Init()
70 {
71 m_osChatMessageReceived = null;
72 m_chatMessagesReceived = 0;
73 m_chatMessagesThreshold = 0;
74 m_chatEvent = new AutoResetEvent(false);
75 m_stoppedEvent = new AutoResetEvent(false);
76
77 //AppDomain.CurrentDomain.SetData("APPBASE", Environment.CurrentDirectory + "/bin");
78// Console.WriteLine(AppDomain.CurrentDomain.BaseDirectory);
79 m_xEngine = new OpenSim.Region.ScriptEngine.XEngine.XEngine();
80
81 IniConfigSource configSource = new IniConfigSource();
82
83 IConfig startupConfig = configSource.AddConfig("Startup");
84 startupConfig.Set("DefaultScriptEngine", "XEngine");
85
86 IConfig xEngineConfig = configSource.AddConfig("XEngine");
87 xEngineConfig.Set("Enabled", "true");
88 xEngineConfig.Set("StartDelay", "0");
89
90 // These tests will not run with AppDomainLoading = true, at least on mono. For unknown reasons, the call
91 // to AssemblyResolver.OnAssemblyResolve fails.
92 xEngineConfig.Set("AppDomainLoading", "false");
93
94 xEngineConfig.Set("ScriptStopStrategy", "co-op");
95
96 // Make sure loops aren't actually being terminated by a script delay wait.
97 xEngineConfig.Set("ScriptDelayFactor", 0);
98
99 // This is really just set for debugging the test.
100 xEngineConfig.Set("WriteScriptSourceToDebugFile", true);
101
102 // Set to false if we need to debug test so the old scripts don't get wiped before each separate test
103// xEngineConfig.Set("DeleteScriptsOnStartup", false);
104
105 // This is not currently used at all for co-op termination. Bumping up to demonstrate that co-op termination
106 // has an effect - without it tests will fail due to a 120 second wait for the event to finish.
107 xEngineConfig.Set("WaitForEventCompletionOnScriptStop", 120000);
108
109 m_scene = new SceneHelpers().SetupScene("My Test", TestHelpers.ParseTail(0x9999), 1000, 1000, configSource);
110 SceneHelpers.SetupSceneModules(m_scene, configSource, m_xEngine);
111 m_scene.StartScripts();
112 }
113
114 /// <summary>
115 /// Test co-operative termination on derez of an object containing a script with a long-running event.
116 /// </summary>
117 /// <remarks>
118 /// TODO: Actually compiling the script is incidental to this test. Really want a way to compile test scripts
119 /// within the build itself.
120 /// </remarks>
121 [Test]
122 public void TestStopOnLongSleep()
123 {
124 TestHelpers.InMethod();
125// TestHelpers.EnableLogging();
126
127 string script =
128@"default
129{
130 state_entry()
131 {
132 llSay(0, ""Thin Lizzy"");
133 llSleep(60);
134 }
135}";
136
137 TestStop(script);
138 }
139
140 [Test]
141 public void TestNoStopOnSingleStatementForLoop()
142 {
143 TestHelpers.InMethod();
144// TestHelpers.EnableLogging();
145
146 string script =
147@"default
148{
149 state_entry()
150 {
151 integer i = 0;
152 for (i = 0; i <= 1; i++) llSay(0, ""Iter "" + (string)i);
153 }
154}";
155
156 TestSingleStatementNoStop(script);
157 }
158
159 [Test]
160 public void TestStopOnLongSingleStatementForLoop()
161 {
162 TestHelpers.InMethod();
163// TestHelpers.EnableLogging();
164
165 string script =
166@"default
167{
168 state_entry()
169 {
170 integer i = 0;
171 llSay(0, ""Thin Lizzy"");
172
173 for (i = 0; i < 2147483647; i++) llSay(0, ""Iter "" + (string)i);
174 }
175}";
176
177 TestStop(script);
178 }
179
180 [Test]
181 public void TestStopOnLongCompoundStatementForLoop()
182 {
183 TestHelpers.InMethod();
184// TestHelpers.EnableLogging();
185
186 string script =
187@"default
188{
189 state_entry()
190 {
191 integer i = 0;
192 llSay(0, ""Thin Lizzy"");
193
194 for (i = 0; i < 2147483647; i++)
195 {
196 llSay(0, ""Iter "" + (string)i);
197 }
198 }
199}";
200
201 TestStop(script);
202 }
203
204 [Test]
205 public void TestNoStopOnSingleStatementWhileLoop()
206 {
207 TestHelpers.InMethod();
208// TestHelpers.EnableLogging();
209
210 string script =
211@"default
212{
213 state_entry()
214 {
215 integer i = 0;
216 while (i < 2) llSay(0, ""Iter "" + (string)i++);
217 }
218}";
219
220 TestSingleStatementNoStop(script);
221 }
222
223 [Test]
224 public void TestStopOnLongSingleStatementWhileLoop()
225 {
226 TestHelpers.InMethod();
227// TestHelpers.EnableLogging();
228
229 string script =
230@"default
231{
232 state_entry()
233 {
234 integer i = 0;
235 llSay(0, ""Thin Lizzy"");
236
237 while (1 == 1)
238 llSay(0, ""Iter "" + (string)i++);
239 }
240}";
241
242 TestStop(script);
243 }
244
245 [Test]
246 public void TestStopOnLongCompoundStatementWhileLoop()
247 {
248 TestHelpers.InMethod();
249// TestHelpers.EnableLogging();
250
251 string script =
252@"default
253{
254 state_entry()
255 {
256 integer i = 0;
257 llSay(0, ""Thin Lizzy"");
258
259 while (1 == 1)
260 {
261 llSay(0, ""Iter "" + (string)i++);
262 }
263 }
264}";
265
266 TestStop(script);
267 }
268
269 [Test]
270 public void TestNoStopOnSingleStatementDoWhileLoop()
271 {
272 TestHelpers.InMethod();
273// TestHelpers.EnableLogging();
274
275 string script =
276@"default
277{
278 state_entry()
279 {
280 integer i = 0;
281
282 do llSay(0, ""Iter "" + (string)i++);
283 while (i < 2);
284 }
285}";
286
287 TestSingleStatementNoStop(script);
288 }
289
290 [Test]
291 public void TestStopOnLongSingleStatementDoWhileLoop()
292 {
293 TestHelpers.InMethod();
294// TestHelpers.EnableLogging();
295
296 string script =
297@"default
298{
299 state_entry()
300 {
301 integer i = 0;
302 llSay(0, ""Thin Lizzy"");
303
304 do llSay(0, ""Iter "" + (string)i++);
305 while (1 == 1);
306 }
307}";
308
309 TestStop(script);
310 }
311
312 [Test]
313 public void TestStopOnLongCompoundStatementDoWhileLoop()
314 {
315 TestHelpers.InMethod();
316// TestHelpers.EnableLogging();
317
318 string script =
319@"default
320{
321 state_entry()
322 {
323 integer i = 0;
324 llSay(0, ""Thin Lizzy"");
325
326 do
327 {
328 llSay(0, ""Iter "" + (string)i++);
329 } while (1 == 1);
330 }
331}";
332
333 TestStop(script);
334 }
335
336 [Test]
337 public void TestStopOnInfiniteJumpLoop()
338 {
339 TestHelpers.InMethod();
340// TestHelpers.EnableLogging();
341
342 string script =
343@"default
344{
345 state_entry()
346 {
347 integer i = 0;
348 llSay(0, ""Thin Lizzy"");
349
350 @p1;
351 llSay(0, ""Iter "" + (string)i++);
352 jump p1;
353 }
354}";
355
356 TestStop(script);
357 }
358
359 // Disabling for now as these are not particularly useful tests (since they fail due to stack overflow before
360 // termination can even be tried.
361// [Test]
362 public void TestStopOnInfiniteUserFunctionCallLoop()
363 {
364 TestHelpers.InMethod();
365// TestHelpers.EnableLogging();
366
367 string script =
368@"
369integer i = 0;
370
371ufn1()
372{
373 llSay(0, ""Iter ufn1() "" + (string)i++);
374 ufn1();
375}
376
377default
378{
379 state_entry()
380 {
381 integer i = 0;
382 llSay(0, ""Thin Lizzy"");
383
384 ufn1();
385 }
386}";
387
388 TestStop(script);
389 }
390
391 // Disabling for now as these are not particularly useful tests (since they fail due to stack overflow before
392 // termination can even be tried.
393// [Test]
394 public void TestStopOnInfiniteManualEventCallLoop()
395 {
396 TestHelpers.InMethod();
397// TestHelpers.EnableLogging();
398
399 string script =
400@"default
401{
402 state_entry()
403 {
404 integer i = 0;
405 llSay(0, ""Thin Lizzy"");
406
407 llSay(0, ""Iter"" + (string)i++);
408 default_event_state_entry();
409 }
410}";
411
412 TestStop(script);
413 }
414
415 private SceneObjectPart CreateScript(string script, string itemName, UUID userId)
416 {
417// UUID objectId = TestHelpers.ParseTail(0x100);
418// UUID itemId = TestHelpers.ParseTail(0x3);
419
420 SceneObjectGroup so
421 = SceneHelpers.CreateSceneObject(1, userId, string.Format("Object for {0}", itemName), 0x100);
422 m_scene.AddNewSceneObject(so, true);
423
424 InventoryItemBase itemTemplate = new InventoryItemBase();
425// itemTemplate.ID = itemId;
426 itemTemplate.Name = itemName;
427 itemTemplate.Folder = so.UUID;
428 itemTemplate.InvType = (int)InventoryType.LSL;
429
430 m_scene.EventManager.OnChatFromWorld += OnChatFromWorld;
431
432 return m_scene.RezNewScript(userId, itemTemplate, script);
433 }
434
435 private void TestSingleStatementNoStop(string script)
436 {
437 // In these tests we expect to see at least 2 chat messages to confirm that the loop is working properly.
438 m_chatMessagesThreshold = 2;
439
440 UUID userId = TestHelpers.ParseTail(0x1);
441// UUID objectId = TestHelpers.ParseTail(0x100);
442// UUID itemId = TestHelpers.ParseTail(0x3);
443 string itemName = "TestNoStop";
444
445 SceneObjectPart partWhereRezzed = CreateScript(script, itemName, userId);
446
447 // Wait for the script to start the event before we try stopping it.
448 m_chatEvent.WaitOne(60000);
449
450 if (m_osChatMessageReceived == null)
451 Assert.Fail("Script did not start");
452 else
453 Assert.That(m_chatMessagesReceived, Is.EqualTo(2));
454
455 bool running;
456 TaskInventoryItem scriptItem = partWhereRezzed.Inventory.GetInventoryItem(itemName);
457 Assert.That(
458 SceneObjectPartInventory.TryGetScriptInstanceRunning(m_scene, scriptItem, out running), Is.True);
459 Assert.That(running, Is.True);
460 }
461
462 private void TestStop(string script)
463 {
464 // In these tests we're only interested in the first message to confirm that the script has started.
465 m_chatMessagesThreshold = 1;
466
467 UUID userId = TestHelpers.ParseTail(0x1);
468// UUID objectId = TestHelpers.ParseTail(0x100);
469// UUID itemId = TestHelpers.ParseTail(0x3);
470 string itemName = "TestStop";
471
472 SceneObjectPart partWhereRezzed = CreateScript(script, itemName, userId);
473 TaskInventoryItem rezzedItem = partWhereRezzed.Inventory.GetInventoryItem(itemName);
474
475 // Wait for the script to start the event before we try stopping it.
476 m_chatEvent.WaitOne(60000);
477
478 if (m_osChatMessageReceived != null)
479 Console.WriteLine("Script started with message [{0}]", m_osChatMessageReceived.Message);
480 else
481 Assert.Fail("Script did not start");
482
483 // FIXME: This is a very poor way of trying to avoid a low-probability race condition where the script
484 // executes llSay() but has not started the next statement before we try to stop it.
485 Thread.Sleep(1000);
486
487 // We need a way of carrying on if StopScript() fail, since it won't return if the script isn't actually
488 // stopped. This kind of multi-threading is far from ideal in a regression test.
489 new Thread(() => { m_xEngine.StopScript(rezzedItem.ItemID); m_stoppedEvent.Set(); }).Start();
490
491 if (!m_stoppedEvent.WaitOne(30000))
492 Assert.Fail("Script did not co-operatively stop.");
493
494 bool running;
495 TaskInventoryItem scriptItem = partWhereRezzed.Inventory.GetInventoryItem(itemName);
496 Assert.That(
497 SceneObjectPartInventory.TryGetScriptInstanceRunning(m_scene, scriptItem, out running), Is.True);
498 Assert.That(running, Is.False);
499 }
500
501 private void OnChatFromWorld(object sender, OSChatMessage oscm)
502 {
503 Console.WriteLine("Got chat [{0}]", oscm.Message);
504 m_osChatMessageReceived = oscm;
505
506 if (++m_chatMessagesReceived >= m_chatMessagesThreshold)
507 {
508 m_scene.EventManager.OnChatFromWorld -= OnChatFromWorld;
509 m_chatEvent.Set();
510 }
511 }
512 }
513} \ No newline at end of file
diff --git a/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs b/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs
index c6393ed..b524a18 100644
--- a/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/LSL_Types.cs
@@ -633,19 +633,44 @@ namespace OpenSim.Region.ScriptEngine.Shared
633 633
634 public LSL_Types.Vector3 GetVector3Item(int itemIndex) 634 public LSL_Types.Vector3 GetVector3Item(int itemIndex)
635 { 635 {
636 if(m_data[itemIndex] is LSL_Types.Vector3) 636 if (m_data[itemIndex] is LSL_Types.Vector3)
637 {
637 return (LSL_Types.Vector3)m_data[itemIndex]; 638 return (LSL_Types.Vector3)m_data[itemIndex];
639 }
640 else if(m_data[itemIndex] is OpenMetaverse.Vector3)
641 {
642 return new LSL_Types.Vector3(
643 (OpenMetaverse.Vector3)m_data[itemIndex]);
644 }
638 else 645 else
646 {
639 throw new InvalidCastException(string.Format( 647 throw new InvalidCastException(string.Format(
640 "{0} expected but {1} given", 648 "{0} expected but {1} given",
641 typeof(LSL_Types.Vector3).Name, 649 typeof(LSL_Types.Vector3).Name,
642 m_data[itemIndex] != null ? 650 m_data[itemIndex] != null ?
643 m_data[itemIndex].GetType().Name : "null")); 651 m_data[itemIndex].GetType().Name : "null"));
652 }
644 } 653 }
645 654
646 public LSL_Types.Quaternion GetQuaternionItem(int itemIndex) 655 public LSL_Types.Quaternion GetQuaternionItem(int itemIndex)
647 { 656 {
648 return (LSL_Types.Quaternion)m_data[itemIndex]; 657 if (m_data[itemIndex] is LSL_Types.Quaternion)
658 {
659 return (LSL_Types.Quaternion)m_data[itemIndex];
660 }
661 else if(m_data[itemIndex] is OpenMetaverse.Quaternion)
662 {
663 return new LSL_Types.Quaternion(
664 (OpenMetaverse.Quaternion)m_data[itemIndex]);
665 }
666 else
667 {
668 throw new InvalidCastException(string.Format(
669 "{0} expected but {1} given",
670 typeof(LSL_Types.Quaternion).Name,
671 m_data[itemIndex] != null ?
672 m_data[itemIndex].GetType().Name : "null"));
673 }
649 } 674 }
650 675
651 public LSL_Types.key GetKeyItem(int itemIndex) 676 public LSL_Types.key GetKeyItem(int itemIndex)
diff --git a/OpenSim/Region/ScriptEngine/Shared/Properties/AssemblyInfo.cs b/OpenSim/Region/ScriptEngine/Shared/Properties/AssemblyInfo.cs
index e6e8777..d08b0a6 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Properties/AssemblyInfo.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Properties/AssemblyInfo.cs
@@ -29,5 +29,5 @@ using System.Runtime.InteropServices;
29// Build Number 29// Build Number
30// Revision 30// Revision
31// 31//
32[assembly: AssemblyVersion("0.7.5.*")] 32[assembly: AssemblyVersion("0.7.6.*")]
33[assembly: AssemblyFileVersion("1.0.0.0")] 33[assembly: AssemblyFileVersion("1.0.0.0")]
diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiHttpTests.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiHttpTests.cs
new file mode 100644
index 0000000..ab44e38
--- /dev/null
+++ b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiHttpTests.cs
@@ -0,0 +1,249 @@
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.Collections.Generic;
30using System.IO;
31using System.Net;
32using System.Reflection;
33using System.Text;
34using log4net;
35using Nini.Config;
36using NUnit.Framework;
37using OpenMetaverse;
38using OpenSim.Framework;
39using OpenSim.Framework.Servers;
40using OpenSim.Framework.Servers.HttpServer;
41using OpenSim.Region.CoreModules.Scripting.LSLHttp;
42using OpenSim.Region.Framework.Scenes;
43using OpenSim.Region.ScriptEngine.Shared;
44using OpenSim.Region.ScriptEngine.Shared.Api;
45using OpenSim.Region.ScriptEngine.Shared.ScriptBase;
46using OpenSim.Services.Interfaces;
47using OpenSim.Tests.Common;
48using OpenSim.Tests.Common.Mock;
49
50namespace OpenSim.Region.ScriptEngine.Shared.Tests
51{
52 /// <summary>
53 /// Tests for HTTP related functions in LSL
54 /// </summary>
55 [TestFixture]
56 public class LSL_ApiHttpTests : OpenSimTestCase
57 {
58 private Scene m_scene;
59 private MockScriptEngine m_engine;
60 private UrlModule m_urlModule;
61
62 private TaskInventoryItem m_scriptItem;
63 private LSL_Api m_lslApi;
64
65 [TestFixtureSetUp]
66 public void TestFixtureSetUp()
67 {
68 // Don't allow tests to be bamboozled by asynchronous events. Execute everything on the same thread.
69 Util.FireAndForgetMethod = FireAndForgetMethod.RegressionTest;
70 }
71
72 [TestFixtureTearDown]
73 public void TestFixureTearDown()
74 {
75 // We must set this back afterwards, otherwise later tests will fail since they're expecting multiple
76 // threads. Possibly, later tests should be rewritten so none of them require async stuff (which regression
77 // tests really shouldn't).
78 Util.FireAndForgetMethod = Util.DefaultFireAndForgetMethod;
79 }
80
81 [SetUp]
82 public override void SetUp()
83 {
84 base.SetUp();
85
86 // This is an unfortunate bit of clean up we have to do because MainServer manages things through static
87 // variables and the VM is not restarted between tests.
88 uint port = 9999;
89 MainServer.RemoveHttpServer(port);
90
91 BaseHttpServer server = new BaseHttpServer(port, false, 0, "");
92 MainServer.AddHttpServer(server);
93 MainServer.Instance = server;
94
95 server.Start();
96
97 m_engine = new MockScriptEngine();
98 m_urlModule = new UrlModule();
99
100 m_scene = new SceneHelpers().SetupScene();
101 SceneHelpers.SetupSceneModules(m_scene, new IniConfigSource(), m_engine, m_urlModule);
102
103 SceneObjectGroup so = SceneHelpers.AddSceneObject(m_scene);
104 m_scriptItem = TaskInventoryHelpers.AddScript(m_scene, so.RootPart);
105
106 // This is disconnected from the actual script - the mock engine does not set up any LSL_Api atm.
107 // Possibly this could be done and we could obtain it directly from the MockScriptEngine.
108 m_lslApi = new LSL_Api();
109 m_lslApi.Initialize(m_engine, so.RootPart, m_scriptItem, null);
110 }
111
112 [TearDown]
113 public void TearDown()
114 {
115 MainServer.Instance.Stop();
116 }
117
118 [Test]
119 public void TestLlReleaseUrl()
120 {
121 TestHelpers.InMethod();
122
123 m_lslApi.llRequestURL();
124 string returnedUri = m_engine.PostedEvents[m_scriptItem.ItemID][0].Params[2].ToString();
125
126 {
127 // Check that the initial number of URLs is correct
128 Assert.That(m_lslApi.llGetFreeURLs().value, Is.EqualTo(m_urlModule.TotalUrls - 1));
129 }
130
131 {
132 // Check releasing a non-url
133 m_lslApi.llReleaseURL("GARBAGE");
134 Assert.That(m_lslApi.llGetFreeURLs().value, Is.EqualTo(m_urlModule.TotalUrls - 1));
135 }
136
137 {
138 // Check releasing a non-existing url
139 m_lslApi.llReleaseURL("http://example.com");
140 Assert.That(m_lslApi.llGetFreeURLs().value, Is.EqualTo(m_urlModule.TotalUrls - 1));
141 }
142
143 {
144 // Check URL release
145 m_lslApi.llReleaseURL(returnedUri);
146 Assert.That(m_lslApi.llGetFreeURLs().value, Is.EqualTo(m_urlModule.TotalUrls));
147
148 HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(returnedUri);
149
150 bool gotExpectedException = false;
151
152 try
153 {
154 using (HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse())
155 {}
156 }
157 catch (WebException e)
158 {
159 using (HttpWebResponse response = (HttpWebResponse)e.Response)
160 gotExpectedException = response.StatusCode == HttpStatusCode.NotFound;
161 }
162
163 Assert.That(gotExpectedException, Is.True);
164 }
165
166 {
167 // Check releasing the same URL again
168 m_lslApi.llReleaseURL(returnedUri);
169 Assert.That(m_lslApi.llGetFreeURLs().value, Is.EqualTo(m_urlModule.TotalUrls));
170 }
171 }
172
173 [Test]
174 public void TestLlRequestUrl()
175 {
176 TestHelpers.InMethod();
177
178 string requestId = m_lslApi.llRequestURL();
179 Assert.That(requestId, Is.Not.EqualTo(UUID.Zero.ToString()));
180 string returnedUri;
181
182 {
183 // Check that URL is correctly set up
184 Assert.That(m_lslApi.llGetFreeURLs().value, Is.EqualTo(m_urlModule.TotalUrls - 1));
185
186 Assert.That(m_engine.PostedEvents.ContainsKey(m_scriptItem.ItemID));
187
188 List<EventParams> events = m_engine.PostedEvents[m_scriptItem.ItemID];
189 Assert.That(events.Count, Is.EqualTo(1));
190 EventParams eventParams = events[0];
191 Assert.That(eventParams.EventName, Is.EqualTo("http_request"));
192
193 UUID returnKey;
194 string rawReturnKey = eventParams.Params[0].ToString();
195 string method = eventParams.Params[1].ToString();
196 returnedUri = eventParams.Params[2].ToString();
197
198 Assert.That(UUID.TryParse(rawReturnKey, out returnKey), Is.True);
199 Assert.That(method, Is.EqualTo(ScriptBaseClass.URL_REQUEST_GRANTED));
200 Assert.That(Uri.IsWellFormedUriString(returnedUri, UriKind.Absolute), Is.True);
201 }
202
203 {
204 // Check that request to URL works.
205 string testResponse = "Hello World";
206
207 m_engine.ClearPostedEvents();
208 m_engine.PostEventHook
209 += (itemId, evp) => m_lslApi.llHTTPResponse(evp.Params[0].ToString(), 200, testResponse);
210
211// Console.WriteLine("Trying {0}", returnedUri);
212
213 AssertHttpResponse(returnedUri, testResponse);
214
215 Assert.That(m_engine.PostedEvents.ContainsKey(m_scriptItem.ItemID));
216
217 List<EventParams> events = m_engine.PostedEvents[m_scriptItem.ItemID];
218 Assert.That(events.Count, Is.EqualTo(1));
219 EventParams eventParams = events[0];
220 Assert.That(eventParams.EventName, Is.EqualTo("http_request"));
221
222 UUID returnKey;
223 string rawReturnKey = eventParams.Params[0].ToString();
224 string method = eventParams.Params[1].ToString();
225 string body = eventParams.Params[2].ToString();
226
227 Assert.That(UUID.TryParse(rawReturnKey, out returnKey), Is.True);
228 Assert.That(method, Is.EqualTo("GET"));
229 Assert.That(body, Is.EqualTo(""));
230 }
231 }
232
233 private void AssertHttpResponse(string uri, string expectedResponse)
234 {
235 HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(uri);
236
237 using (HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse())
238 {
239 using (Stream stream = webResponse.GetResponseStream())
240 {
241 using (StreamReader reader = new StreamReader(stream))
242 {
243 Assert.That(reader.ReadToEnd(), Is.EqualTo(expectedResponse));
244 }
245 }
246 }
247 }
248 }
249} \ No newline at end of file
diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiInventoryTests.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiInventoryTests.cs
index c73e22f..6dd6c17 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiInventoryTests.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiInventoryTests.cs
@@ -41,6 +41,7 @@ using OpenSim.Region.OptionalModules.World.NPC;
41using OpenSim.Region.Framework.Scenes; 41using OpenSim.Region.Framework.Scenes;
42using OpenSim.Region.ScriptEngine.Shared; 42using OpenSim.Region.ScriptEngine.Shared;
43using OpenSim.Region.ScriptEngine.Shared.Api; 43using OpenSim.Region.ScriptEngine.Shared.Api;
44using OpenSim.Region.ScriptEngine.Shared.Instance;
44using OpenSim.Services.Interfaces; 45using OpenSim.Services.Interfaces;
45using OpenSim.Tests.Common; 46using OpenSim.Tests.Common;
46using OpenSim.Tests.Common.Mock; 47using OpenSim.Tests.Common.Mock;
@@ -51,14 +52,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
51 /// Tests for inventory functions in LSL 52 /// Tests for inventory functions in LSL
52 /// </summary> 53 /// </summary>
53 [TestFixture] 54 [TestFixture]
54 public class LSL_ApiInventoryTests 55 public class LSL_ApiInventoryTests : OpenSimTestCase
55 { 56 {
56 protected Scene m_scene; 57 protected Scene m_scene;
57 protected XEngine.XEngine m_engine; 58 protected XEngine.XEngine m_engine;
58 59
59 [SetUp] 60 [SetUp]
60 public void SetUp() 61 public override void SetUp()
61 { 62 {
63 base.SetUp();
64
62 IConfigSource initConfigSource = new IniConfigSource(); 65 IConfigSource initConfigSource = new IniConfigSource();
63 IConfig config = initConfigSource.AddConfig("XEngine"); 66 IConfig config = initConfigSource.AddConfig("XEngine");
64 config.Set("Enabled", "true"); 67 config.Set("Enabled", "true");
@@ -91,7 +94,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
91 TaskInventoryHelpers.AddSceneObject(m_scene, so1.RootPart, inventoryItemName, itemId, userId); 94 TaskInventoryHelpers.AddSceneObject(m_scene, so1.RootPart, inventoryItemName, itemId, userId);
92 95
93 LSL_Api api = new LSL_Api(); 96 LSL_Api api = new LSL_Api();
94 api.Initialize(m_engine, so1.RootPart, null); 97 api.Initialize(m_engine, so1.RootPart, null, null);
95 98
96 // Create a second object 99 // Create a second object
97 SceneObjectGroup so2 = SceneHelpers.CreateSceneObject(1, userId, "so2", 0x100); 100 SceneObjectGroup so2 = SceneHelpers.CreateSceneObject(1, userId, "so2", 0x100);
@@ -124,7 +127,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
124 SceneObjectGroup so1 = SceneHelpers.CreateSceneObject(1, user1Id, "so1", 0x10); 127 SceneObjectGroup so1 = SceneHelpers.CreateSceneObject(1, user1Id, "so1", 0x10);
125 m_scene.AddSceneObject(so1); 128 m_scene.AddSceneObject(so1);
126 LSL_Api api = new LSL_Api(); 129 LSL_Api api = new LSL_Api();
127 api.Initialize(m_engine, so1.RootPart, null); 130 api.Initialize(m_engine, so1.RootPart, null, null);
128 131
129 // Create an object embedded inside the first 132 // Create an object embedded inside the first
130 UUID itemId = TestHelpers.ParseTail(0x20); 133 UUID itemId = TestHelpers.ParseTail(0x20);
@@ -134,7 +137,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
134 SceneObjectGroup so2 = SceneHelpers.CreateSceneObject(1, user2Id, "so2", 0x100); 137 SceneObjectGroup so2 = SceneHelpers.CreateSceneObject(1, user2Id, "so2", 0x100);
135 m_scene.AddSceneObject(so2); 138 m_scene.AddSceneObject(so2);
136 LSL_Api api2 = new LSL_Api(); 139 LSL_Api api2 = new LSL_Api();
137 api2.Initialize(m_engine, so2.RootPart, null); 140 api2.Initialize(m_engine, so2.RootPart, null, null);
138 141
139 // *** Firstly, we test where llAllowInventoryDrop() has not been called. *** 142 // *** Firstly, we test where llAllowInventoryDrop() has not been called. ***
140 api.llGiveInventory(so2.UUID.ToString(), inventoryItemName); 143 api.llGiveInventory(so2.UUID.ToString(), inventoryItemName);
diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiLinkingTests.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiLinkingTests.cs
index 2565ae7..ac9f93b 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiLinkingTests.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiLinkingTests.cs
@@ -41,6 +41,7 @@ using OpenSim.Region.OptionalModules.World.NPC;
41using OpenSim.Region.Framework.Scenes; 41using OpenSim.Region.Framework.Scenes;
42using OpenSim.Region.ScriptEngine.Shared; 42using OpenSim.Region.ScriptEngine.Shared;
43using OpenSim.Region.ScriptEngine.Shared.Api; 43using OpenSim.Region.ScriptEngine.Shared.Api;
44using OpenSim.Region.ScriptEngine.Shared.Instance;
44using OpenSim.Region.ScriptEngine.Shared.ScriptBase; 45using OpenSim.Region.ScriptEngine.Shared.ScriptBase;
45using OpenSim.Services.Interfaces; 46using OpenSim.Services.Interfaces;
46using OpenSim.Tests.Common; 47using OpenSim.Tests.Common;
@@ -56,14 +57,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
56 /// OpenSim.Region.Framework.Scenes.Tests.SceneObjectLinkingTests. 57 /// OpenSim.Region.Framework.Scenes.Tests.SceneObjectLinkingTests.
57 /// </remarks> 58 /// </remarks>
58 [TestFixture] 59 [TestFixture]
59 public class LSL_ApiLinkingTests 60 public class LSL_ApiLinkingTests : OpenSimTestCase
60 { 61 {
61 protected Scene m_scene; 62 protected Scene m_scene;
62 protected XEngine.XEngine m_engine; 63 protected XEngine.XEngine m_engine;
63 64
64 [SetUp] 65 [SetUp]
65 public void SetUp() 66 public override void SetUp()
66 { 67 {
68 base.SetUp();
69
67 IConfigSource initConfigSource = new IniConfigSource(); 70 IConfigSource initConfigSource = new IniConfigSource();
68 IConfig config = initConfigSource.AddConfig("XEngine"); 71 IConfig config = initConfigSource.AddConfig("XEngine");
69 config.Set("Enabled", "true"); 72 config.Set("Enabled", "true");
@@ -90,7 +93,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
90 // FIXME: This should really be a script item (with accompanying script) 93 // FIXME: This should really be a script item (with accompanying script)
91 TaskInventoryItem grp1Item 94 TaskInventoryItem grp1Item
92 = TaskInventoryHelpers.AddNotecard( 95 = TaskInventoryHelpers.AddNotecard(
93 m_scene, grp1.RootPart, "ncItem", TestHelpers.ParseTail(0x800), TestHelpers.ParseTail(0x900)); 96 m_scene, grp1.RootPart, "ncItem", TestHelpers.ParseTail(0x800), TestHelpers.ParseTail(0x900), "Hello World!");
94 grp1Item.PermsMask |= ScriptBaseClass.PERMISSION_CHANGE_LINKS; 97 grp1Item.PermsMask |= ScriptBaseClass.PERMISSION_CHANGE_LINKS;
95 98
96 SceneObjectGroup grp2 = SceneHelpers.CreateSceneObject(2, ownerId, "grp2-", 0x20); 99 SceneObjectGroup grp2 = SceneHelpers.CreateSceneObject(2, ownerId, "grp2-", 0x20);
@@ -102,7 +105,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
102 m_scene.AddSceneObject(grp2); 105 m_scene.AddSceneObject(grp2);
103 106
104 LSL_Api apiGrp1 = new LSL_Api(); 107 LSL_Api apiGrp1 = new LSL_Api();
105 apiGrp1.Initialize(m_engine, grp1.RootPart, grp1Item); 108 apiGrp1.Initialize(m_engine, grp1.RootPart, grp1Item, null);
106 109
107 apiGrp1.llCreateLink(grp2.UUID.ToString(), ScriptBaseClass.TRUE); 110 apiGrp1.llCreateLink(grp2.UUID.ToString(), ScriptBaseClass.TRUE);
108 111
@@ -124,12 +127,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
124 // FIXME: This should really be a script item (with accompanying script) 127 // FIXME: This should really be a script item (with accompanying script)
125 TaskInventoryItem grp1Item 128 TaskInventoryItem grp1Item
126 = TaskInventoryHelpers.AddNotecard( 129 = TaskInventoryHelpers.AddNotecard(
127 m_scene, grp1.RootPart, "ncItem", TestHelpers.ParseTail(0x800), TestHelpers.ParseTail(0x900)); 130 m_scene, grp1.RootPart, "ncItem", TestHelpers.ParseTail(0x800), TestHelpers.ParseTail(0x900), "Hello World!");
128 131
129 grp1Item.PermsMask |= ScriptBaseClass.PERMISSION_CHANGE_LINKS; 132 grp1Item.PermsMask |= ScriptBaseClass.PERMISSION_CHANGE_LINKS;
130 133
131 LSL_Api apiGrp1 = new LSL_Api(); 134 LSL_Api apiGrp1 = new LSL_Api();
132 apiGrp1.Initialize(m_engine, grp1.RootPart, grp1Item); 135 apiGrp1.Initialize(m_engine, grp1.RootPart, grp1Item, null);
133 136
134 apiGrp1.llBreakLink(2); 137 apiGrp1.llBreakLink(2);
135 138
diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiListTests.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiListTests.cs
index dd23be8..60de5cb 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiListTests.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiListTests.cs
@@ -34,6 +34,7 @@ using OpenSim.Region.ScriptEngine.Shared;
34using OpenSim.Region.Framework.Scenes; 34using OpenSim.Region.Framework.Scenes;
35using Nini.Config; 35using Nini.Config;
36using OpenSim.Region.ScriptEngine.Shared.Api; 36using OpenSim.Region.ScriptEngine.Shared.Api;
37using OpenSim.Region.ScriptEngine.Shared.Instance;
37using OpenSim.Region.ScriptEngine.Shared.ScriptBase; 38using OpenSim.Region.ScriptEngine.Shared.ScriptBase;
38using OpenMetaverse; 39using OpenMetaverse;
39using OpenSim.Tests.Common.Mock; 40using OpenSim.Tests.Common.Mock;
@@ -46,13 +47,15 @@ using LSL_String = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLString;
46namespace OpenSim.Region.ScriptEngine.Shared.Tests 47namespace OpenSim.Region.ScriptEngine.Shared.Tests
47{ 48{
48 [TestFixture] 49 [TestFixture]
49 public class LSL_ApiListTests 50 public class LSL_ApiListTests : OpenSimTestCase
50 { 51 {
51 private LSL_Api m_lslApi; 52 private LSL_Api m_lslApi;
52 53
53 [SetUp] 54 [SetUp]
54 public void SetUp() 55 public override void SetUp()
55 { 56 {
57 base.SetUp();
58
56 IConfigSource initConfigSource = new IniConfigSource(); 59 IConfigSource initConfigSource = new IniConfigSource();
57 IConfig config = initConfigSource.AddConfig("XEngine"); 60 IConfig config = initConfigSource.AddConfig("XEngine");
58 config.Set("Enabled", "true"); 61 config.Set("Enabled", "true");
@@ -65,7 +68,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
65 engine.AddRegion(scene); 68 engine.AddRegion(scene);
66 69
67 m_lslApi = new LSL_Api(); 70 m_lslApi = new LSL_Api();
68 m_lslApi.Initialize(engine, part, null); 71 m_lslApi.Initialize(engine, part, null, null);
69 } 72 }
70 73
71 [Test] 74 [Test]
diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiNotecardTests.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiNotecardTests.cs
new file mode 100644
index 0000000..c92bcdb
--- /dev/null
+++ b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiNotecardTests.cs
@@ -0,0 +1,270 @@
1using System;
2using System.Collections.Generic;
3using System.IO;
4using System.Net;
5using System.Reflection;
6using System.Text;
7using log4net;
8using Nini.Config;
9using NUnit.Framework;
10using OpenMetaverse;
11using OpenSim.Framework;
12using OpenSim.Framework.Servers;
13using OpenSim.Framework.Servers.HttpServer;
14using OpenSim.Region.CoreModules.Scripting.LSLHttp;
15using OpenSim.Region.Framework.Scenes;
16using OpenSim.Region.ScriptEngine.Shared;
17using OpenSim.Region.ScriptEngine.Shared.Api;
18using OpenSim.Region.ScriptEngine.Shared.ScriptBase;
19using OpenSim.Services.Interfaces;
20using OpenSim.Tests.Common;
21using OpenSim.Tests.Common.Mock;
22
23namespace OpenSim.Region.ScriptEngine.Shared.Tests
24{
25 /// <summary>
26 /// Tests for notecard related functions in LSL
27 /// </summary>
28 [TestFixture]
29 public class LSL_ApiNotecardTests : OpenSimTestCase
30 {
31 private Scene m_scene;
32 private MockScriptEngine m_engine;
33
34 private SceneObjectGroup m_so;
35 private TaskInventoryItem m_scriptItem;
36 private LSL_Api m_lslApi;
37
38 [TestFixtureSetUp]
39 public void TestFixtureSetUp()
40 {
41 // Don't allow tests to be bamboozled by asynchronous events. Execute everything on the same thread.
42 Util.FireAndForgetMethod = FireAndForgetMethod.RegressionTest;
43 }
44
45 [TestFixtureTearDown]
46 public void TestFixureTearDown()
47 {
48 // We must set this back afterwards, otherwise later tests will fail since they're expecting multiple
49 // threads. Possibly, later tests should be rewritten so none of them require async stuff (which regression
50 // tests really shouldn't).
51 Util.FireAndForgetMethod = Util.DefaultFireAndForgetMethod;
52 }
53
54 [SetUp]
55 public override void SetUp()
56 {
57 base.SetUp();
58
59 m_engine = new MockScriptEngine();
60
61 m_scene = new SceneHelpers().SetupScene();
62 SceneHelpers.SetupSceneModules(m_scene, new IniConfigSource(), m_engine);
63
64 m_so = SceneHelpers.AddSceneObject(m_scene);
65 m_scriptItem = TaskInventoryHelpers.AddScript(m_scene, m_so.RootPart);
66
67 // This is disconnected from the actual script - the mock engine does not set up any LSL_Api atm.
68 // Possibly this could be done and we could obtain it directly from the MockScriptEngine.
69 m_lslApi = new LSL_Api();
70 m_lslApi.Initialize(m_engine, m_so.RootPart, m_scriptItem, null);
71 }
72
73 [Test]
74 public void TestLlGetNotecardLine()
75 {
76 TestHelpers.InMethod();
77
78 string[] ncLines = { "One", "Two", "Three" };
79
80 TaskInventoryItem ncItem
81 = TaskInventoryHelpers.AddNotecard(m_scene, m_so.RootPart, "nc", "1", "10", string.Join("\n", ncLines));
82
83 AssertValidNotecardLine(ncItem.Name, 0, ncLines[0]);
84 AssertValidNotecardLine(ncItem.Name, 2, ncLines[2]);
85 AssertValidNotecardLine(ncItem.Name, 3, ScriptBaseClass.EOF);
86 AssertValidNotecardLine(ncItem.Name, 4, ScriptBaseClass.EOF);
87
88 // XXX: Is this correct or do we really expect no dataserver event to fire at all?
89 AssertValidNotecardLine(ncItem.Name, -1, "");
90 AssertValidNotecardLine(ncItem.Name, -2, "");
91 }
92
93 [Test]
94 public void TestLlGetNotecardLine_NoNotecard()
95 {
96 TestHelpers.InMethod();
97
98 AssertInValidNotecardLine("nc", 0);
99 }
100
101 [Test]
102 public void TestLlGetNotecardLine_NotANotecard()
103 {
104 TestHelpers.InMethod();
105
106 TaskInventoryItem ncItem = TaskInventoryHelpers.AddScript(m_scene, m_so.RootPart, "nc1", "Not important");
107
108 AssertInValidNotecardLine(ncItem.Name, 0);
109 }
110
111 private void AssertValidNotecardLine(string ncName, int lineNumber, string assertLine)
112 {
113 string key = m_lslApi.llGetNotecardLine(ncName, lineNumber);
114 Assert.That(key, Is.Not.EqualTo(UUID.Zero.ToString()));
115
116 Assert.That(m_engine.PostedEvents.Count, Is.EqualTo(1));
117 Assert.That(m_engine.PostedEvents.ContainsKey(m_scriptItem.ItemID));
118
119 List<EventParams> events = m_engine.PostedEvents[m_scriptItem.ItemID];
120 Assert.That(events.Count, Is.EqualTo(1));
121 EventParams eventParams = events[0];
122
123 Assert.That(eventParams.EventName, Is.EqualTo("dataserver"));
124 Assert.That(eventParams.Params[0].ToString(), Is.EqualTo(key));
125 Assert.That(eventParams.Params[1].ToString(), Is.EqualTo(assertLine));
126
127 m_engine.ClearPostedEvents();
128 }
129
130 private void AssertInValidNotecardLine(string ncName, int lineNumber)
131 {
132 string key = m_lslApi.llGetNotecardLine(ncName, lineNumber);
133 Assert.That(key, Is.EqualTo(UUID.Zero.ToString()));
134
135 Assert.That(m_engine.PostedEvents.Count, Is.EqualTo(0));
136 }
137
138// [Test]
139// public void TestLlReleaseUrl()
140// {
141// TestHelpers.InMethod();
142//
143// m_lslApi.llRequestURL();
144// string returnedUri = m_engine.PostedEvents[m_scriptItem.ItemID][0].Params[2].ToString();
145//
146// {
147// // Check that the initial number of URLs is correct
148// Assert.That(m_lslApi.llGetFreeURLs().value, Is.EqualTo(m_urlModule.TotalUrls - 1));
149// }
150//
151// {
152// // Check releasing a non-url
153// m_lslApi.llReleaseURL("GARBAGE");
154// Assert.That(m_lslApi.llGetFreeURLs().value, Is.EqualTo(m_urlModule.TotalUrls - 1));
155// }
156//
157// {
158// // Check releasing a non-existing url
159// m_lslApi.llReleaseURL("http://example.com");
160// Assert.That(m_lslApi.llGetFreeURLs().value, Is.EqualTo(m_urlModule.TotalUrls - 1));
161// }
162//
163// {
164// // Check URL release
165// m_lslApi.llReleaseURL(returnedUri);
166// Assert.That(m_lslApi.llGetFreeURLs().value, Is.EqualTo(m_urlModule.TotalUrls));
167//
168// HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(returnedUri);
169//
170// bool gotExpectedException = false;
171//
172// try
173// {
174// using (HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse())
175// {}
176// }
177// catch (WebException e)
178// {
179// using (HttpWebResponse response = (HttpWebResponse)e.Response)
180// gotExpectedException = response.StatusCode == HttpStatusCode.NotFound;
181// }
182//
183// Assert.That(gotExpectedException, Is.True);
184// }
185//
186// {
187// // Check releasing the same URL again
188// m_lslApi.llReleaseURL(returnedUri);
189// Assert.That(m_lslApi.llGetFreeURLs().value, Is.EqualTo(m_urlModule.TotalUrls));
190// }
191// }
192//
193// [Test]
194// public void TestLlRequestUrl()
195// {
196// TestHelpers.InMethod();
197//
198// string requestId = m_lslApi.llRequestURL();
199// Assert.That(requestId, Is.Not.EqualTo(UUID.Zero.ToString()));
200// string returnedUri;
201//
202// {
203// // Check that URL is correctly set up
204// Assert.That(m_lslApi.llGetFreeURLs().value, Is.EqualTo(m_urlModule.TotalUrls - 1));
205//
206// Assert.That(m_engine.PostedEvents.ContainsKey(m_scriptItem.ItemID));
207//
208// List<EventParams> events = m_engine.PostedEvents[m_scriptItem.ItemID];
209// Assert.That(events.Count, Is.EqualTo(1));
210// EventParams eventParams = events[0];
211// Assert.That(eventParams.EventName, Is.EqualTo("http_request"));
212//
213// UUID returnKey;
214// string rawReturnKey = eventParams.Params[0].ToString();
215// string method = eventParams.Params[1].ToString();
216// returnedUri = eventParams.Params[2].ToString();
217//
218// Assert.That(UUID.TryParse(rawReturnKey, out returnKey), Is.True);
219// Assert.That(method, Is.EqualTo(ScriptBaseClass.URL_REQUEST_GRANTED));
220// Assert.That(Uri.IsWellFormedUriString(returnedUri, UriKind.Absolute), Is.True);
221// }
222//
223// {
224// // Check that request to URL works.
225// string testResponse = "Hello World";
226//
227// m_engine.ClearPostedEvents();
228// m_engine.PostEventHook
229// += (itemId, evp) => m_lslApi.llHTTPResponse(evp.Params[0].ToString(), 200, testResponse);
230//
231//// Console.WriteLine("Trying {0}", returnedUri);
232// HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(returnedUri);
233//
234// AssertHttpResponse(returnedUri, testResponse);
235//
236// Assert.That(m_engine.PostedEvents.ContainsKey(m_scriptItem.ItemID));
237//
238// List<EventParams> events = m_engine.PostedEvents[m_scriptItem.ItemID];
239// Assert.That(events.Count, Is.EqualTo(1));
240// EventParams eventParams = events[0];
241// Assert.That(eventParams.EventName, Is.EqualTo("http_request"));
242//
243// UUID returnKey;
244// string rawReturnKey = eventParams.Params[0].ToString();
245// string method = eventParams.Params[1].ToString();
246// string body = eventParams.Params[2].ToString();
247//
248// Assert.That(UUID.TryParse(rawReturnKey, out returnKey), Is.True);
249// Assert.That(method, Is.EqualTo("GET"));
250// Assert.That(body, Is.EqualTo(""));
251// }
252// }
253//
254// private void AssertHttpResponse(string uri, string expectedResponse)
255// {
256// HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(uri);
257//
258// using (HttpWebResponse webResponse = (HttpWebResponse)webRequest.GetResponse())
259// {
260// using (Stream stream = webResponse.GetResponseStream())
261// {
262// using (StreamReader reader = new StreamReader(stream))
263// {
264// Assert.That(reader.ReadToEnd(), Is.EqualTo(expectedResponse));
265// }
266// }
267// }
268// }
269 }
270} \ No newline at end of file
diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiTest.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiTest.cs
index c41d1e7..e97ae06 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiTest.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_ApiTest.cs
@@ -33,6 +33,7 @@ using OpenSim.Region.ScriptEngine.Shared;
33using OpenSim.Region.Framework.Scenes; 33using OpenSim.Region.Framework.Scenes;
34using Nini.Config; 34using Nini.Config;
35using OpenSim.Region.ScriptEngine.Shared.Api; 35using OpenSim.Region.ScriptEngine.Shared.Api;
36using OpenSim.Region.ScriptEngine.Shared.Instance;
36using OpenSim.Region.ScriptEngine.Shared.ScriptBase; 37using OpenSim.Region.ScriptEngine.Shared.ScriptBase;
37using OpenMetaverse; 38using OpenMetaverse;
38using System; 39using System;
@@ -66,7 +67,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
66 engine.AddRegion(scene); 67 engine.AddRegion(scene);
67 68
68 m_lslApi = new LSL_Api(); 69 m_lslApi = new LSL_Api();
69 m_lslApi.Initialize(engine, part, null); 70 m_lslApi.Initialize(engine, part, null, null);
70 } 71 }
71 72
72 [Test] 73 [Test]
diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_TypesTestLSLFloat.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_TypesTestLSLFloat.cs
index 3ed2562..c8c7f82 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_TypesTestLSLFloat.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_TypesTestLSLFloat.cs
@@ -33,7 +33,7 @@ using OpenSim.Region.ScriptEngine.Shared;
33namespace OpenSim.Region.ScriptEngine.Shared.Tests 33namespace OpenSim.Region.ScriptEngine.Shared.Tests
34{ 34{
35 [TestFixture] 35 [TestFixture]
36 public class LSL_TypesTestLSLFloat 36 public class LSL_TypesTestLSLFloat : OpenSimTestCase
37 { 37 {
38 // Used for testing equality of two floats. 38 // Used for testing equality of two floats.
39 private double _lowPrecisionTolerance = 0.000001; 39 private double _lowPrecisionTolerance = 0.000001;
diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_TypesTestLSLInteger.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_TypesTestLSLInteger.cs
index 8d1169a..c664108 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_TypesTestLSLInteger.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_TypesTestLSLInteger.cs
@@ -33,7 +33,7 @@ using OpenSim.Region.ScriptEngine.Shared;
33namespace OpenSim.Region.ScriptEngine.Shared.Tests 33namespace OpenSim.Region.ScriptEngine.Shared.Tests
34{ 34{
35 [TestFixture] 35 [TestFixture]
36 public class LSL_TypesTestLSLInteger 36 public class LSL_TypesTestLSLInteger : OpenSimTestCase
37 { 37 {
38 private Dictionary<double, int> m_doubleIntSet; 38 private Dictionary<double, int> m_doubleIntSet;
39 private Dictionary<string, int> m_stringIntSet; 39 private Dictionary<string, int> m_stringIntSet;
diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_TypesTestLSLString.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_TypesTestLSLString.cs
index c4ca1a8..8550f2d 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_TypesTestLSLString.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_TypesTestLSLString.cs
@@ -33,7 +33,7 @@ using OpenSim.Region.ScriptEngine.Shared;
33namespace OpenSim.Region.ScriptEngine.Shared.Tests 33namespace OpenSim.Region.ScriptEngine.Shared.Tests
34{ 34{
35 [TestFixture] 35 [TestFixture]
36 public class LSL_TypesTestLSLString 36 public class LSL_TypesTestLSLString : OpenSimTestCase
37 { 37 {
38 private Dictionary<double, string> m_doubleStringSet; 38 private Dictionary<double, string> m_doubleStringSet;
39 39
diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_TypesTestList.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_TypesTestList.cs
index b81225f..71b88bc 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_TypesTestList.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_TypesTestList.cs
@@ -36,7 +36,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
36 /// Tests the LSL_Types.list class. 36 /// Tests the LSL_Types.list class.
37 /// </summary> 37 /// </summary>
38 [TestFixture] 38 [TestFixture]
39 public class LSL_TypesTestList 39 public class LSL_TypesTestList : OpenSimTestCase
40 { 40 {
41 /// <summary> 41 /// <summary>
42 /// Tests concatenating a string to a list. 42 /// Tests concatenating a string to a list.
diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_TypesTestVector3.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_TypesTestVector3.cs
index ebf8001..0c838af 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_TypesTestVector3.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Tests/LSL_TypesTestVector3.cs
@@ -36,7 +36,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
36 /// Tests for Vector3 36 /// Tests for Vector3
37 /// </summary> 37 /// </summary>
38 [TestFixture] 38 [TestFixture]
39 public class LSL_TypesTestVector3 39 public class LSL_TypesTestVector3 : OpenSimTestCase
40 { 40 {
41 [Test] 41 [Test]
42 public void TestDotProduct() 42 public void TestDotProduct()
diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAppearanceTest.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAppearanceTest.cs
index c401794..c88bad5 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAppearanceTest.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAppearanceTest.cs
@@ -41,6 +41,7 @@ using OpenSim.Region.OptionalModules.World.NPC;
41using OpenSim.Region.Framework.Scenes; 41using OpenSim.Region.Framework.Scenes;
42using OpenSim.Region.ScriptEngine.Shared; 42using OpenSim.Region.ScriptEngine.Shared;
43using OpenSim.Region.ScriptEngine.Shared.Api; 43using OpenSim.Region.ScriptEngine.Shared.Api;
44using OpenSim.Region.ScriptEngine.Shared.Instance;
44using OpenSim.Services.Interfaces; 45using OpenSim.Services.Interfaces;
45using OpenSim.Tests.Common; 46using OpenSim.Tests.Common;
46using OpenSim.Tests.Common.Mock; 47using OpenSim.Tests.Common.Mock;
@@ -51,14 +52,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
51 /// Tests for OSSL_Api 52 /// Tests for OSSL_Api
52 /// </summary> 53 /// </summary>
53 [TestFixture] 54 [TestFixture]
54 public class OSSL_ApiAppearanceTest 55 public class OSSL_ApiAppearanceTest : OpenSimTestCase
55 { 56 {
56 protected Scene m_scene; 57 protected Scene m_scene;
57 protected XEngine.XEngine m_engine; 58 protected XEngine.XEngine m_engine;
58 59
59 [SetUp] 60 [SetUp]
60 public void SetUp() 61 public override void SetUp()
61 { 62 {
63 base.SetUp();
64
62 IConfigSource initConfigSource = new IniConfigSource(); 65 IConfigSource initConfigSource = new IniConfigSource();
63 IConfig config = initConfigSource.AddConfig("XEngine"); 66 IConfig config = initConfigSource.AddConfig("XEngine");
64 config.Set("Enabled", "true"); 67 config.Set("Enabled", "true");
@@ -91,7 +94,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
91 m_scene.AddSceneObject(so); 94 m_scene.AddSceneObject(so);
92 95
93 OSSL_Api osslApi = new OSSL_Api(); 96 OSSL_Api osslApi = new OSSL_Api();
94 osslApi.Initialize(m_engine, part, null); 97 osslApi.Initialize(m_engine, part, null, null);
95 98
96 string notecardName = "appearanceNc"; 99 string notecardName = "appearanceNc";
97 100
@@ -132,7 +135,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
132 m_scene.AddSceneObject(so); 135 m_scene.AddSceneObject(so);
133 136
134 OSSL_Api osslApi = new OSSL_Api(); 137 OSSL_Api osslApi = new OSSL_Api();
135 osslApi.Initialize(m_engine, part, null); 138 osslApi.Initialize(m_engine, part, null, null);
136 139
137 string notecardName = "appearanceNc"; 140 string notecardName = "appearanceNc";
138 141
diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAttachmentTests.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAttachmentTests.cs
index 5ed1f3d..e422f5b 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAttachmentTests.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiAttachmentTests.cs
@@ -41,6 +41,7 @@ using OpenSim.Region.CoreModules.Framework.InventoryAccess;
41using OpenSim.Region.Framework.Scenes; 41using OpenSim.Region.Framework.Scenes;
42using OpenSim.Region.ScriptEngine.Shared; 42using OpenSim.Region.ScriptEngine.Shared;
43using OpenSim.Region.ScriptEngine.Shared.Api; 43using OpenSim.Region.ScriptEngine.Shared.Api;
44using OpenSim.Region.ScriptEngine.Shared.Instance;
44using OpenSim.Services.Interfaces; 45using OpenSim.Services.Interfaces;
45using OpenSim.Tests.Common; 46using OpenSim.Tests.Common;
46using OpenSim.Tests.Common.Mock; 47using OpenSim.Tests.Common.Mock;
@@ -98,9 +99,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
98 SceneObjectGroup inWorldObj = SceneHelpers.AddSceneObject(m_scene, "inWorldObj", ua1.PrincipalID); 99 SceneObjectGroup inWorldObj = SceneHelpers.AddSceneObject(m_scene, "inWorldObj", ua1.PrincipalID);
99 TaskInventoryItem scriptItem = TaskInventoryHelpers.AddScript(m_scene, inWorldObj.RootPart); 100 TaskInventoryItem scriptItem = TaskInventoryHelpers.AddScript(m_scene, inWorldObj.RootPart);
100 101
101 new LSL_Api().Initialize(m_engine, inWorldObj.RootPart, scriptItem); 102 new LSL_Api().Initialize(m_engine, inWorldObj.RootPart, scriptItem, null);
102 OSSL_Api osslApi = new OSSL_Api(); 103 OSSL_Api osslApi = new OSSL_Api();
103 osslApi.Initialize(m_engine, inWorldObj.RootPart, scriptItem); 104 osslApi.Initialize(m_engine, inWorldObj.RootPart, scriptItem, null);
104 105
105// SceneObjectGroup sog1 = SceneHelpers.CreateSceneObject(1, ua1.PrincipalID); 106// SceneObjectGroup sog1 = SceneHelpers.CreateSceneObject(1, ua1.PrincipalID);
106 107
@@ -144,13 +145,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
144 SceneObjectGroup inWorldObj = SceneHelpers.AddSceneObject(m_scene, "inWorldObj", ua1.PrincipalID); 145 SceneObjectGroup inWorldObj = SceneHelpers.AddSceneObject(m_scene, "inWorldObj", ua1.PrincipalID);
145 TaskInventoryItem scriptItem = TaskInventoryHelpers.AddScript(m_scene, inWorldObj.RootPart); 146 TaskInventoryItem scriptItem = TaskInventoryHelpers.AddScript(m_scene, inWorldObj.RootPart);
146 147
147 new LSL_Api().Initialize(m_engine, inWorldObj.RootPart, scriptItem); 148 new LSL_Api().Initialize(m_engine, inWorldObj.RootPart, scriptItem, null);
148 OSSL_Api osslApi = new OSSL_Api(); 149 OSSL_Api osslApi = new OSSL_Api();
149 osslApi.Initialize(m_engine, inWorldObj.RootPart, scriptItem); 150 osslApi.Initialize(m_engine, inWorldObj.RootPart, scriptItem, null);
150 151
151 // Create an object embedded inside the first 152 // Create an object embedded inside the first
152 TaskInventoryHelpers.AddNotecard( 153 TaskInventoryHelpers.AddNotecard(
153 m_scene, inWorldObj.RootPart, taskInvObjItemName, taskInvObjItemId, TestHelpers.ParseTail(0x900)); 154 m_scene, inWorldObj.RootPart, taskInvObjItemName, taskInvObjItemId, TestHelpers.ParseTail(0x900), "Hello World!");
154 155
155 bool exceptionCaught = false; 156 bool exceptionCaught = false;
156 157
@@ -192,12 +193,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
192 SceneObjectGroup inWorldObj = SceneHelpers.AddSceneObject(m_scene, "inWorldObj", ua1.PrincipalID); 193 SceneObjectGroup inWorldObj = SceneHelpers.AddSceneObject(m_scene, "inWorldObj", ua1.PrincipalID);
193 TaskInventoryItem scriptItem = TaskInventoryHelpers.AddScript(m_scene, inWorldObj.RootPart); 194 TaskInventoryItem scriptItem = TaskInventoryHelpers.AddScript(m_scene, inWorldObj.RootPart);
194 195
195 new LSL_Api().Initialize(m_engine, inWorldObj.RootPart, scriptItem); 196 new LSL_Api().Initialize(m_engine, inWorldObj.RootPart, scriptItem, null);
196 OSSL_Api osslApi = new OSSL_Api(); 197 OSSL_Api osslApi = new OSSL_Api();
197 osslApi.Initialize(m_engine, inWorldObj.RootPart, scriptItem); 198 osslApi.Initialize(m_engine, inWorldObj.RootPart, scriptItem, null);
198 199
199 // Create an object embedded inside the first 200 // Create an object embedded inside the first
200 TaskInventoryHelpers.AddSceneObject(m_scene, inWorldObj.RootPart, taskInvObjItemName, taskInvObjItemId, ua1.PrincipalID); 201 TaskInventoryHelpers.AddSceneObject(
202 m_scene, inWorldObj.RootPart, taskInvObjItemName, taskInvObjItemId, ua1.PrincipalID);
201 203
202 ScenePresence sp2 = SceneHelpers.AddScenePresence(m_scene, ua2); 204 ScenePresence sp2 = SceneHelpers.AddScenePresence(m_scene, ua2);
203 205
diff --git a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs
index b49bcc2..74f010e 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Tests/OSSL_ApiNpcTests.cs
@@ -42,6 +42,7 @@ using OpenSim.Region.OptionalModules.World.NPC;
42using OpenSim.Region.Framework.Scenes; 42using OpenSim.Region.Framework.Scenes;
43using OpenSim.Region.ScriptEngine.Shared; 43using OpenSim.Region.ScriptEngine.Shared;
44using OpenSim.Region.ScriptEngine.Shared.Api; 44using OpenSim.Region.ScriptEngine.Shared.Api;
45using OpenSim.Region.ScriptEngine.Shared.Instance;
45using OpenSim.Region.ScriptEngine.Shared.ScriptBase; 46using OpenSim.Region.ScriptEngine.Shared.ScriptBase;
46using OpenSim.Services.Interfaces; 47using OpenSim.Services.Interfaces;
47using OpenSim.Tests.Common; 48using OpenSim.Tests.Common;
@@ -99,7 +100,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
99 m_scene.AddSceneObject(so); 100 m_scene.AddSceneObject(so);
100 101
101 OSSL_Api osslApi = new OSSL_Api(); 102 OSSL_Api osslApi = new OSSL_Api();
102 osslApi.Initialize(m_engine, part, null); 103 osslApi.Initialize(m_engine, part, null, null);
103 104
104 string notecardName = "appearanceNc"; 105 string notecardName = "appearanceNc";
105 osslApi.osOwnerSaveAppearance(notecardName); 106 osslApi.osOwnerSaveAppearance(notecardName);
@@ -125,14 +126,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
125 m_scene.AddSceneObject(so); 126 m_scene.AddSceneObject(so);
126 127
127 OSSL_Api osslApi = new OSSL_Api(); 128 OSSL_Api osslApi = new OSSL_Api();
128 osslApi.Initialize(m_engine, so.RootPart, null); 129 osslApi.Initialize(m_engine, so.RootPart, null, null);
129 130
130 string npcRaw;
131 bool gotExpectedException = false; 131 bool gotExpectedException = false;
132 try 132 try
133 { 133 {
134 npcRaw 134 osslApi.osNpcCreate("Jane", "Doe", new LSL_Types.Vector3(128, 128, 128), "not existing notecard name");
135 = osslApi.osNpcCreate("Jane", "Doe", new LSL_Types.Vector3(128, 128, 128), "not existing notecard name");
136 } 135 }
137 catch (ScriptException) 136 catch (ScriptException)
138 { 137 {
@@ -162,7 +161,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
162 m_scene.AddSceneObject(so); 161 m_scene.AddSceneObject(so);
163 162
164 OSSL_Api osslApi = new OSSL_Api(); 163 OSSL_Api osslApi = new OSSL_Api();
165 osslApi.Initialize(m_engine, part, null); 164 osslApi.Initialize(m_engine, part, null, null);
166 165
167 string notecardName = "appearanceNc"; 166 string notecardName = "appearanceNc";
168 osslApi.osOwnerSaveAppearance(notecardName); 167 osslApi.osOwnerSaveAppearance(notecardName);
@@ -196,7 +195,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
196 m_scene.AddSceneObject(so); 195 m_scene.AddSceneObject(so);
197 196
198 OSSL_Api osslApi = new OSSL_Api(); 197 OSSL_Api osslApi = new OSSL_Api();
199 osslApi.Initialize(m_engine, part, null); 198 osslApi.Initialize(m_engine, part, null, null);
200 199
201 osslApi.osOwnerSaveAppearance(firstAppearanceNcName); 200 osslApi.osOwnerSaveAppearance(firstAppearanceNcName);
202 201
@@ -223,7 +222,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
223 // Store an avatar with a different height from default in a notecard. 222 // Store an avatar with a different height from default in a notecard.
224 UUID userId = TestHelpers.ParseTail(0x1); 223 UUID userId = TestHelpers.ParseTail(0x1);
225 float firstHeight = 1.9f; 224 float firstHeight = 1.9f;
226 float secondHeight = 2.1f; 225// float secondHeight = 2.1f;
227 string firstAppearanceNcName = "appearanceNc1"; 226 string firstAppearanceNcName = "appearanceNc1";
228 string secondAppearanceNcName = "appearanceNc2"; 227 string secondAppearanceNcName = "appearanceNc2";
229 228
@@ -234,7 +233,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
234 m_scene.AddSceneObject(so); 233 m_scene.AddSceneObject(so);
235 234
236 OSSL_Api osslApi = new OSSL_Api(); 235 OSSL_Api osslApi = new OSSL_Api();
237 osslApi.Initialize(m_engine, part, null); 236 osslApi.Initialize(m_engine, part, null, null);
238 237
239 osslApi.osOwnerSaveAppearance(firstAppearanceNcName); 238 osslApi.osOwnerSaveAppearance(firstAppearanceNcName);
240 239
@@ -286,10 +285,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
286 m_scene.AddSceneObject(otherSo); 285 m_scene.AddSceneObject(otherSo);
287 286
288 OSSL_Api osslApi = new OSSL_Api(); 287 OSSL_Api osslApi = new OSSL_Api();
289 osslApi.Initialize(m_engine, part, null); 288 osslApi.Initialize(m_engine, part, null, null);
290 289
291 OSSL_Api otherOsslApi = new OSSL_Api(); 290 OSSL_Api otherOsslApi = new OSSL_Api();
292 otherOsslApi.Initialize(m_engine, otherPart, null); 291 otherOsslApi.Initialize(m_engine, otherPart, null, null);
293 292
294 string notecardName = "appearanceNc"; 293 string notecardName = "appearanceNc";
295 osslApi.osOwnerSaveAppearance(notecardName); 294 osslApi.osOwnerSaveAppearance(notecardName);
@@ -333,7 +332,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Tests
333 m_scene.AddSceneObject(so); 332 m_scene.AddSceneObject(so);
334 333
335 OSSL_Api osslApi = new OSSL_Api(); 334 OSSL_Api osslApi = new OSSL_Api();
336 osslApi.Initialize(m_engine, part, null); 335 osslApi.Initialize(m_engine, part, null, null);
337 336
338 string notecardName = "appearanceNc"; 337 string notecardName = "appearanceNc";
339 osslApi.osOwnerSaveAppearance(notecardName); 338 osslApi.osOwnerSaveAppearance(notecardName);