diff --git a/OpenSim/Region/CoreModules/Scripting/WorldComm/WorldCommModule.cs b/OpenSim/Region/CoreModules/Scripting/WorldComm/WorldCommModule.cs index 1774bb8c90..03e29278dd 100644 --- a/OpenSim/Region/CoreModules/Scripting/WorldComm/WorldCommModule.cs +++ b/OpenSim/Region/CoreModules/Scripting/WorldComm/WorldCommModule.cs @@ -100,8 +100,8 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm private const int DEBUG_CHANNEL = 0x7fffffff; private ListenerManager m_listenerManager; - private ConcurrentQueue m_pending; private Scene m_scene; + private int m_whisperdistance = 10; private int m_saydistance = 20; private int m_shoutdistance = 100; @@ -146,9 +146,8 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm public void AddRegion(Scene scene) { - m_pending = new ConcurrentQueue(); m_scene = scene; - m_listenerManager = new ListenerManager(m_maxlisteners, m_maxhandles, scene, m_pending); + m_listenerManager = new ListenerManager(m_maxlisteners, m_maxhandles, scene); m_scene.RegisterModuleInterface(this); m_scene.EventManager.OnChatFromClient += DeliverClientMessage; m_scene.EventManager.OnChatBroadcast += DeliverClientMessage; @@ -367,7 +366,7 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm if (channel == 0) { // Channel 0 goes to viewer ONLY - m_scene.SimChat(Utils.StringToBytes(msg), ChatTypeEnum.Direct, 0, pos, name, id, target, false, false); + m_scene.SimChat(msg, ChatTypeEnum.Direct, 0, pos, name, id, target, false, false); return; } @@ -403,25 +402,6 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm m_listenerManager.TryEnqueueMessage(channel, target, name, id, msg); } - /// - /// Are there any listen events ready to be dispatched? - /// - /// boolean indication - public bool HasMessages() - { - return (m_pending.Count > 0); - } - - /// - /// Pop the first availlable listen event from the queue - /// - /// ListenerInfo with filter filled in - public IWorldCommListenerMessage GetNextMessage() - { - m_pending.TryDequeue(out ListenerMessage li); - return li; - } - #endregion /******************************************************************** @@ -485,7 +465,6 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm private int m_curlisteners; private Scene m_scene; - private ConcurrentQueue m_messagesQueue; /// /// Total number of listeners @@ -504,13 +483,12 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm } } - public ListenerManager(int maxlisteners, int maxhandles, Scene scene, ConcurrentQueue messagesQueue) + public ListenerManager(int maxlisteners, int maxhandles, Scene scene) { m_maxlisteners = maxlisteners; m_maxhandles = maxhandles; m_curlisteners = 0; m_scene = scene; - m_messagesQueue = messagesQueue; } public int AddListener(UUID itemID, UUID hostID, int channel, string name, UUID id, string msg) @@ -697,6 +675,12 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm #endregion + public bool HasListeners(int channel) + { + lock (mainLock) + return m_listenersByChannel.TryGetValue(channel, out List listeners) && listeners.Count > 0; + } + /// /// Get listeners matching the input parameters. /// @@ -818,14 +802,7 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm if (maxDistanceSQ > Vector3.DistanceSquared(sPart.AbsolutePosition, position)) { - m_messagesQueue.Enqueue(new ListenerMessage - { - ItemID = li.ItemID, - ID = id, - Channel = channel, - Name = name, - Message = msg - }); + m_scene.EventManager.TriggerScriptListen(li.ItemID, channel, name, id, msg); } } } @@ -876,14 +853,7 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm continue; } } - m_messagesQueue.Enqueue(new ListenerMessage - { - ItemID = li.ItemID, - ID = id, - Channel = channel, - Name = name, - Message = msg - }); + m_scene.EventManager.TriggerScriptListen(li.ItemID, channel, name, id, msg); } } } @@ -936,14 +906,7 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm continue; } } - m_messagesQueue.Enqueue(new ListenerMessage - { - ItemID = li.ItemID, - ID = id, - Channel = channel, - Name = name, - Message = msg - }); + m_scene.EventManager.TriggerScriptListen(li.ItemID, channel, name, id, msg); } } } @@ -996,14 +959,7 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm continue; } } - m_messagesQueue.Enqueue(new ListenerMessage - { - ItemID = li.ItemID, - ID = id, - Channel = channel, - Name = name, - Message = msg - }); + m_scene.EventManager.TriggerScriptListen(li.ItemID, channel, name, id, msg); } } } @@ -1053,14 +1009,6 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm } } } - public class ListenerMessage: IWorldCommListenerMessage - { - public UUID ItemID; - public int Channel; - public UUID ID; - public string Name; - public string Message; - } public class ListenerInfo : IWorldCommListenerInfo { diff --git a/OpenSim/Region/Framework/Interfaces/IScriptModule.cs b/OpenSim/Region/Framework/Interfaces/IScriptModule.cs index b7fddf639d..97eed0f647 100644 --- a/OpenSim/Region/Framework/Interfaces/IScriptModule.cs +++ b/OpenSim/Region/Framework/Interfaces/IScriptModule.cs @@ -70,7 +70,6 @@ namespace OpenSim.Region.Framework.Interfaces /// e.g. for http_request this will be an object array of key request_id, string method, string body /// bool PostScriptEvent(UUID itemID, string name, Object[] args); - bool PostObjectEvent(UUID itemID, string name, Object[] args); /// diff --git a/OpenSim/Region/Framework/Interfaces/IWorldComm.cs b/OpenSim/Region/Framework/Interfaces/IWorldComm.cs index f2409b19c2..2a2655535e 100644 --- a/OpenSim/Region/Framework/Interfaces/IWorldComm.cs +++ b/OpenSim/Region/Framework/Interfaces/IWorldComm.cs @@ -31,7 +31,6 @@ using OpenSim.Framework; namespace OpenSim.Region.Framework.Interfaces { - public interface IWorldCommListenerMessage { } public interface IWorldCommListenerInfo { bool IsActive { get; } @@ -129,18 +128,6 @@ namespace OpenSim.Region.Framework.Interfaces /// void DeliverMessageTo(UUID target, int channel, Vector3 pos, string name, UUID id, string msg); - /// - /// Are there any listen events ready to be dispatched? - /// - /// boolean indication - bool HasMessages(); - - /// - /// Pop the first availlable listen event from the queue - /// - /// ListenerInfo with filter filled in - IWorldCommListenerMessage GetNextMessage(); - void ListenControl(UUID itemID, int handle, int active); void ListenRemove(UUID itemID, int handle); void DeleteListener(UUID itemID); diff --git a/OpenSim/Region/Framework/Scenes/EventManager.cs b/OpenSim/Region/Framework/Scenes/EventManager.cs index b70219b9c5..7ac2bff49f 100644 --- a/OpenSim/Region/Framework/Scenes/EventManager.cs +++ b/OpenSim/Region/Framework/Scenes/EventManager.cs @@ -3282,25 +3282,33 @@ namespace OpenSim.Region.Framework.Scenes OnThrottleUpdate?.Invoke(scenePresence); } -// public void TriggerGatherUuids(SceneObjectPart sop, IDictionary assetUuids) -// { -// GatherUuids handler = OnGatherUuids; -// -// if (handler != null) -// { -// foreach (GatherUuids d in handler.GetInvocationList()) -// { -// try -// { -// d(sop, assetUuids); -// } -// catch (Exception e) -// { -// m_log.ErrorFormat("[EVENT MANAGER]: Delegate for TriggerUuidGather failed - continuing {0} - {1}", -// e.Message, e.StackTrace); -// } -// } -// } -// } + // public void TriggerGatherUuids(SceneObjectPart sop, IDictionary assetUuids) + // { + // GatherUuids handler = OnGatherUuids; + // + // if (handler != null) + // { + // foreach (GatherUuids d in handler.GetInvocationList()) + // { + // try + // { + // d(sop, assetUuids); + // } + // catch (Exception e) + // { + // m_log.ErrorFormat("[EVENT MANAGER]: Delegate for TriggerUuidGather failed - continuing {0} - {1}", + // e.Message, e.StackTrace); + // } + // } + // } + // } + + public delegate void ScriptListen(UUID scriptID, int channel, string name, UUID id, string message); + public event ScriptListen OnScriptListenEvent; + + public void TriggerScriptListen(UUID scriptID, int channel, string name, UUID id, string message) + { + OnScriptListenEvent?.Invoke(scriptID, channel, name, id, message); + } } } diff --git a/OpenSim/Region/ScriptEngine/XEngine/EventManager.cs b/OpenSim/Region/ScriptEngine/XEngine/EventManager.cs index 3963b5ee02..907c8464c8 100644 --- a/OpenSim/Region/ScriptEngine/XEngine/EventManager.cs +++ b/OpenSim/Region/ScriptEngine/XEngine/EventManager.cs @@ -71,6 +71,7 @@ namespace OpenSim.Region.ScriptEngine.XEngine myScriptEngine.World.EventManager.OnScriptLandColliderStart += land_collision_start; myScriptEngine.World.EventManager.OnScriptLandColliding += land_collision; myScriptEngine.World.EventManager.OnScriptLandColliderEnd += land_collision_end; + myScriptEngine.World.EventManager.OnScriptListenEvent += script_listen; IMoneyModule money = myScriptEngine.World.RequestModuleInterface(); if (money != null) { @@ -236,6 +237,18 @@ namespace OpenSim.Region.ScriptEngine.XEngine } } + public void script_listen(UUID scriptID, int channel, string name, UUID id, string message) + { + object[] resobj = new object[] + { + new LSL_Types.LSLInteger(channel), + new LSL_Types.LSLString(name), + new LSL_Types.LSLString(id.ToString()), + new LSL_Types.LSLString(message) + }; + myScriptEngine.PostScriptEvent(scriptID, new EventParams("listen", resobj, new DetectParams[0])); + } + // state_entry: not processed here // state_exit: not processed here diff --git a/OpenSim/Region/ScriptEngine/YEngine/XMREvents.cs b/OpenSim/Region/ScriptEngine/YEngine/XMREvents.cs index 7bf2e90573..bbcdb37920 100644 --- a/OpenSim/Region/ScriptEngine/YEngine/XMREvents.cs +++ b/OpenSim/Region/ScriptEngine/YEngine/XMREvents.cs @@ -58,24 +58,27 @@ namespace OpenSim.Region.ScriptEngine.Yengine private void InitEvents() { m_log.Info("[YEngine] Hooking up to server events"); - this.World.EventManager.OnAttach += attach; - this.World.EventManager.OnObjectGrab += touch_start; - this.World.EventManager.OnObjectGrabbing += touch; - this.World.EventManager.OnObjectDeGrab += touch_end; - this.World.EventManager.OnScriptChangedEvent += changed; - this.World.EventManager.OnScriptAtTargetEvent += at_target; - this.World.EventManager.OnScriptNotAtTargetEvent += not_at_target; - this.World.EventManager.OnScriptAtRotTargetEvent += at_rot_target; - this.World.EventManager.OnScriptNotAtRotTargetEvent += not_at_rot_target; - this.World.EventManager.OnScriptMovingStartEvent += moving_start; - this.World.EventManager.OnScriptMovingEndEvent += moving_end; - this.World.EventManager.OnScriptControlEvent += control; - this.World.EventManager.OnScriptColliderStart += collision_start; - this.World.EventManager.OnScriptColliding += collision; - this.World.EventManager.OnScriptCollidingEnd += collision_end; - this.World.EventManager.OnScriptLandColliderStart += land_collision_start; - this.World.EventManager.OnScriptLandColliding += land_collision; - this.World.EventManager.OnScriptLandColliderEnd += land_collision_end; + EventManager eManager = this.World.EventManager; + eManager.OnAttach += attach; + eManager.OnObjectGrab += touch_start; + eManager.OnObjectGrabbing += touch; + eManager.OnObjectDeGrab += touch_end; + eManager.OnScriptChangedEvent += changed; + eManager.OnScriptAtTargetEvent += at_target; + eManager.OnScriptNotAtTargetEvent += not_at_target; + eManager.OnScriptAtRotTargetEvent += at_rot_target; + eManager.OnScriptNotAtRotTargetEvent += not_at_rot_target; + eManager.OnScriptMovingStartEvent += moving_start; + eManager.OnScriptMovingEndEvent += moving_end; + eManager.OnScriptControlEvent += control; + eManager.OnScriptColliderStart += collision_start; + eManager.OnScriptColliding += collision; + eManager.OnScriptCollidingEnd += collision_end; + eManager.OnScriptLandColliderStart += land_collision_start; + eManager.OnScriptLandColliding += land_collision; + eManager.OnScriptLandColliderEnd += land_collision_end; + eManager.OnScriptListenEvent += script_listen; + IMoneyModule money = this.World.RequestModuleInterface(); if(money != null) { @@ -209,12 +212,24 @@ namespace OpenSim.Region.ScriptEngine.Yengine } } + public void script_listen(UUID scriptID, int channel, string name, UUID id, string message) + { + object[] resobj = new object[] + { + new LSL_Types.LSLInteger(channel), + new LSL_Types.LSLString(name), + new LSL_Types.LSLString(id.ToString()), + new LSL_Types.LSLString(message) + }; + PostScriptEvent(scriptID, new EventParams("listen", resobj, new DetectParams[0])); + } + // state_entry: not processed here // state_exit: not processed here public void money(uint localID, UUID agentID, int amount, DetectParams[] det) { - this.PostObjectEvent(localID, new EventParams( + PostObjectEvent(localID, new EventParams( "money", new object[] { agentID.ToString(), amount },