Make "show object part" command correctly display script status.
Uses new IEntityInventory.TryGetScriptInstanceRunning() Makes it clearer that TaskInventoryItem.ScriptRunning cannot be used as it is temporary and not updated.integration
parent
3388534ff5
commit
6235d16c31
|
@ -35,10 +35,12 @@ using OpenMetaverse;
|
|||
namespace OpenSim.Framework
|
||||
{
|
||||
/// <summary>
|
||||
/// A dictionary for task inventory.
|
||||
/// A dictionary containing task inventory items. Indexed by item UUID.
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// This class is not thread safe. Callers must synchronize on Dictionary methods or Clone() this object before
|
||||
/// iterating over it.
|
||||
/// </remarks>
|
||||
public class TaskInventoryDictionary : Dictionary<UUID, TaskInventoryItem>,
|
||||
ICloneable, IXmlSerializable
|
||||
{
|
||||
|
|
|
@ -73,9 +73,6 @@ 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;
|
||||
|
@ -353,14 +350,13 @@ namespace OpenSim.Framework
|
|||
}
|
||||
}
|
||||
|
||||
public bool ScriptRunning {
|
||||
get {
|
||||
return _scriptRunning;
|
||||
}
|
||||
set {
|
||||
_scriptRunning = value;
|
||||
}
|
||||
}
|
||||
/// <summary>
|
||||
/// This used ONLY during copy. It can't be relied on at other times!
|
||||
/// </summary>
|
||||
/// <remarks>
|
||||
/// For true script running status, use IEntityInventory.TryGetScriptInstanceRunning() for now.
|
||||
/// </remarks>
|
||||
public bool ScriptRunning { get; set; }
|
||||
|
||||
// See ICloneable
|
||||
|
||||
|
@ -388,6 +384,7 @@ namespace OpenSim.Framework
|
|||
|
||||
public TaskInventoryItem()
|
||||
{
|
||||
ScriptRunning = true;
|
||||
CreationDate = (uint)(DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -571,9 +571,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
|
|||
|
||||
if (grp.HasGroupChanged)
|
||||
{
|
||||
// m_log.DebugFormat(
|
||||
// "[ATTACHMENTS MODULE]: Updating asset for attachment {0}, attachpoint {1}",
|
||||
// grp.UUID, grp.AttachmentPoint);
|
||||
m_log.DebugFormat(
|
||||
"[ATTACHMENTS MODULE]: Updating asset for attachment {0}, attachpoint {1}",
|
||||
grp.UUID, grp.AttachmentPoint);
|
||||
|
||||
string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(grp, scriptedState);
|
||||
|
||||
|
|
|
@ -606,12 +606,18 @@ namespace OpenSim.Region.CoreModules.World.Objects.Commands
|
|||
cdt.AddColumn("Asset UUID", 36);
|
||||
|
||||
foreach (TaskInventoryItem item in inv.GetInventoryItems())
|
||||
{
|
||||
bool foundScriptInstance, scriptRunning;
|
||||
foundScriptInstance
|
||||
= SceneObjectPartInventory.TryGetScriptInstanceRunning(m_scene, item, out scriptRunning);
|
||||
|
||||
cdt.AddRow(
|
||||
item.Name,
|
||||
((InventoryType)item.InvType).ToString(),
|
||||
(InventoryType)item.InvType == InventoryType.LSL ? item.ScriptRunning.ToString() : "n/a",
|
||||
foundScriptInstance ? scriptRunning.ToString() : "n/a",
|
||||
item.ItemID.ToString(),
|
||||
item.AssetID.ToString());
|
||||
}
|
||||
|
||||
return sb.Append(cdt.ToString());
|
||||
}
|
||||
|
|
|
@ -149,6 +149,19 @@ namespace OpenSim.Region.Framework.Interfaces
|
|||
/// <param name="itemId"></param>
|
||||
void StopScriptInstance(UUID itemId);
|
||||
|
||||
/// <summary>
|
||||
/// Try to get the script running status.
|
||||
/// </summary>
|
||||
/// <returns>
|
||||
/// Returns true if a script for the item was found in one of the simulator's script engines. In this case,
|
||||
/// the running parameter will reflect the running status.
|
||||
/// Returns false if the item could not be found, if the item is not a script or if a script instance for the
|
||||
/// item was not found in any of the script engines. In this case, running status is irrelevant.
|
||||
/// </returns>
|
||||
/// <param name='itemId'></param>
|
||||
/// <param name='running'></param>
|
||||
bool TryGetScriptInstanceRunning(UUID itemId, out bool running);
|
||||
|
||||
/// <summary>
|
||||
/// Add an item to this entity's inventory. If an item with the same name already exists, then an alternative
|
||||
/// name is chosen.
|
||||
|
|
|
@ -232,31 +232,49 @@ namespace OpenSim.Region.Framework.Scenes
|
|||
if (m_part == null || m_part.ParentGroup == null || m_part.ParentGroup.Scene == 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
bool running;
|
||||
if (TryGetScriptInstanceRunning(m_part.ParentGroup.Scene, item, out running))
|
||||
item.ScriptRunning = running;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public bool TryGetScriptInstanceRunning(UUID itemId, out bool running)
|
||||
{
|
||||
running = false;
|
||||
|
||||
TaskInventoryItem item = GetInventoryItem(itemId);
|
||||
|
||||
if (item == null)
|
||||
return false;
|
||||
|
||||
return TryGetScriptInstanceRunning(m_part.ParentGroup.Scene, item, out running);
|
||||
}
|
||||
|
||||
public static bool TryGetScriptInstanceRunning(Scene scene, TaskInventoryItem item, out bool running)
|
||||
{
|
||||
running = false;
|
||||
|
||||
if (item.InvType != (int)InventoryType.LSL)
|
||||
return false;
|
||||
|
||||
IScriptModule[] engines = scene.RequestModuleInterfaces<IScriptModule>();
|
||||
if (engines == null) // No engine at all
|
||||
return false;
|
||||
|
||||
foreach (IScriptModule e in engines)
|
||||
{
|
||||
if (e.HasScript(item.ItemID, out running))
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public int CreateScriptInstances(int startParam, bool postOnRez, string engine, int stateSource)
|
||||
{
|
||||
int scriptsValidForStarting = 0;
|
||||
|
|
|
@ -90,7 +90,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine.Tests
|
|||
// log4net.Config.XmlConfigurator.Configure();
|
||||
|
||||
UUID userId = TestHelpers.ParseTail(0x1);
|
||||
// UUID objectId = TestHelpers.ParseTail(0x2);
|
||||
// UUID objectId = TestHelpers.ParseTail(0x100);
|
||||
// UUID itemId = TestHelpers.ParseTail(0x3);
|
||||
string itemName = "TestStartScript() Item";
|
||||
|
||||
|
@ -105,12 +105,18 @@ namespace OpenSim.Region.ScriptEngine.XEngine.Tests
|
|||
|
||||
m_scene.EventManager.OnChatFromWorld += OnChatFromWorld;
|
||||
|
||||
m_scene.RezNewScript(userId, itemTemplate);
|
||||
SceneObjectPart partWhereRezzed = m_scene.RezNewScript(userId, itemTemplate);
|
||||
|
||||
m_chatEvent.WaitOne(60000);
|
||||
|
||||
Assert.That(m_osChatMessageReceived, Is.Not.Null, "No chat message received in TestStartScript()");
|
||||
Assert.That(m_osChatMessageReceived.Message, Is.EqualTo("Script running"));
|
||||
|
||||
bool running;
|
||||
TaskInventoryItem scriptItem = partWhereRezzed.Inventory.GetInventoryItem(itemName);
|
||||
Assert.That(
|
||||
SceneObjectPartInventory.TryGetScriptInstanceRunning(m_scene, scriptItem, out running), Is.True);
|
||||
Assert.That(running, Is.True);
|
||||
}
|
||||
|
||||
private void OnChatFromWorld(object sender, OSChatMessage oscm)
|
||||
|
|
Loading…
Reference in New Issue