From 3fe966d6b32f858da37a263e0568f28c7700b03b Mon Sep 17 00:00:00 2001 From: idb Date: Sun, 21 Dec 2008 19:04:06 +0000 Subject: An initial implementation of llMinEventDelay in XEngine. Not implemented yet in DotNetEngine. Fixes Mantis #2830 --- .../ScriptEngine/Shared/Instance/ScriptInstance.cs | 33 ++++++++++++++++++++++ .../Shared/Instance/ScriptSerializer.cs | 14 ++++++++- 2 files changed, 46 insertions(+), 1 deletion(-) (limited to 'OpenSim/Region/ScriptEngine/Shared/Instance') diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs index 1f57c13..8d6966f 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptInstance.cs @@ -84,6 +84,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance private int m_LastControlLevel = 0; private bool m_CollisionInQueue = false; private TaskInventoryItem m_thisScriptTask; + // The following is for setting a minimum delay between events + private double m_minEventDelay = 0; + private long m_eventDelayTicks = 0; + private long m_nextEventTimeTicks = 0; //private ISponsor m_ScriptSponsor; private Dictionary, KeyValuePair> @@ -103,6 +107,25 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance public Object[] PluginData = new Object[0]; + /// + /// Used by llMinEventDelay to suppress events happening any faster than this speed. + /// This currently restricts all events in one go. Not sure if each event type has + /// its own check so take the simple route first. + /// + public double MinEventDelay + { + get { return m_minEventDelay; } + set + { + if (value > 0.001) + m_minEventDelay = value; + else + m_minEventDelay = 0.0; + m_eventDelayTicks = (long)(m_minEventDelay * 10000000L); + m_nextEventTimeTicks = DateTime.Now.Ticks; + } + } + public bool Running { get { return m_RunEvents; } @@ -498,6 +521,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance if (!Running) return; + // If min event delay is set then ignore any events untill the time has expired + // This currently only allows 1 event of any type in the given time period. + // This may need extending to allow for a time for each individual event type. + if (m_eventDelayTicks != 0) + { + if (DateTime.Now.Ticks < m_nextEventTimeTicks) + return; + m_nextEventTimeTicks = DateTime.Now.Ticks + m_eventDelayTicks; + } + lock (m_EventQueue) { if (m_EventQueue.Count >= m_MaxScriptQueue) diff --git a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptSerializer.cs b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptSerializer.cs index 0ec039b..c06960b 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptSerializer.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Instance/ScriptSerializer.cs @@ -194,6 +194,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance } } + if (instance.MinEventDelay > 0.0) + { + XmlElement eventDelay = xmldoc.CreateElement("", "MinEventDelay", ""); + eventDelay.AppendChild(xmldoc.CreateTextNode(instance.MinEventDelay.ToString())); + rootElement.AppendChild(eventDelay); + } + return xmldoc.InnerXml; } @@ -380,8 +387,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance } } break; - } + case "MinEventDelay": + double minEventDelay = 0.0; + double.TryParse(part.InnerText, out minEventDelay); + instance.MinEventDelay = minEventDelay; + break; } + } } } -- cgit v1.1