diff options
Diffstat (limited to 'OpenSim/Region/ClientStack')
-rw-r--r-- | OpenSim/Region/ClientStack/Linden/UDP/LLClientView.cs | 33 |
1 files changed, 27 insertions, 6 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 |