From d32cf2157670889c571a34f1a4473d672e29627d Mon Sep 17 00:00:00 2001
From: Melanie
Date: Sun, 1 Jul 2012 18:30:59 +0100
Subject: Add preservation of running state of scripts when drag-copying.

---
 OpenSim/Framework/TaskInventoryItem.cs             | 12 ++++++++
 .../Region/Framework/Interfaces/IScriptModule.cs   |  4 ++-
 .../Framework/Scenes/SceneObjectPartInventory.cs   | 36 +++++++++++++++++++++-
 OpenSim/Region/ScriptEngine/XEngine/XEngine.cs     | 12 ++++++++
 4 files changed, 62 insertions(+), 2 deletions(-)

diff --git a/OpenSim/Framework/TaskInventoryItem.cs b/OpenSim/Framework/TaskInventoryItem.cs
index 362d365..3b40381 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 cbaf241..42dbedc 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);
+
         /// <summary>
         /// Returns true if a script is running.
         /// </summary>
@@ -101,4 +103,4 @@ namespace OpenSim.Region.Framework.Interfaces
         /// </returns>
         Dictionary<uint, float> GetObjectScriptsExecutionTimes();
     }
-}
\ No newline at end of file
+}
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs
index c223474..6427014 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<IScriptModule>();
+            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 35fac4e..7f3bd76 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;
+        }
     }
 }
-- 
cgit v1.1