diff options
Merge branch 'master' into careminster-presence-refactor
Diffstat (limited to 'OpenSim/Region/CoreModules/Avatar/Chat')
-rw-r--r-- | OpenSim/Region/CoreModules/Avatar/Chat/ChatModule.cs | 43 |
1 files changed, 35 insertions, 8 deletions
diff --git a/OpenSim/Region/CoreModules/Avatar/Chat/ChatModule.cs b/OpenSim/Region/CoreModules/Avatar/Chat/ChatModule.cs index 2a590f1..8ab4391 100644 --- a/OpenSim/Region/CoreModules/Avatar/Chat/ChatModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Chat/ChatModule.cs | |||
@@ -169,7 +169,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat | |||
169 | // sanity check: | 169 | // sanity check: |
170 | if (c.Sender == null) | 170 | if (c.Sender == null) |
171 | { | 171 | { |
172 | m_log.ErrorFormat("[CHAT] OnChatFromClient from {0} has empty Sender field!", sender); | 172 | m_log.ErrorFormat("[CHAT]: OnChatFromClient from {0} has empty Sender field!", sender); |
173 | return; | 173 | return; |
174 | } | 174 | } |
175 | 175 | ||
@@ -234,8 +234,12 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat | |||
234 | if (message.Length >= 1000) // libomv limit | 234 | if (message.Length >= 1000) // libomv limit |
235 | message = message.Substring(0, 1000); | 235 | message = message.Substring(0, 1000); |
236 | 236 | ||
237 | // m_log.DebugFormat("[CHAT]: DCTA: fromID {0} fromName {1}, cType {2}, sType {3}", fromID, fromName, c.Type, sourceType); | 237 | // m_log.DebugFormat( |
238 | // "[CHAT]: DCTA: fromID {0} fromName {1}, region{2}, cType {3}, sType {4}", | ||
239 | // fromID, fromName, scene.RegionInfo.RegionName, c.Type, sourceType); | ||
238 | 240 | ||
241 | HashSet<UUID> receiverIDs = new HashSet<UUID>(); | ||
242 | |||
239 | foreach (Scene s in m_scenes) | 243 | foreach (Scene s in m_scenes) |
240 | { | 244 | { |
241 | s.ForEachScenePresence( | 245 | s.ForEachScenePresence( |
@@ -250,13 +254,17 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat | |||
250 | // objects on a parcel with access restrictions | 254 | // objects on a parcel with access restrictions |
251 | if (c.Sender == null || Presencecheck.IsEitherBannedOrRestricted(c.Sender.AgentId) != true) | 255 | if (c.Sender == null || Presencecheck.IsEitherBannedOrRestricted(c.Sender.AgentId) != true) |
252 | { | 256 | { |
253 | TrySendChatMessage(presence, fromPos, regionPos, fromID, fromNamePrefix+fromName, c.Type, message, sourceType); | 257 | if (TrySendChatMessage(presence, fromPos, regionPos, fromID, fromNamePrefix + fromName, c.Type, message, sourceType)) |
258 | receiverIDs.Add(presence.UUID); | ||
254 | } | 259 | } |
255 | } | 260 | } |
256 | 261 | ||
257 | } | 262 | } |
258 | ); | 263 | ); |
259 | } | 264 | } |
265 | |||
266 | (scene as Scene).EventManager.TriggerOnChatToClients( | ||
267 | fromID, receiverIDs, message, c.Type, fromPos, fromName, sourceType, ChatAudibleLevel.Fully); | ||
260 | } | 268 | } |
261 | 269 | ||
262 | static private Vector3 CenterOfRegion = new Vector3(128, 128, 30); | 270 | static private Vector3 CenterOfRegion = new Vector3(128, 128, 30); |
@@ -294,6 +302,8 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat | |||
294 | } | 302 | } |
295 | 303 | ||
296 | // m_log.DebugFormat("[CHAT] Broadcast: fromID {0} fromName {1}, cType {2}, sType {3}", fromID, fromName, cType, sourceType); | 304 | // m_log.DebugFormat("[CHAT] Broadcast: fromID {0} fromName {1}, cType {2}, sType {3}", fromID, fromName, cType, sourceType); |
305 | HashSet<UUID> receiverIDs = new HashSet<UUID>(); | ||
306 | |||
297 | if (c.Scene != null) | 307 | if (c.Scene != null) |
298 | { | 308 | { |
299 | ((Scene)c.Scene).ForEachScenePresence | 309 | ((Scene)c.Scene).ForEachScenePresence |
@@ -314,18 +324,33 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat | |||
314 | 324 | ||
315 | client.SendChatMessage(c.Message, (byte)cType, CenterOfRegion, fromName, fromID, | 325 | client.SendChatMessage(c.Message, (byte)cType, CenterOfRegion, fromName, fromID, |
316 | (byte)sourceType, (byte)ChatAudibleLevel.Fully); | 326 | (byte)sourceType, (byte)ChatAudibleLevel.Fully); |
327 | receiverIDs.Add(presence.UUID); | ||
317 | } | 328 | } |
318 | ); | 329 | ); |
330 | (c.Scene as Scene).EventManager.TriggerOnChatToClients( | ||
331 | fromID, receiverIDs, c.Message, cType, CenterOfRegion, fromName, sourceType, ChatAudibleLevel.Fully); | ||
319 | } | 332 | } |
320 | } | 333 | } |
321 | 334 | ||
322 | 335 | /// <summary> | |
323 | protected virtual void TrySendChatMessage(ScenePresence presence, Vector3 fromPos, Vector3 regionPos, | 336 | /// Try to send a message to the given presence |
337 | /// </summary> | ||
338 | /// <param name="presence">The receiver</param> | ||
339 | /// <param name="fromPos"></param> | ||
340 | /// <param name="regionPos">/param> | ||
341 | /// <param name="fromAgentID"></param> | ||
342 | /// <param name="fromName"></param> | ||
343 | /// <param name="type"></param> | ||
344 | /// <param name="message"></param> | ||
345 | /// <param name="src"></param> | ||
346 | /// <returns>true if the message was sent to the receiver, false if it was not sent due to failing a | ||
347 | /// precondition</returns> | ||
348 | protected virtual bool TrySendChatMessage(ScenePresence presence, Vector3 fromPos, Vector3 regionPos, | ||
324 | UUID fromAgentID, string fromName, ChatTypeEnum type, | 349 | UUID fromAgentID, string fromName, ChatTypeEnum type, |
325 | string message, ChatSourceType src) | 350 | string message, ChatSourceType src) |
326 | { | 351 | { |
327 | // don't send stuff to child agents | 352 | // don't send stuff to child agents |
328 | if (presence.IsChildAgent) return; | 353 | if (presence.IsChildAgent) return false; |
329 | 354 | ||
330 | Vector3 fromRegionPos = fromPos + regionPos; | 355 | Vector3 fromRegionPos = fromPos + regionPos; |
331 | Vector3 toRegionPos = presence.AbsolutePosition + | 356 | Vector3 toRegionPos = presence.AbsolutePosition + |
@@ -338,12 +363,14 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat | |||
338 | type == ChatTypeEnum.Say && dis > m_saydistance || | 363 | type == ChatTypeEnum.Say && dis > m_saydistance || |
339 | type == ChatTypeEnum.Shout && dis > m_shoutdistance) | 364 | type == ChatTypeEnum.Shout && dis > m_shoutdistance) |
340 | { | 365 | { |
341 | return; | 366 | return false; |
342 | } | 367 | } |
343 | 368 | ||
344 | // TODO: should change so the message is sent through the avatar rather than direct to the ClientView | 369 | // TODO: should change so the message is sent through the avatar rather than direct to the ClientView |
345 | presence.ControllingClient.SendChatMessage(message, (byte) type, fromPos, fromName, | 370 | presence.ControllingClient.SendChatMessage(message, (byte) type, fromPos, fromName, |
346 | fromAgentID,(byte)src,(byte)ChatAudibleLevel.Fully); | 371 | fromAgentID, (byte)src, (byte)ChatAudibleLevel.Fully); |
372 | |||
373 | return true; | ||
347 | } | 374 | } |
348 | 375 | ||
349 | Dictionary<UUID, System.Threading.Timer> Timers = new Dictionary<UUID, System.Threading.Timer>(); | 376 | Dictionary<UUID, System.Threading.Timer> Timers = new Dictionary<UUID, System.Threading.Timer>(); |