diff --git a/OpenSim/Framework/IScene.cs b/OpenSim/Framework/IScene.cs
index 6919c48d91..e0e023d76c 100644
--- a/OpenSim/Framework/IScene.cs
+++ b/OpenSim/Framework/IScene.cs
@@ -74,9 +74,7 @@ namespace OpenSim.Framework
///
/// The type of agent to add.
///
- /// The scene agent if the new client was added.
- /// Null if the required scene agent already existed or no scene agent was added because the required client circuit doesn't exist.
- ///
+ /// The scene agent if the new client was added or if an agent that already existed.
ISceneAgent AddNewClient(IClientAPI client, PresenceType type);
///
diff --git a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs
index 7db5f6bc5b..4ab8fd02fd 100644
--- a/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs
+++ b/OpenSim/Region/ClientStack/Linden/UDP/LLUDPServer.cs
@@ -897,12 +897,12 @@ namespace OpenSim.Region.ClientStack.LindenUDP
IClientAPI client = AddNewClient((UseCircuitCodePacket)packet, remoteEndPoint);
// Send ack straight away to let the viewer know that the connection is active.
+ // The client will be null if it already exists (e.g. if on a region crossing the client sends a use
+ // circuit code to the existing child agent. This is not particularly obvious.
SendAckImmediate(remoteEndPoint, packet.Header.Sequence);
- // FIXME: Nasty - this is the only way we currently know if Scene.AddNewClient() failed to find a
- // circuit and bombed out early. That check might be pointless since authorization is established
- // up here.
- if (client != null && client.SceneAgent != null)
+ // We only want to send initial data to new clients, not ones which are being converted from child to root.
+ if (client != null)
client.SceneAgent.SendInitialDataToMe();
// m_log.DebugFormat(
diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs
index b019695fed..4613b81e03 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.cs
@@ -2467,21 +2467,14 @@ namespace OpenSim.Region.Framework.Scenes
#region Add/Remove Avatar Methods
- ///
- /// Add a new client and create a child scene presence for it.
- ///
- ///
- /// The type of agent to add.
public override ISceneAgent AddNewClient(IClientAPI client, PresenceType type)
{
+ // Validation occurs in LLUDPServer
AgentCircuitData aCircuit = m_authenticateHandler.GetAgentCircuitData(client.CircuitCode);
- bool vialogin = false;
- if (aCircuit == null) // no good, didn't pass NewUserConnection successfully
- return null;
-
- vialogin = (aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaHGLogin) != 0 ||
- (aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaLogin) != 0;
+ bool vialogin
+ = (aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaHGLogin) != 0
+ || (aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaLogin) != 0;
CheckHeartbeat();
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 0762b95ae4..31b6de781f 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -2540,7 +2540,7 @@ namespace OpenSim.Region.Framework.Scenes
}
// This agent just became root. We are going to tell everyone about it. The process of
- // getting other avatars information was initiated in the constructor... don't do it
+ // getting other avatars information was initiated elsewhere immediately after the child circuit connected... don't do it
// again here... this comes after the cached appearance check because the avatars
// appearance goes into the avatar update packet
SendAvatarDataToAllAgents();