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 ScriptEngine lastScriptEngine;
private uint lastLocalID; private uint lastLocalID;
private UUID lastItemID;
// Queue processing thread loop // Queue processing thread loop
private void EventQueueThreadLoop() private void EventQueueThreadLoop()
@ -201,6 +202,14 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
lastScriptEngine.World.DeleteSceneObject( lastScriptEngine.World.DeleteSceneObject(
part.ParentGroup, false); 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) catch (Exception e)
{ {
m_log.ErrorFormat("[{0}]: Exception {1} thrown", ScriptEngineName, e.GetType().ToString()); m_log.ErrorFormat("[{0}]: Exception {1} thrown", ScriptEngineName, e.GetType().ToString());
@ -284,6 +293,7 @@ namespace OpenSim.Region.ScriptEngine.DotNetEngine
QIS.localID)) QIS.localID))
{ {
lastLocalID = QIS.localID; lastLocalID = QIS.localID;
lastItemID = QIS.itemID;
LastExecutionStarted = DateTime.Now.Ticks; LastExecutionStarted = DateTime.Now.Ticks;
KillCurrentScript = false; KillCurrentScript = false;
InExecution = true; InExecution = true;

View File

@ -3577,6 +3577,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
{ {
if (item.Name == name) if (item.Name == name)
{ {
if (item.ItemID == m_itemID)
throw new ScriptDeleteException();
else
m_host.Inventory.RemoveInventoryItem(item.ItemID); m_host.Inventory.RemoveInventoryItem(item.ItemID);
return; 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 class DetectParams
{ {
public DetectParams() public DetectParams()

View File

@ -707,11 +707,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
} }
catch (Exception e) catch (Exception e)
{ {
m_log.DebugFormat("[Script] Exception: {0}", e.Message); // m_log.DebugFormat("[SCRIPT] Exception: {0}", e.Message);
m_InEvent = false; m_InEvent = false;
m_CurrentEvent = String.Empty; 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 try
{ {
@ -727,10 +727,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
} }
catch (Exception e2) // LEGIT: User Scripting catch (Exception e2) // LEGIT: User Scripting
{ {
m_log.Error("[Script]: "+ m_log.Error("[SCRIPT]: "+
"Error displaying error in-world: " + "Error displaying error in-world: " +
e2.ToString()); e2.ToString());
m_log.Error("[Script]: " + m_log.Error("[SCRIPT]: " +
"Errormessage: Error compiling script:\r\n" + "Errormessage: Error compiling script:\r\n" +
e.ToString()); e.ToString());
} }
@ -741,6 +741,12 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance
if (part != null && part.ParentGroup != null) if (part != null && part.ParentGroup != null)
m_Engine.World.DeleteSceneObject(part.ParentGroup, false); 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);
}
} }
} }
} }