aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorJustin Clark-Casey (justincc)2010-03-30 17:04:26 +0100
committerJustin Clark-Casey (justincc)2010-03-30 17:04:26 +0100
commit696d711d15ce078ad9e96af7c086748b4a860486 (patch)
tree299509b92940d88f6cb81f465bafcc9e3e4eb782
parentfix build break. First argument of GetGroupRecord is not a uuid (diff)
downloadopensim-SC-696d711d15ce078ad9e96af7c086748b4a860486.zip
opensim-SC-696d711d15ce078ad9e96af7c086748b4a860486.tar.gz
opensim-SC-696d711d15ce078ad9e96af7c086748b4a860486.tar.bz2
opensim-SC-696d711d15ce078ad9e96af7c086748b4a860486.tar.xz
Completely prevent full update packets being sent after kill object packets
If a full update is sent after the kill, the object remains as in the linden viewer but in an undeletable and unowned state until relog This patch prevents this by recording kills in LLClientView
-rw-r--r--OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs49
1 files changed, 43 insertions, 6 deletions
diff --git a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
index 18d3889..3b26dde 100644
--- a/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
+++ b/OpenSim/Region/ClientStack/LindenUDP/LLClientView.cs
@@ -40,7 +40,6 @@ using OpenMetaverse.Packets;
40using OpenMetaverse.StructuredData; 40using OpenMetaverse.StructuredData;
41using OpenSim.Framework; 41using OpenSim.Framework;
42using OpenSim.Framework.Client; 42using OpenSim.Framework.Client;
43
44using OpenSim.Framework.Statistics; 43using OpenSim.Framework.Statistics;
45using OpenSim.Region.Framework.Interfaces; 44using OpenSim.Region.Framework.Interfaces;
46using OpenSim.Region.Framework.Scenes; 45using OpenSim.Region.Framework.Scenes;
@@ -353,6 +352,23 @@ namespace OpenSim.Region.ClientStack.LindenUDP
353 protected PriorityQueue<double, ImprovedTerseObjectUpdatePacket.ObjectDataBlock> m_avatarTerseUpdates; 352 protected PriorityQueue<double, ImprovedTerseObjectUpdatePacket.ObjectDataBlock> m_avatarTerseUpdates;
354 private PriorityQueue<double, ImprovedTerseObjectUpdatePacket.ObjectDataBlock> m_primTerseUpdates; 353 private PriorityQueue<double, ImprovedTerseObjectUpdatePacket.ObjectDataBlock> m_primTerseUpdates;
355 private PriorityQueue<double, ObjectUpdatePacket.ObjectDataBlock> m_primFullUpdates; 354 private PriorityQueue<double, ObjectUpdatePacket.ObjectDataBlock> m_primFullUpdates;
355
356 /// <value>
357 /// List used in construction of data blocks for an object update packet. This is to stop us having to
358 /// continually recreate it.
359 /// </value>
360 protected List<ObjectUpdatePacket.ObjectDataBlock> m_fullUpdateDataBlocksBuilder;
361
362 /// <value>
363 /// Maintain a record of all the objects killed. This allows us to stop an update being sent from the
364 /// thread servicing the m_primFullUpdates queue after a kill. If this happens the object persists as an
365 /// ownerless phantom.
366 ///
367 /// All manipulation of this set has to occur under a m_primFullUpdate.SyncRoot lock
368 ///
369 /// </value>
370 protected HashSet<uint> m_killRecord;
371
356 private int m_moneyBalance; 372 private int m_moneyBalance;
357 private int m_animationSequenceNumber = 1; 373 private int m_animationSequenceNumber = 1;
358 private bool m_SendLogoutPacketWhenClosing = true; 374 private bool m_SendLogoutPacketWhenClosing = true;
@@ -449,6 +465,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
449 m_avatarTerseUpdates = new PriorityQueue<double, ImprovedTerseObjectUpdatePacket.ObjectDataBlock>(); 465 m_avatarTerseUpdates = new PriorityQueue<double, ImprovedTerseObjectUpdatePacket.ObjectDataBlock>();
450 m_primTerseUpdates = new PriorityQueue<double, ImprovedTerseObjectUpdatePacket.ObjectDataBlock>(); 466 m_primTerseUpdates = new PriorityQueue<double, ImprovedTerseObjectUpdatePacket.ObjectDataBlock>();
451 m_primFullUpdates = new PriorityQueue<double, ObjectUpdatePacket.ObjectDataBlock>(m_scene.Entities.Count); 467 m_primFullUpdates = new PriorityQueue<double, ObjectUpdatePacket.ObjectDataBlock>(m_scene.Entities.Count);
468 m_fullUpdateDataBlocksBuilder = new List<ObjectUpdatePacket.ObjectDataBlock>();
469 m_killRecord = new HashSet<uint>();
452 470
453 m_assetService = m_scene.RequestModuleInterface<IAssetService>(); 471 m_assetService = m_scene.RequestModuleInterface<IAssetService>();
454 m_hyperAssets = m_scene.RequestModuleInterface<IHyperAssetService>(); 472 m_hyperAssets = m_scene.RequestModuleInterface<IHyperAssetService>();
@@ -1489,7 +1507,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP
1489 kill.ObjectData[0].ID = localID; 1507 kill.ObjectData[0].ID = localID;
1490 kill.Header.Reliable = true; 1508 kill.Header.Reliable = true;
1491 kill.Header.Zerocoded = true; 1509 kill.Header.Zerocoded = true;
1492 OutPacket(kill, ThrottleOutPacketType.State); 1510
1511 lock (m_primFullUpdates.SyncRoot)
1512 {
1513 m_killRecord.Add(localID);
1514 OutPacket(kill, ThrottleOutPacketType.State);
1515 }
1493 } 1516 }
1494 1517
1495 /// <summary> 1518 /// <summary>
@@ -3538,21 +3561,35 @@ namespace OpenSim.Region.ClientStack.LindenUDP
3538 if (count == 0) 3561 if (count == 0)
3539 return; 3562 return;
3540 3563
3541 outPacket.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[count]; 3564 m_fullUpdateDataBlocksBuilder.Clear();
3565
3542 for (int i = 0; i < count; i++) 3566 for (int i = 0; i < count; i++)
3543 { 3567 {
3544 outPacket.ObjectData[i] = m_primFullUpdates.Dequeue(); 3568 ObjectUpdatePacket.ObjectDataBlock block = m_primFullUpdates.Dequeue();
3569 //outPacket.ObjectData[i] = m_primFullUpdates.Dequeue();
3545 3570
3571 if (!m_killRecord.Contains(block.ID))
3572 {
3573 m_fullUpdateDataBlocksBuilder.Add(block);
3574
3546// string text = Util.FieldToString(outPacket.ObjectData[i].Text); 3575// string text = Util.FieldToString(outPacket.ObjectData[i].Text);
3547// if (text.IndexOf("\n") >= 0) 3576// if (text.IndexOf("\n") >= 0)
3548// text = text.Remove(text.IndexOf("\n")); 3577// text = text.Remove(text.IndexOf("\n"));
3549// m_log.DebugFormat( 3578// m_log.DebugFormat(
3550// "[CLIENT]: Sending full info about prim {0} text {1} to client {2}", 3579// "[CLIENT]: Sending full info about prim {0} text {1} to client {2}",
3551// outPacket.ObjectData[i].ID, text, Name); 3580// outPacket.ObjectData[i].ID, text, Name);
3581 }
3582// else
3583// {
3584// m_log.WarnFormat(
3585// "[CLIENT]: Preventing full update for {0} after kill to {1}", block.ID, Name);
3586// }
3552 } 3587 }
3553 }
3554 3588
3555 OutPacket(outPacket, ThrottleOutPacketType.State); 3589 outPacket.ObjectData = m_fullUpdateDataBlocksBuilder.ToArray();
3590
3591 OutPacket(outPacket, ThrottleOutPacketType.State);
3592 }
3556 } 3593 }
3557 3594
3558 public void SendPrimTerseUpdate(SendPrimitiveTerseData data) 3595 public void SendPrimTerseUpdate(SendPrimitiveTerseData data)