Fixed: after a Hypergrid teleport, attachments often either disappear, or appear both on the avatar AND as in-world objects.

Another manifestation of this bug is that after a Hypergrid teleport, when you click on one of the avatar's attachments the object doesn't show its name. This means that the viewer knows the attachment is there, but the simulator does not.

The problem was caused by treating Hypergrid teleports as if they're Logins (because the teleport flag ViaLogin is enabled).

This may fix: http://opensimulator.org/mantis/view.php?id=7238
This may fix: http://opensimulator.org/mantis/view.php?id=7220
bullet-2.82
Oren Hurvitz 2014-07-20 18:53:11 +03:00
parent 712c50e0bf
commit 899bcb7acd
1 changed files with 13 additions and 10 deletions

View File

@ -1193,20 +1193,18 @@ namespace OpenSim.Region.Framework.Scenes
// and it has already rezzed the attachments and started their scripts.
// We do the following only for non-login agents, because their scripts
// haven't started yet.
if (PresenceType == PresenceType.Npc || (TeleportFlags & TeleportFlags.ViaLogin) != 0)
if (PresenceType == PresenceType.Npc || IsRealLogin(m_teleportFlags))
{
// Viewers which have a current outfit folder will actually rez their own attachments. However,
// viewers without (e.g. v1 viewers) will not, so we still need to make this call.
if (Scene.AttachmentsModule != null)
Util.FireAndForget(
o =>
{
// if (PresenceType != PresenceType.Npc && Util.FireAndForgetMethod != FireAndForgetMethod.None)
// System.Threading.Thread.Sleep(7000);
Util.FireAndForget(o =>
{
Scene.AttachmentsModule.RezAttachments(this);
});
}
}
else
{
// We need to restart scripts here so that they receive the correct changed events (CHANGED_TELEPORT
@ -1267,6 +1265,11 @@ namespace OpenSim.Region.Framework.Scenes
return true;
}
private static bool IsRealLogin(TeleportFlags teleportFlags)
{
return ((teleportFlags & TeleportFlags.ViaLogin) != 0) && ((teleportFlags & TeleportFlags.ViaHGLogin) == 0);
}
/// <summary>
/// Force viewers to show the avatar's current name.
/// </summary>
@ -1698,7 +1701,7 @@ namespace OpenSim.Region.Framework.Scenes
try
{
// Make sure it's not a login agent. We don't want to wait for updates during login
if (PresenceType != PresenceType.Npc && (m_teleportFlags & TeleportFlags.ViaLogin) == 0)
if (!(PresenceType == PresenceType.Npc || IsRealLogin(m_teleportFlags)))
{
// Let's wait until UpdateAgent (called by departing region) is done
if (!WaitForUpdateAgent(client))