From 6ed63487d912c9d1e0946fb271639c40356483e9 Mon Sep 17 00:00:00 2001 From: Micheil Merlin Date: Sat, 20 Nov 2010 21:49:37 -0600 Subject: llUnsit position fix 4063 (updated 11-20-2010) --- OpenSim/Region/Framework/Scenes/ScenePresence.cs | 29 ++++++++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) (limited to 'OpenSim/Region') diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 4a48ac3..d4b4e0a 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; - - return m_parentPosition + m_pos; + 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_pos; // OS Mantis #4063 } set { -- cgit v1.1