diff options
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/ScenePresence.cs')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/ScenePresence.cs | 131 |
1 files changed, 91 insertions, 40 deletions
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index a34c44c..7a6a334 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs | |||
@@ -355,6 +355,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
355 | 355 | ||
356 | private bool m_updateflag; | 356 | private bool m_updateflag; |
357 | 357 | ||
358 | /// <summary> | ||
359 | /// Is the agent stop control flag currently active? | ||
360 | /// </summary> | ||
361 | public bool AgentControlStopActive { get; private set; } | ||
362 | |||
358 | public bool Updated | 363 | public bool Updated |
359 | { | 364 | { |
360 | set { m_updateflag = value; } | 365 | set { m_updateflag = value; } |
@@ -768,6 +773,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
768 | set { m_speedModifier = value; } | 773 | set { m_speedModifier = value; } |
769 | } | 774 | } |
770 | 775 | ||
776 | /// <summary> | ||
777 | /// Modifier for agent movement if we get an AGENT_CONTROL_STOP whilst walking or running | ||
778 | /// </summary> | ||
779 | /// <remarks> | ||
780 | /// AGENT_CONTRL_STOP comes about if user holds down space key on viewers. | ||
781 | /// </remarks> | ||
782 | private float AgentControlStopSlowWhilstMoving = 0.5f; | ||
783 | |||
771 | private bool m_forceFly; | 784 | private bool m_forceFly; |
772 | 785 | ||
773 | public bool ForceFly | 786 | public bool ForceFly |
@@ -1634,7 +1647,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
1634 | if ((oldState & (uint)AgentState.Editing) != 0 && State == (uint)AgentState.None) | 1647 | if ((oldState & (uint)AgentState.Editing) != 0 && State == (uint)AgentState.None) |
1635 | ControllingClient.SendAgentTerseUpdate(this); | 1648 | ControllingClient.SendAgentTerseUpdate(this); |
1636 | 1649 | ||
1637 | |||
1638 | PhysicsActor actor = PhysicsActor; | 1650 | PhysicsActor actor = PhysicsActor; |
1639 | if (actor == null) | 1651 | if (actor == null) |
1640 | { | 1652 | { |
@@ -1712,7 +1724,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1712 | // Why did I get this? | 1724 | // Why did I get this? |
1713 | } | 1725 | } |
1714 | 1726 | ||
1715 | if ((MovementFlag & (uint)DCF) == 0) | 1727 | if (((MovementFlag & (uint)DCF) == 0) & !AgentControlStopActive) |
1716 | { | 1728 | { |
1717 | //m_log.DebugFormat("[SCENE PRESENCE]: Updating MovementFlag for {0} with {1}", Name, DCF); | 1729 | //m_log.DebugFormat("[SCENE PRESENCE]: Updating MovementFlag for {0} with {1}", Name, DCF); |
1718 | MovementFlag += (uint)DCF; | 1730 | MovementFlag += (uint)DCF; |
@@ -1744,6 +1756,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
1744 | i++; | 1756 | i++; |
1745 | } | 1757 | } |
1746 | 1758 | ||
1759 | // Detect AGENT_CONTROL_STOP state changes | ||
1760 | if (AgentControlStopActive != ((flags & AgentManager.ControlFlags.AGENT_CONTROL_STOP) != 0)) | ||
1761 | { | ||
1762 | AgentControlStopActive = !AgentControlStopActive; | ||
1763 | update_movementflag = true; | ||
1764 | } | ||
1765 | |||
1747 | if (MovingToTarget) | 1766 | if (MovingToTarget) |
1748 | { | 1767 | { |
1749 | // If the user has pressed a key then we want to cancel any move to target. | 1768 | // If the user has pressed a key then we want to cancel any move to target. |
@@ -1769,53 +1788,79 @@ namespace OpenSim.Region.Framework.Scenes | |||
1769 | // Only do this if we're flying | 1788 | // Only do this if we're flying |
1770 | if (Flying && !ForceFly) | 1789 | if (Flying && !ForceFly) |
1771 | { | 1790 | { |
1772 | // Landing detection code | 1791 | // Need to stop in mid air if user holds down AGENT_CONTROL_STOP |
1773 | 1792 | if (AgentControlStopActive) | |
1774 | // Are the landing controls requirements filled? | ||
1775 | bool controlland = (((flags & AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0) || | ||
1776 | ((flags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG) != 0)); | ||
1777 | |||
1778 | //m_log.Debug("[CONTROL]: " +flags); | ||
1779 | // Applies a satisfying roll effect to the avatar when flying. | ||
1780 | if ((flags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT) != 0 && (flags & AgentManager.ControlFlags.AGENT_CONTROL_YAW_POS) != 0) | ||
1781 | { | 1793 | { |
1782 | ApplyFlyingRoll( | 1794 | agent_control_v3 = Vector3.Zero; |
1783 | FLY_ROLL_RADIANS_PER_UPDATE, | ||
1784 | (flags & AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0, | ||
1785 | (flags & AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0); | ||
1786 | } | ||
1787 | else if ((flags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT) != 0 && | ||
1788 | (flags & AgentManager.ControlFlags.AGENT_CONTROL_YAW_NEG) != 0) | ||
1789 | { | ||
1790 | ApplyFlyingRoll( | ||
1791 | -FLY_ROLL_RADIANS_PER_UPDATE, | ||
1792 | (flags & AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0, | ||
1793 | (flags & AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0); | ||
1794 | } | 1795 | } |
1795 | else | 1796 | else |
1796 | { | 1797 | { |
1797 | if (m_AngularVelocity.Z != 0) | 1798 | // Landing detection code |
1798 | m_AngularVelocity.Z += CalculateFlyingRollResetToZero(FLY_ROLL_RESET_RADIANS_PER_UPDATE); | ||
1799 | } | ||
1800 | 1799 | ||
1801 | if (Flying && IsColliding && controlland) | 1800 | // Are the landing controls requirements filled? |
1802 | { | 1801 | bool controlland = (((flags & AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0) || |
1803 | // nesting this check because LengthSquared() is expensive and we don't | 1802 | ((flags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG) != 0)); |
1804 | // want to do it every step when flying. | 1803 | |
1805 | if ((Velocity.LengthSquared() <= LAND_VELOCITYMAG_MAX)) | 1804 | //m_log.Debug("[CONTROL]: " +flags); |
1806 | StopFlying(); | 1805 | // Applies a satisfying roll effect to the avatar when flying. |
1806 | if ((flags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT) != 0 && (flags & AgentManager.ControlFlags.AGENT_CONTROL_YAW_POS) != 0) | ||
1807 | { | ||
1808 | ApplyFlyingRoll( | ||
1809 | FLY_ROLL_RADIANS_PER_UPDATE, | ||
1810 | (flags & AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0, | ||
1811 | (flags & AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0); | ||
1812 | } | ||
1813 | else if ((flags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT) != 0 && | ||
1814 | (flags & AgentManager.ControlFlags.AGENT_CONTROL_YAW_NEG) != 0) | ||
1815 | { | ||
1816 | ApplyFlyingRoll( | ||
1817 | -FLY_ROLL_RADIANS_PER_UPDATE, | ||
1818 | (flags & AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0, | ||
1819 | (flags & AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0); | ||
1820 | } | ||
1821 | else | ||
1822 | { | ||
1823 | if (m_AngularVelocity.Z != 0) | ||
1824 | m_AngularVelocity.Z += CalculateFlyingRollResetToZero(FLY_ROLL_RESET_RADIANS_PER_UPDATE); | ||
1825 | } | ||
1826 | |||
1827 | if (Flying && IsColliding && controlland) | ||
1828 | { | ||
1829 | // nesting this check because LengthSquared() is expensive and we don't | ||
1830 | // want to do it every step when flying. | ||
1831 | if ((Velocity.LengthSquared() <= LAND_VELOCITYMAG_MAX)) | ||
1832 | StopFlying(); | ||
1833 | } | ||
1807 | } | 1834 | } |
1808 | } | 1835 | } |
1809 | 1836 | ||
1837 | // m_log.DebugFormat("[SCENE PRESENCE]: MovementFlag {0} for {1}", MovementFlag, Name); | ||
1838 | |||
1810 | // If the agent update does move the avatar, then calculate the force ready for the velocity update, | 1839 | // If the agent update does move the avatar, then calculate the force ready for the velocity update, |
1811 | // which occurs later in the main scene loop | 1840 | // which occurs later in the main scene loop |
1812 | if (update_movementflag || (update_rotation && DCFlagKeyPressed)) | 1841 | // We also need to update if the user rotates their avatar whilst it is slow walking/running (if they |
1842 | // held down AGENT_CONTROL_STOP whilst normal walking/running). However, we do not want to update | ||
1843 | // if the user rotated whilst holding down AGENT_CONTROL_STOP when already still (which locks the | ||
1844 | // avatar location in place). | ||
1845 | if (update_movementflag | ||
1846 | || (update_rotation && DCFlagKeyPressed && (!AgentControlStopActive || MovementFlag != 0))) | ||
1813 | { | 1847 | { |
1814 | // m_log.DebugFormat( | 1848 | // if (update_movementflag || !AgentControlStopActive || MovementFlag != 0) |
1815 | // "[SCENE PRESENCE]: In {0} adding velocity of {1} to {2}, umf = {3}, ur = {4}", | 1849 | // { |
1816 | // m_scene.RegionInfo.RegionName, agent_control_v3, Name, update_movementflag, update_rotation); | 1850 | // m_log.DebugFormat( |
1851 | // "[SCENE PRESENCE]: In {0} adding velocity of {1} to {2}, umf = {3}, mf = {4}, ur = {5}", | ||
1852 | // m_scene.RegionInfo.RegionName, agent_control_v3, Name, | ||
1853 | // update_movementflag, MovementFlag, update_rotation); | ||
1854 | |||
1855 | float speedModifier; | ||
1856 | |||
1857 | if (AgentControlStopActive) | ||
1858 | speedModifier = 0.5f; | ||
1859 | else | ||
1860 | speedModifier = 1; | ||
1817 | 1861 | ||
1818 | AddNewMovement(agent_control_v3); | 1862 | AddNewMovement(agent_control_v3, speedModifier); |
1863 | // } | ||
1819 | } | 1864 | } |
1820 | // else | 1865 | // else |
1821 | // { | 1866 | // { |
@@ -1828,7 +1873,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
1828 | // } | 1873 | // } |
1829 | 1874 | ||
1830 | if (update_movementflag && ParentID == 0) | 1875 | if (update_movementflag && ParentID == 0) |
1876 | { | ||
1877 | // m_log.DebugFormat("[SCENE PRESENCE]: Updating movement animations for {0}", Name); | ||
1831 | Animator.UpdateMovementAnimations(); | 1878 | Animator.UpdateMovementAnimations(); |
1879 | } | ||
1832 | 1880 | ||
1833 | SendControlsToScripts(flagsForScripts); | 1881 | SendControlsToScripts(flagsForScripts); |
1834 | } | 1882 | } |
@@ -2711,10 +2759,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
2711 | /// Rotate the avatar to the given rotation and apply a movement in the given relative vector | 2759 | /// Rotate the avatar to the given rotation and apply a movement in the given relative vector |
2712 | /// </summary> | 2760 | /// </summary> |
2713 | /// <param name="vec">The vector in which to move. This is relative to the rotation argument</param> | 2761 | /// <param name="vec">The vector in which to move. This is relative to the rotation argument</param> |
2714 | public void AddNewMovement(Vector3 vec) | 2762 | /// <param name="thisAddSpeedModifier"> |
2763 | /// Optional additional speed modifier for this particular add. Default is 1</param> | ||
2764 | public void AddNewMovement(Vector3 vec, float thisAddSpeedModifier = 1) | ||
2715 | { | 2765 | { |
2716 | // m_log.DebugFormat( | 2766 | // m_log.DebugFormat( |
2717 | // "[SCENE PRESENCE]: Adding new movement {0} with rotation {1} for {2}", vec, Rotation, Name); | 2767 | // "[SCENE PRESENCE]: Adding new movement {0} with rotation {1}, thisAddSpeedModifier {2} for {3}", |
2768 | // vec, Rotation, thisAddSpeedModifier, Name); | ||
2718 | 2769 | ||
2719 | Vector3 direc = vec * Rotation; | 2770 | Vector3 direc = vec * Rotation; |
2720 | direc.Normalize(); | 2771 | direc.Normalize(); |
@@ -2732,7 +2783,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
2732 | if ((vec.Z == 0f) && !Flying) | 2783 | if ((vec.Z == 0f) && !Flying) |
2733 | direc.Z = 0f; // Prevent camera WASD up. | 2784 | direc.Z = 0f; // Prevent camera WASD up. |
2734 | 2785 | ||
2735 | direc *= 0.03f * 128f * SpeedModifier; | 2786 | direc *= 0.03f * 128f * SpeedModifier * thisAddSpeedModifier; |
2736 | 2787 | ||
2737 | // m_log.DebugFormat("[SCENE PRESENCE]: Force to apply before modification was {0} for {1}", direc, Name); | 2788 | // m_log.DebugFormat("[SCENE PRESENCE]: Force to apply before modification was {0} for {1}", direc, Name); |
2738 | 2789 | ||