From f61e54892f2284b6f89bacf3069467c05b2eea11 Mon Sep 17 00:00:00 2001 From: Justin Clark-Casey (justincc) Date: Thu, 8 Dec 2011 18:34:23 +0000 Subject: On a new client circuit, send the initial reply ack to let the client know it's live before sending other data. This means that avatar/appearance data of other avatars and scene objects for a client will be sent after the ack rather than possibly before. This may stop some avatars appearing grey on login. This introduces a new OpenSim.Framework.ISceneAgent to accompany the existing OpenSim.Framework.ISceneObject and ISceneEntity This allows IClientAPI to handle this as it can't reference OpenSim.Region.Framework.Interfaces --- .../Region/Framework/Interfaces/IScenePresence.cs | 22 +----------- OpenSim/Region/Framework/Scenes/Scene.cs | 15 ++------- OpenSim/Region/Framework/Scenes/SceneBase.cs | 2 +- OpenSim/Region/Framework/Scenes/ScenePresence.cs | 39 ++++++++++++++-------- 4 files changed, 30 insertions(+), 48 deletions(-) (limited to 'OpenSim/Region/Framework') diff --git a/OpenSim/Region/Framework/Interfaces/IScenePresence.cs b/OpenSim/Region/Framework/Interfaces/IScenePresence.cs index ff39283..5e43843 100644 --- a/OpenSim/Region/Framework/Interfaces/IScenePresence.cs +++ b/OpenSim/Region/Framework/Interfaces/IScenePresence.cs @@ -38,28 +38,8 @@ namespace OpenSim.Region.Framework.Interfaces /// /// Interface is a work in progress. Please feel free to add other required properties and methods. /// - public interface IScenePresence : ISceneEntity + public interface IScenePresence : ISceneAgent { - /// - /// The client controlling this presence - /// - IClientAPI ControllingClient { get; } - - /// - /// What type of presence is this? User, NPC, etc. - /// - PresenceType PresenceType { get; } - - /// - /// Avatar appearance data. - /// - /// - // Because appearance setting is in a module, we actually need - // to give it access to our appearance directly, otherwise we - // get a synchronization issue. - /// - AvatarAppearance Appearance { get; set; } - /// /// The AttachmentsModule synchronizes on this to avoid race conditions between commands to add and remove attachments. /// diff --git a/OpenSim/Region/Framework/Scenes/Scene.cs b/OpenSim/Region/Framework/Scenes/Scene.cs index 21c4a87..d47536a 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.cs @@ -2491,13 +2491,13 @@ namespace OpenSim.Region.Framework.Scenes /// /// /// The type of agent to add. - public override void AddNewClient(IClientAPI client, PresenceType type) + public override ISceneAgent AddNewClient(IClientAPI client, PresenceType type) { AgentCircuitData aCircuit = m_authenticateHandler.GetAgentCircuitData(client.CircuitCode); bool vialogin = false; if (aCircuit == null) // no good, didn't pass NewUserConnection successfully - return; + return null; vialogin = (aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaHGLogin) != 0 || (aCircuit.teleportFlags & (uint)Constants.TeleportFlags.ViaLogin) != 0; @@ -2552,16 +2552,7 @@ namespace OpenSim.Region.Framework.Scenes if (vialogin) EventManager.TriggerOnClientLogin(client); - // Send all scene object to the new client - Util.FireAndForget(delegate - { - EntityBase[] entities = Entities.GetEntities(); - foreach(EntityBase e in entities) - { - if (e != null && e is SceneObjectGroup) - ((SceneObjectGroup)e).SendFullUpdateToClient(client); - } - }); + return sp; } /// diff --git a/OpenSim/Region/Framework/Scenes/SceneBase.cs b/OpenSim/Region/Framework/Scenes/SceneBase.cs index a633c72..da15491 100644 --- a/OpenSim/Region/Framework/Scenes/SceneBase.cs +++ b/OpenSim/Region/Framework/Scenes/SceneBase.cs @@ -175,7 +175,7 @@ namespace OpenSim.Region.Framework.Scenes #region Add/Remove Agent/Avatar - public abstract void AddNewClient(IClientAPI client, PresenceType type); + public abstract ISceneAgent AddNewClient(IClientAPI client, PresenceType type); public abstract void RemoveClient(UUID agentID, bool closeChildAgents); public bool TryGetScenePresence(UUID agentID, out object scenePresence) diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 5b9438b..8e55996 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -782,15 +782,6 @@ namespace OpenSim.Region.Framework.Scenes AdjustKnownSeeds(); - // we created a new ScenePresence (a new child agent) in a fresh region. - // Request info about all the (root) agents in this region - // Note: This won't send data *to* other clients in that region (children don't send) - -// MIC: This gets called again in CompleteMovement - // SendInitialFullUpdateToAllClients(); - SendOtherAgentsAvatarDataToMe(); - SendOtherAgentsAppearanceToMe(); - RegisterToEvents(); SetDirectionVectors(); @@ -1191,9 +1182,9 @@ namespace OpenSim.Region.Framework.Scenes { // DateTime startTime = DateTime.Now; - m_log.DebugFormat( - "[SCENE PRESENCE]: Completing movement of {0} into region {1}", - client.Name, Scene.RegionInfo.RegionName); +// m_log.DebugFormat( +// "[SCENE PRESENCE]: Completing movement of {0} into region {1}", +// client.Name, Scene.RegionInfo.RegionName); Vector3 look = Velocity; if ((look.X == 0) && (look.Y == 0) && (look.Z == 0)) @@ -1225,7 +1216,7 @@ namespace OpenSim.Region.Framework.Scenes //m_log.DebugFormat("[SCENE PRESENCE] Completed movement"); ControllingClient.MoveAgentIntoRegion(m_scene.RegionInfo, AbsolutePosition, look); - SendInitialData(); + ValidateAndSendAppearanceAndAgentData(); // Create child agents in neighbouring regions if (openChildAgents && !IsChildAgent) @@ -2512,11 +2503,31 @@ namespace OpenSim.Region.Framework.Scenes ControllingClient.SendCoarseLocationUpdate(avatarUUIDs, coarseLocations); } + public void SendInitialDataToMe() + { + // we created a new ScenePresence (a new child agent) in a fresh region. + // Request info about all the (root) agents in this region + // Note: This won't send data *to* other clients in that region (children don't send) + SendOtherAgentsAvatarDataToMe(); + SendOtherAgentsAppearanceToMe(); + + // Send all scene object to the new client + Util.FireAndForget(delegate + { + EntityBase[] entities = Scene.Entities.GetEntities(); + foreach(EntityBase e in entities) + { + if (e != null && e is SceneObjectGroup) + ((SceneObjectGroup)e).SendFullUpdateToClient(ControllingClient); + } + }); + } + /// /// Do everything required once a client completes its movement into a region and becomes /// a root agent. /// - private void SendInitialData() + private void ValidateAndSendAppearanceAndAgentData() { //m_log.DebugFormat("[SCENE PRESENCE] SendInitialData: {0} ({1})", Name, UUID); // Moved this into CompleteMovement to ensure that Appearance is initialized before -- cgit v1.1