diff options
Diffstat (limited to 'OpenSim/Region/CoreModules/Avatar/Chat')
-rw-r--r-- | OpenSim/Region/CoreModules/Avatar/Chat/ChatModule.cs | 37 |
1 files changed, 34 insertions, 3 deletions
diff --git a/OpenSim/Region/CoreModules/Avatar/Chat/ChatModule.cs b/OpenSim/Region/CoreModules/Avatar/Chat/ChatModule.cs index 5cbfec6..9b41083 100644 --- a/OpenSim/Region/CoreModules/Avatar/Chat/ChatModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Chat/ChatModule.cs | |||
@@ -216,6 +216,10 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat | |||
216 | Vector3 regionPos = new Vector3(scene.RegionInfo.RegionLocX * Constants.RegionSize, | 216 | Vector3 regionPos = new Vector3(scene.RegionInfo.RegionLocX * Constants.RegionSize, |
217 | scene.RegionInfo.RegionLocY * Constants.RegionSize, 0); | 217 | scene.RegionInfo.RegionLocY * Constants.RegionSize, 0); |
218 | 218 | ||
219 | bool checkParcelHide = false; | ||
220 | UUID sourceParcelID = UUID.Zero; | ||
221 | Vector3 hidePos = fromPos; | ||
222 | |||
219 | if (c.Channel == DEBUG_CHANNEL) c.Type = ChatTypeEnum.DebugChannel; | 223 | if (c.Channel == DEBUG_CHANNEL) c.Type = ChatTypeEnum.DebugChannel; |
220 | 224 | ||
221 | switch (sourceType) | 225 | switch (sourceType) |
@@ -237,15 +241,22 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat | |||
237 | } | 241 | } |
238 | destination = UUID.Zero; // Avatars cant "SayTo" | 242 | destination = UUID.Zero; // Avatars cant "SayTo" |
239 | ownerID = c.Sender.AgentId; | 243 | ownerID = c.Sender.AgentId; |
240 | 244 | checkParcelHide = true; | |
245 | hidePos = fromPos; | ||
241 | break; | 246 | break; |
242 | 247 | ||
243 | case ChatSourceType.Object: | 248 | case ChatSourceType.Object: |
244 | fromID = c.SenderUUID; | 249 | fromID = c.SenderUUID; |
245 | 250 | ||
246 | if (c.SenderObject != null && c.SenderObject is SceneObjectPart) | 251 | if (c.SenderObject != null && c.SenderObject is SceneObjectPart) |
252 | { | ||
247 | ownerID = ((SceneObjectPart)c.SenderObject).OwnerID; | 253 | ownerID = ((SceneObjectPart)c.SenderObject).OwnerID; |
248 | 254 | if (((SceneObjectPart)c.SenderObject).ParentGroup.IsAttachment) | |
255 | { | ||
256 | checkParcelHide = true; | ||
257 | hidePos = ((SceneObjectPart)c.SenderObject).ParentGroup.AbsolutePosition; | ||
258 | } | ||
259 | } | ||
249 | break; | 260 | break; |
250 | } | 261 | } |
251 | 262 | ||
@@ -258,13 +269,28 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat | |||
258 | // fromID, fromName, scene.RegionInfo.RegionName, c.Type, sourceType); | 269 | // fromID, fromName, scene.RegionInfo.RegionName, c.Type, sourceType); |
259 | 270 | ||
260 | HashSet<UUID> receiverIDs = new HashSet<UUID>(); | 271 | HashSet<UUID> receiverIDs = new HashSet<UUID>(); |
261 | 272 | ||
273 | if (checkParcelHide) | ||
274 | { | ||
275 | checkParcelHide = false; | ||
276 | if (c.Type < ChatTypeEnum.DebugChannel && destination == UUID.Zero) | ||
277 | { | ||
278 | ILandObject srcland = (scene as Scene).LandChannel.GetLandObject(hidePos.X, hidePos.Y); | ||
279 | if (srcland != null && !srcland.LandData.SeeAVs) | ||
280 | { | ||
281 | sourceParcelID = srcland.LandData.GlobalID; | ||
282 | checkParcelHide = true; | ||
283 | } | ||
284 | } | ||
285 | } | ||
286 | |||
262 | foreach (Scene s in m_scenes) | 287 | foreach (Scene s in m_scenes) |
263 | { | 288 | { |
264 | // This should use ForEachClient, but clients don't have a position. | 289 | // This should use ForEachClient, but clients don't have a position. |
265 | // If camera is moved into client, then camera position can be used | 290 | // If camera is moved into client, then camera position can be used |
266 | // MT: No, it can't, as chat is heard from the avatar position, not | 291 | // MT: No, it can't, as chat is heard from the avatar position, not |
267 | // the camera position. | 292 | // the camera position. |
293 | |||
268 | s.ForEachScenePresence( | 294 | s.ForEachScenePresence( |
269 | delegate(ScenePresence presence) | 295 | delegate(ScenePresence presence) |
270 | { | 296 | { |
@@ -277,6 +303,11 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat | |||
277 | // perfect, but it will do. For now. Better | 303 | // perfect, but it will do. For now. Better |
278 | // than the prior behavior of muting all | 304 | // than the prior behavior of muting all |
279 | // objects on a parcel with access restrictions | 305 | // objects on a parcel with access restrictions |
306 | if (checkParcelHide) | ||
307 | { | ||
308 | if (sourceParcelID != Presencecheck.LandData.GlobalID) | ||
309 | return; | ||
310 | } | ||
280 | if (c.Sender == null || Presencecheck.IsEitherBannedOrRestricted(c.Sender.AgentId) != true) | 311 | if (c.Sender == null || Presencecheck.IsEitherBannedOrRestricted(c.Sender.AgentId) != true) |
281 | { | 312 | { |
282 | if (destination != UUID.Zero) | 313 | if (destination != UUID.Zero) |