diff options
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/ScenePresence.cs')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/ScenePresence.cs | 60 |
1 files changed, 50 insertions, 10 deletions
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index 3e5f947..471caa2 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs | |||
@@ -206,8 +206,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
206 | 206 | ||
207 | private const float FLY_ROLL_MAX_RADIANS = 1.1f; | 207 | private const float FLY_ROLL_MAX_RADIANS = 1.1f; |
208 | 208 | ||
209 | private const float FLY_ROLL_RADIANS_PER_SECOND = 0.06f; | 209 | private const float FLY_ROLL_RADIANS_PER_UPDATE = 0.06f; |
210 | private const float FLY_ROLL_RESET_RADIANS_PER_SECOND = 0.02f; | 210 | private const float FLY_ROLL_RESET_RADIANS_PER_UPDATE = 0.02f; |
211 | 211 | ||
212 | private float m_health = 100f; | 212 | private float m_health = 100f; |
213 | 213 | ||
@@ -1244,11 +1244,47 @@ namespace OpenSim.Region.Framework.Scenes | |||
1244 | /// Applies a roll accumulator to the avatar's angular velocity for the avatar fly roll effect. | 1244 | /// Applies a roll accumulator to the avatar's angular velocity for the avatar fly roll effect. |
1245 | /// </summary> | 1245 | /// </summary> |
1246 | /// <param name="amount">Postive or negative roll amount in radians</param> | 1246 | /// <param name="amount">Postive or negative roll amount in radians</param> |
1247 | private void ApplyFlyingRoll(float amount) | 1247 | private void ApplyFlyingRoll(float amount, bool PressingUp, bool PressingDown) |
1248 | { | 1248 | { |
1249 | float noise = ((float)(Util.RandomClass.NextDouble()*0.2f)-0.1f); | 1249 | |
1250 | float rollAmount = Util.Clamp(m_AngularVelocity.Z + amount, -FLY_ROLL_MAX_RADIANS, FLY_ROLL_MAX_RADIANS) + noise; | 1250 | float rollAmount = Util.Clamp(m_AngularVelocity.Z + amount, -FLY_ROLL_MAX_RADIANS, FLY_ROLL_MAX_RADIANS); |
1251 | m_AngularVelocity.Z = rollAmount; | 1251 | m_AngularVelocity.Z = rollAmount; |
1252 | |||
1253 | // APPLY EXTRA consideration for flying up and flying down during this time. | ||
1254 | // if we're turning left | ||
1255 | if (amount > 0) | ||
1256 | { | ||
1257 | |||
1258 | // If we're at the max roll and pressing up, we want to swing BACK a bit | ||
1259 | // Automatically adds noise | ||
1260 | if (PressingUp) | ||
1261 | { | ||
1262 | if (m_AngularVelocity.Z >= FLY_ROLL_MAX_RADIANS - 0.04f) | ||
1263 | m_AngularVelocity.Z -= 0.9f; | ||
1264 | } | ||
1265 | // If we're at the max roll and pressing down, we want to swing MORE a bit | ||
1266 | if (PressingDown) | ||
1267 | { | ||
1268 | if (m_AngularVelocity.Z >= FLY_ROLL_MAX_RADIANS && m_AngularVelocity.Z < FLY_ROLL_MAX_RADIANS + 0.6f) | ||
1269 | m_AngularVelocity.Z += 0.6f; | ||
1270 | } | ||
1271 | } | ||
1272 | else // we're turning right. | ||
1273 | { | ||
1274 | // If we're at the max roll and pressing up, we want to swing BACK a bit | ||
1275 | // Automatically adds noise | ||
1276 | if (PressingUp) | ||
1277 | { | ||
1278 | if (m_AngularVelocity.Z <= (-FLY_ROLL_MAX_RADIANS)) | ||
1279 | m_AngularVelocity.Z += 0.6f; | ||
1280 | } | ||
1281 | // If we're at the max roll and pressing down, we want to swing MORE a bit | ||
1282 | if (PressingDown) | ||
1283 | { | ||
1284 | if (m_AngularVelocity.Z >= -FLY_ROLL_MAX_RADIANS - 0.6f) | ||
1285 | m_AngularVelocity.Z -= 0.6f; | ||
1286 | } | ||
1287 | } | ||
1252 | } | 1288 | } |
1253 | 1289 | ||
1254 | /// <summary> | 1290 | /// <summary> |
@@ -1800,26 +1836,30 @@ namespace OpenSim.Region.Framework.Scenes | |||
1800 | ((flags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG) != 0)); | 1836 | ((flags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG) != 0)); |
1801 | 1837 | ||
1802 | 1838 | ||
1803 | 1839 | //m_log.Debug("[CONTROL]: " +flags); | |
1804 | // Applies a satisfying roll effect to the avatar when flying. | 1840 | // Applies a satisfying roll effect to the avatar when flying. |
1805 | if (((flags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT) != 0) && ((flags & AgentManager.ControlFlags.AGENT_CONTROL_YAW_POS) != 0)) | 1841 | if (((flags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT) != 0) && ((flags & AgentManager.ControlFlags.AGENT_CONTROL_YAW_POS) != 0)) |
1806 | { | 1842 | { |
1807 | ApplyFlyingRoll(FLY_ROLL_RADIANS_PER_SECOND); | 1843 | |
1844 | ApplyFlyingRoll(FLY_ROLL_RADIANS_PER_UPDATE, ((flags & AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0), ((flags & AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0)); | ||
1845 | |||
1808 | 1846 | ||
1809 | } | 1847 | } |
1810 | else if (((flags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT) != 0) && | 1848 | else if (((flags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT) != 0) && |
1811 | ((flags & AgentManager.ControlFlags.AGENT_CONTROL_YAW_NEG) != 0)) | 1849 | ((flags & AgentManager.ControlFlags.AGENT_CONTROL_YAW_NEG) != 0)) |
1812 | { | 1850 | { |
1813 | ApplyFlyingRoll(-FLY_ROLL_RADIANS_PER_SECOND); | 1851 | ApplyFlyingRoll(-FLY_ROLL_RADIANS_PER_UPDATE, ((flags & AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0), ((flags & AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0)); |
1852 | |||
1814 | 1853 | ||
1815 | } | 1854 | } |
1816 | else | 1855 | else |
1817 | { | 1856 | { |
1818 | if (m_AngularVelocity.Z != 0) | 1857 | if (m_AngularVelocity.Z != 0) |
1819 | m_AngularVelocity.Z += CalculateFlyingRollResetToZero(FLY_ROLL_RESET_RADIANS_PER_SECOND); | 1858 | m_AngularVelocity.Z += CalculateFlyingRollResetToZero(FLY_ROLL_RESET_RADIANS_PER_UPDATE); |
1820 | 1859 | ||
1821 | } | 1860 | } |
1822 | 1861 | ||
1862 | |||
1823 | 1863 | ||
1824 | 1864 | ||
1825 | if (Flying && IsColliding && controlland) | 1865 | if (Flying && IsColliding && controlland) |