aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/Region/CoreModules/Scripting/WorldComm/WorldCommModule.cs71
-rw-r--r--OpenSim/Region/Framework/Interfaces/IWorldComm.cs2
-rw-r--r--OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs9
3 files changed, 71 insertions, 11 deletions
diff --git a/OpenSim/Region/CoreModules/Scripting/WorldComm/WorldCommModule.cs b/OpenSim/Region/CoreModules/Scripting/WorldComm/WorldCommModule.cs
index 6917b14..22352f5 100644
--- a/OpenSim/Region/CoreModules/Scripting/WorldComm/WorldCommModule.cs
+++ b/OpenSim/Region/CoreModules/Scripting/WorldComm/WorldCommModule.cs
@@ -282,9 +282,71 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm
282 } 282 }
283 } 283 }
284 284
285 // wComm.DeliverMessageTo(target, channelID, m_host.Name, m_host.UUID, text); 285 /// <summary>
286 public void DeliverMessageTo(UUID target, int channel, string name, UUID id, string msg) 286 /// Delivers the message to.
287 { 287 /// </summary>
288 /// <param name='target'>
289 /// Target.
290 /// </param>
291 /// <param name='channel'>
292 /// Channel.
293 /// </param>
294 /// <param name='name'>
295 /// Name.
296 /// </param>
297 /// <param name='id'>
298 /// Identifier.
299 /// </param>
300 /// <param name='msg'>
301 /// Message.
302 /// </param>
303 public bool DeliverMessageTo(UUID target, int channel, Vector3 pos, string name, UUID id, string msg, out string error)
304 {
305 error = null;
306 // Is id an avatar?
307 ScenePresence sp = m_scene.GetScenePresence(target);
308
309 if (sp != null)
310 {
311 // Send message to avatar
312 if (channel == 0)
313 {
314 m_scene.SimChatBroadcast(Utils.StringToBytes(msg), ChatTypeEnum.Owner, 0, pos, name, id, false);
315 }
316
317 List<SceneObjectGroup> attachments = sp.Attachments;
318 // Nothing left to do
319 if (attachments == null)
320 return true;
321
322 // Get uuid of attachments
323 List<UUID> targets = new List<UUID>();
324 foreach ( SceneObjectGroup sog in attachments )
325 {
326 targets.Add(sog.UUID);
327 }
328 // Need to check each attachment
329 foreach (ListenerInfo li in m_listenerManager.GetListeners(UUID.Zero, channel, name, id, msg))
330 {
331 if (li.GetHostID().Equals(id))
332 continue;
333
334 if (m_scene.GetSceneObjectPart(li.GetHostID()) == null)
335 continue;
336
337 if ( targets.Contains(li.GetHostID()))
338 QueueMessage(new ListenerInfo(li, name, id, msg));
339 }
340 return true;
341 }
342
343 // Need to toss an error here
344 if (channel == 0)
345 {
346 error = "Cannot use llRegionSayTo to message objects on channel 0";
347 return false;
348 }
349
288 foreach (ListenerInfo li in m_listenerManager.GetListeners(UUID.Zero, channel, name, id, msg)) 350 foreach (ListenerInfo li in m_listenerManager.GetListeners(UUID.Zero, channel, name, id, msg))
289 { 351 {
290 // Dont process if this message is from yourself! 352 // Dont process if this message is from yourself!
@@ -298,9 +360,10 @@ namespace OpenSim.Region.CoreModules.Scripting.WorldComm
298 if ( li.GetHostID().Equals(target)) 360 if ( li.GetHostID().Equals(target))
299 { 361 {
300 QueueMessage(new ListenerInfo(li, name, id, msg)); 362 QueueMessage(new ListenerInfo(li, name, id, msg));
301 return; 363 break;
302 } 364 }
303 } 365 }
366 return true;
304 } 367 }
305 368
306 protected void QueueMessage(ListenerInfo li) 369 protected void QueueMessage(ListenerInfo li)
diff --git a/OpenSim/Region/Framework/Interfaces/IWorldComm.cs b/OpenSim/Region/Framework/Interfaces/IWorldComm.cs
index 8f200ae..dafbf30 100644
--- a/OpenSim/Region/Framework/Interfaces/IWorldComm.cs
+++ b/OpenSim/Region/Framework/Interfaces/IWorldComm.cs
@@ -98,7 +98,7 @@ namespace OpenSim.Region.Framework.Interfaces
98 /// <param name='msg'> 98 /// <param name='msg'>
99 /// Message. 99 /// Message.
100 /// </param> 100 /// </param>
101 void DeliverMessageTo(UUID target, int channel, string name, UUID id, string msg); 101 bool DeliverMessageTo(UUID target, int channel, Vector3 pos, string name, UUID id, string msg, out string error);
102 102
103 /// <summary> 103 /// <summary>
104 /// Are there any listen events ready to be dispatched? 104 /// Are there any listen events ready to be dispatched?
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 25d7ad9..db45354 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -845,11 +845,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
845 845
846 public void llRegionSayTo(string target, int channel, string msg) 846 public void llRegionSayTo(string target, int channel, string msg)
847 { 847 {
848 if (channel == 0) 848 string error = String.Empty;
849 {
850 LSLError("Cannot use llRegionSay() on channel 0");
851 return;
852 }
853 849
854 if (msg.Length > 1023) 850 if (msg.Length > 1023)
855 msg = msg.Substring(0, 1023); 851 msg = msg.Substring(0, 1023);
@@ -861,7 +857,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
861 857
862 IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>(); 858 IWorldComm wComm = m_ScriptEngine.World.RequestModuleInterface<IWorldComm>();
863 if (wComm != null) 859 if (wComm != null)
864 wComm.DeliverMessageTo(TargetID, channel, m_host.Name, m_host.UUID, msg); 860 if (!wComm.DeliverMessageTo(TargetID, channel, m_host.AbsolutePosition, m_host.Name, m_host.UUID, msg, out error))
861 LSLError(error);
865 } 862 }
866 863
867 public LSL_Integer llListen(int channelID, string name, string ID, string msg) 864 public LSL_Integer llListen(int channelID, string name, string ID, string msg)