Mantis#1659. Thank you, Melanie for a patch that:

In LSL, the state command should have an immediate effect. 
The OpenSim script engine seems to wait until the function 
ends to process the state transition.
0.6.0-stable
Charles Krinke 2008-07-04 00:59:38 +00:00
parent cf87a9c5fe
commit ce5122ebf3
3 changed files with 54 additions and 32 deletions

View File

@ -99,6 +99,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
public void state(string newState) public void state(string newState)
{ {
m_ScriptEngine.SetState(m_itemID, newState); m_ScriptEngine.SetState(m_itemID, newState);
throw new EventAbortException();
} }
public void llSay(int channelID, string text) public void llSay(int channelID, string text)
@ -2791,6 +2792,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
{ {
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
m_ScriptEngine.ApiResetScript(m_itemID); m_ScriptEngine.ApiResetScript(m_itemID);
throw new EventAbortException();
} }
public void llMessageLinked(int linknum, int num, string msg, string id) public void llMessageLinked(int linknum, int num, string msg, string id)

View File

@ -30,6 +30,7 @@ using System.IO;
using System.Threading; using System.Threading;
using System.Collections; using System.Collections;
using System.Collections.Generic; using System.Collections.Generic;
using System.Runtime.Serialization;
using libsecondlife; using libsecondlife;
using OpenSim.Framework; using OpenSim.Framework;
using OpenSim.Region.Environment; using OpenSim.Region.Environment;
@ -37,6 +38,20 @@ using OpenSim.Region.Environment.Scenes;
namespace OpenSim.Region.ScriptEngine.Shared namespace OpenSim.Region.ScriptEngine.Shared
{ {
[Serializable]
public class EventAbortException : Exception
{
public EventAbortException()
{
}
protected EventAbortException(
SerializationInfo info,
StreamingContext context)
{
}
}
public class DetectParams public class DetectParams
{ {
public DetectParams() public DetectParams()

View File

@ -1296,44 +1296,49 @@ namespace OpenSim.Region.ScriptEngine.XEngine
catch (Exception e) catch (Exception e)
{ {
m_InEvent = false; m_InEvent = false;
if (e is System.Threading.ThreadAbortException) m_CurrentEvent = String.Empty;
if (!(e is TargetInvocationException) || !(e.InnerException is EventAbortException))
{ {
lock (m_EventQueue) if (e is System.Threading.ThreadAbortException)
{ {
if ((m_EventQueue.Count > 0) && m_RunEvents) lock (m_EventQueue)
{ {
m_CurrentResult=m_Engine.QueueEventHandler(this); if ((m_EventQueue.Count > 0) && m_RunEvents)
} {
else m_CurrentResult=m_Engine.QueueEventHandler(this);
{ }
m_CurrentResult = null; else
{
m_CurrentResult = null;
}
} }
m_DetectParams = null;
return 0;
} }
m_DetectParams = null; try
{
return 0; // DISPLAY ERROR INWORLD
} string text = "Runtime error:\n" + e.ToString();
if (text.Length > 1400)
try text = text.Substring(0, 1400);
{ m_Engine.World.SimChat(Helpers.StringToField(text),
// DISPLAY ERROR INWORLD ChatTypeEnum.DebugChannel, 2147483647,
string text = "Runtime error:\n" + e.ToString(); part.AbsolutePosition,
if (text.Length > 1400) part.Name, part.UUID, false);
text = text.Substring(0, 1400); }
m_Engine.World.SimChat(Helpers.StringToField(text), catch (Exception e2) // LEGIT: User Scripting
ChatTypeEnum.DebugChannel, 2147483647, {
part.AbsolutePosition, m_Engine.Log.Error("[XEngine]: "+
part.Name, part.UUID, false); "Error displaying error in-world: " +
} e2.ToString());
catch (Exception e2) // LEGIT: User Scripting m_Engine.Log.Error("[XEngine]: " +
{ "Errormessage: Error compiling script:\r\n" +
m_Engine.Log.Error("[XEngine]: "+ e.ToString());
"Error displaying error in-world: " + }
e2.ToString());
m_Engine.Log.Error("[XEngine]: " +
"Errormessage: Error compiling script:\r\n" +
e.ToString());
} }
} }
} }