diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index 6beb9b42a9..24d92f2eba 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs @@ -4007,7 +4007,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP bool doCulling = m_scene.ObjectsCullingByDistance; float cullingrange = 64.0f; HashSet GroupsNeedFullUpdate = new HashSet(); - List kills = new List(); // Vector3 mycamera = Vector3.Zero; Vector3 mypos = Vector3.Zero; ScenePresence mysp = (ScenePresence)SceneAgent; @@ -4048,7 +4047,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP // Instead send another kill object, because the first one may have gotten // into a race condition if (!m_killRecord.Contains(grp.LocalId)) + { m_killRecord.Add(grp.LocalId); + maxUpdatesBytes -= 30; + } continue; } @@ -4336,16 +4338,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP m_killRecord.Clear(); } - if (kills.Count > 0) - { - foreach(SceneObjectGroup grp in kills) - { - foreach(SceneObjectPart p in grp.Parts) - SendEntityUpdate(p,PrimUpdateFlags.Kill); - } - kills.Clear(); - } - if(GroupsNeedFullUpdate.Count > 0) { foreach(SceneObjectGroup grp in GroupsNeedFullUpdate) diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 33418e631d..5d5ea895ae 100755 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -3866,15 +3866,9 @@ namespace OpenSim.Region.Framework.Scenes foreach (uint localID in localIDs) { SceneObjectPart part = GetSceneObjectPart(localID); - if (part != null) // It is a prim - { - if (part.ParentGroup != null && !part.ParentGroup.IsDeleted) // Valid - { - if (part.ParentGroup.RootPart != part) // Child part - continue; - } - } - deleteIDs.Add(localID); + if (part != null && part.ParentGroup != null && + part.ParentGroup.RootPart == part) + deleteIDs.Add(localID); } ForEachClient(c => c.SendKillObject(deleteIDs)); diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index e17ef2bded..df6a1cf00f 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs @@ -2065,41 +2065,37 @@ namespace OpenSim.Region.Framework.Scenes { // We need to keep track of this state in case this group is still queued for backup. IsDeleted = true; - HasGroupChanged = true; DetachFromBackup(); + if(Scene == null) // should not happen unless restart/shutdown ? + return; + SceneObjectPart[] parts = m_parts.GetArray(); for (int i = 0; i < parts.Length; i++) { SceneObjectPart part = parts[i]; - if (Scene != null) + Scene.ForEachScenePresence(delegate(ScenePresence avatar) { - Scene.ForEachScenePresence(delegate(ScenePresence avatar) - { - if (!avatar.IsChildAgent && avatar.ParentID == LocalId) - avatar.StandUp(); + if (!avatar.IsChildAgent && avatar.ParentID == LocalId) + avatar.StandUp(); - if (!silent) + if (!silent) + { + part.ClearUpdateSchedule(); + if (part == m_rootPart) { - part.ClearUpdateSchedule(); - if (part == m_rootPart) + if (!IsAttachment + || AttachedAvatar == avatar.ControllingClient.AgentId + || !HasPrivateAttachmentPoint) { - if (!IsAttachment - || AttachedAvatar == avatar.ControllingClient.AgentId - || !HasPrivateAttachmentPoint) - { - // Send a kill object immediately - avatar.ControllingClient.SendKillObject(new List { part.LocalId }); - // Also, send a terse update; in case race conditions make the object pop again in the client, - // this update will send another kill object - m_rootPart.SendTerseUpdateToClient(avatar.ControllingClient); - } + // Send a kill object immediately + avatar.ControllingClient.SendKillObject(new List { part.LocalId }); } } - }); - } + } + }); } } diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index bc603aead0..ca5951cfac 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs @@ -5420,6 +5420,9 @@ SendFullUpdateToClient(remoteClient, Position) ignores position parameter public void SendTerseUpdateToClient(IClientAPI remoteClient) { + if (ParentGroup.IsDeleted) + return; + if (ParentGroup.IsAttachment && (ParentGroup.RootPart != this || ParentGroup.AttachedAvatar != remoteClient.AgentId && ParentGroup.HasPrivateAttachmentPoint))