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 LLClientViewslimupdates
parent
24fc4703d0
commit
696d711d15
|
@ -40,7 +40,6 @@ using OpenMetaverse.Packets;
|
||||||
using OpenMetaverse.StructuredData;
|
using OpenMetaverse.StructuredData;
|
||||||
using OpenSim.Framework;
|
using OpenSim.Framework;
|
||||||
using OpenSim.Framework.Client;
|
using OpenSim.Framework.Client;
|
||||||
|
|
||||||
using OpenSim.Framework.Statistics;
|
using OpenSim.Framework.Statistics;
|
||||||
using OpenSim.Region.Framework.Interfaces;
|
using OpenSim.Region.Framework.Interfaces;
|
||||||
using OpenSim.Region.Framework.Scenes;
|
using OpenSim.Region.Framework.Scenes;
|
||||||
|
@ -353,6 +352,23 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
protected PriorityQueue<double, ImprovedTerseObjectUpdatePacket.ObjectDataBlock> m_avatarTerseUpdates;
|
protected PriorityQueue<double, ImprovedTerseObjectUpdatePacket.ObjectDataBlock> m_avatarTerseUpdates;
|
||||||
private PriorityQueue<double, ImprovedTerseObjectUpdatePacket.ObjectDataBlock> m_primTerseUpdates;
|
private PriorityQueue<double, ImprovedTerseObjectUpdatePacket.ObjectDataBlock> m_primTerseUpdates;
|
||||||
private PriorityQueue<double, ObjectUpdatePacket.ObjectDataBlock> m_primFullUpdates;
|
private PriorityQueue<double, ObjectUpdatePacket.ObjectDataBlock> m_primFullUpdates;
|
||||||
|
|
||||||
|
/// <value>
|
||||||
|
/// List used in construction of data blocks for an object update packet. This is to stop us having to
|
||||||
|
/// continually recreate it.
|
||||||
|
/// </value>
|
||||||
|
protected List<ObjectUpdatePacket.ObjectDataBlock> m_fullUpdateDataBlocksBuilder;
|
||||||
|
|
||||||
|
/// <value>
|
||||||
|
/// Maintain a record of all the objects killed. This allows us to stop an update being sent from the
|
||||||
|
/// thread servicing the m_primFullUpdates queue after a kill. If this happens the object persists as an
|
||||||
|
/// ownerless phantom.
|
||||||
|
///
|
||||||
|
/// All manipulation of this set has to occur under a m_primFullUpdate.SyncRoot lock
|
||||||
|
///
|
||||||
|
/// </value>
|
||||||
|
protected HashSet<uint> m_killRecord;
|
||||||
|
|
||||||
private int m_moneyBalance;
|
private int m_moneyBalance;
|
||||||
private int m_animationSequenceNumber = 1;
|
private int m_animationSequenceNumber = 1;
|
||||||
private bool m_SendLogoutPacketWhenClosing = true;
|
private bool m_SendLogoutPacketWhenClosing = true;
|
||||||
|
@ -449,6 +465,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
m_avatarTerseUpdates = new PriorityQueue<double, ImprovedTerseObjectUpdatePacket.ObjectDataBlock>();
|
m_avatarTerseUpdates = new PriorityQueue<double, ImprovedTerseObjectUpdatePacket.ObjectDataBlock>();
|
||||||
m_primTerseUpdates = new PriorityQueue<double, ImprovedTerseObjectUpdatePacket.ObjectDataBlock>();
|
m_primTerseUpdates = new PriorityQueue<double, ImprovedTerseObjectUpdatePacket.ObjectDataBlock>();
|
||||||
m_primFullUpdates = new PriorityQueue<double, ObjectUpdatePacket.ObjectDataBlock>(m_scene.Entities.Count);
|
m_primFullUpdates = new PriorityQueue<double, ObjectUpdatePacket.ObjectDataBlock>(m_scene.Entities.Count);
|
||||||
|
m_fullUpdateDataBlocksBuilder = new List<ObjectUpdatePacket.ObjectDataBlock>();
|
||||||
|
m_killRecord = new HashSet<uint>();
|
||||||
|
|
||||||
m_assetService = m_scene.RequestModuleInterface<IAssetService>();
|
m_assetService = m_scene.RequestModuleInterface<IAssetService>();
|
||||||
m_hyperAssets = m_scene.RequestModuleInterface<IHyperAssetService>();
|
m_hyperAssets = m_scene.RequestModuleInterface<IHyperAssetService>();
|
||||||
|
@ -1489,8 +1507,13 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
kill.ObjectData[0].ID = localID;
|
kill.ObjectData[0].ID = localID;
|
||||||
kill.Header.Reliable = true;
|
kill.Header.Reliable = true;
|
||||||
kill.Header.Zerocoded = true;
|
kill.Header.Zerocoded = true;
|
||||||
|
|
||||||
|
lock (m_primFullUpdates.SyncRoot)
|
||||||
|
{
|
||||||
|
m_killRecord.Add(localID);
|
||||||
OutPacket(kill, ThrottleOutPacketType.State);
|
OutPacket(kill, ThrottleOutPacketType.State);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Send information about the items contained in a folder to the client.
|
/// Send information about the items contained in a folder to the client.
|
||||||
|
@ -3538,10 +3561,16 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
if (count == 0)
|
if (count == 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
outPacket.ObjectData = new ObjectUpdatePacket.ObjectDataBlock[count];
|
m_fullUpdateDataBlocksBuilder.Clear();
|
||||||
|
|
||||||
for (int i = 0; i < count; i++)
|
for (int i = 0; i < count; i++)
|
||||||
{
|
{
|
||||||
outPacket.ObjectData[i] = m_primFullUpdates.Dequeue();
|
ObjectUpdatePacket.ObjectDataBlock block = m_primFullUpdates.Dequeue();
|
||||||
|
//outPacket.ObjectData[i] = m_primFullUpdates.Dequeue();
|
||||||
|
|
||||||
|
if (!m_killRecord.Contains(block.ID))
|
||||||
|
{
|
||||||
|
m_fullUpdateDataBlocksBuilder.Add(block);
|
||||||
|
|
||||||
// string text = Util.FieldToString(outPacket.ObjectData[i].Text);
|
// string text = Util.FieldToString(outPacket.ObjectData[i].Text);
|
||||||
// if (text.IndexOf("\n") >= 0)
|
// if (text.IndexOf("\n") >= 0)
|
||||||
|
@ -3550,10 +3579,18 @@ namespace OpenSim.Region.ClientStack.LindenUDP
|
||||||
// "[CLIENT]: Sending full info about prim {0} text {1} to client {2}",
|
// "[CLIENT]: Sending full info about prim {0} text {1} to client {2}",
|
||||||
// outPacket.ObjectData[i].ID, text, Name);
|
// outPacket.ObjectData[i].ID, text, Name);
|
||||||
}
|
}
|
||||||
|
// else
|
||||||
|
// {
|
||||||
|
// m_log.WarnFormat(
|
||||||
|
// "[CLIENT]: Preventing full update for {0} after kill to {1}", block.ID, Name);
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
outPacket.ObjectData = m_fullUpdateDataBlocksBuilder.ToArray();
|
||||||
|
|
||||||
OutPacket(outPacket, ThrottleOutPacketType.State);
|
OutPacket(outPacket, ThrottleOutPacketType.State);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void SendPrimTerseUpdate(SendPrimitiveTerseData data)
|
public void SendPrimTerseUpdate(SendPrimitiveTerseData data)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue