mirror of
https://github.com/opensim/opensim.git
synced 2026-05-15 03:15:41 +08:00
try simplify lsl listen code a bit
This commit is contained in:
@@ -210,11 +210,9 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm
|
||||
/// </param>
|
||||
/// <param name="msg">msg to filter on</param>
|
||||
/// <returns>number of the scripts handle</returns>
|
||||
public int Listen(uint localID, UUID itemID, UUID hostID, int channel,
|
||||
string name, UUID id, string msg)
|
||||
public int Listen(UUID itemID, UUID hostID, int channel, string name, UUID id, string msg)
|
||||
{
|
||||
return m_listenerManager.AddListener(localID, itemID, hostID,
|
||||
channel, name, id, msg);
|
||||
return m_listenerManager.AddListener(itemID, hostID, channel, name, id, msg);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -223,7 +221,6 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm
|
||||
/// the script during 'peek' time. Parameter hostID is needed to
|
||||
/// determine the position of the script.
|
||||
/// </summary>
|
||||
/// <param name="localID">localID of the script engine</param>
|
||||
/// <param name="itemID">UUID of the script engine</param>
|
||||
/// <param name="hostID">UUID of the SceneObjectPart</param>
|
||||
/// <param name="channel">channel to listen on</param>
|
||||
@@ -236,11 +233,10 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm
|
||||
/// Bitfield indicating which strings should be processed as regex.
|
||||
/// </param>
|
||||
/// <returns>number of the scripts handle</returns>
|
||||
public int Listen(uint localID, UUID itemID, UUID hostID, int channel,
|
||||
public int Listen(UUID itemID, UUID hostID, int channel,
|
||||
string name, UUID id, string msg, int regexBitfield)
|
||||
{
|
||||
return m_listenerManager.AddListener(localID, itemID, hostID,
|
||||
channel, name, id, msg, regexBitfield);
|
||||
return m_listenerManager.AddListener(itemID, hostID, channel, name, id, msg, regexBitfield);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -340,12 +336,10 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm
|
||||
// in a limited set of listeners, each belonging a host. If the host is in range, add them
|
||||
// to the pending queue.
|
||||
|
||||
UUID hostID;
|
||||
foreach (ListenerInfo li in m_listenerManager.GetListeners(UUID.Zero, channel, name, id, msg))
|
||||
{
|
||||
hostID = li.GetHostID();
|
||||
// Dont process if this message is from yourself!
|
||||
if (id == hostID)
|
||||
if (id.Equals(li.HostID))
|
||||
continue;
|
||||
|
||||
if(maxDistanceSQ < 0)
|
||||
@@ -354,7 +348,7 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm
|
||||
continue;
|
||||
}
|
||||
|
||||
SceneObjectPart sPart = m_scene.GetSceneObjectPart(hostID);
|
||||
SceneObjectPart sPart = m_scene.GetSceneObjectPart(li.HostID);
|
||||
if (sPart == null)
|
||||
continue;
|
||||
|
||||
@@ -424,8 +418,8 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm
|
||||
|
||||
foreach (ListenerInfo li in m_listenerManager.GetListeners(UUID.Zero, channel, name, id, msg))
|
||||
{
|
||||
UUID liHostID = li.GetHostID();
|
||||
if (liHostID.Equals(id))
|
||||
UUID liHostID = li.HostID;
|
||||
if (li.HostID.Equals(id))
|
||||
continue;
|
||||
if (m_scene.GetSceneObjectPart(liHostID) == null)
|
||||
continue;
|
||||
@@ -443,7 +437,7 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm
|
||||
|
||||
foreach (ListenerInfo li in m_listenerManager.GetListeners(UUID.Zero, channel, name, id, msg))
|
||||
{
|
||||
UUID liHostID = li.GetHostID();
|
||||
UUID liHostID = li.HostID;
|
||||
// Dont process if this message is from yourself!
|
||||
if (liHostID.Equals(id))
|
||||
continue;
|
||||
@@ -507,10 +501,10 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm
|
||||
return m_listenerManager.GetSerializationData(itemID);
|
||||
}
|
||||
|
||||
public void CreateFromData(uint localID, UUID itemID, UUID hostID,
|
||||
public void CreateFromData(UUID itemID, UUID hostID,
|
||||
Object[] data)
|
||||
{
|
||||
m_listenerManager.AddFromData(localID, itemID, hostID, data);
|
||||
m_listenerManager.AddFromData(itemID, hostID, data);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -541,15 +535,12 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm
|
||||
m_curlisteners = 0;
|
||||
}
|
||||
|
||||
public int AddListener(uint localID, UUID itemID, UUID hostID,
|
||||
int channel, string name, UUID id, string msg)
|
||||
public int AddListener(UUID itemID, UUID hostID, int channel, string name, UUID id, string msg)
|
||||
{
|
||||
return AddListener(localID, itemID, hostID, channel, name, id,
|
||||
msg, 0);
|
||||
return AddListener(itemID, hostID, channel, name, id, msg, 0);
|
||||
}
|
||||
|
||||
public int AddListener(uint localID, UUID itemID, UUID hostID,
|
||||
int channel, string name, UUID id, string msg,
|
||||
public int AddListener(UUID itemID, UUID hostID, int channel, string name, UUID id, string msg,
|
||||
int regexBitfield)
|
||||
{
|
||||
// do we already have a match on this particular filter event?
|
||||
@@ -559,7 +550,7 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm
|
||||
{
|
||||
// special case, called with same filter settings, return same
|
||||
// handle (2008-05-02, tested on 1.21.1 server, still holds)
|
||||
return coll[0].GetHandle();
|
||||
return coll[0].Handle;
|
||||
}
|
||||
|
||||
lock (mainLock)
|
||||
@@ -570,7 +561,7 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm
|
||||
|
||||
if (newHandle > 0)
|
||||
{
|
||||
ListenerInfo li = new ListenerInfo(newHandle, localID,
|
||||
ListenerInfo li = new ListenerInfo(newHandle,
|
||||
itemID, hostID, channel, name, id, msg,
|
||||
regexBitfield);
|
||||
|
||||
@@ -597,7 +588,7 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm
|
||||
{
|
||||
foreach (ListenerInfo li in lis.Value)
|
||||
{
|
||||
if (handle == li.GetHandle() && itemID == li.GetItemID())
|
||||
if (handle == li.Handle && itemID.Equals(li.ItemID))
|
||||
{
|
||||
lis.Value.Remove(li);
|
||||
m_curlisteners--;
|
||||
@@ -622,7 +613,7 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm
|
||||
{
|
||||
foreach (ListenerInfo li in lis.Value)
|
||||
{
|
||||
if (itemID == li.GetItemID())
|
||||
if (itemID.Equals(li.ItemID))
|
||||
removedListeners.Add(li);
|
||||
}
|
||||
|
||||
@@ -651,7 +642,7 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm
|
||||
{
|
||||
foreach (ListenerInfo li in lis.Value)
|
||||
{
|
||||
if (handle == li.GetHandle() && itemID == li.GetItemID())
|
||||
if (handle == li.Handle && itemID.Equals(li.ItemID))
|
||||
{
|
||||
li.Activate();
|
||||
return;
|
||||
@@ -669,7 +660,7 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm
|
||||
{
|
||||
foreach (ListenerInfo li in lis.Value)
|
||||
{
|
||||
if (handle == li.GetHandle() && itemID == li.GetItemID())
|
||||
if (handle == li.Handle && itemID.Equals(li.ItemID))
|
||||
{
|
||||
li.Deactivate();
|
||||
return;
|
||||
@@ -694,8 +685,8 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm
|
||||
{
|
||||
foreach (ListenerInfo li in lis.Value)
|
||||
{
|
||||
if (itemID == li.GetItemID())
|
||||
handles.Add(li.GetHandle());
|
||||
if (itemID == li.ItemID)
|
||||
handles.Add(li.Handle);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -748,48 +739,103 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm
|
||||
|
||||
lock (mainLock)
|
||||
{
|
||||
List<ListenerInfo> listeners;
|
||||
if (!m_listenersByChannel.TryGetValue(channel, out listeners))
|
||||
if (!m_listenersByChannel.TryGetValue(channel, out List<ListenerInfo> listeners))
|
||||
{
|
||||
return collection;
|
||||
}
|
||||
|
||||
bool itemIDNotZero = !itemID.IsZero();
|
||||
bool itemIDNotZero = itemID.IsNotZero();
|
||||
bool nameNotEmpty = !string.IsNullOrEmpty(name);
|
||||
bool msgNotEmpty = !string.IsNullOrEmpty(msg);
|
||||
foreach (ListenerInfo li in listeners)
|
||||
{
|
||||
if (!li.IsActive())
|
||||
if (!li.IsActive)
|
||||
continue;
|
||||
|
||||
if (itemIDNotZero && itemID != li.GetItemID())
|
||||
if (itemIDNotZero && itemID.NotEqual(li.ItemID))
|
||||
continue;
|
||||
|
||||
if (!li.GetID().IsZero() && id.NotEqual(li.GetID()))
|
||||
if (li.ID.IsNotZero() && id.NotEqual(li.ID))
|
||||
continue;
|
||||
|
||||
if (li.GetName().Length > 0)
|
||||
if (nameNotEmpty && li.Name.Length > 0)
|
||||
{
|
||||
if((li.RegexBitfield & OS_LISTEN_REGEX_NAME) == OS_LISTEN_REGEX_NAME)
|
||||
if ((li.RegexBitfield & OS_LISTEN_REGEX_NAME) == OS_LISTEN_REGEX_NAME)
|
||||
{
|
||||
if (!Regex.IsMatch(name, li.GetName()))
|
||||
if (!Regex.IsMatch(name, li.Name))
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!li.GetName().Equals(name))
|
||||
if (!li.Name.Equals(name))
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (li.GetMessage().Length > 0)
|
||||
if (msgNotEmpty && li.Message.Length > 0)
|
||||
{
|
||||
if((li.RegexBitfield & OS_LISTEN_REGEX_MESSAGE) == OS_LISTEN_REGEX_MESSAGE)
|
||||
if ((li.RegexBitfield & OS_LISTEN_REGEX_MESSAGE) == OS_LISTEN_REGEX_MESSAGE)
|
||||
{
|
||||
if(!Regex.IsMatch(msg, li.GetMessage()))
|
||||
if (!Regex.IsMatch(msg, li.Message))
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if(!li.GetMessage().Equals(msg))
|
||||
if (!li.Message.Equals(msg))
|
||||
continue;
|
||||
}
|
||||
}
|
||||
collection.Add(li);
|
||||
}
|
||||
}
|
||||
return collection;
|
||||
}
|
||||
|
||||
public List<ListenerInfo> GetListeners(int channel, string name, UUID id, string msg)
|
||||
{
|
||||
List<ListenerInfo> collection = new List<ListenerInfo>();
|
||||
|
||||
lock (mainLock)
|
||||
{
|
||||
if (!m_listenersByChannel.TryGetValue(channel, out List<ListenerInfo> listeners))
|
||||
{
|
||||
return collection;
|
||||
}
|
||||
|
||||
bool nameNotEmpty = !string.IsNullOrEmpty(name);
|
||||
bool msgNotEmpty = !string.IsNullOrEmpty(msg);
|
||||
foreach (ListenerInfo li in listeners)
|
||||
{
|
||||
if (!li.IsActive)
|
||||
continue;
|
||||
|
||||
if (li.ID.IsNotZero() && id.NotEqual(li.ID))
|
||||
continue;
|
||||
|
||||
if (nameNotEmpty && li.Name.Length > 0)
|
||||
{
|
||||
if ((li.RegexBitfield & OS_LISTEN_REGEX_NAME) == OS_LISTEN_REGEX_NAME)
|
||||
{
|
||||
if (!Regex.IsMatch(name, li.Name))
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!li.Name.Equals(name))
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
if (msgNotEmpty && li.Message.Length > 0)
|
||||
{
|
||||
if ((li.RegexBitfield & OS_LISTEN_REGEX_MESSAGE) == OS_LISTEN_REGEX_MESSAGE)
|
||||
{
|
||||
if (!Regex.IsMatch(msg, li.Message))
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!li.Message.Equals(msg))
|
||||
continue;
|
||||
}
|
||||
}
|
||||
@@ -809,16 +855,15 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm
|
||||
{
|
||||
foreach (ListenerInfo l in list)
|
||||
{
|
||||
if (l.GetItemID() == itemID)
|
||||
if (itemID.Equals(l.ItemID))
|
||||
data.AddRange(l.GetSerializationData());
|
||||
}
|
||||
}
|
||||
}
|
||||
return (Object[])data.ToArray();
|
||||
return data.ToArray();
|
||||
}
|
||||
|
||||
public void AddFromData(uint localID, UUID itemID, UUID hostID,
|
||||
Object[] data)
|
||||
public void AddFromData(UUID itemID, UUID hostID, Object[] data)
|
||||
{
|
||||
int idx = 0;
|
||||
Object[] item = new Object[6];
|
||||
@@ -830,8 +875,7 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm
|
||||
item = new Object[dataItemLength];
|
||||
Array.Copy(data, idx, item, 0, dataItemLength);
|
||||
|
||||
ListenerInfo info =
|
||||
ListenerInfo.FromData(localID, itemID, hostID, item);
|
||||
ListenerInfo info = ListenerInfo.FromData(itemID, hostID, item);
|
||||
|
||||
lock (mainLock)
|
||||
{
|
||||
@@ -852,91 +896,99 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm
|
||||
/// <summary>
|
||||
/// Listener is active or not
|
||||
/// </summary>
|
||||
private bool m_active;
|
||||
public bool IsActive { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// Assigned handle of this listener
|
||||
/// </summary>
|
||||
private int m_handle;
|
||||
|
||||
/// <summary>
|
||||
/// Local ID from script engine
|
||||
/// </summary>
|
||||
private uint m_localID;
|
||||
public int Handle { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// ID of the host script engine
|
||||
/// </summary>
|
||||
private UUID m_itemID;
|
||||
public UUID ItemID { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// ID of the host/scene part
|
||||
/// </summary>
|
||||
private UUID m_hostID;
|
||||
public UUID HostID { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// Channel
|
||||
/// </summary>
|
||||
private int m_channel;
|
||||
public int Channel { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// ID to filter messages from
|
||||
/// </summary>
|
||||
private UUID m_id;
|
||||
public UUID ID { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// Object name to filter messages from
|
||||
/// </summary>
|
||||
private string m_name;
|
||||
public string Name { get; private set; }
|
||||
|
||||
/// <summary>
|
||||
/// The message
|
||||
/// </summary>
|
||||
private string m_message;
|
||||
public string Message { get; private set; }
|
||||
public int RegexBitfield { get; private set; }
|
||||
|
||||
public ListenerInfo(int handle, uint localID, UUID ItemID,
|
||||
public ListenerInfo()
|
||||
{
|
||||
}
|
||||
|
||||
public ListenerInfo(int handle, UUID _ItemID,
|
||||
UUID hostID, int channel, string name, UUID id,
|
||||
string message)
|
||||
{
|
||||
Initialise(handle, localID, ItemID, hostID, channel, name, id,
|
||||
message, 0);
|
||||
IsActive = true;
|
||||
Handle = handle;
|
||||
ItemID = _ItemID;
|
||||
HostID = hostID;
|
||||
Channel = channel;
|
||||
Name = name;
|
||||
ID = id;
|
||||
Message = message;
|
||||
RegexBitfield = 0;
|
||||
}
|
||||
|
||||
public ListenerInfo(int handle, uint localID, UUID ItemID,
|
||||
public ListenerInfo(int handle, UUID _ItemID,
|
||||
UUID hostID, int channel, string name, UUID id,
|
||||
string message, int regexBitfield)
|
||||
{
|
||||
Initialise(handle, localID, ItemID, hostID, channel, name, id,
|
||||
message, regexBitfield);
|
||||
Handle = handle;
|
||||
ItemID = _ItemID;
|
||||
HostID = hostID;
|
||||
Channel = channel;
|
||||
Name = name;
|
||||
ID = id;
|
||||
Message = message;
|
||||
RegexBitfield = regexBitfield;
|
||||
}
|
||||
|
||||
public ListenerInfo(ListenerInfo li, string name, UUID id,
|
||||
string message)
|
||||
public ListenerInfo(ListenerInfo li, string name, UUID id, string message)
|
||||
{
|
||||
Initialise(li.m_handle, li.m_localID, li.m_itemID, li.m_hostID,
|
||||
li.m_channel, name, id, message, 0);
|
||||
IsActive = true;
|
||||
Handle = li.Handle;
|
||||
ItemID = li.ItemID;
|
||||
HostID = li.HostID;
|
||||
Channel = li.Channel;
|
||||
Name = name;
|
||||
ID = id;
|
||||
Message = message;
|
||||
}
|
||||
|
||||
public ListenerInfo(ListenerInfo li, string name, UUID id,
|
||||
string message, int regexBitfield)
|
||||
public ListenerInfo(ListenerInfo li, string name, UUID id, string message, int regexBitfield)
|
||||
{
|
||||
Initialise(li.m_handle, li.m_localID, li.m_itemID, li.m_hostID,
|
||||
li.m_channel, name, id, message, regexBitfield);
|
||||
}
|
||||
|
||||
private void Initialise(int handle, uint localID, UUID ItemID,
|
||||
UUID hostID, int channel, string name, UUID id,
|
||||
string message, int regexBitfield)
|
||||
{
|
||||
m_active = true;
|
||||
m_handle = handle;
|
||||
m_localID = localID;
|
||||
m_itemID = ItemID;
|
||||
m_hostID = hostID;
|
||||
m_channel = channel;
|
||||
m_name = name;
|
||||
m_id = id;
|
||||
m_message = message;
|
||||
IsActive = true;
|
||||
Handle = li.Handle;
|
||||
ItemID = li.ItemID;
|
||||
HostID = li.HostID;
|
||||
Channel = li.Channel;
|
||||
Name = name;
|
||||
ID = id;
|
||||
Message = message;
|
||||
RegexBitfield = regexBitfield;
|
||||
}
|
||||
|
||||
@@ -944,87 +996,41 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm
|
||||
{
|
||||
Object[] data = new Object[7];
|
||||
|
||||
data[0] = m_active;
|
||||
data[1] = m_handle;
|
||||
data[2] = m_channel;
|
||||
data[3] = m_name;
|
||||
data[4] = m_id;
|
||||
data[5] = m_message;
|
||||
data[0] = IsActive;
|
||||
data[1] = Handle;
|
||||
data[2] = Channel;
|
||||
data[3] = Name;
|
||||
data[4] = ID;
|
||||
data[5] = Message;
|
||||
data[6] = RegexBitfield;
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
public static ListenerInfo FromData(uint localID, UUID ItemID,
|
||||
UUID hostID, Object[] data)
|
||||
public static ListenerInfo FromData(UUID _ItemID, UUID hostID, Object[] data)
|
||||
{
|
||||
ListenerInfo linfo = new ListenerInfo((int)data[1], localID,
|
||||
ItemID, hostID, (int)data[2], (string)data[3],
|
||||
(UUID)data[4], (string)data[5]);
|
||||
linfo.m_active = (bool)data[0];
|
||||
if (data.Length >= 7)
|
||||
return new ListenerInfo()
|
||||
{
|
||||
linfo.RegexBitfield = (int)data[6];
|
||||
}
|
||||
|
||||
return linfo;
|
||||
}
|
||||
|
||||
public UUID GetItemID()
|
||||
{
|
||||
return m_itemID;
|
||||
}
|
||||
|
||||
public UUID GetHostID()
|
||||
{
|
||||
return m_hostID;
|
||||
}
|
||||
|
||||
public int GetChannel()
|
||||
{
|
||||
return m_channel;
|
||||
}
|
||||
|
||||
public uint GetLocalID()
|
||||
{
|
||||
return m_localID;
|
||||
}
|
||||
|
||||
public int GetHandle()
|
||||
{
|
||||
return m_handle;
|
||||
}
|
||||
|
||||
public string GetMessage()
|
||||
{
|
||||
return m_message;
|
||||
}
|
||||
|
||||
public string GetName()
|
||||
{
|
||||
return m_name;
|
||||
}
|
||||
|
||||
public bool IsActive()
|
||||
{
|
||||
return m_active;
|
||||
}
|
||||
|
||||
public void Deactivate()
|
||||
{
|
||||
m_active = false;
|
||||
IsActive = (bool)data[0],
|
||||
Handle = (int)data[1],
|
||||
ItemID = _ItemID,
|
||||
HostID = hostID,
|
||||
Channel = (int)data[2],
|
||||
Name = (string)data[3],
|
||||
ID = (UUID)data[4],
|
||||
Message = (string)data[5],
|
||||
RegexBitfield = (data.Length > 6) ? (int)data[6] : 0
|
||||
};
|
||||
}
|
||||
|
||||
public void Activate()
|
||||
{
|
||||
m_active = true;
|
||||
IsActive = true;
|
||||
}
|
||||
|
||||
public UUID GetID()
|
||||
public void Deactivate()
|
||||
{
|
||||
return m_id;
|
||||
IsActive = false;
|
||||
}
|
||||
|
||||
public int RegexBitfield { get; private set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -33,18 +33,14 @@ namespace OpenSim.Region.Framework.Interfaces
|
||||
{
|
||||
public interface IWorldCommListenerInfo
|
||||
{
|
||||
Object[] GetSerializationData();
|
||||
UUID GetItemID();
|
||||
UUID GetHostID();
|
||||
int GetChannel();
|
||||
uint GetLocalID();
|
||||
int GetHandle();
|
||||
string GetMessage();
|
||||
string GetName();
|
||||
bool IsActive();
|
||||
void Deactivate();
|
||||
void Activate();
|
||||
UUID GetID();
|
||||
bool IsActive { get; }
|
||||
int Handle { get; }
|
||||
UUID ItemID { get; }
|
||||
UUID HostID { get; }
|
||||
int Channel { get; }
|
||||
string Message { get; }
|
||||
string Name { get; }
|
||||
UUID ID { get; }
|
||||
|
||||
/// <summary>
|
||||
/// Bitfield indicating which strings should be processed as regex.
|
||||
@@ -52,6 +48,10 @@ namespace OpenSim.Region.Framework.Interfaces
|
||||
/// 2 corresponds to IWorldCommListenerInfo::GetMessage()
|
||||
/// </summary>
|
||||
int RegexBitfield { get; }
|
||||
Object[] GetSerializationData();
|
||||
|
||||
void Deactivate();
|
||||
void Activate();
|
||||
}
|
||||
|
||||
public interface IWorldComm
|
||||
@@ -67,7 +67,6 @@ namespace OpenSim.Region.Framework.Interfaces
|
||||
/// the script during 'peek' time. Parameter hostID is needed to
|
||||
/// determine the position of the script.
|
||||
/// </summary>
|
||||
/// <param name="LocalID">localID of the script engine</param>
|
||||
/// <param name="itemID">UUID of the script engine</param>
|
||||
/// <param name="hostID">UUID of the SceneObjectPart</param>
|
||||
/// <param name="channel">channel to listen on</param>
|
||||
@@ -75,7 +74,7 @@ namespace OpenSim.Region.Framework.Interfaces
|
||||
/// <param name="id">key to filter on (user given, could be totally faked)</param>
|
||||
/// <param name="msg">msg to filter on</param>
|
||||
/// <returns>number of the scripts handle</returns>
|
||||
int Listen(uint LocalID, UUID itemID, UUID hostID, int channel, string name, UUID id, string msg);
|
||||
int Listen(UUID itemID, UUID hostID, int channel, string name, UUID id, string msg);
|
||||
|
||||
/// <summary>
|
||||
/// Create a listen event callback with the specified filters.
|
||||
@@ -83,7 +82,6 @@ namespace OpenSim.Region.Framework.Interfaces
|
||||
/// the script during 'peek' time. Parameter hostID is needed to
|
||||
/// determine the position of the script.
|
||||
/// </summary>
|
||||
/// <param name="LocalID">localID of the script engine</param>
|
||||
/// <param name="itemID">UUID of the script engine</param>
|
||||
/// <param name="hostID">UUID of the SceneObjectPart</param>
|
||||
/// <param name="channel">channel to listen on</param>
|
||||
@@ -92,7 +90,7 @@ namespace OpenSim.Region.Framework.Interfaces
|
||||
/// <param name="msg">msg to filter on</param>
|
||||
/// <param name="regexBitfield">Bitfield indicating which strings should be processed as regex.</param>
|
||||
/// <returns>number of the scripts handle</returns>
|
||||
int Listen(uint LocalID, UUID itemID, UUID hostID, int channel, string name, UUID id, string msg, int regexBitfield);
|
||||
int Listen(UUID itemID, UUID hostID, int channel, string name, UUID id, string msg, int regexBitfield);
|
||||
|
||||
/// <summary>
|
||||
/// This method scans over the objects which registered an interest in listen callbacks.
|
||||
@@ -146,7 +144,6 @@ namespace OpenSim.Region.Framework.Interfaces
|
||||
void ListenRemove(UUID itemID, int handle);
|
||||
void DeleteListener(UUID itemID);
|
||||
Object[] GetSerializationData(UUID itemID);
|
||||
void CreateFromData(uint localID, UUID itemID, UUID hostID,
|
||||
Object[] data);
|
||||
void CreateFromData(UUID itemID, UUID hostID, Object[] data);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -454,16 +454,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||
switch (type)
|
||||
{
|
||||
case "listener":
|
||||
m_Listener[engine].CreateFromData(localID, itemID,
|
||||
hostID, item);
|
||||
m_Listener[engine].CreateFromData(itemID, hostID, item);
|
||||
break;
|
||||
case "timer":
|
||||
m_ScriptTimer[engine].CreateFromData(localID, itemID,
|
||||
hostID, item);
|
||||
m_ScriptTimer[engine].CreateFromData(localID, itemID, hostID, item);
|
||||
break;
|
||||
case "sensor":
|
||||
m_SensorRepeat[engine].CreateFromData(localID,
|
||||
itemID, hostID, item);
|
||||
m_SensorRepeat[engine].CreateFromData(localID, itemID, hostID, item);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1340,7 +1340,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||
return -1;
|
||||
|
||||
UUID.TryParse(ID, out UUID keyID);
|
||||
return wComm.Listen(m_host.LocalId, m_item.ItemID, m_host.UUID, channelID, name, keyID, msg);
|
||||
return wComm.Listen(m_item.ItemID, m_host.UUID, channelID, name, keyID, msg);
|
||||
}
|
||||
|
||||
public void llListenControl(int number, int active)
|
||||
|
||||
@@ -3998,7 +3998,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||
if(UUID.TryParse(prim, out UUID pID) && pID.IsNotZero())
|
||||
{
|
||||
SceneObjectPart obj = World.GetSceneObjectPart(pID);
|
||||
SetProjectionParams(obj, llprojection, texture, fov, focus, amb);
|
||||
if(obj != null)
|
||||
{
|
||||
if(obj.OwnerID.Equals(m_host.OwnerID))
|
||||
SetProjectionParams(obj, llprojection, texture, fov, focus, amb);
|
||||
}
|
||||
}
|
||||
else
|
||||
SetProjectionParams(m_host, llprojection, texture, fov, focus, amb);
|
||||
@@ -4598,9 +4602,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||
public LSL_Integer osListenRegex(int channelID, string name, string ID, string msg, int regexBitfield)
|
||||
{
|
||||
CheckThreatLevel(ThreatLevel.Low, "osListenRegex");
|
||||
IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>();
|
||||
if(wComm == null)
|
||||
return -1;
|
||||
|
||||
UUID.TryParse(ID, out UUID keyID);
|
||||
|
||||
// if we want the name to be used as a regular expression, ensure it is valid first.
|
||||
if ((regexBitfield & ScriptBaseClass.OS_LISTEN_REGEX_NAME) == ScriptBaseClass.OS_LISTEN_REGEX_NAME)
|
||||
{
|
||||
@@ -4608,7 +4614,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||
{
|
||||
Regex.IsMatch("", name);
|
||||
}
|
||||
catch (Exception)
|
||||
catch
|
||||
{
|
||||
OSSLShoutError("Name regex is invalid.");
|
||||
return -1;
|
||||
@@ -4622,24 +4628,15 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
|
||||
{
|
||||
Regex.IsMatch("", msg);
|
||||
}
|
||||
catch (Exception)
|
||||
catch
|
||||
{
|
||||
OSSLShoutError("Message regex is invalid.");
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>();
|
||||
return (wComm == null) ? -1 : wComm.Listen(
|
||||
m_host.LocalId,
|
||||
m_item.ItemID,
|
||||
m_host.UUID,
|
||||
channelID,
|
||||
name,
|
||||
keyID,
|
||||
msg,
|
||||
regexBitfield
|
||||
);
|
||||
return wComm.Listen(m_item.ItemID, m_host.UUID,
|
||||
channelID, name, keyID, msg, regexBitfield);
|
||||
}
|
||||
|
||||
public LSL_Integer osRegexIsMatch(string input, string pattern)
|
||||
|
||||
@@ -189,10 +189,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
|
||||
catch { }
|
||||
|
||||
ds.action = null;
|
||||
|
||||
lock (DataserverRequests)
|
||||
{
|
||||
if (DataserverRequests.TryGetValue(id, out ds))
|
||||
DataserverRequests.Remove(id);
|
||||
DataserverRequests.Remove(id);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -200,20 +200,19 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
|
||||
public void DataserverReply(string identifier, string reply)
|
||||
{
|
||||
DataserverRequest ds;
|
||||
|
||||
lock (DataserverRequests)
|
||||
{
|
||||
if (!DataserverRequests.ContainsKey(identifier))
|
||||
if (!DataserverRequests.TryGetValue(identifier, out ds))
|
||||
return;
|
||||
|
||||
ds = DataserverRequests[identifier];
|
||||
DataserverRequests.Remove(identifier);
|
||||
}
|
||||
|
||||
m_CmdManager.m_ScriptEngine.PostObjectEvent(ds.localID,
|
||||
new EventParams("dataserver", new Object[]
|
||||
{ new LSL_Types.LSLString(ds.ID.ToString()),
|
||||
new LSL_Types.LSLString(reply)},
|
||||
{
|
||||
new LSL_Types.LSLString(ds.ID.ToString()),
|
||||
new LSL_Types.LSLString(reply)
|
||||
},
|
||||
new DetectParams[0]));
|
||||
}
|
||||
|
||||
|
||||
@@ -62,25 +62,21 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
|
||||
|
||||
if (m_commsPlugin != null)
|
||||
{
|
||||
while (m_commsPlugin.HasMessages())
|
||||
ListenerInfo lInfo;
|
||||
while ((lInfo = (ListenerInfo)m_commsPlugin.GetNextMessage()) != null)
|
||||
{
|
||||
ListenerInfo lInfo = (ListenerInfo)m_commsPlugin.GetNextMessage();
|
||||
|
||||
//Deliver data to prim's listen handler
|
||||
object[] resobj = new object[]
|
||||
{
|
||||
new LSL_Types.LSLInteger(lInfo.GetChannel()),
|
||||
new LSL_Types.LSLString(lInfo.GetName()),
|
||||
new LSL_Types.LSLString(lInfo.GetID().ToString()),
|
||||
new LSL_Types.LSLString(lInfo.GetMessage())
|
||||
new LSL_Types.LSLInteger(lInfo.Channel),
|
||||
new LSL_Types.LSLString(lInfo.Name),
|
||||
new LSL_Types.LSLString(lInfo.ID.ToString()),
|
||||
new LSL_Types.LSLString(lInfo.Message)
|
||||
};
|
||||
|
||||
foreach (IScriptEngine e in m_CmdManager.ScriptEngines)
|
||||
{
|
||||
e.PostScriptEvent(
|
||||
lInfo.GetItemID(), new EventParams(
|
||||
"listen", resobj,
|
||||
new DetectParams[0]));
|
||||
e.PostScriptEvent(lInfo.ItemID, new EventParams("listen", resobj, new DetectParams[0]));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -94,11 +90,10 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api.Plugins
|
||||
return new Object[]{};
|
||||
}
|
||||
|
||||
public void CreateFromData(uint localID, UUID itemID, UUID hostID,
|
||||
Object[] data)
|
||||
public void CreateFromData( UUID itemID, UUID hostID, Object[] data)
|
||||
{
|
||||
if (m_commsPlugin != null)
|
||||
m_commsPlugin.CreateFromData(localID, itemID, hostID, data);
|
||||
m_commsPlugin.CreateFromData(itemID, hostID, data);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -253,10 +253,15 @@ namespace OpenSim.Region.ScriptEngine.XEngine
|
||||
|
||||
public void Initialise(IConfigSource configSource)
|
||||
{
|
||||
if (configSource.Configs["XEngine"] == null)
|
||||
m_ScriptConfig = configSource.Configs["XEngine"];
|
||||
if (m_ScriptConfig == null)
|
||||
return;
|
||||
|
||||
m_ScriptConfig = configSource.Configs["XEngine"];
|
||||
if (!m_ScriptConfig.GetBoolean("Enabled", true))
|
||||
return;
|
||||
|
||||
m_Enabled = true;
|
||||
|
||||
m_ConfigSource = configSource;
|
||||
|
||||
string rawScriptStopStrategy = m_ScriptConfig.GetString("ScriptStopStrategy", "co-op");
|
||||
@@ -282,19 +287,13 @@ namespace OpenSim.Region.ScriptEngine.XEngine
|
||||
|
||||
public void AddRegion(Scene scene)
|
||||
{
|
||||
if (m_ScriptConfig == null)
|
||||
if (!m_Enabled)
|
||||
return;
|
||||
|
||||
|
||||
m_ScriptFailCount = 0;
|
||||
m_ScriptErrorMessage = String.Empty;
|
||||
|
||||
m_Enabled = m_ScriptConfig.GetBoolean("Enabled", true);
|
||||
|
||||
if (!m_Enabled)
|
||||
return;
|
||||
|
||||
AppDomain.CurrentDomain.AssemblyResolve +=
|
||||
OnAssemblyResolve;
|
||||
AppDomain.CurrentDomain.AssemblyResolve += OnAssemblyResolve;
|
||||
|
||||
m_Scene = scene;
|
||||
m_log.InfoFormat("[XEngine]: Initializing scripts in region {0}", m_Scene.RegionInfo.RegionName);
|
||||
|
||||
Reference in New Issue
Block a user