aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim')
-rw-r--r--OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs33
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs7
-rw-r--r--OpenSim/Region/Framework/Scenes/SceneObjectPart.cs3
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))