diff --git a/OpenSim/Framework/TaskInventoryItem.cs b/OpenSim/Framework/TaskInventoryItem.cs
index 362d3652b4..3b40381c61 100644
--- a/OpenSim/Framework/TaskInventoryItem.cs
+++ b/OpenSim/Framework/TaskInventoryItem.cs
@@ -73,6 +73,9 @@ namespace OpenSim.Framework
private bool _ownerChanged = false;
+ // This used ONLY during copy. It can't be relied on at other times!
+ private bool _scriptRunning = true;
+
public UUID AssetID {
get {
return _assetID;
@@ -350,6 +353,15 @@ namespace OpenSim.Framework
}
}
+ public bool ScriptRunning {
+ get {
+ return _scriptRunning;
+ }
+ set {
+ _scriptRunning = value;
+ }
+ }
+
// See ICloneable
#region ICloneable Members
diff --git a/OpenSim/Region/Framework/Interfaces/IScriptModule.cs b/OpenSim/Region/Framework/Interfaces/IScriptModule.cs
index cbaf24139d..42dbedcd56 100644
--- a/OpenSim/Region/Framework/Interfaces/IScriptModule.cs
+++ b/OpenSim/Region/Framework/Interfaces/IScriptModule.cs
@@ -69,6 +69,8 @@ namespace OpenSim.Region.Framework.Interfaces
ArrayList GetScriptErrors(UUID itemID);
+ bool HasScript(UUID itemID, out bool running);
+
///
/// Returns true if a script is running.
///
@@ -101,4 +103,4 @@ namespace OpenSim.Region.Framework.Interfaces
///
Dictionary GetObjectScriptsExecutionTimes();
}
-}
\ No newline at end of file
+}
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
index c223474f90..6427014906 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
@@ -89,6 +89,7 @@ namespace OpenSim.Region.Framework.Scenes
{
m_items = value;
m_inventorySerial++;
+ QueryScriptStates();
}
}
@@ -217,6 +218,36 @@ namespace OpenSim.Region.Framework.Scenes
}
}
+ private void QueryScriptStates()
+ {
+ if (m_part == null || m_part.ParentGroup == null)
+ return;
+
+ IScriptModule[] engines = m_part.ParentGroup.Scene.RequestModuleInterfaces();
+ if (engines == null) // No engine at all
+ return;
+
+ lock (Items)
+ {
+ foreach (TaskInventoryItem item in Items.Values)
+ {
+ if (item.InvType == (int)InventoryType.LSL)
+ {
+ foreach (IScriptModule e in engines)
+ {
+ bool running;
+
+ if (e.HasScript(item.ItemID, out running))
+ {
+ item.ScriptRunning = running;
+ break;
+ }
+ }
+ }
+ }
+ }
+ }
+
public int CreateScriptInstances(int startParam, bool postOnRez, string engine, int stateSource)
{
int scriptsValidForStarting = 0;
@@ -321,6 +352,9 @@ 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);
+ if (!item.ScriptRunning)
+ m_part.ParentGroup.Scene.EventManager.TriggerStopScript(
+ m_part.LocalId, item.ItemID);
m_part.ParentGroup.AddActiveScriptCount(1);
m_part.ScheduleFullUpdate();
@@ -1251,4 +1285,4 @@ namespace OpenSim.Region.Framework.Scenes
}
}
}
-}
\ No newline at end of file
+}
diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
index 35fac4e57a..7f3bd765f0 100644
--- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
+++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs
@@ -2081,5 +2081,17 @@ namespace OpenSim.Region.ScriptEngine.XEngine
// else
// m_log.DebugFormat("[XEngine]: Could not find script with ID {0} to resume", itemID);
}
+
+ public bool HasScript(UUID itemID, out bool running)
+ {
+ running = true;
+
+ IScriptInstance instance = GetInstance(itemID);
+ if (instance == null)
+ return false;
+
+ running = instance.Running;
+ return true;
+ }
}
}