Mantis #2111
Eliminate gretuitious KillObject packets. KillObject is sent to the viewer for the root part only. Also prevents the full update on deselect that makes a deleted object reappear and stay visible until the background deleter got around to it. We still send 2 KillObject packets for the root prim, that could be avoided only at a cost in reliability. One packet seems an acceptable price to pay for consistency.0.6.0-stable
parent
ef27c8817f
commit
eee9c114cb
|
@ -2496,6 +2496,15 @@ namespace OpenSim.Region.Environment.Scenes
|
||||||
|
|
||||||
public void SendKillObject(uint localID)
|
public void SendKillObject(uint localID)
|
||||||
{
|
{
|
||||||
|
SceneObjectPart part = GetSceneObjectPart(localID);
|
||||||
|
if (part != null) // It is a prim
|
||||||
|
{
|
||||||
|
if (part.ParentGroup != null && part.ParentGroup.RootPart != null) // Valid
|
||||||
|
{
|
||||||
|
if (part.ParentGroup.RootPart != part) // Child part
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
Broadcast(delegate(IClientAPI client) { client.SendKillObject(m_regionHandle, localID); });
|
Broadcast(delegate(IClientAPI client) { client.SendKillObject(m_regionHandle, localID); });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -105,6 +105,7 @@ namespace OpenSim.Region.Environment.Scenes
|
||||||
/// </summary>
|
/// </summary>
|
||||||
protected Dictionary<LLUUID, SceneObjectPart> m_parts = new Dictionary<LLUUID, SceneObjectPart>();
|
protected Dictionary<LLUUID, SceneObjectPart> m_parts = new Dictionary<LLUUID, SceneObjectPart>();
|
||||||
|
|
||||||
|
private bool m_deleted = false;
|
||||||
protected ulong m_regionHandle;
|
protected ulong m_regionHandle;
|
||||||
protected SceneObjectPart m_rootPart;
|
protected SceneObjectPart m_rootPart;
|
||||||
// private Dictionary<LLUUID, scriptEvents> m_scriptEvents = new Dictionary<LLUUID, scriptEvents>();
|
// private Dictionary<LLUUID, scriptEvents> m_scriptEvents = new Dictionary<LLUUID, scriptEvents>();
|
||||||
|
@ -948,6 +949,7 @@ namespace OpenSim.Region.Environment.Scenes
|
||||||
avatars[i].StandUp();
|
avatars[i].StandUp();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (m_rootPart != null && part == m_rootPart)
|
||||||
avatars[i].ControllingClient.SendKillObject(m_regionHandle, part.LocalId);
|
avatars[i].ControllingClient.SendKillObject(m_regionHandle, part.LocalId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -959,6 +961,8 @@ namespace OpenSim.Region.Environment.Scenes
|
||||||
|
|
||||||
public void FakeDeleteGroup()
|
public void FakeDeleteGroup()
|
||||||
{
|
{
|
||||||
|
m_deleted = true;
|
||||||
|
|
||||||
foreach (SceneObjectPart part in m_parts.Values)
|
foreach (SceneObjectPart part in m_parts.Values)
|
||||||
{
|
{
|
||||||
List<ScenePresence> avatars = Scene.GetScenePresences();
|
List<ScenePresence> avatars = Scene.GetScenePresences();
|
||||||
|
@ -969,6 +973,7 @@ namespace OpenSim.Region.Environment.Scenes
|
||||||
avatars[i].StandUp();
|
avatars[i].StandUp();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (m_rootPart != null && part == m_rootPart)
|
||||||
avatars[i].ControllingClient.SendKillObject(m_regionHandle, part.LocalId);
|
avatars[i].ControllingClient.SendKillObject(m_regionHandle, part.LocalId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1543,6 +1548,16 @@ namespace OpenSim.Region.Environment.Scenes
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public void ScheduleGroupForFullUpdate()
|
public void ScheduleGroupForFullUpdate()
|
||||||
{
|
{
|
||||||
|
// If we wre in the delete queue, this will be set
|
||||||
|
// A full update now would make the prim reappear
|
||||||
|
// after KillObject was sent via FakeDeleteGroup
|
||||||
|
// causing flickering and delays in deletion.
|
||||||
|
// This leads to users clicking delete multiple times
|
||||||
|
// which can crash the session. So, avoid it.
|
||||||
|
//
|
||||||
|
if (m_deleted)
|
||||||
|
return;
|
||||||
|
|
||||||
checkAtTargets();
|
checkAtTargets();
|
||||||
lock (m_parts)
|
lock (m_parts)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue