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