diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 4a48ac3bb1..d4b4e0a3fc 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs @@ -445,8 +445,33 @@ namespace OpenSim.Region.Framework.Scenes PhysicsActor actor = m_physicsActor; if (actor != null) m_pos = actor.Position; + else // OS Mantis #4063 + { // OS Mantis #4063 + // OpenSim Mantis #4063. Obtain the correct position of a seated avatar. In addition + // to providing the correct position while the avatar is seated, this value will also + // be used as the location to unsit to. + // + // If m_parentID is not 0, assume we are a seated avatar and we should return the + // position based on the sittarget offset and rotation of the prim we are seated on. + // + // Generally, m_pos will contain the position of the avator 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 (m_parentID != 0) // OS Mantis #4063 + { + SceneObjectPart part = m_scene.GetSceneObjectPart(m_parentID); // OS Mantis #4063 + if (part != null) // OS Mantis #4063 + { // OS Mantis #4064 + return m_parentPosition + (m_pos * part.GetWorldRotation()); // OS Mantis #4063 + } + else // OS Mantis #4064 + { // OS Mantis #4063 + return m_parentPosition + m_pos; // OS Mantis #4064 + } // OS Mantis #4063 + } // OS Mantis #4063 + } // OS Mantis #4063 - return m_parentPosition + m_pos; + return m_pos; // OS Mantis #4063 } set {