diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs index a3206015c2..3cd4a10e6c 100644 --- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs +++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs @@ -230,27 +230,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 4190cf6b68..c4aaebef99 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -438,7 +438,7 @@ namespace OpenSim.Region.Framework.Scenes { get { - if (PhysicsActor != null && m_parentID == 0) + if (PhysicsActor != null) { m_pos = PhysicsActor.Position; @@ -461,12 +461,12 @@ namespace OpenSim.Region.Framework.Scenes // in the sim unless the avatar is on a sit target. While // on a sit target, m_pos will contain the desired offset // without the parent rotation applied. - if (ParentID != 0) - { - SceneObjectPart part = ParentPart; - return part.AbsolutePosition + (m_pos * part.GetWorldRotation()); - } + SceneObjectPart sitPart = ParentPart; + + if (sitPart != null) + return sitPart.AbsolutePosition + (m_pos * sitPart.GetWorldRotation()); } + return m_pos; } set @@ -483,7 +483,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; @@ -510,6 +510,7 @@ namespace OpenSim.Region.Framework.Scenes // There is no offset position when not seated if (ParentID == 0) return; + m_pos = value; } } @@ -568,12 +569,10 @@ 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 UUID ParentUUID { @@ -582,12 +581,13 @@ namespace OpenSim.Region.Framework.Scenes } private UUID m_parentUUID = UUID.Zero; - 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 { @@ -2285,23 +2285,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 3c36943d09..9d52a8f084 100644 --- a/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs +++ b/OpenSim/Region/RegionCombinerModule/RegionCombinerModule.cs @@ -630,33 +630,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 6d4072c526..e2d17a7d9d 100644 --- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs +++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs @@ -4213,7 +4213,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); }); @@ -4844,22 +4845,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) @@ -6067,7 +6057,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; diff --git a/OpenSim/Services/Connectors/Asset/HGAssetServiceConnector.cs b/OpenSim/Services/Connectors/Asset/HGAssetServiceConnector.cs index bb5d51fa59..c395178740 100644 --- a/OpenSim/Services/Connectors/Asset/HGAssetServiceConnector.cs +++ b/OpenSim/Services/Connectors/Asset/HGAssetServiceConnector.cs @@ -45,6 +45,24 @@ namespace OpenSim.Services.Connectors LogManager.GetLogger( MethodBase.GetCurrentMethod().DeclaringType); + private Dictionary m_endpointSerializer = new Dictionary(); + private object EndPointLock(IAssetService connector) + { + lock (m_endpointSerializer) + { + object eplock = null; + + if (! m_endpointSerializer.TryGetValue(connector, out eplock)) + { + eplock = new object(); + m_endpointSerializer.Add(connector, eplock); + // m_log.WarnFormat("[WEB UTIL] add a new host to end point serializer {0}",endpoint); + } + + return eplock; + } + } + private Dictionary m_connectors = new Dictionary(); public HGAssetServiceConnector(IConfigSource source) @@ -197,7 +215,8 @@ namespace OpenSim.Services.Connectors IAssetService connector = GetConnector(url); // Restore the assetID to a simple UUID asset.ID = assetID; - return connector.Store(asset); + lock (EndPointLock(connector)) + return connector.Store(asset); } return String.Empty;