From 78fd487a705c91720991a7572b860567f36366c4 Mon Sep 17 00:00:00 2001
From: Snoopy Pfeffer
Date: Tue, 10 Apr 2012 21:49:43 +0200
Subject: New OS scripting functions osSetTerrainTexture and osSetTerrainHeight
as originally proposed in SL Jira
(https://jira.secondlife.com/browse/SVC-244).
---
.../World/Estate/EstateManagementModule.cs | 15 +++++-
.../Region/Framework/Interfaces/IEstateModule.cs | 3 ++
.../Shared/Api/Implementation/OSSL_Api.cs | 55 ++++++++++++++++++++++
.../ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs | 3 ++
.../ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs | 10 ++++
5 files changed, 84 insertions(+), 2 deletions(-)
diff --git a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs
index fc217b0..124f01c 100644
--- a/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs
+++ b/OpenSim/Region/CoreModules/World/Estate/EstateManagementModule.cs
@@ -157,12 +157,18 @@ namespace OpenSim.Region.CoreModules.World.Estate
sendRegionInfoPacketToAll();
}
- public void setEstateTerrainBaseTexture(IClientAPI remoteClient, int corner, UUID texture)
+ public void setEstateTerrainBaseTexture(int level, UUID texture)
+ {
+ setEstateTerrainBaseTexture(null, level, texture);
+ sendRegionHandshakeToAll();
+ }
+
+ public void setEstateTerrainBaseTexture(IClientAPI remoteClient, int level, UUID texture)
{
if (texture == UUID.Zero)
return;
- switch (corner)
+ switch (level)
{
case 0:
Scene.RegionInfo.RegionSettings.TerrainTexture1 = texture;
@@ -182,6 +188,11 @@ namespace OpenSim.Region.CoreModules.World.Estate
sendRegionInfoPacketToAll();
}
+ public void setEstateTerrainTextureHeights(int corner, float lowValue, float highValue)
+ {
+ setEstateTerrainTextureHeights(null, corner, lowValue, highValue);
+ }
+
public void setEstateTerrainTextureHeights(IClientAPI client, int corner, float lowValue, float highValue)
{
switch (corner)
diff --git a/OpenSim/Region/Framework/Interfaces/IEstateModule.cs b/OpenSim/Region/Framework/Interfaces/IEstateModule.cs
index 721f0ee..15cd238 100644
--- a/OpenSim/Region/Framework/Interfaces/IEstateModule.cs
+++ b/OpenSim/Region/Framework/Interfaces/IEstateModule.cs
@@ -45,5 +45,8 @@ namespace OpenSim.Region.Framework.Interfaces
/// Tell all clients about the current state of the region (terrain textures, water height, etc.).
///
void sendRegionHandshakeToAll();
+
+ void setEstateTerrainBaseTexture(int level, UUID texture);
+ void setEstateTerrainTextureHeights(int corner, float lowValue, float highValue);
}
}
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
index a5dcba4..339166b 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
@@ -3049,5 +3049,60 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
return ScriptBaseClass.TRUE;
}
+
+ ///
+ /// Sets terrain estate texture
+ ///
+ ///
+ ///
+ ///
+ public void osSetTerrainTexture(int level, LSL_Key texture)
+ {
+ CheckThreatLevel(ThreatLevel.High, "osSetTerrainTexture");
+
+ m_host.AddScriptLPS(1);
+ //Check to make sure that the script's owner is the estate manager/master
+ //World.Permissions.GenericEstatePermission(
+ if (World.Permissions.IsGod(m_host.OwnerID))
+ {
+ if (level < 0 || level > 3)
+ return;
+
+ UUID textureID = new UUID();
+ if (!UUID.TryParse(texture, out textureID))
+ return;
+
+ // estate module is required
+ IEstateModule estate = World.RequestModuleInterface();
+ if (estate != null)
+ estate.setEstateTerrainBaseTexture(level, textureID);
+ }
+ }
+
+ ///
+ /// Sets terrain heights of estate
+ ///
+ ///
+ ///
+ ///
+ ///
+ public void osSetTerrainTextureHeight(int corner, double low, double high)
+ {
+ CheckThreatLevel(ThreatLevel.High, "osSetTerrainTextureHeight");
+
+ m_host.AddScriptLPS(1);
+ //Check to make sure that the script's owner is the estate manager/master
+ //World.Permissions.GenericEstatePermission(
+ if (World.Permissions.IsGod(m_host.OwnerID))
+ {
+ if (corner < 0 || corner > 3)
+ return;
+
+ // estate module is required
+ IEstateModule estate = World.RequestModuleInterface();
+ if (estate != null)
+ estate.setEstateTerrainTextureHeights(corner, (float)low, (float)high);
+ }
+ }
}
}
\ No newline at end of file
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs
index 30bd3ef..545bbee 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Interface/IOSSL_Api.cs
@@ -234,5 +234,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Interfaces
LSL_Integer osInviteToGroup(LSL_Key agentId);
LSL_Integer osEjectFromGroup(LSL_Key agentId);
+
+ void osSetTerrainTexture(int level, LSL_Key texture);
+ void osSetTerrainTextureHeight(int corner, double low, double high);
}
}
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs
index 680cefb4..b94b9bf 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Runtime/OSSL_Stub.cs
@@ -878,5 +878,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.ScriptBase
{
return m_OSSL_Functions.osEjectFromGroup(agentId);
}
+
+ public void osSetTerrainTexture(int level, LSL_Key texture)
+ {
+ m_OSSL_Functions.osSetTerrainTexture(level, texture);
+ }
+
+ public void osSetTerrainTextureHeight(int corner, double low, double high)
+ {
+ m_OSSL_Functions.osSetTerrainTextureHeight(corner, low, high);
+ }
}
}
--
cgit v1.1
From f2ede8c7e09487436261b249ec093bfd01c3f971 Mon Sep 17 00:00:00 2001
From: Diva Canto
Date: Wed, 11 Apr 2012 08:11:05 -0700
Subject: HGFriendsModule: add the scaffolding for supporting permissions
pertaining to HG friendships. Snoopy take it from here.
---
.../CoreModules/Avatar/Friends/FriendsModule.cs | 4 +--
.../CoreModules/Avatar/Friends/HGFriendsModule.cs | 30 ++++++++++++++++++++++
2 files changed, 32 insertions(+), 2 deletions(-)
diff --git a/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs b/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs
index f64c161..fc6325d 100644
--- a/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Friends/FriendsModule.cs
@@ -162,7 +162,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
}
}
- protected void InitModule(IConfigSource config)
+ protected virtual void InitModule(IConfigSource config)
{
IConfig friendsConfig = config.Configs["Friends"];
if (friendsConfig != null)
@@ -546,7 +546,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
}
}
- private void OnInstantMessage(IClientAPI client, GridInstantMessage im)
+ protected virtual void OnInstantMessage(IClientAPI client, GridInstantMessage im)
{
if ((InstantMessageDialog)im.dialog == InstantMessageDialog.FriendshipOffered)
{
diff --git a/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs b/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs
index 9a6d277..ddb6a71 100644
--- a/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs
@@ -87,6 +87,19 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
m_StatusNotifier = new HGStatusNotifier(this);
}
+ protected override void InitModule(IConfigSource config)
+ {
+ base.InitModule(config);
+
+ // Additionally to the base method
+ IConfig friendsConfig = config.Configs["HGFriendsModule"];
+ if (friendsConfig != null)
+ {
+ // TODO: read in all config variables pertaining to
+ // HG friendship permissions
+ }
+ }
+
#endregion
#region IFriendsSimConnector
@@ -105,6 +118,23 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
#endregion
+ protected override void OnInstantMessage(IClientAPI client, GridInstantMessage im)
+ {
+ if ((InstantMessageDialog)im.dialog == InstantMessageDialog.FriendshipOffered)
+ {
+ // we got a friendship offer
+ UUID principalID = new UUID(im.fromAgentID);
+ UUID friendID = new UUID(im.toAgentID);
+
+ // TODO: CHECK IF friendID is foreigner and if principalID has the permission
+ // to request these kinds of friendships. If not, return immediately.
+ // Maybe you want to let the client know too with
+ // client.SendAlertMessage
+ }
+
+ base.OnInstantMessage(client, im);
+ }
+
protected override void OnApproveFriendRequest(IClientAPI client, UUID friendID, List callingCardFolders)
{
// Update the local cache. Yes, we need to do it right here
--
cgit v1.1
From 1f4d3d35822c5ad3dbdd5f363014f1bf9afebdc6 Mon Sep 17 00:00:00 2001
From: Snoopy Pfeffer
Date: Wed, 11 Apr 2012 18:52:07 +0200
Subject: HGFriendsModule: Added optional user level based restriction to send
friendship invitations to foreign users.
---
.../CoreModules/Avatar/Friends/HGFriendsModule.cs | 24 ++++++++++++++++++----
bin/config-include/GridCommon.ini.example | 4 ++++
bin/config-include/StandaloneCommon.ini.example | 4 ++++
3 files changed, 28 insertions(+), 4 deletions(-)
diff --git a/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs b/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs
index ddb6a71..f8fbbbb 100644
--- a/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs
@@ -50,6 +50,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
{
private static readonly ILog m_log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType);
+ private int m_levelHGFriends = 0;
+
IUserManagement m_uMan;
public IUserManagement UserManagementModule
{
@@ -95,6 +97,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
IConfig friendsConfig = config.Configs["HGFriendsModule"];
if (friendsConfig != null)
{
+ m_levelHGFriends = friendsConfig.GetInt("LevelHGFriends", 0);
+
// TODO: read in all config variables pertaining to
// HG friendship permissions
}
@@ -126,10 +130,22 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
UUID principalID = new UUID(im.fromAgentID);
UUID friendID = new UUID(im.toAgentID);
- // TODO: CHECK IF friendID is foreigner and if principalID has the permission
- // to request these kinds of friendships. If not, return immediately.
- // Maybe you want to let the client know too with
- // client.SendAlertMessage
+ // Check if friendID is foreigner and if principalID has the permission
+ // to request friendships with foreigners. If not, return immediately.
+ if (!UserManagementModule.IsLocalGridUser(friendID))
+ {
+ ScenePresence avatar = null;
+ client.Scene.TryGetScenePresence(principalID, out avatar);
+
+ if (avatar == null)
+ return;
+
+ if (avatar.UserLevel < m_levelHGFriends)
+ {
+ client.SendAgentAlertMessage("Unable to send friendship invitation to foreigner. Insufficient permissions.", false);
+ return;
+ }
+ }
}
base.OnInstantMessage(client, im);
diff --git a/bin/config-include/GridCommon.ini.example b/bin/config-include/GridCommon.ini.example
index fa6f525..8d7f6fc 100644
--- a/bin/config-include/GridCommon.ini.example
+++ b/bin/config-include/GridCommon.ini.example
@@ -137,6 +137,10 @@
;; uncomment the next line. You may want to do this on sims that have licensed content.
; OutboundPermission = False
+[HGFriendsModule]
+ ; User level required to be able to send friendship invitations to foreign users
+ ;LevelHGFriends = 0;
+
[UserAgentService]
;
; === HG ONLY ===
diff --git a/bin/config-include/StandaloneCommon.ini.example b/bin/config-include/StandaloneCommon.ini.example
index 8fe64df..e4bc548 100644
--- a/bin/config-include/StandaloneCommon.ini.example
+++ b/bin/config-include/StandaloneCommon.ini.example
@@ -61,6 +61,10 @@
;; uncomment the next line. You may want to do this on sims that have licensed content.
; OutboundPermission = False
+[HGFriendsModule]
+ ; User level required to be able to send friendship invitations to foreign users
+ ;LevelHGFriends = 0;
+
[GridService]
;; For in-memory region storage (default)
StorageProvider = "OpenSim.Data.Null.dll:NullRegionData"
--
cgit v1.1
From 8be14095fed0d1d9f448d51fede20d13231c02db Mon Sep 17 00:00:00 2001
From: Snoopy Pfeffer
Date: Wed, 11 Apr 2012 18:56:28 +0200
Subject: HGFriendsModule: Type casts to fix compile error
---
OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs b/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs
index f8fbbbb..3728b85 100644
--- a/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Friends/HGFriendsModule.cs
@@ -135,7 +135,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Friends
if (!UserManagementModule.IsLocalGridUser(friendID))
{
ScenePresence avatar = null;
- client.Scene.TryGetScenePresence(principalID, out avatar);
+ ((Scene)client.Scene).TryGetScenePresence(principalID, out avatar);
if (avatar == null)
return;
--
cgit v1.1
From 30d8506bc2f04028c1bbdcf57cf5f45fedb3ae7a Mon Sep 17 00:00:00 2001
From: nebadon
Date: Thu, 12 Apr 2012 18:27:14 -0700
Subject: make changes to FlotsamCache.ini.example as noted in mantis #5960
http://opensimulator.org/mantis/view.php?id=5960
---
bin/config-include/FlotsamCache.ini.example | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/bin/config-include/FlotsamCache.ini.example b/bin/config-include/FlotsamCache.ini.example
index cd39f8c..b9c6d84 100644
--- a/bin/config-include/FlotsamCache.ini.example
+++ b/bin/config-include/FlotsamCache.ini.example
@@ -36,7 +36,7 @@
; How often {in hours} should the disk be checked for expired filed
; Specify 0 to disable expiration checking
- FileCleanupTimer = .166 ;roughly every 10 minutes
+ FileCleanupTimer = 1.0 ;every hour
; If WAIT_ON_INPROGRESS_REQUESTS has been defined then this specifies how
; long (in miliseconds) to block a request thread while trying to complete
@@ -60,4 +60,4 @@
; cache, and request all assets that are found that are not already cached (this
; will cause those assets to be cached)
;
- ; DeepScanBeforePurge = false
+ DeepScanBeforePurge = true
--
cgit v1.1
From 08e509978d81cb3451c205ed59648e3f5da91344 Mon Sep 17 00:00:00 2001
From: Talun
Date: Tue, 10 Apr 2012 21:25:05 +0100
Subject: Mantis 55025 Implement script time.
Signed-off-by: nebadon
---
.../Framework/Interfaces/IEntityInventory.cs | 12 +++-
.../Region/Framework/Interfaces/IScriptModule.cs | 8 +++
.../Region/Framework/Scenes/SceneObjectGroup.cs | 39 ++++++++++
.../Framework/Scenes/SceneObjectPartInventory.cs | 14 ++--
OpenSim/Region/Framework/Scenes/ScenePresence.cs | 19 +++++
.../Shared/Api/Implementation/LSL_Api.cs | 7 +-
OpenSim/Region/ScriptEngine/XEngine/XEngine.cs | 82 +++++++++++++---------
7 files changed, 135 insertions(+), 46 deletions(-)
diff --git a/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs b/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs
index f5dda34..30ed7d1 100644
--- a/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs
+++ b/OpenSim/Region/Framework/Interfaces/IEntityInventory.cs
@@ -172,7 +172,17 @@ namespace OpenSim.Region.Framework.Interfaces
/// If no inventory item has that name then an empty list is returned.
///
List GetInventoryItems(string name);
-
+
+ ///
+ /// Get inventory items by type.
+ ///
+ ///
+ ///
+ /// A list of inventory items of that type.
+ /// If no inventory items of that type then an empty list is returned.
+ ///
+ List GetInventoryItems(InventoryType type);
+
///
/// Get the scene object referenced by an inventory item.
///
diff --git a/OpenSim/Region/Framework/Interfaces/IScriptModule.cs b/OpenSim/Region/Framework/Interfaces/IScriptModule.cs
index c0616ed..0d488df 100644
--- a/OpenSim/Region/Framework/Interfaces/IScriptModule.cs
+++ b/OpenSim/Region/Framework/Interfaces/IScriptModule.cs
@@ -83,6 +83,14 @@ namespace OpenSim.Region.Framework.Interfaces
void StartProcessing();
///
+ /// Get the execution times of all scripts in the given array if they are currently running.
+ ///
+ ///
+ /// A float the value is a representative execution time in milliseconds of all scripts in that Array.
+ ///
+ float GetScriptExecutionTime(List itemIDs);
+
+ ///
/// Get the execution times of all scripts in each object.
///
///
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 7d14814..a49ed13 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -3270,6 +3270,45 @@ namespace OpenSim.Region.Framework.Scenes
}
///
+ /// A float the value is a representative execution time in milliseconds of all scripts in the link set.
+ ///
+ public float ScriptExecutionTime()
+ {
+ IScriptModule[] engines = Scene.RequestModuleInterfaces();
+
+ if (engines.Length == 0) // No engine at all
+ return 0.0f;
+
+ float time = 0.0f;
+
+ // get all the scripts in all parts
+ SceneObjectPart[] parts = m_parts.GetArray();
+ List scripts = new List();
+ for (int i = 0; i < parts.Length; i++)
+ {
+ scripts.AddRange(parts[i].Inventory.GetInventoryItems(InventoryType.LSL));
+ }
+ // extract the UUIDs
+ List ids = new List(scripts.Count);
+ foreach (TaskInventoryItem script in scripts)
+ {
+ if (!ids.Contains(script.ItemID))
+ {
+ ids.Add(script.ItemID);
+ }
+ }
+ // Offer the list of script UUIDs to each engine found and accumulate the time
+ foreach (IScriptModule e in engines)
+ {
+ if (e != null)
+ {
+ time += e.GetScriptExecutionTime(ids);
+ }
+ }
+ return time;
+ }
+
+ ///
/// Returns a count of the number of running scripts in this groups parts.
///
public int RunningScriptCount()
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
index 9a04c65..aacad98 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
@@ -222,7 +222,7 @@ namespace OpenSim.Region.Framework.Scenes
///
public void CreateScriptInstances(int startParam, bool postOnRez, string engine, int stateSource)
{
- List scripts = GetInventoryScripts();
+ List scripts = GetInventoryItems(InventoryType.LSL);
foreach (TaskInventoryItem item in scripts)
CreateScriptInstance(item, startParam, postOnRez, engine, stateSource);
}
@@ -255,7 +255,7 @@ namespace OpenSim.Region.Framework.Scenes
///
public void RemoveScriptInstances(bool sceneObjectBeingDeleted)
{
- List scripts = GetInventoryScripts();
+ List scripts = GetInventoryItems(InventoryType.LSL);
foreach (TaskInventoryItem item in scripts)
RemoveScriptInstance(item.ItemID, sceneObjectBeingDeleted);
}
@@ -1116,7 +1116,7 @@ namespace OpenSim.Region.Framework.Scenes
return 0;
int count = 0;
- List scripts = GetInventoryScripts();
+ List scripts = GetInventoryItems(InventoryType.LSL);
foreach (TaskInventoryItem item in scripts)
{
@@ -1157,14 +1157,14 @@ namespace OpenSim.Region.Framework.Scenes
return ret;
}
- public List GetInventoryScripts()
+ public List GetInventoryItems(InventoryType type)
{
List ret = new List();
lock (m_items)
{
foreach (TaskInventoryItem item in m_items.Values)
- if (item.InvType == (int)InventoryType.LSL)
+ if (item.InvType == (int)type)
ret.Add(item);
}
@@ -1183,7 +1183,7 @@ namespace OpenSim.Region.Framework.Scenes
if (engines.Length == 0) // No engine at all
return ret;
- List scripts = GetInventoryScripts();
+ List scripts = GetInventoryItems(InventoryType.LSL);
foreach (TaskInventoryItem item in scripts)
{
@@ -1211,7 +1211,7 @@ namespace OpenSim.Region.Framework.Scenes
if (engines.Length == 0)
return;
- List scripts = GetInventoryScripts();
+ List scripts = GetInventoryItems(InventoryType.LSL);
foreach (TaskInventoryItem item in scripts)
{
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 8863df1..641d742 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -3438,6 +3438,25 @@ namespace OpenSim.Region.Framework.Scenes
}
///
+ /// A float the value is a representative execution time in milliseconds of all scripts in all attachments.
+ ///
+ public float ScriptExecutionTime()
+ {
+ float time = 0.0f;
+ lock (m_attachments)
+ {
+ foreach (SceneObjectGroup gobj in m_attachments)
+ {
+ if (gobj != null)
+ {
+ time += gobj.ScriptExecutionTime();
+ }
+ }
+ }
+ return time;
+ }
+
+ ///
/// Returns the total count of running scripts in all parts.
///
public int RunningScriptCount()
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index c38a52e..078a22a 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -10367,7 +10367,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
ret.Add(new LSL_Integer(av.RunningScriptCount() * 16384));
break;
case ScriptBaseClass.OBJECT_SCRIPT_TIME:
- ret.Add(new LSL_Float(0));
+ ret.Add(new LSL_Float(av.ScriptExecutionTime() / 1000.0f));
break;
case ScriptBaseClass.OBJECT_PRIM_EQUIVALENCE:
ret.Add(new LSL_Integer(1));
@@ -10435,9 +10435,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
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 object
- // Not currently available at Object level
- ret.Add(new LSL_Float(0));
+ // Average cpu time in seconds per simulator frame expended on all scripts in the object
+ ret.Add(new LSL_Float(obj.ParentGroup.ScriptExecutionTime() / 1000.0f));
break;
case ScriptBaseClass.OBJECT_PRIM_EQUIVALENCE:
// according to the SL wiki A prim or linkset will have prim
diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
index 7712076..b7903d5 100644
--- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
+++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
@@ -1907,45 +1907,59 @@ namespace OpenSim.Region.ScriptEngine.XEngine
if (!topScripts.ContainsKey(si.LocalID))
topScripts[si.RootLocalID] = 0;
-// long ticksElapsed = tickNow - si.MeasurementPeriodTickStart;
-// float framesElapsed = ticksElapsed / (18.1818 * TimeSpan.TicksPerMillisecond);
-
- // Execution time of the script adjusted by it's measurement period to make scripts started at
- // different times comparable.
-// float adjustedExecutionTime
-// = (float)si.MeasurementPeriodExecutionTime
-// / ((float)(tickNow - si.MeasurementPeriodTickStart) / ScriptInstance.MaxMeasurementPeriod)
-// / TimeSpan.TicksPerMillisecond;
-
- long ticksElapsed = tickNow - si.MeasurementPeriodTickStart;
-
- // Avoid divide by zerp
- if (ticksElapsed == 0)
- ticksElapsed = 1;
+ topScripts[si.RootLocalID] += CalculateAdjustedExectionTime(si, tickNow);
+ }
+ }
- // Scale execution time to the ideal 55 fps frame time for these reasons.
- //
- // 1) XEngine does not execute scripts per frame, unlike other script engines. Hence, there is no
- // 'script execution time per frame', which is the original purpose of this value.
- //
- // 2) Giving the raw execution times is misleading since scripts start at different times, making
- // it impossible to compare scripts.
- //
- // 3) Scaling the raw execution time to the time that the script has been running is better but
- // is still misleading since a script that has just been rezzed may appear to have been running
- // for much longer.
- //
- // 4) Hence, we scale execution time to an idealised frame time (55 fps). This is also not perfect
- // since the figure does not represent actual execution time and very hard running scripts will
- // never exceed 18ms (though this is a very high number for script execution so is a warning sign).
- float adjustedExecutionTime
- = ((float)si.MeasurementPeriodExecutionTime / ticksElapsed) * 18.1818f;
+ return topScripts;
+ }
- topScripts[si.RootLocalID] += adjustedExecutionTime;
+ public float GetScriptExecutionTime(List itemIDs)
+ {
+ if (itemIDs == null|| itemIDs.Count == 0)
+ {
+ return 0.0f;
+ }
+ float time = 0.0f;
+ long tickNow = Util.EnvironmentTickCount();
+ IScriptInstance si;
+ // Calculate the time for all scripts that this engine is executing
+ // Ignore any others
+ foreach (UUID id in itemIDs)
+ {
+ si = GetInstance(id);
+ if (si != null && si.Running)
+ {
+ time += CalculateAdjustedExectionTime(si, tickNow);
}
}
+ return time;
+ }
- return topScripts;
+ private float CalculateAdjustedExectionTime(IScriptInstance si, long tickNow)
+ {
+ long ticksElapsed = tickNow - si.MeasurementPeriodTickStart;
+
+ // Avoid divide by zero
+ if (ticksElapsed == 0)
+ ticksElapsed = 1;
+
+ // Scale execution time to the ideal 55 fps frame time for these reasons.
+ //
+ // 1) XEngine does not execute scripts per frame, unlike other script engines. Hence, there is no
+ // 'script execution time per frame', which is the original purpose of this value.
+ //
+ // 2) Giving the raw execution times is misleading since scripts start at different times, making
+ // it impossible to compare scripts.
+ //
+ // 3) Scaling the raw execution time to the time that the script has been running is better but
+ // is still misleading since a script that has just been rezzed may appear to have been running
+ // for much longer.
+ //
+ // 4) Hence, we scale execution time to an idealised frame time (55 fps). This is also not perfect
+ // since the figure does not represent actual execution time and very hard running scripts will
+ // never exceed 18ms (though this is a very high number for script execution so is a warning sign).
+ return ((float)si.MeasurementPeriodExecutionTime / ticksElapsed) * 18.1818f;
}
public void SuspendScript(UUID itemID)
--
cgit v1.1