Add preservation of running state of scripts when drag-copying.

0.7.4.1
Melanie 2012-07-01 18:30:59 +01:00
parent 1926de5a05
commit d32cf21576
4 changed files with 62 additions and 2 deletions

View File

@ -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

View File

@ -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();
}
}
}

View File

@ -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
}
}
}
}
}

View File

@ -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;
}
}
}