diff options
author | Justin Clark-Casey (justincc) | 2011-11-11 21:42:58 +0000 |
---|---|---|
committer | Justin Clark-Casey (justincc) | 2011-11-11 21:42:58 +0000 |
commit | b1cb4f5b04f076c067842de6971ec1016b9a3912 (patch) | |
tree | 300b3e49768aa67a268cc8857d2fa71e34de59e3 /OpenSim | |
parent | Bump warp sit distance up to 10 meters, as discussed on opensim-dev mailing l... (diff) | |
download | opensim-SC_OLD-b1cb4f5b04f076c067842de6971ec1016b9a3912.zip opensim-SC_OLD-b1cb4f5b04f076c067842de6971ec1016b9a3912.tar.gz opensim-SC_OLD-b1cb4f5b04f076c067842de6971ec1016b9a3912.tar.bz2 opensim-SC_OLD-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.
Diffstat (limited to 'OpenSim')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/ScenePresence.cs | 393 | ||||
-rw-r--r-- | OpenSim/Region/Framework/Scenes/Tests/ScenePresenceSitTests.cs | 33 |
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 |