diff options
Diffstat (limited to 'OpenSim/Region/ScriptEngine/Shared')
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 | ||
28 | using System; | 28 | using System; |
29 | using System.Threading; | ||
29 | using System.Reflection; | 30 | using System.Reflection; |
30 | using System.Collections; | 31 | using System.Collections; |
31 | using System.Collections.Generic; | 32 | using 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; | |||
48 | using OpenSim.Region.Framework.Scenes; | 48 | using OpenSim.Region.Framework.Scenes; |
49 | using OpenSim.Region.Framework.Scenes.Serialization; | 49 | using OpenSim.Region.Framework.Scenes.Serialization; |
50 | using OpenSim.Region.Framework.Scenes.Animation; | 50 | using OpenSim.Region.Framework.Scenes.Animation; |
51 | using OpenSim.Region.Framework.Scenes.Scripting; | ||
51 | using OpenSim.Region.Physics.Manager; | 52 | using OpenSim.Region.Physics.Manager; |
52 | using OpenSim.Region.ScriptEngine.Shared; | 53 | using OpenSim.Region.ScriptEngine.Shared; |
53 | using OpenSim.Region.ScriptEngine.Shared.Api.Plugins; | 54 | using 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; | |||
30 | using System.Collections; | 30 | using System.Collections; |
31 | using System.Collections.Generic; | 31 | using System.Collections.Generic; |
32 | using System.Runtime.Remoting.Lifetime; | 32 | using System.Runtime.Remoting.Lifetime; |
33 | using System.Threading; | ||
33 | using OpenMetaverse; | 34 | using OpenMetaverse; |
34 | using Nini.Config; | 35 | using Nini.Config; |
35 | using OpenSim; | 36 | using 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; | |||
30 | using System.Collections; | 30 | using System.Collections; |
31 | using System.Collections.Generic; | 31 | using System.Collections.Generic; |
32 | using System.Runtime.Remoting.Lifetime; | 32 | using System.Runtime.Remoting.Lifetime; |
33 | using System.Threading; | ||
34 | using log4net; | ||
33 | using OpenMetaverse; | 35 | using OpenMetaverse; |
34 | using Nini.Config; | 36 | using Nini.Config; |
35 | using OpenSim; | 37 | using 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; | |||
31 | using System.Reflection; | 31 | using System.Reflection; |
32 | using log4net; | 32 | using log4net; |
33 | using Tools; | 33 | using Tools; |
34 | |||
35 | using OpenSim.Region.Framework.Interfaces; | 34 | using OpenSim.Region.Framework.Interfaces; |
36 | 35 | ||
37 | namespace OpenSim.Region.ScriptEngine.Shared.CodeTools | 36 | namespace 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 { " + | 468 | using System.Collections.Generic; |
459 | String.Empty + "public class Script : OpenSim.Region.ScriptEngine.Shared.ScriptBase.ScriptBaseClass { \r\n" + | 469 | |
460 | @"public Script() { } " + | 470 | namespace 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 | |||
28 | using System; | ||
29 | using System.Collections.Generic; | ||
30 | using System.Threading; | ||
31 | using Nini.Config; | ||
32 | using NUnit.Framework; | ||
33 | using OpenMetaverse; | ||
34 | using OpenSim.Framework; | ||
35 | using OpenSim.Region.CoreModules.Scripting.WorldComm; | ||
36 | using OpenSim.Region.Framework.Scenes; | ||
37 | using OpenSim.Region.Framework.Interfaces; | ||
38 | using OpenSim.Region.ScriptEngine.XEngine; | ||
39 | using OpenSim.Tests.Common; | ||
40 | using OpenSim.Tests.Common.Mock; | ||
41 | |||
42 | namespace 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 | @" | ||
369 | integer i = 0; | ||
370 | |||
371 | ufn1() | ||
372 | { | ||
373 | llSay(0, ""Iter ufn1() "" + (string)i++); | ||
374 | ufn1(); | ||
375 | } | ||
376 | |||
377 | default | ||
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 | |||
28 | using System; | ||
29 | using System.Collections.Generic; | ||
30 | using System.IO; | ||
31 | using System.Net; | ||
32 | using System.Reflection; | ||
33 | using System.Text; | ||
34 | using log4net; | ||
35 | using Nini.Config; | ||
36 | using NUnit.Framework; | ||
37 | using OpenMetaverse; | ||
38 | using OpenSim.Framework; | ||
39 | using OpenSim.Framework.Servers; | ||
40 | using OpenSim.Framework.Servers.HttpServer; | ||
41 | using OpenSim.Region.CoreModules.Scripting.LSLHttp; | ||
42 | using OpenSim.Region.Framework.Scenes; | ||
43 | using OpenSim.Region.ScriptEngine.Shared; | ||
44 | using OpenSim.Region.ScriptEngine.Shared.Api; | ||
45 | using OpenSim.Region.ScriptEngine.Shared.ScriptBase; | ||
46 | using OpenSim.Services.Interfaces; | ||
47 | using OpenSim.Tests.Common; | ||
48 | using OpenSim.Tests.Common.Mock; | ||
49 | |||
50 | namespace 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; | |||
41 | using OpenSim.Region.Framework.Scenes; | 41 | using OpenSim.Region.Framework.Scenes; |
42 | using OpenSim.Region.ScriptEngine.Shared; | 42 | using OpenSim.Region.ScriptEngine.Shared; |
43 | using OpenSim.Region.ScriptEngine.Shared.Api; | 43 | using OpenSim.Region.ScriptEngine.Shared.Api; |
44 | using OpenSim.Region.ScriptEngine.Shared.Instance; | ||
44 | using OpenSim.Services.Interfaces; | 45 | using OpenSim.Services.Interfaces; |
45 | using OpenSim.Tests.Common; | 46 | using OpenSim.Tests.Common; |
46 | using OpenSim.Tests.Common.Mock; | 47 | using 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; | |||
41 | using OpenSim.Region.Framework.Scenes; | 41 | using OpenSim.Region.Framework.Scenes; |
42 | using OpenSim.Region.ScriptEngine.Shared; | 42 | using OpenSim.Region.ScriptEngine.Shared; |
43 | using OpenSim.Region.ScriptEngine.Shared.Api; | 43 | using OpenSim.Region.ScriptEngine.Shared.Api; |
44 | using OpenSim.Region.ScriptEngine.Shared.Instance; | ||
44 | using OpenSim.Region.ScriptEngine.Shared.ScriptBase; | 45 | using OpenSim.Region.ScriptEngine.Shared.ScriptBase; |
45 | using OpenSim.Services.Interfaces; | 46 | using OpenSim.Services.Interfaces; |
46 | using OpenSim.Tests.Common; | 47 | using 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; | |||
34 | using OpenSim.Region.Framework.Scenes; | 34 | using OpenSim.Region.Framework.Scenes; |
35 | using Nini.Config; | 35 | using Nini.Config; |
36 | using OpenSim.Region.ScriptEngine.Shared.Api; | 36 | using OpenSim.Region.ScriptEngine.Shared.Api; |
37 | using OpenSim.Region.ScriptEngine.Shared.Instance; | ||
37 | using OpenSim.Region.ScriptEngine.Shared.ScriptBase; | 38 | using OpenSim.Region.ScriptEngine.Shared.ScriptBase; |
38 | using OpenMetaverse; | 39 | using OpenMetaverse; |
39 | using OpenSim.Tests.Common.Mock; | 40 | using OpenSim.Tests.Common.Mock; |
@@ -46,13 +47,15 @@ using LSL_String = OpenSim.Region.ScriptEngine.Shared.LSL_Types.LSLString; | |||
46 | namespace OpenSim.Region.ScriptEngine.Shared.Tests | 47 | namespace 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 @@ | |||
1 | using System; | ||
2 | using System.Collections.Generic; | ||
3 | using System.IO; | ||
4 | using System.Net; | ||
5 | using System.Reflection; | ||
6 | using System.Text; | ||
7 | using log4net; | ||
8 | using Nini.Config; | ||
9 | using NUnit.Framework; | ||
10 | using OpenMetaverse; | ||
11 | using OpenSim.Framework; | ||
12 | using OpenSim.Framework.Servers; | ||
13 | using OpenSim.Framework.Servers.HttpServer; | ||
14 | using OpenSim.Region.CoreModules.Scripting.LSLHttp; | ||
15 | using OpenSim.Region.Framework.Scenes; | ||
16 | using OpenSim.Region.ScriptEngine.Shared; | ||
17 | using OpenSim.Region.ScriptEngine.Shared.Api; | ||
18 | using OpenSim.Region.ScriptEngine.Shared.ScriptBase; | ||
19 | using OpenSim.Services.Interfaces; | ||
20 | using OpenSim.Tests.Common; | ||
21 | using OpenSim.Tests.Common.Mock; | ||
22 | |||
23 | namespace 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; | |||
33 | using OpenSim.Region.Framework.Scenes; | 33 | using OpenSim.Region.Framework.Scenes; |
34 | using Nini.Config; | 34 | using Nini.Config; |
35 | using OpenSim.Region.ScriptEngine.Shared.Api; | 35 | using OpenSim.Region.ScriptEngine.Shared.Api; |
36 | using OpenSim.Region.ScriptEngine.Shared.Instance; | ||
36 | using OpenSim.Region.ScriptEngine.Shared.ScriptBase; | 37 | using OpenSim.Region.ScriptEngine.Shared.ScriptBase; |
37 | using OpenMetaverse; | 38 | using OpenMetaverse; |
38 | using System; | 39 | using 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; | |||
33 | namespace OpenSim.Region.ScriptEngine.Shared.Tests | 33 | namespace 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; | |||
33 | namespace OpenSim.Region.ScriptEngine.Shared.Tests | 33 | namespace 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; | |||
33 | namespace OpenSim.Region.ScriptEngine.Shared.Tests | 33 | namespace 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; | |||
41 | using OpenSim.Region.Framework.Scenes; | 41 | using OpenSim.Region.Framework.Scenes; |
42 | using OpenSim.Region.ScriptEngine.Shared; | 42 | using OpenSim.Region.ScriptEngine.Shared; |
43 | using OpenSim.Region.ScriptEngine.Shared.Api; | 43 | using OpenSim.Region.ScriptEngine.Shared.Api; |
44 | using OpenSim.Region.ScriptEngine.Shared.Instance; | ||
44 | using OpenSim.Services.Interfaces; | 45 | using OpenSim.Services.Interfaces; |
45 | using OpenSim.Tests.Common; | 46 | using OpenSim.Tests.Common; |
46 | using OpenSim.Tests.Common.Mock; | 47 | using 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; | |||
41 | using OpenSim.Region.Framework.Scenes; | 41 | using OpenSim.Region.Framework.Scenes; |
42 | using OpenSim.Region.ScriptEngine.Shared; | 42 | using OpenSim.Region.ScriptEngine.Shared; |
43 | using OpenSim.Region.ScriptEngine.Shared.Api; | 43 | using OpenSim.Region.ScriptEngine.Shared.Api; |
44 | using OpenSim.Region.ScriptEngine.Shared.Instance; | ||
44 | using OpenSim.Services.Interfaces; | 45 | using OpenSim.Services.Interfaces; |
45 | using OpenSim.Tests.Common; | 46 | using OpenSim.Tests.Common; |
46 | using OpenSim.Tests.Common.Mock; | 47 | using 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; | |||
42 | using OpenSim.Region.Framework.Scenes; | 42 | using OpenSim.Region.Framework.Scenes; |
43 | using OpenSim.Region.ScriptEngine.Shared; | 43 | using OpenSim.Region.ScriptEngine.Shared; |
44 | using OpenSim.Region.ScriptEngine.Shared.Api; | 44 | using OpenSim.Region.ScriptEngine.Shared.Api; |
45 | using OpenSim.Region.ScriptEngine.Shared.Instance; | ||
45 | using OpenSim.Region.ScriptEngine.Shared.ScriptBase; | 46 | using OpenSim.Region.ScriptEngine.Shared.ScriptBase; |
46 | using OpenSim.Services.Interfaces; | 47 | using OpenSim.Services.Interfaces; |
47 | using OpenSim.Tests.Common; | 48 | using 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); |