aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs14
-rwxr-xr-xOpenSim/Region/Framework/Scenes/Scene.cs12
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs38
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectPart.cs3
4 files changed, 26 insertions, 41 deletions
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs
index 6beb9b4..24d92f2 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
4007 bool doCulling = m_scene.ObjectsCullingByDistance; 4007 bool doCulling = m_scene.ObjectsCullingByDistance;
4008 float cullingrange = 64.0f; 4008 float cullingrange = 64.0f;
4009 HashSet<SceneObjectGroup> GroupsNeedFullUpdate = new HashSet<SceneObjectGroup>(); 4009 HashSet<SceneObjectGroup> GroupsNeedFullUpdate = new HashSet<SceneObjectGroup>();
4010 List<SceneObjectGroup> kills = new List<SceneObjectGroup>();
4011// Vector3 mycamera = Vector3.Zero; 4010// Vector3 mycamera = Vector3.Zero;
4012 Vector3 mypos = Vector3.Zero; 4011 Vector3 mypos = Vector3.Zero;
4013 ScenePresence mysp = (ScenePresence)SceneAgent; 4012 ScenePresence mysp = (ScenePresence)SceneAgent;
@@ -4048,7 +4047,10 @@ namespace OpenSim.Region.ClientStack.LindenUDP
4048 // Instead send another kill object, because the first one may have gotten 4047 // Instead send another kill object, because the first one may have gotten
4049 // into a race condition 4048 // into a race condition
4050 if (!m_killRecord.Contains(grp.LocalId)) 4049 if (!m_killRecord.Contains(grp.LocalId))
4050 {
4051 m_killRecord.Add(grp.LocalId); 4051 m_killRecord.Add(grp.LocalId);
4052 maxUpdatesBytes -= 30;
4053 }
4052 continue; 4054 continue;
4053 } 4055 }
4054 4056
@@ -4336,16 +4338,6 @@ namespace OpenSim.Region.ClientStack.LindenUDP
4336 m_killRecord.Clear(); 4338 m_killRecord.Clear();
4337 } 4339 }
4338 4340
4339 if (kills.Count > 0)
4340 {
4341 foreach(SceneObjectGroup grp in kills)
4342 {
4343 foreach(SceneObjectPart p in grp.Parts)
4344 SendEntityUpdate(p,PrimUpdateFlags.Kill);
4345 }
4346 kills.Clear();
4347 }
4348
4349 if(GroupsNeedFullUpdate.Count > 0) 4341 if(GroupsNeedFullUpdate.Count > 0)
4350 { 4342 {
4351 foreach(SceneObjectGroup grp in GroupsNeedFullUpdate) 4343 foreach(SceneObjectGroup grp in GroupsNeedFullUpdate)
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index 33418e6..5d5ea89 100755
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -3866,15 +3866,9 @@ namespace OpenSim.Region.Framework.Scenes
3866 foreach (uint localID in localIDs) 3866 foreach (uint localID in localIDs)
3867 { 3867 {
3868 SceneObjectPart part = GetSceneObjectPart(localID); 3868 SceneObjectPart part = GetSceneObjectPart(localID);
3869 if (part != null) // It is a prim 3869 if (part != null && part.ParentGroup != null &&
3870 { 3870 part.ParentGroup.RootPart == part)
3871 if (part.ParentGroup != null && !part.ParentGroup.IsDeleted) // Valid 3871 deleteIDs.Add(localID);
3872 {
3873 if (part.ParentGroup.RootPart != part) // Child part
3874 continue;
3875 }
3876 }
3877 deleteIDs.Add(localID);
3878 } 3872 }
3879 3873
3880 ForEachClient(c => c.SendKillObject(deleteIDs)); 3874 ForEachClient(c => c.SendKillObject(deleteIDs));
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index e17ef2b..df6a1cf 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -2065,41 +2065,37 @@ namespace OpenSim.Region.Framework.Scenes
2065 { 2065 {
2066 // We need to keep track of this state in case this group is still queued for backup. 2066 // We need to keep track of this state in case this group is still queued for backup.
2067 IsDeleted = true; 2067 IsDeleted = true;
2068 HasGroupChanged = true;
2069 2068
2070 DetachFromBackup(); 2069 DetachFromBackup();
2071 2070
2071 if(Scene == null) // should not happen unless restart/shutdown ?
2072 return;
2073
2072 SceneObjectPart[] parts = m_parts.GetArray(); 2074 SceneObjectPart[] parts = m_parts.GetArray();
2073 for (int i = 0; i < parts.Length; i++) 2075 for (int i = 0; i < parts.Length; i++)
2074 { 2076 {
2075 SceneObjectPart part = parts[i]; 2077 SceneObjectPart part = parts[i];
2076 2078
2077 if (Scene != null) 2079 Scene.ForEachScenePresence(delegate(ScenePresence avatar)
2078 { 2080 {
2079 Scene.ForEachScenePresence(delegate(ScenePresence avatar) 2081 if (!avatar.IsChildAgent && avatar.ParentID == LocalId)
2080 { 2082 avatar.StandUp();
2081 if (!avatar.IsChildAgent && avatar.ParentID == LocalId)
2082 avatar.StandUp();
2083 2083
2084 if (!silent) 2084 if (!silent)
2085 {
2086 part.ClearUpdateSchedule();
2087 if (part == m_rootPart)
2085 { 2088 {
2086 part.ClearUpdateSchedule(); 2089 if (!IsAttachment
2087 if (part == m_rootPart) 2090 || AttachedAvatar == avatar.ControllingClient.AgentId
2091 || !HasPrivateAttachmentPoint)
2088 { 2092 {
2089 if (!IsAttachment 2093 // Send a kill object immediately
2090 || AttachedAvatar == avatar.ControllingClient.AgentId 2094 avatar.ControllingClient.SendKillObject(new List<uint> { part.LocalId });
2091 || !HasPrivateAttachmentPoint)
2092 {
2093 // Send a kill object immediately
2094 avatar.ControllingClient.SendKillObject(new List<uint> { part.LocalId });
2095 // Also, send a terse update; in case race conditions make the object pop again in the client,
2096 // this update will send another kill object
2097 m_rootPart.SendTerseUpdateToClient(avatar.ControllingClient);
2098 }
2099 } 2095 }
2100 } 2096 }
2101 }); 2097 }
2102 } 2098 });
2103 } 2099 }
2104 } 2100 }
2105 2101
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs
index bc603ae..ca5951c 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
5420 5420
5421 public void SendTerseUpdateToClient(IClientAPI remoteClient) 5421 public void SendTerseUpdateToClient(IClientAPI remoteClient)
5422 { 5422 {
5423 if (ParentGroup.IsDeleted)
5424 return;
5425
5423 if (ParentGroup.IsAttachment 5426 if (ParentGroup.IsAttachment
5424 && (ParentGroup.RootPart != this 5427 && (ParentGroup.RootPart != this
5425 || ParentGroup.AttachedAvatar != remoteClient.AgentId && ParentGroup.HasPrivateAttachmentPoint)) 5428 || ParentGroup.AttachedAvatar != remoteClient.AgentId && ParentGroup.HasPrivateAttachmentPoint))