Actually remove the script if it tries to remove itself.

Fixes Mantis #2929
0.6.5-rc1
Melanie Thielker 2009-04-12 12:03:07 +00:00
parent f6f3737fe8
commit 2864c45678
4 changed files with 38 additions and 5 deletions

View File

@ -168,6 +168,7 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
private ScriptEngine lastScriptEngine;
private uint lastLocalID;
private UUID lastItemID;
// Queue processing thread loop
private void EventQueueThreadLoop()
@ -201,6 +202,14 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
lastScriptEngine.World.DeleteSceneObject(
part.ParentGroup, false);
}
catch (ScriptDeleteException) // Must delete item
{
SceneObjectPart part =
lastScriptEngine.World.GetSceneObjectPart(
lastLocalID);
if (part != null && part.ParentGroup != null)
part.Inventory.RemoveInventoryItem(lastItemID);
}
catch (Exception e)
{
m_log.ErrorFormat("[{0}]: Exception {1} thrown", ScriptEngineName, e.GetType().ToString());
@ -284,6 +293,7 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
QIS.localID))
{
lastLocalID = QIS.localID;
lastItemID = QIS.itemID;
LastExecutionStarted = DateTime.Now.Ticks;
KillCurrentScript = false;
InExecution = true;

View File

@ -3577,6 +3577,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
{
if (item.Name == name)
{
if (item.ItemID == m_itemID)
throw new ScriptDeleteException();
else
m_host.Inventory.RemoveInventoryItem(item.ItemID);
return;
}

View File

@ -66,6 +66,20 @@ namespace OpenSim.Region.ScriptEngine.Shared
}
}
[Serializable]
public class ScriptDeleteException : Exception
{
public ScriptDeleteException()
{
}
protected ScriptDeleteException(
SerializationInfo info,
StreamingContext context)
{
}
}
public class DetectParams
{
public DetectParams()

View File

@ -707,11 +707,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
}
catch (Exception e)
{
m_log.DebugFormat("[Script] Exception: {0}", e.Message);
// m_log.DebugFormat("[SCRIPT] Exception: {0}", e.Message);
m_InEvent = false;
m_CurrentEvent = String.Empty;
if ((!(e is TargetInvocationException) || !(e.InnerException is SelfDeleteException)) && (!(e is ThreadAbortException)))
if ((!(e is TargetInvocationException) || (!(e.InnerException is SelfDeleteException) && !(e.InnerException is ScriptDeleteException))) && !(e is ThreadAbortException))
{
try
{
@ -727,10 +727,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
}
catch (Exception e2) // LEGIT: User Scripting
{
m_log.Error("[Script]: "+
m_log.Error("[SCRIPT]: "+
"Error displaying error in-world: " +
e2.ToString());
m_log.Error("[Script]: " +
m_log.Error("[SCRIPT]: " +
"Errormessage: Error compiling script:\r\n" +
e.ToString());
}
@ -741,6 +741,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
if (part != null && part.ParentGroup != null)
m_Engine.World.DeleteSceneObject(part.ParentGroup, false);
}
else if ((e is TargetInvocationException) && (e.InnerException is ScriptDeleteException))
{
m_InSelfDelete = true;
if (part != null && part.ParentGroup != null)
part.Inventory.RemoveInventoryItem(m_ItemID);
}
}
}
}