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