diff options
Diffstat (limited to 'OpenSim')
-rw-r--r-- | OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs | 33 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | 7 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | 3 |
3 files changed, 34 insertions, 9 deletions
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs index d449e82..9cee590 100644 --- a/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs +++ b/OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs | |||
@@ -357,7 +357,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
357 | /// All manipulation of this set has to occur under an m_entityUpdates.SyncRoot lock | 357 | /// All manipulation of this set has to occur under an m_entityUpdates.SyncRoot lock |
358 | /// | 358 | /// |
359 | /// </value> | 359 | /// </value> |
360 | // protected HashSet<uint> m_killRecord; | 360 | protected List<uint> m_killRecord; |
361 | 361 | ||
362 | // protected HashSet<uint> m_attachmentsSent; | 362 | // protected HashSet<uint> m_attachmentsSent; |
363 | 363 | ||
@@ -509,7 +509,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
509 | m_entityUpdates = new PriorityQueue(m_scene.Entities.Count); | 509 | m_entityUpdates = new PriorityQueue(m_scene.Entities.Count); |
510 | m_entityProps = new PriorityQueue(m_scene.Entities.Count); | 510 | m_entityProps = new PriorityQueue(m_scene.Entities.Count); |
511 | m_fullUpdateDataBlocksBuilder = new List<ObjectUpdatePacket.ObjectDataBlock>(); | 511 | m_fullUpdateDataBlocksBuilder = new List<ObjectUpdatePacket.ObjectDataBlock>(); |
512 | // m_killRecord = new HashSet<uint>(); | 512 | m_killRecord = new List<uint>(); |
513 | // m_attachmentsSent = new HashSet<uint>(); | 513 | // m_attachmentsSent = new HashSet<uint>(); |
514 | 514 | ||
515 | m_assetService = m_scene.RequestModuleInterface<IAssetService>(); | 515 | m_assetService = m_scene.RequestModuleInterface<IAssetService>(); |
@@ -3992,7 +3992,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
3992 | foreach (EntityUpdate update in updates) | 3992 | foreach (EntityUpdate update in updates) |
3993 | ResendPrimUpdate(update); | 3993 | ResendPrimUpdate(update); |
3994 | } | 3994 | } |
3995 | 3995 | ||
3996 | private void ProcessEntityUpdates(int maxUpdates) | 3996 | private void ProcessEntityUpdates(int maxUpdates) |
3997 | { | 3997 | { |
3998 | OpenSim.Framework.Lazy<List<ObjectUpdatePacket.ObjectDataBlock>> objectUpdateBlocks = new OpenSim.Framework.Lazy<List<ObjectUpdatePacket.ObjectDataBlock>>(); | 3998 | OpenSim.Framework.Lazy<List<ObjectUpdatePacket.ObjectDataBlock>> objectUpdateBlocks = new OpenSim.Framework.Lazy<List<ObjectUpdatePacket.ObjectDataBlock>>(); |
@@ -4005,6 +4005,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
4005 | OpenSim.Framework.Lazy<List<EntityUpdate>> terseUpdates = new OpenSim.Framework.Lazy<List<EntityUpdate>>(); | 4005 | OpenSim.Framework.Lazy<List<EntityUpdate>> terseUpdates = new OpenSim.Framework.Lazy<List<EntityUpdate>>(); |
4006 | OpenSim.Framework.Lazy<List<EntityUpdate>> terseAgentUpdates = new OpenSim.Framework.Lazy<List<EntityUpdate>>(); | 4006 | OpenSim.Framework.Lazy<List<EntityUpdate>> terseAgentUpdates = new OpenSim.Framework.Lazy<List<EntityUpdate>>(); |
4007 | 4007 | ||
4008 | |||
4008 | // Check to see if this is a flush | 4009 | // Check to see if this is a flush |
4009 | if (maxUpdates <= 0) | 4010 | if (maxUpdates <= 0) |
4010 | { | 4011 | { |
@@ -4033,9 +4034,19 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
4033 | { | 4034 | { |
4034 | SceneObjectPart part = (SceneObjectPart)update.Entity; | 4035 | SceneObjectPart part = (SceneObjectPart)update.Entity; |
4035 | 4036 | ||
4036 | if (part.ParentGroup.IsDeleted || part.ParentGroup.inTransit) | 4037 | if (part.ParentGroup.inTransit) |
4037 | continue; | 4038 | continue; |
4038 | 4039 | ||
4040 | if (part.ParentGroup.IsDeleted) | ||
4041 | { | ||
4042 | // Don't send updates for objects that have been marked deleted. | ||
4043 | // Instead send another kill object, because the first one may have gotten | ||
4044 | // into a race condition | ||
4045 | if (!m_killRecord.Contains(part.ParentGroup.LocalId)) | ||
4046 | m_killRecord.Add(part.ParentGroup.LocalId); | ||
4047 | continue; | ||
4048 | } | ||
4049 | |||
4039 | if (part.ParentGroup.IsAttachment) | 4050 | if (part.ParentGroup.IsAttachment) |
4040 | { // Someone else's HUD, why are we getting these? | 4051 | { // Someone else's HUD, why are we getting these? |
4041 | if (part.ParentGroup.OwnerID != AgentId && part.ParentGroup.HasPrivateAttachmentPoint) | 4052 | if (part.ParentGroup.OwnerID != AgentId && part.ParentGroup.HasPrivateAttachmentPoint) |
@@ -4233,7 +4244,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
4233 | 4244 | ||
4234 | for (int i = 0; i < blocks.Count; i++) | 4245 | for (int i = 0; i < blocks.Count; i++) |
4235 | packet.ObjectData[i] = blocks[i]; | 4246 | packet.ObjectData[i] = blocks[i]; |
4236 | 4247 | ||
4237 | OutPacket(packet, ThrottleOutPacketType.Task, true); | 4248 | OutPacket(packet, ThrottleOutPacketType.Task, true); |
4238 | } | 4249 | } |
4239 | 4250 | ||
@@ -4248,7 +4259,7 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
4248 | 4259 | ||
4249 | for (int i = 0; i < blocks.Count; i++) | 4260 | for (int i = 0; i < blocks.Count; i++) |
4250 | packet.ObjectData[i] = blocks[i]; | 4261 | packet.ObjectData[i] = blocks[i]; |
4251 | 4262 | ||
4252 | OutPacket(packet, ThrottleOutPacketType.Task, true); | 4263 | OutPacket(packet, ThrottleOutPacketType.Task, true); |
4253 | } | 4264 | } |
4254 | 4265 | ||
@@ -4270,6 +4281,16 @@ namespace OpenSim.Region.ClientStack.LindenUDP | |||
4270 | } | 4281 | } |
4271 | 4282 | ||
4272 | #endregion Packet Sending | 4283 | #endregion Packet Sending |
4284 | |||
4285 | #region Handle deleted objects | ||
4286 | if (m_killRecord.Count > 0) | ||
4287 | { | ||
4288 | SendKillObject(m_killRecord); | ||
4289 | m_killRecord.Clear(); | ||
4290 | } | ||
4291 | #endregion | ||
4292 | |||
4293 | |||
4273 | } | 4294 | } |
4274 | 4295 | ||
4275 | // hack.. dont use | 4296 | // hack.. dont use |
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs index 04db123..09dc663 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs | |||
@@ -1987,6 +1987,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1987 | { | 1987 | { |
1988 | // We need to keep track of this state in case this group is still queued for backup. | 1988 | // We need to keep track of this state in case this group is still queued for backup. |
1989 | IsDeleted = true; | 1989 | IsDeleted = true; |
1990 | HasGroupChanged = true; | ||
1990 | 1991 | ||
1991 | DetachFromBackup(); | 1992 | DetachFromBackup(); |
1992 | 1993 | ||
@@ -2010,7 +2011,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
2010 | if (!IsAttachment | 2011 | if (!IsAttachment |
2011 | || AttachedAvatar == avatar.ControllingClient.AgentId | 2012 | || AttachedAvatar == avatar.ControllingClient.AgentId |
2012 | || !HasPrivateAttachmentPoint) | 2013 | || !HasPrivateAttachmentPoint) |
2014 | { | ||
2015 | // Send a kill object immediately | ||
2013 | avatar.ControllingClient.SendKillObject(new List<uint> { part.LocalId }); | 2016 | avatar.ControllingClient.SendKillObject(new List<uint> { part.LocalId }); |
2017 | // Also, send a terse update; in case race conditions make the object pop again in the client, | ||
2018 | // this update will send another kill object | ||
2019 | m_rootPart.SendTerseUpdateToClient(avatar.ControllingClient); | ||
2020 | } | ||
2014 | } | 2021 | } |
2015 | } | 2022 | } |
2016 | }); | 2023 | }); |
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs index 7d95c8d..b4feb9a 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPart.cs | |||
@@ -5390,9 +5390,6 @@ SendFullUpdateToClient(remoteClient, Position) ignores position parameter | |||
5390 | 5390 | ||
5391 | public void SendTerseUpdateToClient(IClientAPI remoteClient) | 5391 | public void SendTerseUpdateToClient(IClientAPI remoteClient) |
5392 | { | 5392 | { |
5393 | if (ParentGroup.IsDeleted) | ||
5394 | return; | ||
5395 | |||
5396 | if (ParentGroup.IsAttachment | 5393 | if (ParentGroup.IsAttachment |
5397 | && (ParentGroup.RootPart != this | 5394 | && (ParentGroup.RootPart != this |
5398 | || ParentGroup.AttachedAvatar != remoteClient.AgentId && ParentGroup.HasPrivateAttachmentPoint)) | 5395 | || ParentGroup.AttachedAvatar != remoteClient.AgentId && ParentGroup.HasPrivateAttachmentPoint)) |