Revert "Mantis 5977 Corrections to llRegionSayTo"

This reverts commit 679da63da6.

Conflicts:

	OpenSim/Region/CoreModules/Avatar/Chat/ChatModule.cs
avinationmerge
Melanie 2012-06-28 22:02:20 +01:00
parent 41a1903c60
commit a1a22a2f10
6 changed files with 63 additions and 123 deletions

View File

@ -51,12 +51,10 @@ namespace OpenSim.Framework
protected object m_senderObject; protected object m_senderObject;
protected ChatTypeEnum m_type; protected ChatTypeEnum m_type;
protected UUID m_fromID; protected UUID m_fromID;
protected UUID m_toID;
public OSChatMessage() public OSChatMessage()
{ {
m_position = new Vector3(); m_position = new Vector3();
m_toID = UUID.Zero;
} }
/// <summary> /// <summary>
@ -104,15 +102,6 @@ namespace OpenSim.Framework
set { m_from = value; } 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 #region IEventArgs Members
/// TODO: Sender and SenderObject should just be Sender and of /// TODO: Sender and SenderObject should just be Sender and of
@ -142,15 +131,6 @@ namespace OpenSim.Framework
set { m_fromID = value; } set { m_fromID = value; }
} }
/// <summary>
/// The single recipient or all if not set.
/// </summary>
public UUID TargetUUID
{
get { return m_toID; }
set { m_toID = value; }
}
/// <summary> /// <summary>
/// ///
/// </summary> /// </summary>

View File

@ -197,7 +197,6 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat
string fromName = c.From; string fromName = c.From;
string fromNamePrefix = ""; string fromNamePrefix = "";
UUID fromID = UUID.Zero; UUID fromID = UUID.Zero;
UUID targetID = c.TargetUUID;
string message = c.Message; string message = c.Message;
IScene scene = c.Scene; IScene scene = c.Scene;
Vector3 fromPos = c.Position; Vector3 fromPos = c.Position;
@ -236,31 +235,17 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat
message = message.Substring(0, 1000); message = message.Substring(0, 1000);
// m_log.DebugFormat( // m_log.DebugFormat(
// "[CHAT]: DCTA: fromID {0} fromName {1}, region{2}, cType {3}, sType {4}, targetID {5}", // "[CHAT]: DCTA: fromID {0} fromName {1}, region{2}, cType {3}, sType {4}",
// fromID, fromName, scene.RegionInfo.RegionName, c.Type, sourceType, targetID); // fromID, fromName, scene.RegionInfo.RegionName, c.Type, sourceType);
HashSet<UUID> receiverIDs = new HashSet<UUID>(); HashSet<UUID> receiverIDs = new HashSet<UUID>();
foreach (Scene s in m_scenes) foreach (Scene s in m_scenes)
{ {
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
// This should use ForEachClient, but clients don't have a position. s.ForEachRootScenePresence(
// If camera is moved into client, then camera position can be used delegate(ScenePresence presence)
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)
{ {
ILandObject Presencecheck = s.LandChannel.GetLandObject(presence.AbsolutePosition.X, presence.AbsolutePosition.Y); ILandObject Presencecheck = s.LandChannel.GetLandObject(presence.AbsolutePosition.X, presence.AbsolutePosition.Y);
if (Presencecheck != null) if (Presencecheck != null)
@ -271,12 +256,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat
// objects on a parcel with access restrictions // objects on a parcel with access restrictions
if (c.Sender == null || Presencecheck.IsEitherBannedOrRestricted(c.Sender.AgentId) != true) if (c.Sender == null || Presencecheck.IsEitherBannedOrRestricted(c.Sender.AgentId) != true)
{ {
if (TrySendChatMessage(presence, fromPos, regionPos, fromID, fromNamePrefix + fromName, c.Type, message, sourceType, false)) if (TrySendChatMessage(presence, fromPos, regionPos, fromID, fromNamePrefix + fromName, c.Type, message, sourceType))
receiverIDs.Add(presence.UUID); receiverIDs.Add(presence.UUID);
} }
} }
} }
} );
} }
(scene as Scene).EventManager.TriggerOnChatToClients( (scene as Scene).EventManager.TriggerOnChatToClients(
@ -358,7 +343,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat
/// precondition</returns> /// precondition</returns>
protected virtual bool TrySendChatMessage(ScenePresence presence, Vector3 fromPos, Vector3 regionPos, protected virtual bool TrySendChatMessage(ScenePresence presence, Vector3 fromPos, Vector3 regionPos,
UUID fromAgentID, string fromName, ChatTypeEnum type, UUID fromAgentID, string fromName, ChatTypeEnum type,
string message, ChatSourceType src, bool ignoreDistance) string message, ChatSourceType src)
{ {
// don't send stuff to child agents // don't send stuff to child agents
if (presence.IsChildAgent) return false; if (presence.IsChildAgent) return false;
@ -370,14 +355,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat
int dis = (int)Util.GetDistanceTo(toRegionPos, fromRegionPos); int dis = (int)Util.GetDistanceTo(toRegionPos, fromRegionPos);
if (!ignoreDistance) if (type == ChatTypeEnum.Whisper && dis > m_whisperdistance ||
type == ChatTypeEnum.Say && dis > m_saydistance ||
type == ChatTypeEnum.Shout && dis > m_shoutdistance)
{ {
if (type == ChatTypeEnum.Whisper && dis > m_whisperdistance || return false;
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 // TODO: should change so the message is sent through the avatar rather than direct to the ClientView

View File

@ -308,56 +308,56 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm
/// <param name='msg'> /// <param name='msg'>
/// Message. /// Message.
/// </param> /// </param>
public void DeliverMessageTo(UUID target, int channel, Vector3 pos, string name, UUID id, string msg) public bool DeliverMessageTo(UUID target, int channel, Vector3 pos, string name, UUID id, string msg, out string error)
{ {
error = null;
// Is id an avatar? // Is id an avatar?
ScenePresence sp = m_scene.GetScenePresence(target); ScenePresence sp = m_scene.GetScenePresence(target);
if (sp != null) if (sp != null)
{ {
// ignore if a child agent this is restricted to inside one region // Send message to avatar
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) if (channel == 0)
{ {
m_scene.SimChatToAgent(target, Utils.StringToBytes(msg), pos, name, id, false); m_scene.SimChatBroadcast(Utils.StringToBytes(msg), ChatTypeEnum.Broadcast, 0, pos, name, id, false);
}
else
{
List<SceneObjectGroup> attachments = sp.GetAttachments();
if (attachments.Count == 0)
return;
// Get uuid of attachments
List<UUID> targets = new List<UUID>();
foreach (SceneObjectGroup sog in attachments)
{
if (!sog.IsDeleted)
targets.Add(sog.UUID);
}
// 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 (m_scene.GetSceneObjectPart(li.GetHostID()) == null)
continue;
if (targets.Contains(li.GetHostID()))
QueueMessage(new ListenerInfo(li, name, id, msg));
}
} }
return; 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)
{
if (!sog.IsDeleted)
targets.Add(sog.UUID);
}
// 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 (m_scene.GetSceneObjectPart(li.GetHostID()) == null)
continue;
if (targets.Contains(li.GetHostID()))
QueueMessage(new ListenerInfo(li, name, id, msg));
}
return true;
}
// Need to toss an error here
if (channel == 0)
{
error = "Cannot use llRegionSayTo to message objects on channel 0";
return false;
} }
// No avatar found so look for an object
foreach (ListenerInfo li in m_listenerManager.GetListeners(UUID.Zero, channel, name, id, msg)) foreach (ListenerInfo li in m_listenerManager.GetListeners(UUID.Zero, channel, name, id, msg))
{ {
// Dont process if this message is from yourself! // Dont process if this message is from yourself!
@ -375,7 +375,7 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm
} }
} }
return; return true;
} }
protected void QueueMessage(ListenerInfo li) protected void QueueMessage(ListenerInfo li)

View File

@ -103,7 +103,7 @@ namespace OpenSim.Region.Framework.Interfaces
/// <param name='msg'> /// <param name='msg'>
/// Message. /// Message.
/// </param> /// </param>
void DeliverMessageTo(UUID target, int channel, Vector3 pos, string name, UUID id, string msg); bool DeliverMessageTo(UUID target, int channel, Vector3 pos, string name, UUID id, string msg, out string error);
/// <summary> /// <summary>
/// Are there any listen events ready to be dispatched? /// Are there any listen events ready to be dispatched?

View File

@ -38,9 +38,8 @@ namespace OpenSim.Region.Framework.Scenes
{ {
public partial class Scene public partial class Scene
{ {
protected void SimChat(byte[] message, ChatTypeEnum type, int channel, Vector3 fromPos, string fromName, protected void SimChat(byte[] message, ChatTypeEnum type, int channel, Vector3 fromPos, string fromName,
UUID fromID, UUID targetID, bool fromAgent, bool broadcast) UUID fromID, bool fromAgent, bool broadcast)
{ {
OSChatMessage args = new OSChatMessage(); OSChatMessage args = new OSChatMessage();
@ -64,7 +63,7 @@ namespace OpenSim.Region.Framework.Scenes
} }
args.From = fromName; args.From = fromName;
args.TargetUUID = targetID; //args.
if (broadcast) if (broadcast)
EventManager.TriggerOnChatBroadcast(this, args); EventManager.TriggerOnChatBroadcast(this, args);
@ -72,12 +71,6 @@ namespace OpenSim.Region.Framework.Scenes
EventManager.TriggerOnChatFromWorld(this, args); 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>
/// ///
/// </summary> /// </summary>
@ -115,19 +108,6 @@ namespace OpenSim.Region.Framework.Scenes
{ {
SimChat(message, type, channel, fromPos, fromName, fromID, fromAgent, true); 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> /// <summary>
/// Invoked when the client requests a prim. /// Invoked when the client requests a prim.

View File

@ -921,22 +921,20 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
public void llRegionSayTo(string target, int channel, string msg) public void llRegionSayTo(string target, int channel, string msg)
{ {
string error = String.Empty;
if (msg.Length > 1023) if (msg.Length > 1023)
msg = msg.Substring(0, 1023); msg = msg.Substring(0, 1023);
m_host.AddScriptLPS(1); m_host.AddScriptLPS(1);
if (channel == ScriptBaseClass.DEBUG_CHANNEL)
{
return;
}
UUID TargetID; UUID TargetID;
UUID.TryParse(target, out TargetID); UUID.TryParse(target, out TargetID);
IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>();
if (wComm != null) if (wComm != null)
wComm.DeliverMessageTo(TargetID, channel, m_host.AbsolutePosition, m_host.Name, m_host.UUID, msg); if (!wComm.DeliverMessageTo(TargetID, channel, m_host.AbsolutePosition, m_host.Name, m_host.UUID, msg, out error))
LSLError(error);
} }
public LSL_Integer llListen(int channelID, string name, string ID, string msg) public LSL_Integer llListen(int channelID, string name, string ID, string msg)