aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Region')
-rw-r--r--OpenSim/Region/Framework/Scenes/ScenePresence.cs393
-rw-r--r--OpenSim/Region/Framework/Scenes/Tests/ScenePresenceSitTests.cs33
2 files changed, 198 insertions, 228 deletions
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index e098c62..6979d2e 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -188,20 +188,12 @@ namespace OpenSim.Region.Framework.Scenes
188 188
189 private readonly Vector3[] Dir_Vectors = new Vector3[11]; 189 private readonly Vector3[] Dir_Vectors = new Vector3[11];
190 190
191
192 protected Timer m_reprioritization_timer; 191 protected Timer m_reprioritization_timer;
193 protected bool m_reprioritizing; 192 protected bool m_reprioritizing;
194 protected bool m_reprioritization_called; 193 protected bool m_reprioritization_called;
195 194
196 private Quaternion m_headrotation = Quaternion.Identity; 195 private Quaternion m_headrotation = Quaternion.Identity;
197 196
198 //Reuse the Vector3 instead of creating a new one on the UpdateMovement method
199// private Vector3 movementvector;
200
201 private bool m_autopilotMoving;
202 private Vector3 m_autoPilotTarget;
203 private bool m_sitAtAutoTarget;
204
205 private string m_nextSitAnimation = String.Empty; 197 private string m_nextSitAnimation = String.Empty;
206 198
207 //PauPaw:Proper PID Controler for autopilot************ 199 //PauPaw:Proper PID Controler for autopilot************
@@ -1417,9 +1409,6 @@ namespace OpenSim.Region.Framework.Scenes
1417 } 1409 }
1418 } 1410 }
1419 1411
1420 if (m_autopilotMoving)
1421 CheckAtSitTarget();
1422
1423 if ((flags & AgentManager.ControlFlags.AGENT_CONTROL_SIT_ON_GROUND) != 0) 1412 if ((flags & AgentManager.ControlFlags.AGENT_CONTROL_SIT_ON_GROUND) != 0)
1424 { 1413 {
1425 m_updateCount = 0; // Kill animation update burst so that the SIT_G.. will stick. 1414 m_updateCount = 0; // Kill animation update burst so that the SIT_G.. will stick.
@@ -1636,111 +1625,109 @@ namespace OpenSim.Region.Framework.Scenes
1636// "[SCENE PRESENCE]: bAllowUpdateMoveToPosition {0}, m_moveToPositionInProgress {1}, m_autopilotMoving {2}", 1625// "[SCENE PRESENCE]: bAllowUpdateMoveToPosition {0}, m_moveToPositionInProgress {1}, m_autopilotMoving {2}",
1637// allowUpdate, m_moveToPositionInProgress, m_autopilotMoving); 1626// allowUpdate, m_moveToPositionInProgress, m_autopilotMoving);
1638 1627
1639 if (!m_autopilotMoving) 1628 double distanceToTarget = Util.GetDistanceTo(AbsolutePosition, MoveToPositionTarget);
1640 { 1629
1641 double distanceToTarget = Util.GetDistanceTo(AbsolutePosition, MoveToPositionTarget);
1642// m_log.DebugFormat( 1630// m_log.DebugFormat(
1643// "[SCENE PRESENCE]: Abs pos of {0} is {1}, target {2}, distance {3}", 1631// "[SCENE PRESENCE]: Abs pos of {0} is {1}, target {2}, distance {3}",
1644// Name, AbsolutePosition, MoveToPositionTarget, distanceToTarget); 1632// Name, AbsolutePosition, MoveToPositionTarget, distanceToTarget);
1645 1633
1646 // Check the error term of the current position in relation to the target position 1634 // Check the error term of the current position in relation to the target position
1647 if (distanceToTarget <= 1) 1635 if (distanceToTarget <= 1)
1648 { 1636 {
1649 // We are close enough to the target 1637 // We are close enough to the target
1650 AbsolutePosition = MoveToPositionTarget; 1638 AbsolutePosition = MoveToPositionTarget;
1651 ResetMoveToTarget(); 1639 ResetMoveToTarget();
1652 updated = true; 1640 updated = true;
1653 } 1641 }
1654 else 1642 else
1643 {
1644 try
1655 { 1645 {
1656 try 1646 // move avatar in 3D at one meter/second towards target, in avatar coordinate frame.
1657 { 1647 // This movement vector gets added to the velocity through AddNewMovement().
1658 // move avatar in 3D at one meter/second towards target, in avatar coordinate frame. 1648 // Theoretically we might need a more complex PID approach here if other
1659 // This movement vector gets added to the velocity through AddNewMovement(). 1649 // unknown forces are acting on the avatar and we need to adaptively respond
1660 // Theoretically we might need a more complex PID approach here if other 1650 // to such forces, but the following simple approach seems to works fine.
1661 // unknown forces are acting on the avatar and we need to adaptively respond 1651 Vector3 LocalVectorToTarget3D =
1662 // to such forces, but the following simple approach seems to works fine. 1652 (MoveToPositionTarget - AbsolutePosition) // vector from cur. pos to target in global coords
1663 Vector3 LocalVectorToTarget3D = 1653 * Matrix4.CreateFromQuaternion(Quaternion.Inverse(Rotation)); // change to avatar coords
1664 (MoveToPositionTarget - AbsolutePosition) // vector from cur. pos to target in global coords 1654 // Ignore z component of vector
1665 * Matrix4.CreateFromQuaternion(Quaternion.Inverse(Rotation)); // change to avatar coords
1666 // Ignore z component of vector
1667// Vector3 LocalVectorToTarget2D = new Vector3((float)(LocalVectorToTarget3D.X), (float)(LocalVectorToTarget3D.Y), 0f); 1655// Vector3 LocalVectorToTarget2D = new Vector3((float)(LocalVectorToTarget3D.X), (float)(LocalVectorToTarget3D.Y), 0f);
1668 LocalVectorToTarget3D.Normalize(); 1656 LocalVectorToTarget3D.Normalize();
1669 1657
1670 // update avatar movement flags. the avatar coordinate system is as follows: 1658 // update avatar movement flags. the avatar coordinate system is as follows:
1671 // 1659 //
1672 // +X (forward) 1660 // +X (forward)
1673 // 1661 //
1674 // ^ 1662 // ^
1675 // | 1663 // |
1676 // | 1664 // |
1677 // | 1665 // |
1678 // | 1666 // |
1679 // (left) +Y <--------o--------> -Y 1667 // (left) +Y <--------o--------> -Y
1680 // avatar 1668 // avatar
1681 // | 1669 // |
1682 // | 1670 // |
1683 // | 1671 // |
1684 // | 1672 // |
1685 // v 1673 // v
1686 // -X 1674 // -X
1687 // 1675 //
1688 1676
1689 // based on the above avatar coordinate system, classify the movement into 1677 // based on the above avatar coordinate system, classify the movement into
1690 // one of left/right/back/forward. 1678 // one of left/right/back/forward.
1691 if (LocalVectorToTarget3D.X < 0) //MoveBack 1679 if (LocalVectorToTarget3D.X < 0) //MoveBack
1692 { 1680 {
1693 MovementFlag += (byte)(uint)Dir_ControlFlags.DIR_CONTROL_FLAG_BACK; 1681 MovementFlag += (byte)(uint)Dir_ControlFlags.DIR_CONTROL_FLAG_BACK;
1694 AgentControlFlags |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_BACK; 1682 AgentControlFlags |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_BACK;
1695 updated = true; 1683 updated = true;
1696 } 1684 }
1697 else if (LocalVectorToTarget3D.X > 0) //Move Forward 1685 else if (LocalVectorToTarget3D.X > 0) //Move Forward
1698 { 1686 {
1699 MovementFlag += (byte)(uint)Dir_ControlFlags.DIR_CONTROL_FLAG_FORWARD; 1687 MovementFlag += (byte)(uint)Dir_ControlFlags.DIR_CONTROL_FLAG_FORWARD;
1700 AgentControlFlags |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_FORWARD; 1688 AgentControlFlags |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_FORWARD;
1701 updated = true; 1689 updated = true;
1702 } 1690 }
1703 1691
1704 if (LocalVectorToTarget3D.Y > 0) //MoveLeft 1692 if (LocalVectorToTarget3D.Y > 0) //MoveLeft
1705 { 1693 {
1706 MovementFlag += (byte)(uint)Dir_ControlFlags.DIR_CONTROL_FLAG_LEFT; 1694 MovementFlag += (byte)(uint)Dir_ControlFlags.DIR_CONTROL_FLAG_LEFT;
1707 AgentControlFlags |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_LEFT; 1695 AgentControlFlags |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_LEFT;
1708 updated = true; 1696 updated = true;
1709 } 1697 }
1710 else if (LocalVectorToTarget3D.Y < 0) //MoveRight 1698 else if (LocalVectorToTarget3D.Y < 0) //MoveRight
1711 { 1699 {
1712 MovementFlag += (byte)(uint)Dir_ControlFlags.DIR_CONTROL_FLAG_RIGHT; 1700 MovementFlag += (byte)(uint)Dir_ControlFlags.DIR_CONTROL_FLAG_RIGHT;
1713 AgentControlFlags |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_RIGHT; 1701 AgentControlFlags |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_RIGHT;
1714 updated = true; 1702 updated = true;
1715 } 1703 }
1716 1704
1717 if (LocalVectorToTarget3D.Z > 0) //Up 1705 if (LocalVectorToTarget3D.Z > 0) //Up
1718 { 1706 {
1719 // Don't set these flags for up or down - doing so will make the avatar crouch or 1707 // Don't set these flags for up or down - doing so will make the avatar crouch or
1720 // keep trying to jump even if walking along level ground 1708 // keep trying to jump even if walking along level ground
1721 //MovementFlag += (byte)(uint)Dir_ControlFlags.DIR_CONTROL_FLAG_UP; 1709 //MovementFlag += (byte)(uint)Dir_ControlFlags.DIR_CONTROL_FLAG_UP;
1722 //AgentControlFlags 1710 //AgentControlFlags
1723 //AgentControlFlags |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_UP; 1711 //AgentControlFlags |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_UP;
1724 updated = true; 1712 updated = true;
1725 } 1713 }
1726 else if (LocalVectorToTarget3D.Z < 0) //Down 1714 else if (LocalVectorToTarget3D.Z < 0) //Down
1727 { 1715 {
1728 //MovementFlag += (byte)(uint)Dir_ControlFlags.DIR_CONTROL_FLAG_DOWN; 1716 //MovementFlag += (byte)(uint)Dir_ControlFlags.DIR_CONTROL_FLAG_DOWN;
1729 //AgentControlFlags |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_DOWN; 1717 //AgentControlFlags |= (uint)Dir_ControlFlags.DIR_CONTROL_FLAG_DOWN;
1730 updated = true; 1718 updated = true;
1731 } 1719 }
1732 1720
1733// m_log.DebugFormat( 1721// m_log.DebugFormat(
1734// "[SCENE PRESENCE]: HandleMoveToTargetUpdate adding {0} to move vector {1} for {2}", 1722// "[SCENE PRESENCE]: HandleMoveToTargetUpdate adding {0} to move vector {1} for {2}",
1735// LocalVectorToTarget3D, agent_control_v3, Name); 1723// LocalVectorToTarget3D, agent_control_v3, Name);
1736 1724
1737 agent_control_v3 += LocalVectorToTarget3D; 1725 agent_control_v3 += LocalVectorToTarget3D;
1738 } 1726 }
1739 catch (Exception e) 1727 catch (Exception e)
1740 { 1728 {
1741 //Avoid system crash, can be slower but... 1729 //Avoid system crash, can be slower but...
1742 m_log.DebugFormat("Crash! {0}", e.ToString()); 1730 m_log.DebugFormat("Crash! {0}", e.ToString());
1743 }
1744 } 1731 }
1745 } 1732 }
1746 1733
@@ -1842,47 +1829,6 @@ namespace OpenSim.Region.Framework.Scenes
1842 AgentControlFlags = (uint)AgentManager.ControlFlags.NONE; 1829 AgentControlFlags = (uint)AgentManager.ControlFlags.NONE;
1843 } 1830 }
1844 1831
1845 private void CheckAtSitTarget()
1846 {
1847 //m_log.Debug("[AUTOPILOT]: " + Util.GetDistanceTo(AbsolutePosition, m_autoPilotTarget).ToString());
1848 if (Util.GetDistanceTo(AbsolutePosition, m_autoPilotTarget) <= 1.5)
1849 {
1850 if (m_sitAtAutoTarget)
1851 {
1852 SceneObjectPart part = m_scene.GetSceneObjectPart(m_requestedSitTargetUUID);
1853 if (part != null)
1854 {
1855 AbsolutePosition = part.AbsolutePosition;
1856 Velocity = Vector3.Zero;
1857 SendAvatarDataToAllAgents();
1858
1859 //HandleAgentSit(ControllingClient, m_requestedSitTargetUUID);
1860 }
1861 //ControllingClient.SendSitResponse(m_requestedSitTargetID, m_requestedSitOffset, Quaternion.Identity, false, Vector3.Zero, Vector3.Zero, false);
1862 m_requestedSitTargetUUID = UUID.Zero;
1863 }
1864 /*
1865 else
1866 {
1867 //ControllingClient.SendAlertMessage("Autopilot cancelled");
1868 //SendTerseUpdateToAllClients();
1869 //PrimitiveBaseShape proxy = PrimitiveBaseShape.Default;
1870 //proxy.PCode = (byte)PCode.ParticleSystem;
1871 ////uint nextUUID = m_scene.NextLocalId;
1872
1873 //proxyObjectGroup = new SceneObjectGroup(m_scene, m_scene.RegionInfo.RegionHandle, UUID, nextUUID, m_autoPilotTarget, Quaternion.Identity, proxy);
1874 //if (proxyObjectGroup != null)
1875 //{
1876 //proxyObjectGroup.SendGroupFullUpdate();
1877 //ControllingClient.SendSitResponse(UUID.Zero, m_autoPilotTarget, Quaternion.Identity, true, Vector3.Zero, Vector3.Zero, false);
1878 //m_scene.DeleteSceneObject(proxyObjectGroup);
1879 //}
1880 }
1881 */
1882 m_autoPilotTarget = Vector3.Zero;
1883 m_autopilotMoving = false;
1884 }
1885 }
1886 /// <summary> 1832 /// <summary>
1887 /// Perform the logic necessary to stand the avatar up. This method also executes 1833 /// Perform the logic necessary to stand the avatar up. This method also executes
1888 /// the stand animation. 1834 /// the stand animation.
@@ -1893,7 +1839,7 @@ namespace OpenSim.Region.Framework.Scenes
1893 1839
1894 if (ParentID != 0) 1840 if (ParentID != 0)
1895 { 1841 {
1896 m_log.Debug("StandupCode Executed"); 1842// m_log.Debug("StandupCode Executed");
1897 SceneObjectPart part = m_scene.GetSceneObjectPart(ParentID); 1843 SceneObjectPart part = m_scene.GetSceneObjectPart(ParentID);
1898 if (part != null) 1844 if (part != null)
1899 { 1845 {
@@ -1983,7 +1929,6 @@ namespace OpenSim.Region.Framework.Scenes
1983 1929
1984 private void SendSitResponse(IClientAPI remoteClient, UUID targetID, Vector3 offset, Quaternion pSitOrientation) 1930 private void SendSitResponse(IClientAPI remoteClient, UUID targetID, Vector3 offset, Quaternion pSitOrientation)
1985 { 1931 {
1986 bool autopilot = true;
1987 Vector3 pos = new Vector3(); 1932 Vector3 pos = new Vector3();
1988 Quaternion sitOrientation = pSitOrientation; 1933 Quaternion sitOrientation = pSitOrientation;
1989 Vector3 cameraEyeOffset = Vector3.Zero; 1934 Vector3 cameraEyeOffset = Vector3.Zero;
@@ -1991,86 +1936,85 @@ namespace OpenSim.Region.Framework.Scenes
1991 bool forceMouselook = false; 1936 bool forceMouselook = false;
1992 1937
1993 SceneObjectPart part = FindNextAvailableSitTarget(targetID); 1938 SceneObjectPart part = FindNextAvailableSitTarget(targetID);
1994 if (part != null) 1939 if (part == null)
1995 { 1940 return;
1996 // TODO: determine position to sit at based on scene geometry; don't trust offset from client
1997 // see http://wiki.secondlife.com/wiki/User:Andrew_Linden/Office_Hours/2007_11_06 for details on how LL does it
1998 1941
1999 // Is a sit target available? 1942 // TODO: determine position to sit at based on scene geometry; don't trust offset from client
2000 Vector3 avSitOffSet = part.SitTargetPosition; 1943 // see http://wiki.secondlife.com/wiki/User:Andrew_Linden/Office_Hours/2007_11_06 for details on how LL does it
2001 Quaternion avSitOrientation = part.SitTargetOrientation; 1944
2002 UUID avOnTargetAlready = part.SitTargetAvatar; 1945 // Is a sit target available?
1946 Vector3 avSitOffSet = part.SitTargetPosition;
1947 Quaternion avSitOrientation = part.SitTargetOrientation;
1948 UUID avOnTargetAlready = part.SitTargetAvatar;
2003 1949
2004 bool SitTargetUnOccupied = (!(avOnTargetAlready != UUID.Zero)); 1950 bool SitTargetUnOccupied = (!(avOnTargetAlready != UUID.Zero));
2005 bool SitTargetisSet = 1951 bool SitTargetisSet =
2006 (!(avSitOffSet == Vector3.Zero && 1952 (!(avSitOffSet == Vector3.Zero &&
2007 ( 1953 (
2008 avSitOrientation == Quaternion.Identity // Valid Zero Rotation quaternion 1954 avSitOrientation == Quaternion.Identity // Valid Zero Rotation quaternion
2009 || avSitOrientation.X == 0f && avSitOrientation.Y == 0f && avSitOrientation.Z == 1f && avSitOrientation.W == 0f // W-Z Mapping was invalid at one point 1955 || avSitOrientation.X == 0f && avSitOrientation.Y == 0f && avSitOrientation.Z == 1f && avSitOrientation.W == 0f // W-Z Mapping was invalid at one point
2010 || avSitOrientation.X == 0f && avSitOrientation.Y == 0f && avSitOrientation.Z == 0f && avSitOrientation.W == 0f // Invalid Quaternion 1956 || avSitOrientation.X == 0f && avSitOrientation.Y == 0f && avSitOrientation.Z == 0f && avSitOrientation.W == 0f // Invalid Quaternion
2011 ) 1957 )
2012 )); 1958 ));
2013 1959
2014// m_log.DebugFormat("[SCENE PRESENCE]: {0} {1}", SitTargetisSet, SitTargetUnOccupied); 1960// m_log.DebugFormat("[SCENE PRESENCE]: {0} {1}", SitTargetisSet, SitTargetUnOccupied);
2015 1961
2016 if (SitTargetisSet && SitTargetUnOccupied) 1962 if (PhysicsActor != null)
1963 m_sitAvatarHeight = m_physicsActor.Size.Z;
1964
1965 bool canSit = false;
1966 pos = part.AbsolutePosition + offset;
1967
1968 if (SitTargetisSet)
1969 {
1970 if (SitTargetUnOccupied)
2017 { 1971 {
1972 m_log.DebugFormat(
1973 "[SCENE PRESENCE]: Sitting {0} on {1} {2} because sit target is set and unoccupied",
1974 Name, part.Name, part.LocalId);
1975
2018 part.SitTargetAvatar = UUID; 1976 part.SitTargetAvatar = UUID;
2019 offset = new Vector3(avSitOffSet.X, avSitOffSet.Y, avSitOffSet.Z); 1977 offset = new Vector3(avSitOffSet.X, avSitOffSet.Y, avSitOffSet.Z);
2020 sitOrientation = avSitOrientation; 1978 sitOrientation = avSitOrientation;
2021 autopilot = false; 1979 canSit = true;
2022 } 1980 }
2023 pos = part.AbsolutePosition + offset; 1981 }
2024 //if (Math.Abs(part.AbsolutePosition.Z - AbsolutePosition.Z) > 1) 1982 else
2025 //{ 1983 {
2026 // offset = pos; 1984 if (Util.GetDistanceTo(AbsolutePosition, pos) <= 10)
2027 //autopilot = false;
2028 //}
2029 if (PhysicsActor != null)
2030 { 1985 {
2031 // If we're not using the client autopilot, we're immediately warping the avatar to the location 1986 m_log.DebugFormat(
2032 // We can remove the physicsActor until they stand up. 1987 "[SCENE PRESENCE]: Sitting {0} on {1} {2} because sit target is unset and within 10m",
2033 m_sitAvatarHeight = PhysicsActor.Size.Z; 1988 Name, part.Name, part.LocalId);
2034 1989
2035 if (autopilot) 1990 AbsolutePosition = pos + new Vector3(0.0f, 0.0f, m_sitAvatarHeight);
2036 { 1991 canSit = true;
2037 if (Util.GetDistanceTo(AbsolutePosition, pos) <= 10) 1992 }
2038 { 1993 }
2039 autopilot = false;
2040 1994
2041 RemoveFromPhysicalScene(); 1995 if (canSit)
2042 AbsolutePosition = pos + new Vector3(0.0f, 0.0f, m_sitAvatarHeight); 1996 {
2043 } 1997 if (PhysicsActor != null)
2044 } 1998 {
2045 else 1999 // We can remove the physicsActor until they stand up.
2046 { 2000 RemoveFromPhysicalScene();
2047 RemoveFromPhysicalScene();
2048 }
2049 } 2001 }
2050 2002
2051 cameraAtOffset = part.GetCameraAtOffset(); 2003 cameraAtOffset = part.GetCameraAtOffset();
2052 cameraEyeOffset = part.GetCameraEyeOffset(); 2004 cameraEyeOffset = part.GetCameraEyeOffset();
2053 forceMouselook = part.GetForceMouselook(); 2005 forceMouselook = part.GetForceMouselook();
2054 }
2055 2006
2056 ControllingClient.SendSitResponse(targetID, offset, sitOrientation, autopilot, cameraAtOffset, cameraEyeOffset, forceMouselook); 2007 ControllingClient.SendSitResponse(
2057 m_requestedSitTargetUUID = targetID; 2008 targetID, offset, sitOrientation, false, cameraAtOffset, cameraEyeOffset, forceMouselook);
2009
2010 m_requestedSitTargetUUID = targetID;
2058 2011
2059 // This calls HandleAgentSit twice, once from here, and the client calls
2060 // HandleAgentSit itself after it gets to the location
2061 // It doesn't get to the location until we've moved them there though
2062 // which happens in HandleAgentSit :P
2063 m_autopilotMoving = autopilot;
2064 m_autoPilotTarget = pos;
2065 m_sitAtAutoTarget = autopilot;
2066 if (!autopilot)
2067 HandleAgentSit(remoteClient, UUID); 2012 HandleAgentSit(remoteClient, UUID);
2068 2013
2069 // Moved here to avoid a race with default sit anim 2014 // Moved here to avoid a race with default sit anim
2070 // The script event needs to be raised after the default sit anim is set. 2015 // The script event needs to be raised after the default sit anim is set.
2071 if (part != null)
2072 part.ParentGroup.TriggerScriptChangedEvent(Changed.LINK); 2016 part.ParentGroup.TriggerScriptChangedEvent(Changed.LINK);
2073 2017 }
2074 } 2018 }
2075 2019
2076 // public void HandleAgentRequestSit(IClientAPI remoteClient, UUID agentID, UUID targetID, Vector3 offset, string sitAnimation) 2020 // public void HandleAgentRequestSit(IClientAPI remoteClient, UUID agentID, UUID targetID, Vector3 offset, string sitAnimation)
@@ -2099,11 +2043,11 @@ namespace OpenSim.Region.Framework.Scenes
2099 { 2043 {
2100 m_nextSitAnimation = part.SitAnimation; 2044 m_nextSitAnimation = part.SitAnimation;
2101 } 2045 }
2046
2102 m_requestedSitTargetID = part.LocalId; 2047 m_requestedSitTargetID = part.LocalId;
2103 //m_requestedSitOffset = offset;
2104 m_requestedSitTargetUUID = targetID; 2048 m_requestedSitTargetUUID = targetID;
2105 2049
2106 m_log.DebugFormat("[SIT]: Client requested Sit Position: {0}", offset); 2050// m_log.DebugFormat("[SIT]: Client requested Sit Position: {0}", offset);
2107 2051
2108 if (m_scene.PhysicsScene.SupportsRayCast()) 2052 if (m_scene.PhysicsScene.SupportsRayCast())
2109 { 2053 {
@@ -2328,43 +2272,40 @@ namespace OpenSim.Region.Framework.Scenes
2328 { 2272 {
2329 SceneObjectPart part = m_scene.GetSceneObjectPart(m_requestedSitTargetID); 2273 SceneObjectPart part = m_scene.GetSceneObjectPart(m_requestedSitTargetID);
2330 2274
2331 if (m_sitAtAutoTarget || !m_autopilotMoving) 2275 if (part != null)
2332 { 2276 {
2333 if (part != null) 2277 if (part.SitTargetAvatar == UUID)
2334 { 2278 {
2335 if (part.SitTargetAvatar == UUID) 2279 Vector3 sitTargetPos = part.SitTargetPosition;
2336 { 2280 Quaternion sitTargetOrient = part.SitTargetOrientation;
2337 Vector3 sitTargetPos = part.SitTargetPosition;
2338 Quaternion sitTargetOrient = part.SitTargetOrientation;
2339 2281
2340// m_log.DebugFormat( 2282// m_log.DebugFormat(
2341// "[SCENE PRESENCE]: Sitting {0} at sit target {1}, {2} on {3} {4}", 2283// "[SCENE PRESENCE]: Sitting {0} at sit target {1}, {2} on {3} {4}",
2342// Name, sitTargetPos, sitTargetOrient, part.Name, part.LocalId); 2284// Name, sitTargetPos, sitTargetOrient, part.Name, part.LocalId);
2343 2285
2344 //Quaternion vq = new Quaternion(sitTargetPos.X, sitTargetPos.Y+0.2f, sitTargetPos.Z+0.2f, 0); 2286 //Quaternion vq = new Quaternion(sitTargetPos.X, sitTargetPos.Y+0.2f, sitTargetPos.Z+0.2f, 0);
2345 //Quaternion nq = new Quaternion(-sitTargetOrient.X, -sitTargetOrient.Y, -sitTargetOrient.Z, sitTargetOrient.w); 2287 //Quaternion nq = new Quaternion(-sitTargetOrient.X, -sitTargetOrient.Y, -sitTargetOrient.Z, sitTargetOrient.w);
2346 2288
2347 //Quaternion result = (sitTargetOrient * vq) * nq; 2289 //Quaternion result = (sitTargetOrient * vq) * nq;
2348 2290
2349 m_pos = sitTargetPos + SIT_TARGET_ADJUSTMENT; 2291 m_pos = sitTargetPos + SIT_TARGET_ADJUSTMENT;
2350 Rotation = sitTargetOrient; 2292 Rotation = sitTargetOrient;
2351 ParentPosition = part.AbsolutePosition; 2293 ParentPosition = part.AbsolutePosition;
2352 } 2294 }
2353 else 2295 else
2354 { 2296 {
2355 m_pos -= part.AbsolutePosition; 2297 m_pos -= part.AbsolutePosition;
2356 ParentPosition = part.AbsolutePosition; 2298 ParentPosition = part.AbsolutePosition;
2357 2299
2358// m_log.DebugFormat( 2300// m_log.DebugFormat(
2359// "[SCENE PRESENCE]: Sitting {0} at position {1} ({2} + {3}) on part {4} {5} without sit target", 2301// "[SCENE PRESENCE]: Sitting {0} at position {1} ({2} + {3}) on part {4} {5} without sit target",
2360// Name, part.AbsolutePosition, m_pos, ParentPosition, part.Name, part.LocalId); 2302// Name, part.AbsolutePosition, m_pos, ParentPosition, part.Name, part.LocalId);
2361 }
2362 }
2363 else
2364 {
2365 return;
2366 } 2303 }
2367 } 2304 }
2305 else
2306 {
2307 return;
2308 }
2368 2309
2369 ParentID = m_requestedSitTargetID; 2310 ParentID = m_requestedSitTargetID;
2370 2311
diff --git a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceSitTests.cs b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceSitTests.cs
index 2636473..a1d30f3 100644
--- a/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceSitTests.cs
+++ b/OpenSim/Region/Framework/Scenes/Tests/ScenePresenceSitTests.cs
@@ -53,7 +53,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
53 } 53 }
54 54
55 [Test] 55 [Test]
56 public void TestSitOutsideRange() 56 public void TestSitOutsideRangeNoTarget()
57 { 57 {
58 TestHelpers.InMethod(); 58 TestHelpers.InMethod();
59// log4net.Config.XmlConfigurator.Configure(); 59// log4net.Config.XmlConfigurator.Configure();
@@ -73,7 +73,7 @@ namespace OpenSim.Region.Framework.Scenes.Tests
73 } 73 }
74 74
75 [Test] 75 [Test]
76 public void TestSitWithinRange() 76 public void TestSitWithinRangeNoTarget()
77 { 77 {
78 TestHelpers.InMethod(); 78 TestHelpers.InMethod();
79// log4net.Config.XmlConfigurator.Configure(); 79// log4net.Config.XmlConfigurator.Configure();
@@ -124,5 +124,34 @@ namespace OpenSim.Region.Framework.Scenes.Tests
124 Assert.That(part.SitTargetAvatar, Is.EqualTo(UUID.Zero)); 124 Assert.That(part.SitTargetAvatar, Is.EqualTo(UUID.Zero));
125 Assert.That(sp.ParentID, Is.EqualTo(0)); 125 Assert.That(sp.ParentID, Is.EqualTo(0));
126 } 126 }
127
128 [Test]
129 public void TestSitAndStandWithSitTarget()
130 {
131 TestHelpers.InMethod();
132// log4net.Config.XmlConfigurator.Configure();
133
134 ScenePresence sp = SceneHelpers.AddScenePresence(m_scene, TestHelpers.ParseTail(0x1));
135
136 // If a prim has a sit target then we can sit from any distance away
137 Vector3 startPos = new Vector3(128, 128, 30);
138 sp.AbsolutePosition = startPos;
139
140 SceneObjectPart part = SceneHelpers.AddSceneObject(m_scene);
141 part.SitTargetPosition = new Vector3(0, 0, 1);
142
143 sp.HandleAgentRequestSit(sp.ControllingClient, sp.UUID, part.UUID, Vector3.Zero);
144
145 Assert.That(part.SitTargetAvatar, Is.EqualTo(sp.UUID));
146 Assert.That(sp.ParentID, Is.EqualTo(part.LocalId));
147 Assert.That(
148 sp.AbsolutePosition,
149 Is.EqualTo(part.AbsolutePosition + part.SitTargetPosition + ScenePresence.SIT_TARGET_ADJUSTMENT));
150
151 sp.StandUp();
152
153 Assert.That(part.SitTargetAvatar, Is.EqualTo(UUID.Zero));
154 Assert.That(sp.ParentID, Is.EqualTo(0));
155 }
127 } 156 }
128} \ No newline at end of file 157} \ No newline at end of file