mirror of
https://github.com/opensim/opensim.git
synced 2026-08-06 17:32:42 +08:00
direct post listen events on chat, bypassing intermediate storage and timed pooling. ( code still dirty)
This commit is contained in:
@@ -100,8 +100,8 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm
|
||||
private const int DEBUG_CHANNEL = 0x7fffffff;
|
||||
|
||||
private ListenerManager m_listenerManager;
|
||||
private ConcurrentQueue<ListenerMessage> 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<ListenerMessage>();
|
||||
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<IWorldComm>(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);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Are there any listen events ready to be dispatched?
|
||||
/// </summary>
|
||||
/// <returns>boolean indication</returns>
|
||||
public bool HasMessages()
|
||||
{
|
||||
return (m_pending.Count > 0);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Pop the first availlable listen event from the queue
|
||||
/// </summary>
|
||||
/// <returns>ListenerInfo with filter filled in</returns>
|
||||
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<ListenerMessage> m_messagesQueue;
|
||||
|
||||
/// <summary>
|
||||
/// Total number of listeners
|
||||
@@ -504,13 +483,12 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm
|
||||
}
|
||||
}
|
||||
|
||||
public ListenerManager(int maxlisteners, int maxhandles, Scene scene, ConcurrentQueue<ListenerMessage> 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<ListenerInfo> listeners) && listeners.Count > 0;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Get listeners matching the input parameters.
|
||||
/// </summary>
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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
|
||||
/// </param>
|
||||
bool PostScriptEvent(UUID itemID, string name, Object[] args);
|
||||
|
||||
bool PostObjectEvent(UUID itemID, string name, Object[] args);
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -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
|
||||
/// </param>
|
||||
void DeliverMessageTo(UUID target, int channel, Vector3 pos, string name, UUID id, string msg);
|
||||
|
||||
/// <summary>
|
||||
/// Are there any listen events ready to be dispatched?
|
||||
/// </summary>
|
||||
/// <returns>boolean indication</returns>
|
||||
bool HasMessages();
|
||||
|
||||
/// <summary>
|
||||
/// Pop the first availlable listen event from the queue
|
||||
/// </summary>
|
||||
/// <returns>ListenerInfo with filter filled in</returns>
|
||||
IWorldCommListenerMessage GetNextMessage();
|
||||
|
||||
void ListenControl(UUID itemID, int handle, int active);
|
||||
void ListenRemove(UUID itemID, int handle);
|
||||
void DeleteListener(UUID itemID);
|
||||
|
||||
@@ -3282,25 +3282,33 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
OnThrottleUpdate?.Invoke(scenePresence);
|
||||
}
|
||||
|
||||
// public void TriggerGatherUuids(SceneObjectPart sop, IDictionary<UUID, AssetType> 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<UUID, AssetType> 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<IMoneyModule>();
|
||||
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
|
||||
|
||||
|
||||
@@ -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<IMoneyModule>();
|
||||
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 },
|
||||
|
||||
Reference in New Issue
Block a user