diff options
Diffstat (limited to '')
-rwxr-xr-x | OpenSim/Region/Framework/Scenes/Scene.cs | 12 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | 38 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 3 |
3 files changed, 23 insertions, 30 deletions
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)) |