diff --git a/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs b/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs
index 32f4eeaf0a..4d70888904 100644
--- a/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs
+++ b/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs
@@ -227,6 +227,16 @@ namespace OpenSim.Region.Framework.Interfaces
///
bool ContainsScripts();
+ ///
+ /// Returns the count of scripts contained
+ ///
+ int ScriptCount();
+
+ ///
+ /// Returns the count of running scripts contained
+ ///
+ int RunningScriptCount();
+
///
/// Get the uuids of all items in this inventory
///
diff --git a/OpenSim/Region/Framework/Interfaces/IScriptModule.cs b/OpenSim/Region/Framework/Interfaces/IScriptModule.cs
index ce66100a65..4f8be1092b 100644
--- a/OpenSim/Region/Framework/Interfaces/IScriptModule.cs
+++ b/OpenSim/Region/Framework/Interfaces/IScriptModule.cs
@@ -71,6 +71,12 @@ namespace OpenSim.Region.Framework.Interfaces
bool HasScript(UUID itemID, out bool running);
+ ///
+ /// Returns true if a script is running.
+ ///
+ /// The item ID of the script.
+ bool GetScriptState(UUID itemID);
+
void SaveAllState();
///
@@ -87,4 +93,4 @@ namespace OpenSim.Region.Framework.Interfaces
///
Dictionary GetObjectScriptsExecutionTimes();
}
-}
\ No newline at end of file
+}
diff --git a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
index b806d9174b..77e808e30d 100644
--- a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
@@ -156,7 +156,9 @@ namespace OpenSim.Region.Framework.Scenes
// that the region position is cached or performance will degrade
Utils.LongToUInts(regionHandle, out x, out y);
GridRegion dest = m_scene.GridService.GetRegionByPosition(UUID.Zero, (int)x, (int)y);
-// bool v = true;
+ if (dest == null)
+ continue;
+
if (!simulatorList.Contains(dest.ServerURI))
{
// we havent seen this simulator before, add it to the list
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 107d9b625f..5786f48d3a 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -4017,7 +4017,33 @@ namespace OpenSim.Region.Framework.Scenes
for (int i = 0; i < parts.Length; i++)
parts[i].TriggerScriptChangedEvent(val);
}
-
+
+ ///
+ /// Returns a count of the number of scripts in this groups parts.
+ ///
+ public int ScriptCount()
+ {
+ int count = 0;
+ SceneObjectPart[] parts = m_parts.GetArray();
+ for (int i = 0; i < parts.Length; i++)
+ count += parts[i].Inventory.ScriptCount();
+
+ return count;
+ }
+
+ ///
+ /// Returns a count of the number of running scripts in this groups parts.
+ ///
+ public int RunningScriptCount()
+ {
+ int count = 0;
+ SceneObjectPart[] parts = m_parts.GetArray();
+ for (int i = 0; i < parts.Length; i++)
+ count += parts[i].Inventory.RunningScriptCount();
+
+ return count;
+ }
+
public override string ToString()
{
return String.Format("{0} {1} ({2})", Name, UUID, AbsolutePosition);
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
index a2649eed91..7e629c0d08 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
@@ -1280,9 +1280,59 @@ namespace OpenSim.Region.Framework.Scenes
return true;
}
}
+
return false;
}
+ ///
+ /// Returns the count of scripts in this parts inventory.
+ ///
+ ///
+ public int ScriptCount()
+ {
+ int count = 0;
+ lock (m_items)
+ {
+ foreach (TaskInventoryItem item in m_items.Values)
+ {
+ if (item.InvType == (int)InventoryType.LSL)
+ {
+ count++;
+ }
+ }
+ }
+
+ return count;
+ }
+ ///
+ /// Returns the count of running scripts in this parts inventory.
+ ///
+ ///
+ public int RunningScriptCount()
+ {
+ IScriptModule[] engines = m_part.ParentGroup.Scene.RequestModuleInterfaces();
+ if (engines.Length == 0)
+ return 0;
+
+ int count = 0;
+ List scripts = GetInventoryScripts();
+
+ foreach (TaskInventoryItem item in scripts)
+ {
+ foreach (IScriptModule engine in engines)
+ {
+ if (engine != null)
+ {
+ if (engine.GetScriptState(item.ItemID))
+ {
+ count++;
+ }
+ }
+ }
+ }
+ return count;
+ }
+
public List GetInventoryList()
{
List ret = new List();
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index b51d41be4c..0cb155691a 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -3521,6 +3521,44 @@ namespace OpenSim.Region.Framework.Scenes
return m_attachments.Count > 0;
}
+ ///
+ /// Returns the total count of scripts in all parts inventories.
+ ///
+ public int ScriptCount()
+ {
+ int count = 0;
+ lock (m_attachments)
+ {
+ foreach (SceneObjectGroup gobj in m_attachments)
+ {
+ if (gobj != null)
+ {
+ count += gobj.ScriptCount();
+ }
+ }
+ }
+ return count;
+ }
+
+ ///
+ /// Returns the total count of running scripts in all parts.
+ ///
+ public int RunningScriptCount()
+ {
+ int count = 0;
+ lock (m_attachments)
+ {
+ foreach (SceneObjectGroup gobj in m_attachments)
+ {
+ if (gobj != null)
+ {
+ count += gobj.RunningScriptCount();
+ }
+ }
+ }
+ return count;
+ }
+
public bool HasScriptedAttachments()
{
lock (m_attachments)
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 7cf284d602..a95dd63808 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -11175,19 +11175,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
break;
// For the following 8 see the Object version below
case ScriptBaseClass.OBJECT_RUNNING_SCRIPT_COUNT:
- ret.Add(new LSL_Integer(0));
+ ret.Add(new LSL_Integer(av.RunningScriptCount()));
break;
case ScriptBaseClass.OBJECT_TOTAL_SCRIPT_COUNT:
- ret.Add(new LSL_Integer(0));
+ ret.Add(new LSL_Integer(av.ScriptCount()));
break;
case ScriptBaseClass.OBJECT_SCRIPT_MEMORY:
- ret.Add(new LSL_Integer(0));
+ ret.Add(new LSL_Integer(av.RunningScriptCount() * 16384));
break;
case ScriptBaseClass.OBJECT_SCRIPT_TIME:
ret.Add(new LSL_Float(0));
break;
case ScriptBaseClass.OBJECT_PRIM_EQUIVALENCE:
- ret.Add(new LSL_Integer(0));
+ ret.Add(new LSL_Integer(1));
break;
case ScriptBaseClass.OBJECT_SERVER_COST:
ret.Add(new LSL_Float(0));
@@ -11239,24 +11239,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
case ScriptBaseClass.OBJECT_CREATOR:
ret.Add(new LSL_String(obj.CreatorID.ToString()));
break;
- // The following 8 I have intentionaly coded to return zero. They are part of
- // "Land Impact" calculations. These calculations are probably not applicable
- // to OpenSim, required figures (cpu/memory usage) are not currently tracked
- // I have intentionally left these all at zero rather than return possibly
- // missleading numbers
case ScriptBaseClass.OBJECT_RUNNING_SCRIPT_COUNT:
- // in SL this currently includes crashed scripts
- ret.Add(new LSL_Integer(0));
+ ret.Add(new LSL_Integer(obj.ParentGroup.RunningScriptCount()));
break;
case ScriptBaseClass.OBJECT_TOTAL_SCRIPT_COUNT:
- ret.Add(new LSL_Integer(0));
+ ret.Add(new LSL_Integer(obj.ParentGroup.ScriptCount()));
break;
case ScriptBaseClass.OBJECT_SCRIPT_MEMORY:
// The value returned in SL for mono scripts is 65536 * number of active scripts
- ret.Add(new LSL_Integer(0));
+ // and 16384 * number of active scripts for LSO. since llGetFreememory
+ // is coded to give the LSO value use it here
+ ret.Add(new LSL_Integer(obj.ParentGroup.RunningScriptCount() * 16384));
break;
case ScriptBaseClass.OBJECT_SCRIPT_TIME:
- // Average cpu time per simulator frame expended on all scripts in the objetc
+ // Average cpu time per simulator frame expended on all scripts in the object
+ // Not currently available at Object level
ret.Add(new LSL_Float(0));
break;
case ScriptBaseClass.OBJECT_PRIM_EQUIVALENCE:
@@ -11264,18 +11261,27 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
// equivalent of the number of prims in a linkset if it does not
// contain a mesh anywhere in the link set or is not a normal prim
// The value returned in SL for normal prims is prim count
- ret.Add(new LSL_Integer(0));
+ ret.Add(new LSL_Integer(obj.ParentGroup.PrimCount));
break;
+ // The following 3 costs I have intentionaly coded to return zero. They are part of
+ // "Land Impact" calculations. These calculations are probably not applicable
+ // to OpenSim and are not yet complete in SL
case ScriptBaseClass.OBJECT_SERVER_COST:
- // The value returned in SL for normal prims is prim count
+ // The linden calculation is here
+ // http://wiki.secondlife.com/wiki/Mesh/Mesh_Server_Weight
+ // The value returned in SL for normal prims looks like the prim count
ret.Add(new LSL_Float(0));
break;
case ScriptBaseClass.OBJECT_STREAMING_COST:
- // The value returned in SL for normal prims is prim count * 0.06
+ // The linden calculation is here
+ // http://wiki.secondlife.com/wiki/Mesh/Mesh_Streaming_Cost
+ // The value returned in SL for normal prims looks like the prim count * 0.06
ret.Add(new LSL_Float(0));
break;
case ScriptBaseClass.OBJECT_PHYSICS_COST:
- // The value returned in SL for normal prims is prim count
+ // The linden calculation is here
+ // http://wiki.secondlife.com/wiki/Mesh/Mesh_physics
+ // The value returned in SL for normal prims looks like the prim count
ret.Add(new LSL_Float(0));
break;
default: