Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Mantis 5977 Corrections to llRegionSayTo

Signed-off-by: BlueWall <jamesh@bluewallgroup.com>
  • Loading branch information...
commit 679da63da617d031e5e7ae3f2d2a29db1a23ace3 1 parent 49ed68e
Talun authored BlueWall committed
View
20 OpenSim/Framework/OSChatMessage.cs
@@ -51,10 +51,12 @@ public class OSChatMessage : EventArgs, IEventArgs
protected object m_senderObject;
protected ChatTypeEnum m_type;
protected UUID m_fromID;
+ protected UUID m_toID;
public OSChatMessage()
{
m_position = new Vector3();
+ m_toID = UUID.Zero;
}
/// <summary>
@@ -102,6 +104,15 @@ public string From
set { m_from = value; }
}
+ /// <summary>
+ /// The name of the sender (needed for scripts)
+ /// </summary>
+ public string To
+ {
+ get { return m_from; }
+ set { m_from = value; }
+ }
+
#region IEventArgs Members
/// TODO: Sender and SenderObject should just be Sender and of
@@ -132,6 +143,15 @@ public UUID SenderUUID
}
/// <summary>
+ /// The single recipient or all if not set.
+ /// </summary>
+ public UUID TargetUUID
+ {
+ get { return m_toID; }
+ set { m_toID = value; }
+ }
+
+ /// <summary>
///
/// </summary>
public IScene Scene
View
52 OpenSim/Region/CoreModules/Avatar/Chat/ChatModule.cs
@@ -186,6 +186,7 @@ protected virtual void DeliverChatToAvatars(ChatSourceType sourceType, OSChatMes
{
string fromName = c.From;
UUID fromID = UUID.Zero;
+ UUID targetID = c.TargetUUID;
string message = c.Message;
IScene scene = c.Scene;
Vector3 fromPos = c.Position;
@@ -221,24 +222,38 @@ protected virtual void DeliverChatToAvatars(ChatSourceType sourceType, OSChatMes
message = message.Substring(0, 1000);
// m_log.DebugFormat(
-// "[CHAT]: DCTA: fromID {0} fromName {1}, region{2}, cType {3}, sType {4}",
-// fromID, fromName, scene.RegionInfo.RegionName, c.Type, sourceType);
+// "[CHAT]: DCTA: fromID {0} fromName {1}, region{2}, cType {3}, sType {4}, targetID {5}",
+// fromID, fromName, scene.RegionInfo.RegionName, c.Type, sourceType, targetID);
HashSet<UUID> receiverIDs = new HashSet<UUID>();
-
+
foreach (Scene s in m_scenes)
{
- // This should use ForEachClient, but clients don't have a position.
- // If camera is moved into client, then camera position can be used
- s.ForEachRootScenePresence(
- delegate(ScenePresence presence)
+ if (targetID == UUID.Zero)
+ {
+ // This should use ForEachClient, but clients don't have a position.
+ // If camera is moved into client, then camera position can be used
+ s.ForEachRootScenePresence(
+ delegate(ScenePresence presence)
+ {
+ if (TrySendChatMessage(presence, fromPos, regionPos, fromID, fromName, c.Type, message, sourceType, false))
+ receiverIDs.Add(presence.UUID);
+ }
+ );
+ }
+ else
+ {
+ // This is a send to a specific client eg from llRegionSayTo
+ // no need to check distance etc, jand send is as say
+ ScenePresence presence = s.GetScenePresence(targetID);
+ if (presence != null && !presence.IsChildAgent)
{
- if (TrySendChatMessage(presence, fromPos, regionPos, fromID, fromName, c.Type, message, sourceType))
- receiverIDs.Add(presence.UUID);
+ if (TrySendChatMessage(presence, fromPos, regionPos, fromID, fromName, ChatTypeEnum.Say, message, sourceType, true))
+ receiverIDs.Add(presence.UUID);
}
- );
+ }
}
-
+
(scene as Scene).EventManager.TriggerOnChatToClients(
fromID, receiverIDs, message, c.Type, fromPos, fromName, sourceType, ChatAudibleLevel.Fully);
}
@@ -315,7 +330,7 @@ public virtual void OnChatBroadcast(Object sender, OSChatMessage c)
/// precondition</returns>
protected virtual bool TrySendChatMessage(ScenePresence presence, Vector3 fromPos, Vector3 regionPos,
UUID fromAgentID, string fromName, ChatTypeEnum type,
- string message, ChatSourceType src)
+ string message, ChatSourceType src, bool ignoreDistance)
{
// don't send stuff to child agents
if (presence.IsChildAgent) return false;
@@ -326,12 +341,15 @@ public virtual void OnChatBroadcast(Object sender, OSChatMessage c)
presence.Scene.RegionInfo.RegionLocY * Constants.RegionSize, 0);
int dis = (int)Util.GetDistanceTo(toRegionPos, fromRegionPos);
-
- if (type == ChatTypeEnum.Whisper && dis > m_whisperdistance ||
- type == ChatTypeEnum.Say && dis > m_saydistance ||
- type == ChatTypeEnum.Shout && dis > m_shoutdistance)
+
+ if (!ignoreDistance)
{
- return false;
+ if (type == ChatTypeEnum.Whisper && dis > m_whisperdistance ||
+ type == ChatTypeEnum.Say && dis > m_saydistance ||
+ type == ChatTypeEnum.Shout && dis > m_shoutdistance)
+ {
+ return false;
+ }
}
// TODO: should change so the message is sent through the avatar rather than direct to the ClientView
View
70 OpenSim/Region/CoreModules/Scripting/WorldComm/WorldCommModule.cs
@@ -308,56 +308,56 @@ public void DeliverMessage(ChatTypeEnum type, int channel, string name, UUID id,
/// <param name='msg'>
/// Message.
/// </param>
- public bool DeliverMessageTo(UUID target, int channel, Vector3 pos, string name, UUID id, string msg, out string error)
+ public void DeliverMessageTo(UUID target, int channel, Vector3 pos, string name, UUID id, string msg)
{
- error = null;
// Is id an avatar?
ScenePresence sp = m_scene.GetScenePresence(target);
if (sp != null)
{
- // Send message to avatar
+ // ignore if a child agent this is restricted to inside one region
+ if (sp.IsChildAgent)
+ return;
+
+ // Send message to the avatar.
+ // Channel zero only goes to the avatar
+ // non zero channel messages only go to the attachments
if (channel == 0)
{
- m_scene.SimChatBroadcast(Utils.StringToBytes(msg), ChatTypeEnum.Broadcast, 0, pos, name, id, false);
- }
-
- List<SceneObjectGroup> attachments = sp.GetAttachments();
-
- if (attachments.Count == 0)
- return true;
-
- // Get uuid of attachments
- List<UUID> targets = new List<UUID>();
- foreach (SceneObjectGroup sog in attachments)
+ m_scene.SimChatToAgent(target, Utils.StringToBytes(msg), pos, name, id, false);
+ }
+ else
{
- if (!sog.IsDeleted)
- targets.Add(sog.UUID);
- }
+ List<SceneObjectGroup> attachments = sp.GetAttachments();
+ if (attachments.Count == 0)
+ return;
- // Need to check each attachment
- foreach (ListenerInfo li in m_listenerManager.GetListeners(UUID.Zero, channel, name, id, msg))
- {
- if (li.GetHostID().Equals(id))
- continue;
+ // Get uuid of attachments
+ List<UUID> targets = new List<UUID>();
+ foreach (SceneObjectGroup sog in attachments)
+ {
+ if (!sog.IsDeleted)
+ targets.Add(sog.UUID);
+ }
- if (m_scene.GetSceneObjectPart(li.GetHostID()) == null)
- continue;
+ // Need to check each attachment
+ foreach (ListenerInfo li in m_listenerManager.GetListeners(UUID.Zero, channel, name, id, msg))
+ {
+ if (li.GetHostID().Equals(id))
+ continue;
- if (targets.Contains(li.GetHostID()))
- QueueMessage(new ListenerInfo(li, name, id, msg));
- }
+ if (m_scene.GetSceneObjectPart(li.GetHostID()) == null)
+ continue;
- return true;
- }
+ if (targets.Contains(li.GetHostID()))
+ QueueMessage(new ListenerInfo(li, name, id, msg));
+ }
+ }
- // Need to toss an error here
- if (channel == 0)
- {
- error = "Cannot use llRegionSayTo to message objects on channel 0";
- return false;
+ return;
}
+ // No avatar found so look for an object
foreach (ListenerInfo li in m_listenerManager.GetListeners(UUID.Zero, channel, name, id, msg))
{
// Dont process if this message is from yourself!
@@ -375,7 +375,7 @@ public bool DeliverMessageTo(UUID target, int channel, Vector3 pos, string name,
}
}
- return true;
+ return;
}
protected void QueueMessage(ListenerInfo li)
View
2  OpenSim/Region/Framework/Interfaces/IWorldComm.cs
@@ -103,7 +103,7 @@ public interface IWorldComm
/// <param name='msg'>
/// Message.
/// </param>
- bool DeliverMessageTo(UUID target, int channel, Vector3 pos, string name, UUID id, string msg, out string error);
+ void DeliverMessageTo(UUID target, int channel, Vector3 pos, string name, UUID id, string msg);
/// <summary>
/// Are there any listen events ready to be dispatched?
View
26 OpenSim/Region/Framework/Scenes/Scene.PacketHandlers.cs
@@ -38,8 +38,9 @@ namespace OpenSim.Region.Framework.Scenes
{
public partial class Scene
{
+
protected void SimChat(byte[] message, ChatTypeEnum type, int channel, Vector3 fromPos, string fromName,
- UUID fromID, bool fromAgent, bool broadcast)
+ UUID fromID, UUID targetID, bool fromAgent, bool broadcast)
{
OSChatMessage args = new OSChatMessage();
@@ -63,14 +64,20 @@ public partial class Scene
}
args.From = fromName;
- //args.
+ args.TargetUUID = targetID;
if (broadcast)
EventManager.TriggerOnChatBroadcast(this, args);
else
EventManager.TriggerOnChatFromWorld(this, args);
}
-
+
+ protected void SimChat(byte[] message, ChatTypeEnum type, int channel, Vector3 fromPos, string fromName,
+ UUID fromID, bool fromAgent, bool broadcast)
+ {
+ SimChat(message, type, channel, fromPos, fromName, fromID, UUID.Zero, fromAgent, broadcast);
+ }
+
/// <summary>
///
/// </summary>
@@ -108,6 +115,19 @@ public void SimChat(string message, string fromName)
{
SimChat(message, type, channel, fromPos, fromName, fromID, fromAgent, true);
}
+ /// <summary>
+ ///
+ /// </summary>
+ /// <param name="message"></param>
+ /// <param name="type"></param>
+ /// <param name="fromPos"></param>
+ /// <param name="fromName"></param>
+ /// <param name="fromAgentID"></param>
+ /// <param name="targetID"></param>
+ public void SimChatToAgent(UUID targetID, byte[] message, Vector3 fromPos, string fromName, UUID fromID, bool fromAgent)
+ {
+ SimChat(message, ChatTypeEnum.Say, 0, fromPos, fromName, fromID, targetID, fromAgent, false);
+ }
/// <summary>
/// Invoked when the client requests a prim.
View
8 OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -839,13 +839,17 @@ public void llRegionSayTo(string target, int channel, string msg)
m_host.AddScriptLPS(1);
+ if (channel == ScriptBaseClass.DEBUG_CHANNEL)
+ {
+ return;
+ }
+
UUID TargetID;
UUID.TryParse(target, out TargetID);
IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>();
if (wComm != null)
- if (!wComm.DeliverMessageTo(TargetID, channel, m_host.AbsolutePosition, m_host.Name, m_host.UUID, msg, out error))
- LSLError(error);
+ wComm.DeliverMessageTo(TargetID, channel, m_host.AbsolutePosition, m_host.Name, m_host.UUID, msg);
}
public LSL_Integer llListen(int channelID, string name, string ID, string msg)
Please sign in to comment.
Something went wrong with that request. Please try again.