diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index 66fb493551..bc3400a7a5 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -215,27 +215,9 @@ namespace OpenSim.Region.Framework.Scenes
if (sp.IsChildAgent)
continue;
- if (sp.ParentID != 0)
- {
- // sitting avatar
- SceneObjectPart sop = m_parentScene.GetSceneObjectPart(sp.ParentID);
- if (sop != null)
- {
- coarseLocations.Add(sop.AbsolutePosition + sp.OffsetPosition);
- avatarUUIDs.Add(sp.UUID);
- }
- else
- {
- // we can't find the parent.. ! arg!
- coarseLocations.Add(sp.AbsolutePosition);
- avatarUUIDs.Add(sp.UUID);
- }
- }
- else
- {
- coarseLocations.Add(sp.AbsolutePosition);
- avatarUUIDs.Add(sp.UUID);
- }
+ coarseLocations.Add(sp.AbsolutePosition);
+
+ avatarUUIDs.Add(sp.UUID);
}
}
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index be56fe136c..b84660a1be 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -432,7 +432,7 @@ namespace OpenSim.Region.Framework.Scenes
{
get
{
- if (PhysicsActor != null && m_parentID == 0)
+ if (PhysicsActor != null)
{
m_pos = PhysicsActor.Position;
@@ -477,7 +477,7 @@ namespace OpenSim.Region.Framework.Scenes
}
}
- // Don't update while sitting
+ // Don't update while sitting. The PhysicsActor above is null whilst sitting.
if (ParentID == 0)
{
m_pos = value;
@@ -504,6 +504,7 @@ namespace OpenSim.Region.Framework.Scenes
// There is no offset position when not seated
if (ParentID == 0)
return;
+
m_pos = value;
}
}
@@ -562,19 +563,18 @@ namespace OpenSim.Region.Framework.Scenes
public bool IsChildAgent { get; set; }
- public uint ParentID
- {
- get { return m_parentID; }
- set { m_parentID = value; }
- }
- private uint m_parentID;
+ ///
+ /// If the avatar is sitting, the local ID of the prim that it's sitting on. If not sitting then zero.
+ ///
+ public uint ParentID { get; set; }
- public SceneObjectPart ParentPart
- {
- get { return m_parentPart; }
- set { m_parentPart = value; }
- }
- private SceneObjectPart m_parentPart = null;
+ ///
+ /// If the avatar is sitting, the prim that it's sitting on. If not sitting then null.
+ ///
+ ///
+ /// If you use this property then you must take a reference since another thread could set it to null.
+ ///
+ public SceneObjectPart ParentPart { get; set; }
public float Health
{
@@ -2204,23 +2204,16 @@ namespace OpenSim.Region.Framework.Scenes
// "[SCENE PRESENCE]: Sitting {0} at position {1} ({2} + {3}) on part {4} {5} without sit target",
// Name, part.AbsolutePosition, m_pos, ParentPosition, part.Name, part.LocalId);
}
+
+ ParentPart = m_scene.GetSceneObjectPart(m_requestedSitTargetID);
+ ParentID = m_requestedSitTargetID;
+
+ Velocity = Vector3.Zero;
+ RemoveFromPhysicalScene();
+
+ Animator.TrySetMovementAnimation(sitAnimation);
+ SendAvatarDataToAllAgents();
}
- else
- {
- return;
- }
-
- ParentPart = m_scene.GetSceneObjectPart(m_requestedSitTargetID);
- if (ParentPart == null)
- return;
-
- ParentID = m_requestedSitTargetID;
-
- Velocity = Vector3.Zero;
- RemoveFromPhysicalScene();
-
- Animator.TrySetMovementAnimation(sitAnimation);
- SendAvatarDataToAllAgents();
}
public void HandleAgentSitOnGround()
diff --git a/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs b/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs
index 09da97a527..eb633b33bb 100644
--- a/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs
+++ b/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs
@@ -712,33 +712,16 @@ namespace OpenSim.Region.RegionCombinerModule
List CoarseLocations = new List();
List AvatarUUIDs = new List();
+
connectiondata.RegionScene.ForEachRootScenePresence(delegate(ScenePresence sp)
{
if (sp.UUID != presence.UUID)
{
- if (sp.ParentID != 0)
- {
- // sitting avatar
- SceneObjectPart sop = connectiondata.RegionScene.GetSceneObjectPart(sp.ParentID);
- if (sop != null)
- {
- CoarseLocations.Add(sop.AbsolutePosition + sp.AbsolutePosition);
- AvatarUUIDs.Add(sp.UUID);
- }
- else
- {
- // we can't find the parent.. ! arg!
- CoarseLocations.Add(sp.AbsolutePosition);
- AvatarUUIDs.Add(sp.UUID);
- }
- }
- else
- {
- CoarseLocations.Add(sp.AbsolutePosition);
- AvatarUUIDs.Add(sp.UUID);
- }
+ CoarseLocations.Add(sp.AbsolutePosition);
+ AvatarUUIDs.Add(sp.UUID);
}
});
+
DistributeCourseLocationUpdates(CoarseLocations, AvatarUUIDs, connectiondata, presence);
}
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 786ae6e6ff..bb374ed002 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -3825,7 +3825,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
List nametable = new List();
World.ForEachRootScenePresence(delegate(ScenePresence presence)
{
- if (presence.ParentID != 0 && m_host.ParentGroup.HasChildPrim(presence.ParentID))
+ SceneObjectPart sitPart = presence.ParentPart;
+ if (sitPart != null && m_host.ParentGroup.HasChildPrim(sitPart.LocalId))
nametable.Add(presence.ControllingClient.Name);
});
@@ -4393,22 +4394,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
// Find pushee position
// Pushee Linked?
- if (pusheeav.ParentID != 0)
- {
- SceneObjectPart parentobj = World.GetSceneObjectPart(pusheeav.ParentID);
- if (parentobj != null)
- {
- PusheePos = parentobj.AbsolutePosition;
- }
- else
- {
- PusheePos = pusheeav.AbsolutePosition;
- }
- }
+ SceneObjectPart sitPart = pusheeav.ParentPart;
+ if (sitPart != null)
+ PusheePos = sitPart.AbsolutePosition;
else
- {
PusheePos = pusheeav.AbsolutePosition;
- }
}
if (!pusheeIsAvatar)
@@ -5603,7 +5593,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
flags |= ScriptBaseClass.AGENT_IN_AIR;
}
- if (agent.ParentID != 0)
+ if (agent.ParentPart != null)
{
flags |= ScriptBaseClass.AGENT_ON_OBJECT;
flags |= ScriptBaseClass.AGENT_SITTING;
@@ -7692,7 +7682,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
World.ForEachRootScenePresence(delegate(ScenePresence presence)
{
if (presence.ParentID != 0 && m_host.ParentGroup.HasChildPrim(presence.ParentID))
- avatarCount++;
+ avatarCount++;
});
return m_host.ParentGroup.PrimCount + avatarCount;