diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs index 66fb493551..dd0ca43e67 100644 --- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs +++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs @@ -215,27 +215,13 @@ 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); - } - } + SceneObjectPart sitPart = sp.ParentPart; + if (sitPart != null) + coarseLocations.Add(sitPart.AbsolutePosition + sp.OffsetPosition); else - { coarseLocations.Add(sp.AbsolutePosition); - avatarUUIDs.Add(sp.UUID); - } + + avatarUUIDs.Add(sp.UUID); } } diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index c9dc7fd71e..aab0bf0a48 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 && ParentID == 0) { m_pos = PhysicsActor.Position; @@ -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 { diff --git a/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs b/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs index 09da97a527..a2e3ac2c44 100644 --- a/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs +++ b/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs @@ -716,29 +716,17 @@ namespace OpenSim.Region.RegionCombinerModule { 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); - } - } + SceneObjectPart sitPart = sp.ParentPart; + + if (sitPart != null) + CoarseLocations.Add(sitPart.AbsolutePosition + sp.AbsolutePosition); else - { CoarseLocations.Add(sp.AbsolutePosition); - AvatarUUIDs.Add(sp.UUID); - } + + 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;