diff --git a/OpenSim/Framework/ILandChannel.cs b/OpenSim/Framework/ILandChannel.cs
index c46c03c4d0..63cc7ebf1e 100644
--- a/OpenSim/Framework/ILandChannel.cs
+++ b/OpenSim/Framework/ILandChannel.cs
@@ -93,5 +93,7 @@ namespace OpenSim.Region.Framework.Interfaces
void Join(int start_x, int start_y, int end_x, int end_y, UUID attempting_user_id);
void Subdivide(int start_x, int start_y, int end_x, int end_y, UUID attempting_user_id);
+ void sendClientInitialLandInfo(IClientAPI remoteClient);
+
}
}
diff --git a/OpenSim/Region/CoreModules/World/Land/LandChannel.cs b/OpenSim/Region/CoreModules/World/Land/LandChannel.cs
index beb0a24715..378826d751 100644
--- a/OpenSim/Region/CoreModules/World/Land/LandChannel.cs
+++ b/OpenSim/Region/CoreModules/World/Land/LandChannel.cs
@@ -213,7 +213,13 @@ namespace OpenSim.Region.CoreModules.World.Land
m_landManagementModule.setParcelOtherCleanTime(remoteClient, localID, otherCleanTime);
}
}
-
+ public void sendClientInitialLandInfo(IClientAPI remoteClient)
+ {
+ if (m_landManagementModule != null)
+ {
+ m_landManagementModule.sendClientInitialLandInfo(remoteClient);
+ }
+ }
#endregion
}
}
diff --git a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs
index c444c298e9..0a2882a7f8 100644
--- a/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs
+++ b/OpenSim/Region/CoreModules/World/Land/LandManagementModule.cs
@@ -146,7 +146,7 @@ namespace OpenSim.Region.CoreModules.World.Land
m_scene.EventManager.OnIncomingLandDataFromStorage += EventManagerOnIncomingLandDataFromStorage;
m_scene.EventManager.OnSetAllowForcefulBan += EventManagerOnSetAllowedForcefulBan;
m_scene.EventManager.OnRegisterCaps += EventManagerOnRegisterCaps;
-
+
lock (m_scene)
{
m_scene.LandChannel = (ILandChannel)landChannel;
@@ -194,13 +194,14 @@ namespace OpenSim.Region.CoreModules.World.Land
client.OnParcelEjectUser += ClientOnParcelEjectUser;
client.OnParcelFreezeUser += ClientOnParcelFreezeUser;
client.OnSetStartLocationRequest += ClientOnSetHome;
-
+/* avatar is still a child here position is unknow
EntityBase presenceEntity;
if (m_scene.Entities.TryGetValue(client.AgentId, out presenceEntity) && presenceEntity is ScenePresence)
{
SendParcelOverlay(client);
SendLandUpdate((ScenePresence)presenceEntity, true);
}
+*/
}
public void EventMakeChildAgent(ScenePresence avatar)
@@ -385,12 +386,29 @@ namespace OpenSim.Region.CoreModules.World.Land
return;
}
+ public void sendClientInitialLandInfo(IClientAPI remoteClient)
+ {
+ SendParcelOverlay(remoteClient);
+ ScenePresence avatar;
+ if (!m_scene.TryGetScenePresence(remoteClient.AgentId, out avatar))
+ return;
+ if (avatar.IsChildAgent)
+ return;
+
+ ILandObject over = GetLandObject(avatar.AbsolutePosition.X,avatar.AbsolutePosition.Y);
+ if (over == null)
+ return;
+
+ avatar.currentParcelUUID = over.LandData.GlobalID;
+ over.SendLandUpdateToClient(avatar.ControllingClient);
+ }
+
public void SendLandUpdate(ScenePresence avatar, bool force)
{
if (avatar.IsChildAgent)
return;
-
- ILandObject over = GetLandObjectClipedXY(avatar.AbsolutePosition.X,avatar.AbsolutePosition.Y);
+
+ ILandObject over = GetLandObjectClipedXY(avatar.AbsolutePosition.X, avatar.AbsolutePosition.Y);
if (over != null)
{
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 6b627be635..577574764b 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -140,8 +140,67 @@ namespace OpenSim.Region.Framework.Scenes
///
public static readonly float SIGNIFICANT_MOVEMENT = 2.0f;
- public UUID currentParcelUUID = UUID.Zero;
+ private UUID m_currentParcelUUID = UUID.Zero;
+ private object parcelLock = new Object();
+ public UUID currentParcelUUID
+ {
+ get { return m_currentParcelUUID; }
+ set
+ {
+ lock (parcelLock)
+ {
+ m_currentParcelUUID = value;
+ }
+ }
+ }
+
+ public bool ParcelAllowThisAvatarSounds
+ {
+ get
+ {
+ try
+ {
+ lock (parcelLock)
+ {
+ ILandObject land = m_scene.LandChannel.GetLandObject(AbsolutePosition.X, AbsolutePosition.Y);
+ if (land == null)
+ return true;
+ if (land.LandData.AnyAVSounds)
+ return true;
+ if (!land.LandData.GroupAVSounds)
+ return false;
+ return land.LandData.GroupID == ControllingClient.ActiveGroupId;
+ }
+ }
+ catch
+ {
+ return true;
+ }
+ }
+ }
+
+ public bool ParcelHideThisAvatar
+ {
+ get
+ {
+ try
+ {
+ lock (parcelLock)
+ {
+ ILandObject land = m_scene.LandChannel.GetLandObject(AbsolutePosition.X, AbsolutePosition.Y);
+ if (land == null || !land.LandData.SeeAVs)
+ return false;
+ return true;
+ }
+ }
+ catch
+ {
+ return false;
+ }
+ }
+ }
+
///
/// The animator for this avatar
///
@@ -482,21 +541,7 @@ namespace OpenSim.Region.Framework.Scenes
}
}
- public bool ParcelAllowThisAvatarSounds
- {
- get
- {
- ILandObject land = m_scene.LandChannel.GetLandObject(AbsolutePosition.X, AbsolutePosition.Y);
- if (land == null)
- return true;
- if (land.LandData.AnyAVSounds)
- return true;
- if (!land.LandData.GroupAVSounds)
- return false;
- return land.LandData.GroupID == ControllingClient.ActiveGroupId;
- }
- }
public byte State { get; set; }
@@ -1023,6 +1068,9 @@ namespace OpenSim.Region.Framework.Scenes
/// This method is on the critical path for transferring an avatar from one region to another. Delay here
/// delays that crossing.
///
+
+
+ // only in use as part of completemovement
private bool MakeRootAgent(Vector3 pos, bool isFlying)
{
lock (m_completeMovementLock)
@@ -1229,6 +1277,7 @@ namespace OpenSim.Region.Framework.Scenes
//
// One cannot simply iterate over attachments in a fire and forget thread because this would no longer
// be locked, allowing race conditions if other code changes the attachments list.
+
List attachments = GetAttachments();
if (attachments.Count > 0)
@@ -1236,16 +1285,19 @@ namespace OpenSim.Region.Framework.Scenes
m_log.DebugFormat(
"[SCENE PRESENCE]: Restarting scripts in attachments for {0} in {1}", Name, Scene.Name);
- // Resume scripts
+ // Resume scripts this possible should also be moved down after sending the avatar to viewer ?
foreach (SceneObjectGroup sog in attachments)
{
- sog.ScheduleGroupForFullUpdate();
+// sending attachments before the avatar ?
+// moved to completemovement where it already was
+// sog.ScheduleGroupForFullUpdate();
sog.RootPart.ParentGroup.CreateScriptInstances(0, false, m_scene.DefaultScriptEngine, GetStateSource());
sog.ResumeScripts();
}
}
}
+/*
SendAvatarDataToAllAgents();
// send the animations of the other presences to me
@@ -1254,6 +1306,7 @@ namespace OpenSim.Region.Framework.Scenes
if (presence != this)
presence.Animator.SendAnimPackToClient(ControllingClient);
});
+*/
// If we don't reset the movement flag here, an avatar that crosses to a neighbouring sim and returns will
// stall on the border crossing since the existing child agent will still have the last movement
@@ -1421,6 +1474,9 @@ namespace OpenSim.Region.Framework.Scenes
public void StopFlying()
{
+ if (IsInTransit)
+ return;
+
Vector3 pos = AbsolutePosition;
if (Appearance.AvatarHeight != 127.0f)
pos += new Vector3(0f, 0f, (Appearance.AvatarHeight / 6f));
@@ -1661,9 +1717,7 @@ namespace OpenSim.Region.Framework.Scenes
m_log.InfoFormat(
"[SCENE PRESENCE]: Completing movement of {0} into region {1} in position {2}",
client.Name, Scene.Name, AbsolutePosition);
-
-
-
+
m_inTransit = true;
try
{
@@ -1709,8 +1763,9 @@ namespace OpenSim.Region.Framework.Scenes
ControllingClient.MoveAgentIntoRegion(m_scene.RegionInfo, AbsolutePosition, look);
// Remember in HandleUseCircuitCode, we delayed this to here
- if (m_teleportFlags > 0)
- SendInitialDataToMe();
+// this prims etc, moved down
+// if (m_teleportFlags > 0)
+// SendInitialDataToMe();
// m_log.DebugFormat("[SCENE PRESENCE] Completed movement");
@@ -1742,6 +1797,20 @@ namespace OpenSim.Region.Framework.Scenes
// client.Name, client.AgentId, m_scene.RegionInfo.RegionName);
// }
+ // send initial land overlay and parcel
+ if (!IsChildAgent)
+ {
+ ILandChannel landch = m_scene.LandChannel;
+ if (landch != null)
+ {
+ landch.sendClientInitialLandInfo(client);
+ }
+ }
+
+ // send agentData to all clients including us (?)
+ // get appearance
+ // if in cache sent it to all clients
+ // send what we have to us, even if not in cache ( bad? )
ValidateAndSendAppearanceAndAgentData();
// Create child agents in neighbouring regions
@@ -1750,11 +1819,11 @@ namespace OpenSim.Region.Framework.Scenes
IEntityTransferModule m_agentTransfer = m_scene.RequestModuleInterface();
if (m_agentTransfer != null)
m_agentTransfer.EnableChildAgents(this);
-
+/* moved down
IFriendsModule friendsModule = m_scene.RequestModuleInterface();
if (friendsModule != null)
friendsModule.SendFriendsOnlineIfNeeded(ControllingClient);
-
+*/
}
// XXX: If we force an update here, then multiple attachments do appear correctly on a destination region
@@ -1769,6 +1838,27 @@ namespace OpenSim.Region.Framework.Scenes
// m_log.DebugFormat(
// "[SCENE PRESENCE]: Completing movement of {0} into region {1} took {2}ms",
// client.Name, Scene.RegionInfo.RegionName, (DateTime.Now - startTime).Milliseconds);
+
+ // send the rest of the world
+ if (m_teleportFlags > 0)
+ SendInitialDataToMe();
+
+ if (!IsChildAgent)
+ {
+// moved from makeroot missing in sendInitialDataToMe ?
+ m_scene.ForEachRootScenePresence(delegate(ScenePresence presence)
+ {
+ if (presence != this)
+ presence.Animator.SendAnimPackToClient(ControllingClient);
+ });
+
+ if (openChildAgents)
+ {
+ IFriendsModule friendsModule = m_scene.RequestModuleInterface();
+ if (friendsModule != null)
+ friendsModule.SendFriendsOnlineIfNeeded(ControllingClient);
+ }
+ }
}
finally
{
@@ -1864,6 +1954,9 @@ namespace OpenSim.Region.Framework.Scenes
return;
}
+ if (IsInTransit)
+ return;
+
#region Sanity Checking
// This is irritating. Really.
@@ -3307,13 +3400,13 @@ namespace OpenSim.Region.Framework.Scenes
SendAvatarDataToAllAgents();
// This invocation always shows up in the viewer logs as an error. Is it needed?
+ // try to send what we have even if not in cache
SendAppearanceToAgent(this);
// If we are using the the cached appearance then send it out to everyone
if (cachedappearance)
{
m_log.DebugFormat("[SCENE PRESENCE]: Baked textures are in the cache for {0} in {1}", Name, m_scene.Name);
-
// If the avatars baked textures are all in the cache, then we have a
// complete appearance... send it out, if not, then we'll send it when
// the avatar finishes updating its appearance
diff --git a/OpenSim/Region/RegionCombinerModule/RegionCombinerLargeLandChannel.cs b/OpenSim/Region/RegionCombinerModule/RegionCombinerLargeLandChannel.cs
index 4bf2a82171..e5e76e9f0c 100644
--- a/OpenSim/Region/RegionCombinerModule/RegionCombinerLargeLandChannel.cs
+++ b/OpenSim/Region/RegionCombinerModule/RegionCombinerLargeLandChannel.cs
@@ -196,6 +196,7 @@ namespace OpenSim.Region.RegionCombinerModule
RootRegionLandChannel.SetParcelOtherCleanTime(remoteClient, localID, otherCleanTime);
}
+ public void sendClientInitialLandInfo(IClientAPI remoteClient) { }
#endregion
}
}
\ No newline at end of file
diff --git a/OpenSim/Tests/Common/Mock/TestLandChannel.cs b/OpenSim/Tests/Common/Mock/TestLandChannel.cs
index 3115035a04..8135bfc2a6 100644
--- a/OpenSim/Tests/Common/Mock/TestLandChannel.cs
+++ b/OpenSim/Tests/Common/Mock/TestLandChannel.cs
@@ -111,5 +111,6 @@ namespace OpenSim.Tests.Common.Mock
public void Join(int start_x, int start_y, int end_x, int end_y, UUID attempting_user_id) {}
public void Subdivide(int start_x, int start_y, int end_x, int end_y, UUID attempting_user_id) {}
+ public void sendClientInitialLandInfo(IClientAPI remoteClient) { }
}
}
\ No newline at end of file