diff --git a/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs b/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs index b0d30b68e0..ca6c3ca1a7 100644 --- a/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs +++ b/OpenSim/Region/ClientStack/Linden/Caps/EventQueue/EventQueueGetModule.cs @@ -358,7 +358,7 @@ namespace OpenSim.Region.ClientStack.Linden return queue.Count > 0; } - m_log.WarnFormat("POLLED FOR EVENTS BY {0} unknown agent", agentID); + //m_log.WarnFormat("POLLED FOR EVENTS BY {0} unknown agent", agentID); return true; } diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs index 0825a01638..2c7cd40c01 100644 --- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs @@ -388,23 +388,34 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments Dictionary scriptStates = new Dictionary(); - foreach (SceneObjectGroup so in attachments) - { - // Scripts MUST be snapshotted before the object is - // removed from the scene because doing otherwise will - // clobber the run flag - // This must be done outside the sp.AttachmentSyncLock so that there is no risk of a deadlock from - // scripts performing attachment operations at the same time. Getting object states stops the scripts. - scriptStates[so] = PrepareScriptInstanceForSave(so, false); - } - - lock (sp.AttachmentsSyncLock) + if (sp.PresenceType != PresenceType.Npc) { foreach (SceneObjectGroup so in attachments) - UpdateDetachedObject(sp, so, scriptStates[so]); - - sp.ClearAttachments(); + { + // Scripts MUST be snapshotted before the object is + // removed from the scene because doing otherwise will + // clobber the run flag + // This must be done outside the sp.AttachmentSyncLock so that there is no risk of a deadlock from + // scripts performing attachment operations at the same time. Getting object states stops the scripts. + scriptStates[so] = PrepareScriptInstanceForSave(so, false); + } + + lock (sp.AttachmentsSyncLock) + { + foreach (SceneObjectGroup so in attachments) + UpdateDetachedObject(sp, so, scriptStates[so]); + sp.ClearAttachments(); + } } + else + { + lock (sp.AttachmentsSyncLock) + { + foreach (SceneObjectGroup so in attachments) + UpdateDetachedObject(sp, so, String.Empty); + sp.ClearAttachments(); + } + } } public void DeleteAttachmentsFromScene(IScenePresence sp, bool silent) @@ -1014,6 +1025,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments // Remove the object from the scene so no more updates // are sent. Doing this before the below changes will ensure // updates can't cause "HUD artefacts" + m_scene.DeleteSceneObject(so, false, false); // Prepare sog for storage diff --git a/OpenSim/Region/CoreModules/Avatar/Chat/ChatModule.cs b/OpenSim/Region/CoreModules/Avatar/Chat/ChatModule.cs index 9b41083991..dcfc630c5d 100644 --- a/OpenSim/Region/CoreModules/Avatar/Chat/ChatModule.cs +++ b/OpenSim/Region/CoreModules/Avatar/Chat/ChatModule.cs @@ -236,12 +236,17 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat fromName = avatar.Name; fromID = c.Sender.AgentId; if (avatar.GodLevel >= 200) - { + { // let gods speak to outside or things may get confusing fromNamePrefix = m_adminPrefix; + checkParcelHide = false; + } + else + { + checkParcelHide = true; } destination = UUID.Zero; // Avatars cant "SayTo" ownerID = c.Sender.AgentId; - checkParcelHide = true; + hidePos = fromPos; break; @@ -305,7 +310,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Chat // objects on a parcel with access restrictions if (checkParcelHide) { - if (sourceParcelID != Presencecheck.LandData.GlobalID) + if (sourceParcelID != Presencecheck.LandData.GlobalID && presence.GodLevel < 200) return; } if (c.Sender == null || Presencecheck.IsEitherBannedOrRestricted(c.Sender.AgentId) != true) diff --git a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs index d8e3082c44..c8555abcc3 100644 --- a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs +++ b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs @@ -368,7 +368,7 @@ namespace OpenSim.Region.CoreModules.World.Land public void SendOutNearestBanLine(IClientAPI client) { ScenePresence sp = m_scene.GetScenePresence(client.AgentId); - if (sp == null || sp.IsChildAgent) + if (sp == null) return; List checkLandParcels = ParcelsNearPoint(sp.AbsolutePosition); @@ -394,11 +394,12 @@ namespace OpenSim.Region.CoreModules.World.Land if (!m_scene.TryGetScenePresence(remoteClient.AgentId, out avatar)) return; - if (avatar.IsChildAgent) - return; SendParcelOverlay(remoteClient); + if (avatar.IsChildAgent) + return; + ILandObject over = GetLandObject(avatar.AbsolutePosition.X,avatar.AbsolutePosition.Y); if (over == null) return; @@ -958,7 +959,7 @@ namespace OpenSim.Region.CoreModules.World.Land UpdateLandObject(startLandObject.LandData.LocalID, startLandObject.LandData); m_scene.ForEachClient(SendParcelOverlay); result.SendLandUpdateToAvatarsOverMe(); - + startLandObject.SendLandUpdateToAvatarsOverMe(); } /// @@ -1047,7 +1048,6 @@ namespace OpenSim.Region.CoreModules.World.Land /// The object representing the client public void SendParcelOverlay(IClientAPI remote_client) { - if (remote_client.SceneAgent.PresenceType == PresenceType.Npc) return; @@ -1198,20 +1198,24 @@ namespace OpenSim.Region.CoreModules.World.Land bool needOverlay = false; if (land.UpdateLandProperties(args, remote_client, out snap_selection, out needOverlay)) { - //the proprieties to who changed it + //the proprieties to who changed them land.SendLandProperties(0, true, LandChannel.LAND_RESULT_SINGLE, remote_client); if (needOverlay) { UUID parcelID = land.LandData.GlobalID; - m_scene.ForEachRootScenePresence(delegate(ScenePresence avatar) + m_scene.ForEachScenePresence(delegate(ScenePresence avatar) { - if (avatar.IsDeleted || avatar.IsChildAgent) + if (avatar.IsDeleted || avatar.isNPC) return; IClientAPI client = avatar.ControllingClient; SendParcelOverlay(client); + + if (avatar.IsChildAgent) + return; + ILandObject aland = GetLandObject(avatar.AbsolutePosition.X, avatar.AbsolutePosition.Y); if (aland != null) { diff --git a/OpenSim/Region/CoreModules/World/Land/LandObject.cs b/OpenSim/Region/CoreModules/World/Land/LandObject.cs index 29c22348d8..e002febd31 100644 --- a/OpenSim/Region/CoreModules/World/Land/LandObject.cs +++ b/OpenSim/Region/CoreModules/World/Land/LandObject.cs @@ -617,6 +617,7 @@ namespace OpenSim.Region.CoreModules.World.Land avatar.Invulnerable = true; SendLandUpdateToClient(snap_selection, avatar.ControllingClient); + avatar.currentParcelUUID = LandData.GlobalID; } } }); diff --git a/OpenSim/Region/Framework/Scenes/EventManager.cs b/OpenSim/Region/Framework/Scenes/EventManager.cs index 7f06e82b34..692e0c9ced 100644 --- a/OpenSim/Region/Framework/Scenes/EventManager.cs +++ b/OpenSim/Region/Framework/Scenes/EventManager.cs @@ -1366,7 +1366,9 @@ namespace OpenSim.Region.Framework.Scenes { try { +// m_log.ErrorFormat("[EVENT MANAGER]: OnRemovePresenceDelegate: {0}",d.Target.ToString()); d(agentId); +// m_log.ErrorFormat("[EVENT MANAGER]: OnRemovePresenceDelegate done "); } catch (Exception e) { @@ -2037,7 +2039,10 @@ namespace OpenSim.Region.Framework.Scenes { try { +// m_log.ErrorFormat("[EVENT MANAGER]: TriggerClientClosed: {0}", d.Target.ToString()); d(ClientID, scene); +// m_log.ErrorFormat("[EVENT MANAGER]: TriggerClientClosed done "); + } catch (Exception e) { diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 0765b3f9f1..0266faf821 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -3640,13 +3640,17 @@ namespace OpenSim.Region.Framework.Scenes } m_eventManager.TriggerClientClosed(agentID, this); +// m_log.Debug("[Scene]TriggerClientClosed done"); m_eventManager.TriggerOnRemovePresence(agentID); +// m_log.Debug("[Scene]TriggerOnRemovePresence done"); if (!isChildAgent) { if (AttachmentsModule != null) { +// m_log.Debug("[Scene]DeRezAttachments"); AttachmentsModule.DeRezAttachments(avatar); +// m_log.Debug("[Scene]DeRezAttachments done"); } ForEachClient( @@ -3660,7 +3664,10 @@ namespace OpenSim.Region.Framework.Scenes // It's possible for child agents to have transactions if changes are being made cross-border. if (AgentTransactionsModule != null) + { +// m_log.Debug("[Scene]RemoveAgentAssetTransactions"); AgentTransactionsModule.RemoveAgentAssetTransactions(agentID); + } m_log.Debug("[Scene] The avatar has left the building"); } catch (Exception e) diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index a9a6ba43be..24a92eb468 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -164,12 +164,12 @@ namespace OpenSim.Region.Framework.Scenes lock (parcelLock) { bool oldhide = m_currentParcelHide; - bool check = true; + bool checksame = true; if (value != m_currentParcelUUID) { m_previusParcelHide = m_currentParcelHide; m_previusParcelUUID = m_currentParcelUUID; - check = false; + checksame = false; } m_currentParcelUUID = value; m_currentParcelHide = false; @@ -177,8 +177,9 @@ namespace OpenSim.Region.Framework.Scenes ILandObject land = m_scene.LandChannel.GetLandObject(AbsolutePosition.X, AbsolutePosition.Y); if (land != null && !land.LandData.SeeAVs) m_currentParcelHide = true; - if (m_previusParcelUUID != UUID.Zero) - ParcelCrossCheck(m_currentParcelUUID,m_previusParcelUUID,m_currentParcelHide, m_previusParcelHide, oldhide,check); + + if (m_previusParcelUUID != UUID.Zero || checksame) + ParcelCrossCheck(m_currentParcelUUID,m_previusParcelUUID,m_currentParcelHide, m_previusParcelHide, oldhide,checksame); } } } @@ -1835,42 +1836,32 @@ namespace OpenSim.Region.Framework.Scenes m_currentParcelUUID = UUID.Zero; // send initial land overlay and parcel - if (!IsChildAgent) + ILandChannel landch = m_scene.LandChannel; + if (landch != null) { - ILandChannel landch = m_scene.LandChannel; - if (landch != null) + landch.sendClientInitialLandInfo(client); + if (!IsChildAgent) { - landch.sendClientInitialLandInfo(client); newhide = m_currentParcelHide; m_currentParcelHide = false; } } - // send agentData to all clients including us (?) // get appearance // if in cache sent it to all clients // send what we have to us, even if not in cache ( bad? ) ValidateAndSendAppearanceAndAgentData(); - // Create child agents in neighbouring regions - if (openChildAgents && !IsChildAgent) - { - IEntityTransferModule m_agentTransfer = m_scene.RequestModuleInterface(); - if (m_agentTransfer != null) - m_agentTransfer.EnableChildAgents(this); - } - - // attachments if (isNPC || (TeleportFlags & TeleportFlags.ViaLogin) != 0) { if (Scene.AttachmentsModule != null) - Util.FireAndForget( - o => - { +// Util.FireAndForget( +// o => +// { Scene.AttachmentsModule.RezAttachments(this); - }); +// }); } else { @@ -1894,6 +1885,14 @@ namespace OpenSim.Region.Framework.Scenes // "[SCENE PRESENCE]: Completing movement of {0} into region {1} took {2}ms", // client.Name, Scene.RegionInfo.RegionName, (DateTime.Now - startTime).Milliseconds); + // Create child agents in neighbouring regions + if (openChildAgents && !IsChildAgent) + { + IEntityTransferModule m_agentTransfer = m_scene.RequestModuleInterface(); + if (m_agentTransfer != null) + m_agentTransfer.EnableChildAgents(this); + } + // send the rest of the world if (m_teleportFlags > 0 && !isNPC) SendInitialDataToMe(); @@ -1923,8 +1922,10 @@ namespace OpenSim.Region.Framework.Scenes } // if hide force a check if (!IsChildAgent && newhide) - ParcelCrossCheck(m_currentParcelUUID, m_previusParcelUUID, - true, m_previusParcelHide, false, true); + { + ParcelLoginCheck(m_currentParcelUUID); + m_currentParcelHide = newhide; + } } /// @@ -3377,7 +3378,7 @@ namespace OpenSim.Region.Framework.Scenes if (!remoteClient.IsActive) return; - if (ParcelHideThisAvatar && p.currentParcelUUID != currentParcelUUID) + if (ParcelHideThisAvatar && p.currentParcelUUID != currentParcelUUID && p.GodLevel < 200) return; @@ -3464,6 +3465,14 @@ namespace OpenSim.Region.Framework.Scenes // we created a new ScenePresence (a new child agent) in a fresh region. // Request info about all the (root) agents in this region // Note: This won't send data *to* other clients in that region (children don't send) + if (m_teleportFlags <= 0) + { + ILandChannel landch = m_scene.LandChannel; + if (landch != null) + { + landch.sendClientInitialLandInfo(ControllingClient); + } + } SendOtherAgentsAvatarDataToMe(); SendOtherAgentsAppearanceToMe(); @@ -3586,7 +3595,7 @@ namespace OpenSim.Region.Framework.Scenes public void SendAvatarDataToAgent(ScenePresence avatar) { //m_log.DebugFormat("[SCENE PRESENCE] SendAvatarDataToAgent from {0} ({1}) to {2} ({3})", Name, UUID, avatar.Name, avatar.UUID); - if (ParcelHideThisAvatar && currentParcelUUID != avatar.currentParcelUUID) + if (ParcelHideThisAvatar && currentParcelUUID != avatar.currentParcelUUID && avatar.GodLevel < 200) return; avatar.ControllingClient.SendAvatarDataImmediate(this); Animator.SendAnimPackToClient(avatar.ControllingClient); @@ -3653,7 +3662,7 @@ namespace OpenSim.Region.Framework.Scenes { // m_log.DebugFormat( // "[SCENE PRESENCE]: Sending appearance data from {0} {1} to {2} {3}", Name, m_uuid, avatar.Name, avatar.UUID); - if (ParcelHideThisAvatar && currentParcelUUID != avatar.currentParcelUUID) + if (ParcelHideThisAvatar && currentParcelUUID != avatar.currentParcelUUID && avatar.GodLevel < 200) return; avatar.ControllingClient.SendAppearance( UUID, Appearance.VisualParams, Appearance.Texture.GetBytes()); @@ -3866,14 +3875,21 @@ namespace OpenSim.Region.Framework.Scenes /// protected bool CrossToNewRegion() { + bool result = false; + parcelRegionCross(false); try { - return m_scene.CrossAgentToNewRegion(this, Flying); + result = m_scene.CrossAgentToNewRegion(this, Flying); } catch { - return m_scene.CrossAgentToNewRegion(this, false); + result = m_scene.CrossAgentToNewRegion(this, false); } + if(!result) + parcelRegionCross(true); + + return result; + } public void Reset() @@ -3947,6 +3963,8 @@ namespace OpenSim.Region.Framework.Scenes /// public void GrantGodlikePowers(UUID agentID, UUID sessionID, UUID token, bool godStatus) { + int oldgodlevel = GodLevel; + if (godStatus) { // For now, assign god level 200 to anyone @@ -3967,6 +3985,9 @@ namespace OpenSim.Region.Framework.Scenes } ControllingClient.SendAdminResponse(token, (uint)GodLevel); + + if(oldgodlevel != GodLevel) + parcelGodCheck(m_currentParcelUUID, GodLevel >= 200); } #region Child Agent Updates @@ -5377,7 +5398,221 @@ namespace OpenSim.Region.Framework.Scenes } - private void ParcelCrossCheck(UUID currentParcelUUID,UUID previusParcelUUID, + private void parcelGodCheck(UUID currentParcelID, bool isGod) + { + List allpresences = null; + + + allpresences = m_scene.GetScenePresences(); + + if (isGod) + { + List viewsToSendme = new List(); + + foreach (ScenePresence p in allpresences) + { + if (p.IsDeleted || p == this || p.ControllingClient == null || !p.ControllingClient.IsActive) + continue; + + if (p.ParcelHideThisAvatar && p.currentParcelUUID != currentParcelID) + { + viewsToSendme.Add(p); // i see them + } + } + + if (viewsToSendme.Count > 0) + { + foreach (ScenePresence p in viewsToSendme) + { + if (p.IsChildAgent) + continue; + m_log.Debug("[AVATAR]: viewMe: " + Lastname + " " + p.Lastname); + ControllingClient.SendAvatarDataImmediate(p); + p.SendAppearanceToAgent(this); + p.SendAttachmentsToClient(ControllingClient); + if (p.Animator != null) + p.Animator.SendAnimPackToClient(ControllingClient); + } + } + } + else + { + List killsToSendme = new List(); + + foreach (ScenePresence p in allpresences) + { + if (p.IsDeleted || p == this || p.ControllingClient == null || !p.ControllingClient.IsActive) + continue; + + if (p.ParcelHideThisAvatar && p.currentParcelUUID != currentParcelID) + { + killsToSendme.Add(p); + } + } + + if (killsToSendme.Count > 0) + { + foreach (ScenePresence p in killsToSendme) + { + m_log.Debug("[AVATAR]: killMe: " + Lastname + " " + p.Lastname); + try { ControllingClient.SendKillObject(new List { p.LocalId }); } + catch (NullReferenceException) { } + } + } + } + + } + + private void ParcelLoginCheck(UUID currentParcelID) + { + List killsToSendto = new List(); + List killsToSendme = new List(); + List viewsToSendto = new List(); + List viewsToSendme = new List(); + List allpresences = null; + + allpresences = m_scene.GetScenePresences(); + + foreach (ScenePresence p in allpresences) + { + if (p.IsDeleted || p == this || p.ControllingClient == null || !p.ControllingClient.IsActive) + continue; + + if (currentParcelID != p.currentParcelUUID) + { + if (p.GodLevel < 200) + killsToSendto.Add(p); + if (GodLevel < 200 && p.ParcelHideThisAvatar) + killsToSendme.Add(p); + } + else + { + viewsToSendto.Add(p); + viewsToSendme.Add(p); + } + } + allpresences.Clear(); + + // send the things + // kill main avatar object + if (killsToSendto.Count > 0 && PresenceType != PresenceType.Npc) + { + foreach (ScenePresence p in killsToSendto) + { + m_log.Debug("[AVATAR]: killTo: " + Lastname + " " + p.Lastname); + try { p.ControllingClient.SendKillObject(new List { LocalId }); } + catch (NullReferenceException) { } + } + } + + if (killsToSendme.Count > 0) + { + foreach (ScenePresence p in killsToSendme) + { + m_log.Debug("[AVATAR]: killMe: " + Lastname + " " + p.Lastname); + try { ControllingClient.SendKillObject(new List { p.LocalId }); } + catch (NullReferenceException) { } + } + } + + if (viewsToSendto.Count > 0 && PresenceType != PresenceType.Npc) + { + foreach (ScenePresence p in viewsToSendto) + { + m_log.Debug("[AVATAR]: viewTo: " + Lastname + " " + p.Lastname); + p.ControllingClient.SendAvatarDataImmediate(this); + SendAppearanceToAgent(p); + SendAttachmentsToClient(p.ControllingClient); + if (Animator != null) + Animator.SendAnimPackToClient(p.ControllingClient); + } + } + + if (viewsToSendme.Count > 0) + { + foreach (ScenePresence p in viewsToSendme) + { + m_log.Debug("[AVATAR]: viewMe: " + Lastname + "<-" + p.Lastname); + if (p.IsChildAgent) + continue; + ControllingClient.SendAvatarDataImmediate(p); + p.SendAppearanceToAgent(this); + p.SendAttachmentsToClient(ControllingClient); + if (p.Animator != null) + p.Animator.SendAnimPackToClient(ControllingClient); + } + } + } + + private void parcelRegionCross(bool abort) + { + if (!ParcelHideThisAvatar) + return; + + List allpresences = null; + allpresences = m_scene.GetScenePresences(); + + if (abort) + { + List viewsToSendme = new List(); + + foreach (ScenePresence p in allpresences) + { + if (p.IsDeleted || p == this || p.ControllingClient == null || !p.ControllingClient.IsActive) + continue; + + if (p.currentParcelUUID == m_currentParcelUUID) + { + viewsToSendme.Add(p); + } + } + + if (viewsToSendme.Count > 0) + { + foreach (ScenePresence p in viewsToSendme) + { + if (p.IsChildAgent) + continue; +// m_log.Debug("[AVATAR]: viewMe: " + Lastname + " " + p.Lastname); + ControllingClient.SendAvatarDataImmediate(p); + p.SendAppearanceToAgent(this); + p.SendAttachmentsToClient(ControllingClient); + if (p.Animator != null) + p.Animator.SendAnimPackToClient(ControllingClient); + } + } + } + else + { + if (GodLevel >= 200) + return; + + List killsToSendme = new List(); + foreach (ScenePresence p in allpresences) + { + if (p.IsDeleted || p == this || p.ControllingClient == null || !p.ControllingClient.IsActive) + continue; + + if (p.currentParcelUUID == m_currentParcelUUID) + { + killsToSendme.Add(p); + } + } + + if (killsToSendme.Count > 0) + { + foreach (ScenePresence p in killsToSendme) + { + m_log.Debug("[AVATAR]: killMe: " + Lastname + " " + p.Lastname); + try { ControllingClient.SendKillObject(new List { p.LocalId }); } + catch (NullReferenceException) { } + } + } + } + } + + + private void ParcelCrossCheck(UUID currentParcelID,UUID previusParcelID, bool currentParcelHide, bool previusParcelHide, bool oldhide,bool check) { List killsToSendto = new List(); @@ -5391,6 +5626,7 @@ namespace OpenSim.Region.Framework.Scenes if (check) { + // check is relative to current parcel only if (currentParcelUUID == null || oldhide == currentParcelHide) return; @@ -5404,8 +5640,8 @@ namespace OpenSim.Region.Framework.Scenes continue; // those on not on parcel see me - if (currentParcelUUID != p.currentParcelUUID) - { + if (currentParcelID != p.currentParcelUUID) + { viewsToSendto.Add(p); // they see me } } @@ -5419,14 +5655,13 @@ namespace OpenSim.Region.Framework.Scenes continue; // those not on parcel dont see me - if (currentParcelUUID != p.currentParcelUUID) + if (currentParcelID != p.currentParcelUUID && p.GodLevel < 200) { killsToSendto.Add(p); // they dont see me } } } // where public end - allpresences.Clear(); } else @@ -5436,7 +5671,7 @@ namespace OpenSim.Region.Framework.Scenes // now on a private parcel allpresences = m_scene.GetScenePresences(); - if (previusParcelHide && previusParcelUUID != UUID.Zero) + if (previusParcelHide && previusParcelID != UUID.Zero) { foreach (ScenePresence p in allpresences) { @@ -5444,13 +5679,15 @@ namespace OpenSim.Region.Framework.Scenes continue; // only those on previus parcel need receive kills - if (previusParcelUUID == p.currentParcelUUID) + if (previusParcelID == p.currentParcelUUID) { - killsToSendto.Add(p); // they dont see me - killsToSendme.Add(p); // i dont see them + if(p.GodLevel < 200) + killsToSendto.Add(p); // they dont see me + if(GodLevel < 200) + killsToSendme.Add(p); // i dont see them } // only those on new parcel need see - if (currentParcelUUID == p.currentParcelUUID) + if (currentParcelID == p.currentParcelUUID) { viewsToSendto.Add(p); // they see me viewsToSendme.Add(p); // i see them @@ -5468,7 +5705,7 @@ namespace OpenSim.Region.Framework.Scenes continue; // those not on new parcel dont see me - if (currentParcelUUID != p.currentParcelUUID) + if (currentParcelID != p.currentParcelUUID && p.GodLevel < 200) { killsToSendto.Add(p); // they dont see me } @@ -5484,7 +5721,7 @@ namespace OpenSim.Region.Framework.Scenes else { // now on public parcel - if (previusParcelHide && previusParcelUUID != UUID.Zero) + if (previusParcelHide && previusParcelID != UUID.Zero) { // was on private area allpresences = m_scene.GetScenePresences(); @@ -5494,7 +5731,7 @@ namespace OpenSim.Region.Framework.Scenes if (p.IsDeleted || p == this || p.ControllingClient == null || !p.ControllingClient.IsActive) continue; // only those old parcel need receive kills - if (previusParcelUUID == p.currentParcelUUID) + if (previusParcelID == p.currentParcelUUID && GodLevel < 200) { killsToSendme.Add(p); // i dont see them } @@ -5511,29 +5748,32 @@ namespace OpenSim.Region.Framework.Scenes // send the things // kill main avatar object - if (killsToSendto.Count > 0) + if (killsToSendto.Count > 0 && PresenceType != PresenceType.Npc) { foreach (ScenePresence p in killsToSendto) { + m_log.Debug("[AVATAR]: killTo: " + Lastname + " " + p.Lastname); try { p.ControllingClient.SendKillObject(new List { LocalId }); } catch (NullReferenceException) { } } } - if (killsToSendme.Count > 0 && PresenceType != PresenceType.Npc) + if (killsToSendme.Count > 0 ) { foreach (ScenePresence p in killsToSendme) { + m_log.Debug("[AVATAR]: killMe: " + Lastname + " " + p.Lastname); try {ControllingClient.SendKillObject(new List { p.LocalId }); } catch (NullReferenceException) { } } } - if (viewsToSendto.Count > 0) + if (viewsToSendto.Count > 0 && PresenceType != PresenceType.Npc) { foreach (ScenePresence p in viewsToSendto) { p.ControllingClient.SendAvatarDataImmediate(this); +// m_log.Debug("[AVATAR]: viewTo: " + Lastname + " " + p.Lastname); SendAppearanceToAgent(p); SendAttachmentsToClient(p.ControllingClient); if (Animator != null) @@ -5541,10 +5781,13 @@ namespace OpenSim.Region.Framework.Scenes } } - if (viewsToSendme.Count > 0 && PresenceType != PresenceType.Npc) + if (viewsToSendme.Count > 0 ) { foreach (ScenePresence p in viewsToSendme) { + if (p.IsChildAgent) + continue; +// m_log.Debug("[AVATAR]: viewMe: " + Lastname + "<-" + p.Lastname); ControllingClient.SendAvatarDataImmediate(p); p.SendAppearanceToAgent(this); p.SendAttachmentsToClient(ControllingClient);