aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
authorJustin Clark-Casey (justincc)2011-11-11 21:42:58 +0000
committerJustin Clark-Casey (justincc)2011-11-11 21:42:58 +0000
commitb1cb4f5b04f076c067842de6971ec1016b9a3912 (patch)
tree300b3e49768aa67a268cc8857d2fa71e34de59e3
parentBump warp sit distance up to 10 meters, as discussed on opensim-dev mailing l... (diff)
downloadopensim-SC-b1cb4f5b04f076c067842de6971ec1016b9a3912.zip
opensim-SC-b1cb4f5b04f076c067842de6971ec1016b9a3912.tar.gz
opensim-SC-b1cb4f5b04f076c067842de6971ec1016b9a3912.tar.bz2
opensim-SC-b1cb4f5b04f076c067842de6971ec1016b9a3912.tar.xz
As per mailing list last week, remove facility that would automatically move the avatar if prim with no sit target was out of sitting range.
Now, no movement occurs. Note that you can still sit on a prim with an explicit sit target from any distance, as was the case before.
-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