diff --git a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs index 29badfa932..28c23373cf 100755 --- a/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/XEngine.cs @@ -1789,8 +1789,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine { if (m_Scripts.TryGetValue(itemID, out IScriptInstance instance)) { - if (instance != null) - instance.PostEvent(p); + instance?.PostEvent(p); return true; } lock (m_CompileDict) diff --git a/OpenSim/Region/ScriptEngine/YEngine/XMRInstBackend.cs b/OpenSim/Region/ScriptEngine/YEngine/XMRInstBackend.cs index bee890ba5c..a5345e5733 100644 --- a/OpenSim/Region/ScriptEngine/YEngine/XMRInstBackend.cs +++ b/OpenSim/Region/ScriptEngine/YEngine/XMRInstBackend.cs @@ -373,7 +373,7 @@ namespace OpenSim.Region.ScriptEngine.Yengine for(lln = m_EventQueue.First; lln != null; lln = lln.Next) { evt = lln.Value; - evc = (ScriptEventCode)Enum.Parse(typeof(ScriptEventCode), evt.EventName); + m_eventCodeMap.TryGetValue(evt.EventName, out evc); evc1 = (int)evc; evc2 = evc1 - 32; if((((uint)evc1 < (uint)32) && (((mask1 >> evc1) & 1) != 0)) || diff --git a/OpenSim/Region/ScriptEngine/YEngine/XMRInstCtor.cs b/OpenSim/Region/ScriptEngine/YEngine/XMRInstCtor.cs index 91a39cbf70..6465742f16 100644 --- a/OpenSim/Region/ScriptEngine/YEngine/XMRInstCtor.cs +++ b/OpenSim/Region/ScriptEngine/YEngine/XMRInstCtor.cs @@ -582,9 +582,8 @@ namespace OpenSim.Region.ScriptEngine.Yengine m_EventCounts[i] = 0; foreach(EventParams evt in m_EventQueue) { - ScriptEventCode eventCode = (ScriptEventCode)Enum.Parse(typeof(ScriptEventCode), - evt.EventName); - m_EventCounts[(int)eventCode]++; + if(m_eventCodeMap.TryGetValue(evt.EventName, out ScriptEventCode eventCode)) + m_EventCounts[(int)eventCode]++; } } @@ -929,9 +928,8 @@ namespace OpenSim.Region.ScriptEngine.Yengine m_EventCounts[i] = 0; foreach (EventParams evt in m_EventQueue) { - ScriptEventCode evtCode = (ScriptEventCode)Enum.Parse(typeof(ScriptEventCode), - evt.EventName); - m_EventCounts[(int)evtCode]++; + if(m_eventCodeMap.TryGetValue(evt.EventName, out ScriptEventCode evtCode)) + m_EventCounts[(int)evtCode]++; } } diff --git a/OpenSim/Region/ScriptEngine/YEngine/XMRInstMain.cs b/OpenSim/Region/ScriptEngine/YEngine/XMRInstMain.cs index def06b27c5..8da149614f 100644 --- a/OpenSim/Region/ScriptEngine/YEngine/XMRInstMain.cs +++ b/OpenSim/Region/ScriptEngine/YEngine/XMRInstMain.cs @@ -219,5 +219,45 @@ namespace OpenSim.Region.ScriptEngine.Yengine // llmineventdelay support double m_minEventDelay = 0.0; double m_nextEventTime = 0.0; + + private static readonly Dictionary m_eventCodeMap = new Dictionary() + { + {"attach", ScriptEventCode.attach}, + {"at_rot_target", ScriptEventCode.at_rot_target}, + {"at_target", ScriptEventCode.at_target}, + {"collision", ScriptEventCode.collision}, + {"collision_end", ScriptEventCode.collision_end}, + {"collision_start", ScriptEventCode.collision_start}, + {"control", ScriptEventCode.control}, + {"dataserver", ScriptEventCode.dataserver}, + {"email", ScriptEventCode.email}, + {"http_response", ScriptEventCode.http_response}, + {"land_collision", ScriptEventCode.land_collision}, + {"land_collision_end", ScriptEventCode.land_collision_end}, + {"land_collision_start", ScriptEventCode.land_collision_start}, + {"listen", ScriptEventCode.listen}, + {"money", ScriptEventCode.money}, + {"moving_end", ScriptEventCode.moving_end}, + {"moving_start", ScriptEventCode.moving_start}, + {"not_at_rot_target", ScriptEventCode.not_at_rot_target}, + {"not_at_target", ScriptEventCode.not_at_target}, + {"remote_data", ScriptEventCode.remote_data}, + {"run_time_permissions", ScriptEventCode.run_time_permissions}, + {"state_entry", ScriptEventCode.state_entry}, + {"state_exit", ScriptEventCode.state_exit}, + {"timer", ScriptEventCode.timer}, + {"touch", ScriptEventCode.touch}, + {"touch_end", ScriptEventCode.touch_end}, + {"touch_start", ScriptEventCode.touch_start}, + {"transaction_result", ScriptEventCode.transaction_result}, + {"object_rez", ScriptEventCode.object_rez}, + {"changed", ScriptEventCode.changed}, + {"link_message", ScriptEventCode.link_message}, + {"no_sensor", ScriptEventCode.no_sensor}, + {"on_rez", ScriptEventCode.on_rez}, + {"sensor", ScriptEventCode.sensor}, + {"http_request", ScriptEventCode.http_request}, + {"path_update", ScriptEventCode.path_update} + }; } } diff --git a/OpenSim/Region/ScriptEngine/YEngine/XMRInstRun.cs b/OpenSim/Region/ScriptEngine/YEngine/XMRInstRun.cs index 191dc0bcd1..8ffea3285f 100644 --- a/OpenSim/Region/ScriptEngine/YEngine/XMRInstRun.cs +++ b/OpenSim/Region/ScriptEngine/YEngine/XMRInstRun.cs @@ -63,7 +63,8 @@ namespace OpenSim.Region.ScriptEngine.Yengine */ public void PostEvent(EventParams evt) { - ScriptEventCode evc = (ScriptEventCode)Enum.Parse(typeof(ScriptEventCode), evt.EventName); + if(!m_eventCodeMap.TryGetValue(evt.EventName, out ScriptEventCode evc)) + return; // Put event on end of event queue. bool startIt = false; @@ -175,7 +176,7 @@ namespace OpenSim.Region.ScriptEngine.Yengine for(lln2 = m_EventQueue.First; lln2 != null; lln2 = lln2.Next) { EventParams evt2 = lln2.Value; - ScriptEventCode evc2 = (ScriptEventCode)Enum.Parse(typeof(ScriptEventCode), evt2.EventName); + m_eventCodeMap.TryGetValue(evt2.EventName, out ScriptEventCode evc2); if((evc2 != ScriptEventCode.state_entry) && (evc2 != ScriptEventCode.attach)) break; } @@ -239,15 +240,8 @@ namespace OpenSim.Region.ScriptEngine.Yengine public void CancelEvent(string eventName) { - ScriptEventCode evc; - try - { - evc = (ScriptEventCode)Enum.Parse(typeof(ScriptEventCode), eventName); - } - catch - { + if (!m_eventCodeMap.TryGetValue(eventName, out ScriptEventCode evc)) return; - } lock (m_QueueLock) { @@ -373,7 +367,7 @@ namespace OpenSim.Region.ScriptEngine.Yengine if(m_EventQueue.First != null) { evt = m_EventQueue.First.Value; - evc = (ScriptEventCode)Enum.Parse(typeof(ScriptEventCode), evt.EventName); + m_eventCodeMap.TryGetValue(evt.EventName, out evc); if (m_DetachQuantum > 0) { if(evc != ScriptEventCode.attach) @@ -390,7 +384,7 @@ namespace OpenSim.Region.ScriptEngine.Yengine } } m_EventQueue.RemoveFirst(); - if((int)evc >= 0) + if(evc >= 0) m_EventCounts[(int)evc]--; }