diff options
Diffstat (limited to 'OpenSim/Region')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/ScenePresence.cs | 87 |
1 files changed, 67 insertions, 20 deletions
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 2b7c702..f3b5a54 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs | |||
@@ -3970,9 +3970,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
3970 | 3970 | ||
3971 | ControllingClient.SendAdminResponse(token, (uint)GodLevel); | 3971 | ControllingClient.SendAdminResponse(token, (uint)GodLevel); |
3972 | 3972 | ||
3973 | if(oldgodlevel != GodLevel) // force a visibility check | 3973 | if(oldgodlevel != GodLevel) |
3974 | ParcelCrossCheck(m_currentParcelUUID, m_previusParcelUUID, | 3974 | parcelGodCheck(m_currentParcelUUID, GodLevel >= 200); |
3975 | !m_currentParcelHide, m_previusParcelHide, m_currentParcelHide, true); | ||
3976 | } | 3975 | } |
3977 | 3976 | ||
3978 | #region Child Agent Updates | 3977 | #region Child Agent Updates |
@@ -5383,6 +5382,68 @@ namespace OpenSim.Region.Framework.Scenes | |||
5383 | 5382 | ||
5384 | } | 5383 | } |
5385 | 5384 | ||
5385 | private void parcelGodCheck(UUID currentParcelUUID, bool isGod) | ||
5386 | { | ||
5387 | List<ScenePresence> allpresences = null; | ||
5388 | |||
5389 | |||
5390 | allpresences = m_scene.GetScenePresences(); | ||
5391 | |||
5392 | if (isGod) | ||
5393 | { | ||
5394 | List<ScenePresence> viewsToSendme = new List<ScenePresence>(); | ||
5395 | |||
5396 | foreach (ScenePresence p in allpresences) | ||
5397 | { | ||
5398 | if (p.IsDeleted || p == this || p.ControllingClient == null || !p.ControllingClient.IsActive) | ||
5399 | continue; | ||
5400 | |||
5401 | if (p.ParcelHideThisAvatar && p.currentParcelUUID != currentParcelUUID) | ||
5402 | { | ||
5403 | viewsToSendme.Add(p); // i see them | ||
5404 | } | ||
5405 | } | ||
5406 | |||
5407 | if (viewsToSendme.Count > 0) | ||
5408 | { | ||
5409 | foreach (ScenePresence p in viewsToSendme) | ||
5410 | { | ||
5411 | ControllingClient.SendAvatarDataImmediate(p); | ||
5412 | p.SendAppearanceToAgent(this); | ||
5413 | p.SendAttachmentsToClient(ControllingClient); | ||
5414 | if (p.Animator != null) | ||
5415 | p.Animator.SendAnimPackToClient(ControllingClient); | ||
5416 | } | ||
5417 | } | ||
5418 | } | ||
5419 | else | ||
5420 | { | ||
5421 | List<ScenePresence> killsToSendme = new List<ScenePresence>(); | ||
5422 | |||
5423 | foreach (ScenePresence p in allpresences) | ||
5424 | { | ||
5425 | if (p.IsDeleted || p == this || p.ControllingClient == null || !p.ControllingClient.IsActive) | ||
5426 | continue; | ||
5427 | |||
5428 | if (p.ParcelHideThisAvatar && p.currentParcelUUID != currentParcelUUID) | ||
5429 | { | ||
5430 | killsToSendme.Add(p); | ||
5431 | } | ||
5432 | } | ||
5433 | |||
5434 | if (killsToSendme.Count > 0 && PresenceType != PresenceType.Npc) | ||
5435 | { | ||
5436 | foreach (ScenePresence p in killsToSendme) | ||
5437 | { | ||
5438 | try { ControllingClient.SendKillObject(new List<uint> { p.LocalId }); } | ||
5439 | catch (NullReferenceException) { } | ||
5440 | } | ||
5441 | } | ||
5442 | } | ||
5443 | |||
5444 | } | ||
5445 | |||
5446 | |||
5386 | private void ParcelCrossCheck(UUID currentParcelUUID,UUID previusParcelUUID, | 5447 | private void ParcelCrossCheck(UUID currentParcelUUID,UUID previusParcelUUID, |
5387 | bool currentParcelHide, bool previusParcelHide, bool oldhide,bool check) | 5448 | bool currentParcelHide, bool previusParcelHide, bool oldhide,bool check) |
5388 | { | 5449 | { |
@@ -5397,26 +5458,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
5397 | 5458 | ||
5398 | if (check) | 5459 | if (check) |
5399 | { | 5460 | { |
5461 | // check is relative to current parcel only | ||
5400 | if (currentParcelUUID == null || oldhide == currentParcelHide) | 5462 | if (currentParcelUUID == null || oldhide == currentParcelHide) |
5401 | return; | 5463 | return; |
5402 | 5464 | ||
5403 | allpresences = m_scene.GetScenePresences(); | 5465 | allpresences = m_scene.GetScenePresences(); |
5404 | 5466 | ||
5405 | if (GodLevel >= 200) | 5467 | if (oldhide) |
5406 | { | ||
5407 | foreach (ScenePresence p in allpresences) | ||
5408 | { | ||
5409 | if (p.IsDeleted || p == this || p.ControllingClient == null || !p.ControllingClient.IsActive) | ||
5410 | continue; | ||
5411 | |||
5412 | if (p.ParcelHideThisAvatar) | ||
5413 | { | ||
5414 | viewsToSendto.Add(p); // they see me | ||
5415 | } | ||
5416 | } | ||
5417 | } | ||
5418 | |||
5419 | else if (oldhide) | ||
5420 | { // where private | 5468 | { // where private |
5421 | foreach (ScenePresence p in allpresences) | 5469 | foreach (ScenePresence p in allpresences) |
5422 | { | 5470 | { |
@@ -5424,7 +5472,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
5424 | continue; | 5472 | continue; |
5425 | 5473 | ||
5426 | // those on not on parcel see me | 5474 | // those on not on parcel see me |
5427 | if (currentParcelUUID != p.currentParcelUUID || p.GodLevel >= 200) | 5475 | if (currentParcelUUID != p.currentParcelUUID) |
5428 | { | 5476 | { |
5429 | viewsToSendto.Add(p); // they see me | 5477 | viewsToSendto.Add(p); // they see me |
5430 | } | 5478 | } |
@@ -5446,7 +5494,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
5446 | } | 5494 | } |
5447 | } // where public end | 5495 | } // where public end |
5448 | 5496 | ||
5449 | |||
5450 | allpresences.Clear(); | 5497 | allpresences.Clear(); |
5451 | } | 5498 | } |
5452 | else | 5499 | else |