aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs73
1 files changed, 67 insertions, 6 deletions
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index fdc1f32..7a6ed5c 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -451,7 +451,19 @@ namespace OpenSim.Region.Framework.Scenes
451 public string Firstname { get; private set; } 451 public string Firstname { get; private set; }
452 public string Lastname { get; private set; } 452 public string Lastname { get; private set; }
453 453
454 public string Grouptitle { get; set; } 454 public string Grouptitle
455 {
456 get { return UseFakeGroupTitle ? "(Loading)" : m_groupTitle; }
457 set { m_groupTitle = value; }
458 }
459 private string m_groupTitle;
460
461 /// <summary>
462 /// When this is 'true', return a dummy group title instead of the real group title. This is
463 /// used as part of a hack to force viewers to update the displayed avatar name.
464 /// </summary>
465 public bool UseFakeGroupTitle { get; set; }
466
455 467
456 // Agent's Draw distance. 468 // Agent's Draw distance.
457 public float DrawDistance { get; set; } 469 public float DrawDistance { get; set; }
@@ -1051,6 +1063,17 @@ namespace OpenSim.Region.Framework.Scenes
1051 if (gm != null) 1063 if (gm != null)
1052 Grouptitle = gm.GetGroupTitle(m_uuid); 1064 Grouptitle = gm.GetGroupTitle(m_uuid);
1053 1065
1066 AgentCircuitData aCircuit = m_scene.AuthenticateHandler.GetAgentCircuitData(ControllingClient.CircuitCode);
1067 uint teleportFlags = (aCircuit == null) ? 0 : aCircuit.teleportFlags;
1068 if ((teleportFlags & (uint)TeleportFlags.ViaHGLogin) != 0)
1069 {
1070 // The avatar is arriving from another grid. This means that we may have changed the
1071 // avatar's name to or from the special Hypergrid format ("First.Last @grid.example.com").
1072 // Unfortunately, due to a viewer bug, viewers don't always show the new name.
1073 // But we have a trick that can force them to update the name anyway.
1074 ForceViewersUpdateName();
1075 }
1076
1054 RegionHandle = m_scene.RegionInfo.RegionHandle; 1077 RegionHandle = m_scene.RegionInfo.RegionHandle;
1055 1078
1056 m_scene.EventManager.TriggerSetRootAgentScene(m_uuid, m_scene); 1079 m_scene.EventManager.TriggerSetRootAgentScene(m_uuid, m_scene);
@@ -1247,6 +1270,36 @@ namespace OpenSim.Region.Framework.Scenes
1247 return true; 1270 return true;
1248 } 1271 }
1249 1272
1273 /// <summary>
1274 /// Force viewers to show the avatar's current name.
1275 /// </summary>
1276 /// <remarks>
1277 /// The avatar name that is shown above the avatar in the viewers is sent in ObjectUpdate packets,
1278 /// and they get the name from the ScenePresence. Unfortunately, viewers have a bug (as of April 2014)
1279 /// where they ignore changes to the avatar name. However, tey don't ignore changes to the avatar's
1280 /// Group Title. So the following trick makes viewers update the avatar's name by briefly changing
1281 /// the group title (to "(Loading)"), and then restoring it.
1282 /// </remarks>
1283 public void ForceViewersUpdateName()
1284 {
1285 m_log.DebugFormat("[SCENE PRESENCE]: Forcing viewers to update the avatar name for " + Name);
1286
1287 UseFakeGroupTitle = true;
1288 SendAvatarDataToAllAgents(false);
1289
1290 Util.FireAndForget(o =>
1291 {
1292 // Viewers only update the avatar name when idle. Therefore, we must wait long
1293 // enough for the viewer to show the fake name that we had set above, and only
1294 // then switch back to the true name. This delay was chosen because it has a high
1295 // chance of succeeding (we don't want to choose a value that's too low).
1296 Thread.Sleep(5000);
1297
1298 UseFakeGroupTitle = false;
1299 SendAvatarDataToAllAgents(false);
1300 });
1301 }
1302
1250 public int GetStateSource() 1303 public int GetStateSource()
1251 { 1304 {
1252 AgentCircuitData aCircuit = m_scene.AuthenticateHandler.GetAgentCircuitData(UUID); 1305 AgentCircuitData aCircuit = m_scene.AuthenticateHandler.GetAgentCircuitData(UUID);
@@ -3263,11 +3316,16 @@ namespace OpenSim.Region.Framework.Scenes
3263 } 3316 }
3264 } 3317 }
3265 3318
3319 public void SendAvatarDataToAllAgents()
3320 {
3321 SendAvatarDataToAllAgents(true);
3322 }
3323
3266 /// <summary> 3324 /// <summary>
3267 /// Send this agent's avatar data to all other root and child agents in the scene 3325 /// Send this agent's avatar data to all other root and child agents in the scene
3268 /// This agent must be root. This avatar will receive its own update. 3326 /// This agent must be root. This avatar will receive its own update.
3269 /// </summary> 3327 /// </summary>
3270 public void SendAvatarDataToAllAgents() 3328 public void SendAvatarDataToAllAgents(bool full)
3271 { 3329 {
3272 //m_log.DebugFormat("[SCENE PRESENCE] SendAvatarDataToAllAgents: {0} ({1})", Name, UUID); 3330 //m_log.DebugFormat("[SCENE PRESENCE] SendAvatarDataToAllAgents: {0} ({1})", Name, UUID);
3273 // only send update from root agents to other clients; children are only "listening posts" 3331 // only send update from root agents to other clients; children are only "listening posts"
@@ -3284,10 +3342,13 @@ namespace OpenSim.Region.Framework.Scenes
3284 3342
3285 int count = 0; 3343 int count = 0;
3286 m_scene.ForEachScenePresence(delegate(ScenePresence scenePresence) 3344 m_scene.ForEachScenePresence(delegate(ScenePresence scenePresence)
3287 { 3345 {
3288 SendAvatarDataToAgent(scenePresence); 3346 if (full)
3289 count++; 3347 SendAvatarDataToAgent(scenePresence);
3290 }); 3348 else
3349 scenePresence.ControllingClient.SendAvatarDataImmediate(this);
3350 count++;
3351 });
3291 3352
3292 m_scene.StatsReporter.AddAgentUpdates(count); 3353 m_scene.StatsReporter.AddAgentUpdates(count);
3293 } 3354 }