clean sendKill a bit, remove a IsChild that is set too early in a calling

path
avinationmerge
UbitUmarov 2014-08-24 00:44:14 +01:00
parent 06b6238d00
commit f4a6be8654
2 changed files with 17 additions and 24 deletions

View File

@ -1677,28 +1677,8 @@ namespace OpenSim.Region.ClientStack.LindenUDP
kill.Header.Reliable = true;
kill.Header.Zerocoded = true;
if (localIDs.Count == 1 && m_scene.GetScenePresence(localIDs[0]) != null)
{
OutPacket(kill, ThrottleOutPacketType.Task);
}
else
{
// We MUST lock for both manipulating the kill record and sending the packet, in order to avoid a race
// condition where a kill can be processed before an out-of-date update for the same object.
// ProcessEntityUpdates() also takes the m_killRecord lock.
// lock (m_killRecord)
// {
// foreach (uint localID in localIDs)
// m_killRecord.Add(localID);
// The throttle queue used here must match that being used for updates. Otherwise, there is a
// chance that a kill packet put on a separate queue will be sent to the client before an existing
// update packet on another queue. Receiving updates after kills results in unowned and undeletable
// scene objects in a viewer until that viewer is relogged in.
OutPacket(kill, ThrottleOutPacketType.Task);
// }
}
}
OutPacket(kill, ThrottleOutPacketType.Task);
}
/// <summary>
/// Send information about the items contained in a folder to the client.

View File

@ -3590,10 +3590,12 @@ namespace OpenSim.Region.Framework.Scenes
if (p.UUID == UUID)
return;
// get the avatar, then a kill if can't see it
p.SendInitialAvatarDataToAgent(this);
if (p.ParcelHideThisAvatar && currentParcelUUID != p.currentParcelUUID && GodLevel < 200)
return;
p.SendAvatarDataToAgentNF(this);
p.SendAppearanceToAgentNF(this);
p.SendAnimPackToAgentNF(this);
p.SendAttachmentsToAgentNF(this);
@ -3651,6 +3653,16 @@ namespace OpenSim.Region.Framework.Scenes
m_scene.StatsReporter.AddAgentUpdates(count);
}
public void SendInitialAvatarDataToAgent(ScenePresence p)
{
p.ControllingClient.SendAvatarDataImmediate(this);
if (p != this && ParcelHideThisAvatar && currentParcelUUID != p.currentParcelUUID && p.GodLevel < 200)
// either just kill the object
// p.ControllingClient.SendKillObject(new List<uint> {LocalId});
// or also attachments viewer may still know about
SendKillTo(p);
}
/// <summary>
/// Send avatar data to an agent.
/// </summary>
@ -5959,7 +5971,8 @@ namespace OpenSim.Region.Framework.Scenes
if (p == this)
continue;
SendKillTo(p);
p.SendKillTo(this);
if (!p.IsChildAgent)
p.SendKillTo(this);
}
if (Scene.AttachmentsModule != null)
Scene.AttachmentsModule.DeleteAttachmentsFromScene(this, true);