diff options
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs index 081ba03..7c7b831 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs | |||
@@ -82,6 +82,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
82 | private int m_ControlEventsInQueue; | 82 | private int m_ControlEventsInQueue; |
83 | private int m_LastControlLevel; | 83 | private int m_LastControlLevel; |
84 | private bool m_CollisionInQueue; | 84 | private bool m_CollisionInQueue; |
85 | private bool m_StateChangeInProgress; | ||
85 | 86 | ||
86 | // The following is for setting a minimum delay between events | 87 | // The following is for setting a minimum delay between events |
87 | private double m_minEventDelay; | 88 | private double m_minEventDelay; |
@@ -210,6 +211,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
210 | public void ClearQueue() | 211 | public void ClearQueue() |
211 | { | 212 | { |
212 | m_TimerQueued = false; | 213 | m_TimerQueued = false; |
214 | m_StateChangeInProgress = false; | ||
213 | EventQueue.Clear(); | 215 | EventQueue.Clear(); |
214 | } | 216 | } |
215 | 217 | ||
@@ -616,13 +618,26 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
616 | { | 618 | { |
617 | if (state == State) | 619 | if (state == State) |
618 | return; | 620 | return; |
619 | 621 | ||
622 | // Remove all queued events, remembering the last timer event | ||
623 | EventParams lastTimerEv = null; | ||
624 | while (EventQueue.Count > 0) | ||
625 | { | ||
626 | EventParams tempv = (EventParams)EventQueue.Dequeue(); | ||
627 | if (tempv.EventName == "timer") lastTimerEv = tempv; | ||
628 | } | ||
629 | // Post events | ||
620 | PostEvent(new EventParams("state_exit", new Object[0], | 630 | PostEvent(new EventParams("state_exit", new Object[0], |
621 | new DetectParams[0])); | 631 | new DetectParams[0])); |
622 | PostEvent(new EventParams("state", new Object[] { state }, | 632 | PostEvent(new EventParams("state", new Object[] { state }, |
623 | new DetectParams[0])); | 633 | new DetectParams[0])); |
624 | PostEvent(new EventParams("state_entry", new Object[0], | 634 | PostEvent(new EventParams("state_entry", new Object[0], |
625 | new DetectParams[0])); | 635 | new DetectParams[0])); |
636 | // Requeue the timer event after the state changing events | ||
637 | if (lastTimerEv != null) EventQueue.Enqueue(lastTimerEv); | ||
638 | // This will stop events from being queued and processed | ||
639 | // until the new state is started | ||
640 | m_StateChangeInProgress = true; | ||
626 | 641 | ||
627 | throw new EventAbortException(); | 642 | throw new EventAbortException(); |
628 | } | 643 | } |
@@ -697,6 +712,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
697 | 712 | ||
698 | m_CollisionInQueue = true; | 713 | m_CollisionInQueue = true; |
699 | } | 714 | } |
715 | |||
716 | // The only events that persist across state changes are timers | ||
717 | if (m_StateChangeInProgress && data.EventName != "timer") return; | ||
700 | 718 | ||
701 | EventQueue.Enqueue(data); | 719 | EventQueue.Enqueue(data); |
702 | 720 | ||
@@ -785,6 +803,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
785 | 803 | ||
786 | AsyncCommandManager.StateChange(Engine, | 804 | AsyncCommandManager.StateChange(Engine, |
787 | LocalID, ItemID); | 805 | LocalID, ItemID); |
806 | // we are effectively in the new state now, so we can resume queueing | ||
807 | // and processing other non-timer events | ||
808 | m_StateChangeInProgress = false; | ||
788 | 809 | ||
789 | Part.SetScriptEvents(ItemID, (int)m_Script.GetStateEventFlags(State)); | 810 | Part.SetScriptEvents(ItemID, (int)m_Script.GetStateEventFlags(State)); |
790 | } | 811 | } |