From 335c1b44206531bc6c0996157884d6873a580527 Mon Sep 17 00:00:00 2001
From: Thomas Grimshaw
Date: Wed, 7 Apr 2010 07:48:26 +0200
Subject: Implement PSYS_SRC_INNERANGLE and PSYS_SRC_OUTERANGLE
---
.../Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | 10 ++++++++++
1 file changed, 10 insertions(+)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index a76f386..5be8929 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -6195,6 +6195,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
tempf = (float)rules.GetLSLFloatItem(i + 1);
prules.OuterAngle = (float)tempf;
break;
+
+ case (int)ScriptBaseClass.PSYS_SRC_INNERANGLE:
+ tempf = (float)rules.GetLSLFloatItem(i + 1);
+ prules.InnerAngle = (float)tempf;
+ break;
+
+ case (int)ScriptBaseClass.PSYS_SRC_OUTERANGLE:
+ tempf = (float)rules.GetLSLFloatItem(i + 1);
+ prules.OuterAngle = (float)tempf;
+ break;
}
}
--
cgit v1.1
From 20e3de1f0a1434d51cf833b6418e983101438568 Mon Sep 17 00:00:00 2001
From: Thomas Grimshaw
Date: Wed, 7 Apr 2010 08:28:57 +0200
Subject: Add CHANGED_REGION_START (alias for CHANGED_REGION_RESTART as per LL
Jira SVC-3773)
---
OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs | 1 +
1 file changed, 1 insertion(+)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs
index ee35fa4..b3e4740 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/LSL_Constants.cs
@@ -274,6 +274,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
public const int CHANGED_ALLOWED_DROP = 64;
public const int CHANGED_OWNER = 128;
public const int CHANGED_REGION_RESTART = 256;
+ public const int CHANGED_REGION_START = 256; //LL Changed the constant from CHANGED_REGION_RESTART
public const int CHANGED_REGION = 512;
public const int CHANGED_TELEPORT = 1024;
public const int CHANGED_ANIMATION = 16384;
--
cgit v1.1
From db5ea850f66308038b16c4adcabd9e0d529ec947 Mon Sep 17 00:00:00 2001
From: Thomas Grimshaw
Date: Wed, 7 Apr 2010 09:49:11 +0200
Subject: Fix llLookAt so that it doesn't "roll" the object and more closely
imitates the behaviour in SL. ( http://bugs.meta7.com/view.php?id=28 )
---
.../Shared/Api/Implementation/LSL_Api.cs | 20 ++++++++++++++++----
1 file changed, 16 insertions(+), 4 deletions(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 5be8929..75dd615 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -2881,6 +2881,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
public void llLookAt(LSL_Vector target, double strength, double damping)
{
+ /*
m_host.AddScriptLPS(1);
// Determine where we are looking from
LSL_Vector from = llGetPos();
@@ -2900,12 +2901,23 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
// the angles of rotation in radians into rotation value
LSL_Types.Quaternion rot = llEuler2Rot(angle);
- /*
- Quaternion rotation = new Quaternion((float)rot.x, (float)rot.y, (float)rot.z, (float)rot.s);
- m_host.startLookAt(rotation, (float)damping, (float)strength);
- This would only work if your physics system contains an APID controller */
+
+ // This would only work if your physics system contains an APID controller:
+ // Quaternion rotation = new Quaternion((float)rot.x, (float)rot.y, (float)rot.z, (float)rot.s);
+ // m_host.startLookAt(rotation, (float)damping, (float)strength);
+
// Orient the object to the angle calculated
llSetRot(rot);
+ */
+
+ //The above code, while nice, doesn't replicate the behaviour of SL and tends to "roll" the object.
+ //There's probably a smarter way of doing this, my rotation math-fu is weak.
+ // http://bugs.meta7.com/view.php?id=28
+ // - Tom
+
+ LSL_Rotation newrot = llGetRot() * llRotBetween(new LSL_Vector(1.0d, 0.0d, 0.0d) * llGetRot(), new LSL_Vector(0.0d, 0.0d, -1.0d));
+ llSetRot(newrot * llRotBetween(new LSL_Vector(0.0d,0.0d,1.0d) * newrot, target - llGetPos()));
+
}
public void llRotLookAt(LSL_Rotation target, double strength, double damping)
--
cgit v1.1
From 309f440fc04cc965e31232947bed698864308356 Mon Sep 17 00:00:00 2001
From: Thomas Grimshaw
Date: Wed, 7 Apr 2010 10:13:47 +0200
Subject: Fix llDialog responses so that they can be heard throughout the
region. This now conforms to the behaviour in SL. (
http://bugs.meta7.com/view.php?id=13 )
---
OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
index ebcdd62..b0e3655 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
@@ -5200,7 +5200,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP
args.Channel = ch;
args.From = String.Empty;
args.Message = Utils.BytesToString(msg);
- args.Type = ChatTypeEnum.Shout;
+ args.Type = ChatTypeEnum.Region; //Behaviour in SL is that the response can be heard from any distance
args.Position = new Vector3();
args.Scene = Scene;
args.Sender = this;
--
cgit v1.1
From e80e04c5fd3892cf3c988baaa00aa8ccfa330256 Mon Sep 17 00:00:00 2001
From: Thomas Grimshaw
Date: Wed, 7 Apr 2010 22:59:13 +0200
Subject: Increase the amount of time we wait for a teleport to complete. This
allows teleportation to a remote region without a local connection to the
asset server without timing out.
---
OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
index 5f84252..04626d3 100644
--- a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
@@ -1032,7 +1032,7 @@ namespace OpenSim.Region.Framework.Scenes
public bool WaitForCallback(UUID id)
{
- int count = 200;
+ int count = 400;
while (m_agentsInTransit.Contains(id) && count-- > 0)
{
//m_log.Debug(" >>> Waiting... " + count);
--
cgit v1.1
From d834a2c3da1aa97887e087e5a265e73a914c5f7b Mon Sep 17 00:00:00 2001
From: Thomas Grimshaw
Date: Wed, 7 Apr 2010 23:53:08 +0200
Subject: Implement cmGetAvatarList(). This returns a strided list of all
avatars in the region, including their UUID, position and name. The radar is
often the most taxing scripts on a sim, this function can help radars reduce
their impact by 66% by eliminating the need for sensors.
---
.../Shared/Api/Implementation/CM_Api.cs | 130 ++++++++++++---------
.../ScriptEngine/Shared/Api/Interface/ICM_Api.cs | 3 +-
.../ScriptEngine/Shared/Api/Runtime/CM_Stub.cs | 14 ++-
3 files changed, 87 insertions(+), 60 deletions(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/CM_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/CM_Api.cs
index 99973b4..9f829da 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/CM_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/CM_Api.cs
@@ -86,6 +86,28 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
}
///
+ /// Like osGetAgents but returns enough info for a radar
+ ///
+ /// Strided list of the UUID, position and name of each avatar in the region
+ public LSL_List cmGetAvatarList()
+ {
+ LSL_List result = new LSL_List();
+ foreach (ScenePresence avatar in World.GetAvatars())
+ {
+ if (avatar.UUID != m_host.OwnerID)
+ {
+ if (avatar.IsChildAgent == false)
+ {
+ result.Add(avatar.UUID);
+ result.Add(avatar.PhysicsActor.Position);
+ result.Add(avatar.Name);
+ }
+ }
+ }
+ return result;
+ }
+
+ ///
/// Get the current Windlight scene
///
/// List of windlight parameters
@@ -229,10 +251,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
return values;
- }
-
+ }
+
private RegionMeta7WindlightData getWindlightProfileFromRules(LSL_List rules)
- {
+ {
RegionMeta7WindlightData wl = (RegionMeta7WindlightData)m_host.ParentGroup.Scene.RegionInfo.WindlightSettings.Clone();
LSL_List values = new LSL_List();
@@ -244,9 +266,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
LSL_Types.Vector3 iV;
switch (rule)
{
- case (int)ScriptBaseClass.WL_SUN_MOON_POSITION:
- idx++;
- wl.sunMoonPosition = (float)rules.GetLSLFloatItem(idx);
+ case (int)ScriptBaseClass.WL_SUN_MOON_POSITION:
+ idx++;
+ wl.sunMoonPosition = (float)rules.GetLSLFloatItem(idx);
break;
case (int)ScriptBaseClass.WL_AMBIENT:
idx++;
@@ -419,58 +441,58 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
{
CMShoutError("Careminster functions are not enabled.");
return 0;
- }
- if (!World.RegionInfo.EstateSettings.IsEstateManager(m_host.OwnerID) && World.GetScenePresence(m_host.OwnerID).GodLevel < 200)
- {
- CMShoutError("cmSetWindlightScene can only be used by estate managers or owners.");
- return 0;
+ }
+ if (!World.RegionInfo.EstateSettings.IsEstateManager(m_host.OwnerID) && World.GetScenePresence(m_host.OwnerID).GodLevel < 200)
+ {
+ CMShoutError("cmSetWindlightScene can only be used by estate managers or owners.");
+ return 0;
+ }
+ int success = 0;
+ m_host.AddScriptLPS(1);
+ if (Meta7WindlightModule.EnableWindlight)
+ {
+ RegionMeta7WindlightData wl = getWindlightProfileFromRules(rules);
+ m_host.ParentGroup.Scene.StoreWindlightProfile(wl);
+ success = 1;
+ }
+ else
+ {
+ CMShoutError("Windlight module is disabled");
+ return 0;
+ }
+ return success;
+ }
+ ///
+ /// Set the current Windlight scene to a target avatar
+ ///
+ ///
+ /// success: true or false
+ public int cmSetWindlightSceneTargeted(LSL_List rules, LSL_Key target)
+ {
+ if (!m_CMFunctionsEnabled)
+ {
+ CMShoutError("Careminster functions are not enabled.");
+ return 0;
+ }
+ if (!World.RegionInfo.EstateSettings.IsEstateManager(m_host.OwnerID) && World.GetScenePresence(m_host.OwnerID).GodLevel < 200)
+ {
+ CMShoutError("cmSetWindlightSceneTargeted can only be used by estate managers or owners.");
+ return 0;
}
int success = 0;
- m_host.AddScriptLPS(1);
- if (Meta7WindlightModule.EnableWindlight)
- {
- RegionMeta7WindlightData wl = getWindlightProfileFromRules(rules);
- m_host.ParentGroup.Scene.StoreWindlightProfile(wl);
- success = 1;
- }
- else
- {
- CMShoutError("Windlight module is disabled");
- return 0;
+ m_host.AddScriptLPS(1);
+ if (Meta7WindlightModule.EnableWindlight)
+ {
+ RegionMeta7WindlightData wl = getWindlightProfileFromRules(rules);
+ World.EventManager.TriggerOnSendNewWindlightProfileTargeted(wl, new UUID(target.m_string));
+ success = 1;
+ }
+ else
+ {
+ CMShoutError("Windlight module is disabled");
+ return 0;
}
return success;
- }
- ///
- /// Set the current Windlight scene to a target avatar
- ///
- ///
- /// success: true or false
- public int cmSetWindlightSceneTargeted(LSL_List rules, LSL_Key target)
- {
- if (!m_CMFunctionsEnabled)
- {
- CMShoutError("Careminster functions are not enabled.");
- return 0;
- }
- if (!World.RegionInfo.EstateSettings.IsEstateManager(m_host.OwnerID) && World.GetScenePresence(m_host.OwnerID).GodLevel < 200)
- {
- CMShoutError("cmSetWindlightSceneTargeted can only be used by estate managers or owners.");
- return 0;
- }
- int success = 0;
- m_host.AddScriptLPS(1);
- if (Meta7WindlightModule.EnableWindlight)
- {
- RegionMeta7WindlightData wl = getWindlightProfileFromRules(rules);
- World.EventManager.TriggerOnSendNewWindlightProfileTargeted(wl, new UUID(target.m_string));
- success = 1;
- }
- else
- {
- CMShoutError("Windlight module is disabled");
- return 0;
- }
- return success;
}
}
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ICM_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ICM_Api.cs
index ef990a1..6239726 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ICM_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/ICM_Api.cs
@@ -15,7 +15,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
{
// Windlight Functions
LSL_List cmGetWindlightScene(LSL_List rules);
- int cmSetWindlightScene(LSL_List rules);
+ int cmSetWindlightScene(LSL_List rules);
int cmSetWindlightSceneTargeted(LSL_List rules, key target);
+ LSL_List cmGetAvatarList();
}
}
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/CM_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/CM_Stub.cs
index 5bc3a88..aaffbe4 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/CM_Stub.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/CM_Stub.cs
@@ -66,11 +66,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
public int cmSetWindlightScene(LSL_List rules)
{
return m_CM_Functions.cmSetWindlightScene(rules);
- }
-
- public int cmSetWindlightSceneTargeted(LSL_List rules, key target)
- {
- return m_CM_Functions.cmSetWindlightSceneTargeted(rules, target);
+ }
+
+ public int cmSetWindlightSceneTargeted(LSL_List rules, key target)
+ {
+ return m_CM_Functions.cmSetWindlightSceneTargeted(rules, target);
+ }
+ public LSL_List cmGetAvatarList()
+ {
+ return m_CM_Functions.cmGetAvatarList();
}
}
}
--
cgit v1.1
From 7701ea27983be851a3c9d3954346018e07680ae6 Mon Sep 17 00:00:00 2001
From: Melanie
Date: Fri, 9 Apr 2010 06:49:14 +0100
Subject: Add Scene.SnmpService, which is of type ISnmpModule and, if nun-null,
can be used to send snmp alerts
---
OpenSim/Region/Framework/Scenes/Scene.cs | 14 ++++++++++++++
1 file changed, 14 insertions(+)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 55f4550..db073e8 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -158,6 +158,20 @@ namespace OpenSim.Region.Framework.Scenes
public IXfer XferManager;
+ protected ISnmpModule m_snmpService = null;
+ public ISnmpModule SnmpService
+ {
+ get
+ {
+ if (m_snmpService == null)
+ {
+ m_snmpService = RequestModuleInterface();
+ }
+
+ return m_snmpService;
+ }
+ }
+
protected IAssetService m_AssetService;
protected IAuthorizationService m_AuthorizationService;
--
cgit v1.1
From d975bd8e5c937314bbcd5c3b66a48f87057358d0 Mon Sep 17 00:00:00 2001
From: lcc
Date: Sat, 10 Apr 2010 17:51:51 +0200
Subject: Fixing Trap
---
OpenSim/Region/Framework/Interfaces/ISnmpModule.cs | 11 -----------
1 file changed, 11 deletions(-)
delete mode 100644 OpenSim/Region/Framework/Interfaces/ISnmpModule.cs
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/Framework/Interfaces/ISnmpModule.cs b/OpenSim/Region/Framework/Interfaces/ISnmpModule.cs
deleted file mode 100644
index 9790fc7..0000000
--- a/OpenSim/Region/Framework/Interfaces/ISnmpModule.cs
+++ /dev/null
@@ -1,11 +0,0 @@
-///////////////////////////////////////////////////////////////////
-//
-// (c) Careminster LImited, Melanie Thielker and the Meta7 Team
-//
-// This file is not open source. All rights reserved
-//
-public interface ISnmpModule
-{
- void Alert(string message);
- void Trap(string message);
-}
--
cgit v1.1
From 58dac970afb09bc003c7089f35fe592516fb209e Mon Sep 17 00:00:00 2001
From: lcc
Date: Sat, 10 Apr 2010 18:05:08 +0200
Subject: re-fixing this darn file
---
OpenSim/Region/Framework/Interfaces/ISnmpModule.cs | 11 +++++++++++
1 file changed, 11 insertions(+)
create mode 100644 OpenSim/Region/Framework/Interfaces/ISnmpModule.cs
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/Framework/Interfaces/ISnmpModule.cs b/OpenSim/Region/Framework/Interfaces/ISnmpModule.cs
new file mode 100644
index 0000000..4e03df5
--- /dev/null
+++ b/OpenSim/Region/Framework/Interfaces/ISnmpModule.cs
@@ -0,0 +1,11 @@
+///////////////////////////////////////////////////////////////////
+//
+// (c) Careminster LImited, Melanie Thielker and the Meta7 Team
+//
+// This file is not open source. All rights reserved
+//
+public interface ISnmpModule
+{
+ void Alert(string message);
+ void Trap(int code,string simname,string Message);
+}
--
cgit v1.1
From 0b2b2daf23dbf7a51f3d568903548cd964334ce2 Mon Sep 17 00:00:00 2001
From: Mike Rieker
Date: Sat, 10 Apr 2010 14:43:26 -0400
Subject: guarantee that a script engine's GetScriptErrors() will not be called
until after its OnRezScript() returns so that script compile error messages
can be retrieved
---
.../Framework/Interfaces/IEntityInventory.cs | 4 +-
OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 3 +-
.../Framework/Scenes/SceneObjectPartInventory.cs | 76 +++++++++++++++++++---
3 files changed, 71 insertions(+), 12 deletions(-)
(limited to 'OpenSim/Region')
diff --git a/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs b/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs
index f58904f..16ca3f9 100644
--- a/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs
+++ b/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs
@@ -73,8 +73,6 @@ namespace OpenSim.Region.Framework.Interfaces
///
void CreateScriptInstances(int startParam, bool postOnRez, string engine, int stateSource);
- ArrayList GetScriptErrors(UUID itemID);
-
///
/// Stop all the scripts in this entity.
///
@@ -104,6 +102,8 @@ namespace OpenSim.Region.Framework.Interfaces
///
void CreateScriptInstance(UUID itemId, int startParam, bool postOnRez, string engine, int stateSource);
+ ArrayList CreateScriptInstanceEr(UUID itemId, int startParam, bool postOnRez, string engine, int stateSource);
+
///
/// Stop a script which is in this prim's inventory.
///
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index b04871e..6c57d18 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -271,8 +271,7 @@ namespace OpenSim.Region.Framework.Scenes
{
// Needs to determine which engine was running it and use that
//
- part.Inventory.CreateScriptInstance(item.ItemID, 0, false, DefaultScriptEngine, 0);
- errors = part.Inventory.GetScriptErrors(item.ItemID);
+ errors = part.Inventory.CreateScriptInstanceEr(item.ItemID, 0, false, DefaultScriptEngine, 0);
}
else
{
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
index 5d00917..d03b464 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
@@ -46,6 +46,8 @@ namespace OpenSim.Region.Framework.Scenes
private string m_inventoryFileName = String.Empty;
private int m_inventoryFileNameSerial = 0;
+
+ private Dictionary m_scriptErrors = new Dictionary();
///
/// The part to which the inventory belongs.
@@ -211,7 +213,7 @@ namespace OpenSim.Region.Framework.Scenes
}
}
- public ArrayList GetScriptErrors(UUID itemID)
+ private ArrayList GetScriptErrors(UUID itemID)
{
ArrayList ret = new ArrayList();
@@ -270,7 +272,10 @@ namespace OpenSim.Region.Framework.Scenes
// item.Name, item.ItemID, Name, UUID);
if (!m_part.ParentGroup.Scene.Permissions.CanRunScript(item.ItemID, m_part.UUID, item.OwnerID))
+ {
+ StoreScriptError(item.ItemID, "no permission");
return;
+ }
m_part.AddFlag(PrimFlags.Scripted);
@@ -285,6 +290,7 @@ namespace OpenSim.Region.Framework.Scenes
m_items.LockItemsForWrite(false);
m_part.ParentGroup.Scene.EventManager.TriggerRezScript(
m_part.LocalId, item.ItemID, String.Empty, startParam, postOnRez, engine, stateSource);
+ StoreScriptErrors(item.ItemID, GetScriptErrors(item.ItemID));
m_part.ParentGroup.AddActiveScriptCount(1);
m_part.ScheduleFullUpdate();
return;
@@ -294,11 +300,13 @@ namespace OpenSim.Region.Framework.Scenes
{
if (null == asset)
{
+ string msg = String.Format("asset ID {0} could not be found", item.AssetID);
+ StoreScriptError(item.ItemID, msg);
m_log.ErrorFormat(
"[PRIM INVENTORY]: " +
- "Couldn't start script {0}, {1} at {2} in {3} since asset ID {4} could not be found",
+ "Couldn't start script {0}, {1} at {2} in {3} since {4}",
item.Name, item.ItemID, m_part.AbsolutePosition,
- m_part.ParentGroup.Scene.RegionInfo.RegionName, item.AssetID);
+ m_part.ParentGroup.Scene.RegionInfo.RegionName, msg);
}
else
{
@@ -311,11 +319,16 @@ namespace OpenSim.Region.Framework.Scenes
string script = Utils.BytesToString(asset.Data);
m_part.ParentGroup.Scene.EventManager.TriggerRezScript(
m_part.LocalId, item.ItemID, script, startParam, postOnRez, engine, stateSource);
+ StoreScriptErrors(item.ItemID, GetScriptErrors(item.ItemID));
m_part.ParentGroup.AddActiveScriptCount(1);
m_part.ScheduleFullUpdate();
}
});
}
+ else
+ {
+ StoreScriptError(item.ItemID, "scripts disabled");
+ }
}
private void RestoreSavedScriptState(UUID oldID, UUID newID)
@@ -392,24 +405,71 @@ namespace OpenSim.Region.Framework.Scenes
else
{
m_items.LockItemsForRead(false);
+ string msg = String.Format("couldn't be found for prim {0}, {1} at {2} in {3}", m_part.Name, m_part.UUID,
+ m_part.AbsolutePosition, m_part.ParentGroup.Scene.RegionInfo.RegionName);
+ StoreScriptError(itemId, msg);
m_log.ErrorFormat(
"[PRIM INVENTORY]: " +
- "Couldn't start script with ID {0} since it couldn't be found for prim {1}, {2} at {3} in {4}",
- itemId, m_part.Name, m_part.UUID,
- m_part.AbsolutePosition, m_part.ParentGroup.Scene.RegionInfo.RegionName);
+ "Couldn't start script with ID {0} since it {1}", itemId, msg);
}
}
else
{
m_items.LockItemsForRead(false);
+ string msg = String.Format("couldn't be found for prim {0}, {1}", m_part.Name, m_part.UUID);
+ StoreScriptError(itemId, msg);
m_log.ErrorFormat(
"[PRIM INVENTORY]: " +
- "Couldn't start script with ID {0} since it couldn't be found for prim {1}, {2}",
- itemId, m_part.Name, m_part.UUID);
+ "Couldn't start script with ID {0} since it {1}", itemId, msg);
}
}
+ public ArrayList CreateScriptInstanceEr(UUID itemId, int startParam, bool postOnRez, string engine, int stateSource)
+ {
+ ArrayList errors;
+
+ lock (m_scriptErrors)
+ {
+ m_scriptErrors.Remove(itemId);
+ }
+ CreateScriptInstance(itemId, startParam, postOnRez, engine, stateSource);
+ lock (m_scriptErrors)
+ {
+ while (!m_scriptErrors.TryGetValue(itemId, out errors))
+ {
+ if (!System.Threading.Monitor.Wait(m_scriptErrors, 15000))
+ {
+ m_log.ErrorFormat(
+ "[PRIM INVENTORY]: " +
+ "timedout waiting for script {0} errors", itemId);
+ if (!m_scriptErrors.TryGetValue(itemId, out errors))
+ {
+ errors = new ArrayList(1);
+ errors.Add("timedout waiting for errors");
+ }
+ break;
+ }
+ }
+ m_scriptErrors.Remove(itemId);
+ }
+ return errors;
+ }
+ private void StoreScriptErrors(UUID itemId, ArrayList errors)
+ {
+ lock (m_scriptErrors)
+ {
+ m_scriptErrors[itemId] = errors;
+ System.Threading.Monitor.PulseAll(m_scriptErrors);
+ }
+ }
+ private void StoreScriptError(UUID itemId, string message)
+ {
+ ArrayList errors = new ArrayList(1);
+ errors.Add(message);
+ StoreScriptErrors(itemId, errors);
+ }
+
///
/// Stop a script which is in this prim's inventory.
///
--
cgit v1.1