diff options
Diffstat (limited to '')
3 files changed, 55 insertions, 2 deletions
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs index 5ef9471..a005b01 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs | |||
@@ -2756,7 +2756,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api | |||
2756 | public void llMinEventDelay(double delay) | 2756 | public void llMinEventDelay(double delay) |
2757 | { | 2757 | { |
2758 | m_host.AddScriptLPS(1); | 2758 | m_host.AddScriptLPS(1); |
2759 | NotImplemented("llMinEventDelay"); | 2759 | try |
2760 | { | ||
2761 | m_ScriptEngine.SetMinEventDelay(m_itemID, delay); | ||
2762 | } | ||
2763 | catch (NotImplementedException) | ||
2764 | { | ||
2765 | // Currently not implemented in DotNetEngine only XEngine | ||
2766 | NotImplemented("llMinEventDelay in DotNetEngine"); | ||
2767 | } | ||
2760 | } | 2768 | } |
2761 | 2769 | ||
2762 | /// <summary> | 2770 | /// <summary> |
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 | |||
84 | private int m_LastControlLevel = 0; | 84 | private int m_LastControlLevel = 0; |
85 | private bool m_CollisionInQueue = false; | 85 | private bool m_CollisionInQueue = false; |
86 | private TaskInventoryItem m_thisScriptTask; | 86 | private TaskInventoryItem m_thisScriptTask; |
87 | // The following is for setting a minimum delay between events | ||
88 | private double m_minEventDelay = 0; | ||
89 | private long m_eventDelayTicks = 0; | ||
90 | private long m_nextEventTimeTicks = 0; | ||
87 | 91 | ||
88 | //private ISponsor m_ScriptSponsor; | 92 | //private ISponsor m_ScriptSponsor; |
89 | private Dictionary<KeyValuePair<int, int>, KeyValuePair<int, int>> | 93 | private Dictionary<KeyValuePair<int, int>, KeyValuePair<int, int>> |
@@ -103,6 +107,25 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
103 | 107 | ||
104 | public Object[] PluginData = new Object[0]; | 108 | public Object[] PluginData = new Object[0]; |
105 | 109 | ||
110 | /// <summary> | ||
111 | /// Used by llMinEventDelay to suppress events happening any faster than this speed. | ||
112 | /// This currently restricts all events in one go. Not sure if each event type has | ||
113 | /// its own check so take the simple route first. | ||
114 | /// </summary> | ||
115 | public double MinEventDelay | ||
116 | { | ||
117 | get { return m_minEventDelay; } | ||
118 | set | ||
119 | { | ||
120 | if (value > 0.001) | ||
121 | m_minEventDelay = value; | ||
122 | else | ||
123 | m_minEventDelay = 0.0; | ||
124 | m_eventDelayTicks = (long)(m_minEventDelay * 10000000L); | ||
125 | m_nextEventTimeTicks = DateTime.Now.Ticks; | ||
126 | } | ||
127 | } | ||
128 | |||
106 | public bool Running | 129 | public bool Running |
107 | { | 130 | { |
108 | get { return m_RunEvents; } | 131 | get { return m_RunEvents; } |
@@ -498,6 +521,16 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
498 | if (!Running) | 521 | if (!Running) |
499 | return; | 522 | return; |
500 | 523 | ||
524 | // If min event delay is set then ignore any events untill the time has expired | ||
525 | // This currently only allows 1 event of any type in the given time period. | ||
526 | // This may need extending to allow for a time for each individual event type. | ||
527 | if (m_eventDelayTicks != 0) | ||
528 | { | ||
529 | if (DateTime.Now.Ticks < m_nextEventTimeTicks) | ||
530 | return; | ||
531 | m_nextEventTimeTicks = DateTime.Now.Ticks + m_eventDelayTicks; | ||
532 | } | ||
533 | |||
501 | lock (m_EventQueue) | 534 | lock (m_EventQueue) |
502 | { | 535 | { |
503 | if (m_EventQueue.Count >= m_MaxScriptQueue) | 536 | 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 | |||
194 | } | 194 | } |
195 | } | 195 | } |
196 | 196 | ||
197 | if (instance.MinEventDelay > 0.0) | ||
198 | { | ||
199 | XmlElement eventDelay = xmldoc.CreateElement("", "MinEventDelay", ""); | ||
200 | eventDelay.AppendChild(xmldoc.CreateTextNode(instance.MinEventDelay.ToString())); | ||
201 | rootElement.AppendChild(eventDelay); | ||
202 | } | ||
203 | |||
197 | return xmldoc.InnerXml; | 204 | return xmldoc.InnerXml; |
198 | } | 205 | } |
199 | 206 | ||
@@ -380,8 +387,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Instance | |||
380 | } | 387 | } |
381 | } | 388 | } |
382 | break; | 389 | break; |
383 | } | 390 | case "MinEventDelay": |
391 | double minEventDelay = 0.0; | ||
392 | double.TryParse(part.InnerText, out minEventDelay); | ||
393 | instance.MinEventDelay = minEventDelay; | ||
394 | break; | ||
384 | } | 395 | } |
396 | } | ||
385 | } | 397 | } |
386 | } | 398 | } |
387 | 399 | ||