diff options
Diffstat (limited to 'OpenSim/Region')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/ScenePresence.cs | 226 |
1 files changed, 183 insertions, 43 deletions
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs index db83cb0..915b202 100644 --- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs +++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs | |||
@@ -117,6 +117,11 @@ namespace OpenSim.Region.Framework.Scenes | |||
117 | 117 | ||
118 | private bool m_setAlwaysRun; | 118 | private bool m_setAlwaysRun; |
119 | 119 | ||
120 | private string m_movementAnimation = "DEFAULT"; | ||
121 | private long m_animPersistUntil; | ||
122 | private bool m_allowFalling = false; | ||
123 | |||
124 | |||
120 | private Quaternion m_bodyRot= Quaternion.Identity; | 125 | private Quaternion m_bodyRot= Quaternion.Identity; |
121 | 126 | ||
122 | public bool IsRestrictedToRegion; | 127 | public bool IsRestrictedToRegion; |
@@ -1943,66 +1948,191 @@ namespace OpenSim.Region.Framework.Scenes | |||
1943 | /// </summary> | 1948 | /// </summary> |
1944 | public string GetMovementAnimation() | 1949 | public string GetMovementAnimation() |
1945 | { | 1950 | { |
1946 | if (m_movementflag != 0) | 1951 | if ((m_animPersistUntil > 0) && (m_animPersistUntil > DateTime.Now.Ticks)) |
1947 | { | 1952 | { |
1948 | // We are moving | 1953 | //We don't want our existing state to end yet. |
1949 | if (PhysicsActor != null && PhysicsActor.Flying) | 1954 | return m_movementAnimation; |
1950 | { | 1955 | |
1951 | return "FLY"; | 1956 | } |
1952 | } | 1957 | else if (m_movementflag != 0) |
1953 | else if (PhysicsActor != null && (m_movementflag & (uint) AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0 && | 1958 | { |
1954 | PhysicsActor.IsColliding) | 1959 | //We're moving |
1960 | m_allowFalling = true; | ||
1961 | if (PhysicsActor.IsColliding) | ||
1955 | { | 1962 | { |
1956 | if ((m_movementflag & (uint) AgentManager.ControlFlags.AGENT_CONTROL_AT_POS) != 0 || | 1963 | //And colliding. Can you guess what it is yet? |
1957 | (m_movementflag & (uint) AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG) != 0) | 1964 | if ((m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0) |
1965 | { | ||
1966 | //Down key is being pressed. | ||
1967 | if ((m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG) + (m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_AT_POS) != 0) | ||
1968 | { | ||
1969 | return "CROUCHWALK"; | ||
1970 | } | ||
1971 | else | ||
1972 | { | ||
1973 | return "CROUCH"; | ||
1974 | } | ||
1975 | } | ||
1976 | else if (m_setAlwaysRun) | ||
1958 | { | 1977 | { |
1959 | return "CROUCHWALK"; | 1978 | return "RUN"; |
1960 | } | 1979 | } |
1961 | else | 1980 | else |
1962 | { | 1981 | { |
1963 | return "CROUCH"; | 1982 | //If we're prejumping then inhibit this, it's a problem |
1983 | //caused by a false positive on IsColliding | ||
1984 | if (m_movementAnimation == "PREJUMP") | ||
1985 | { | ||
1986 | return "PREJUMP"; | ||
1987 | } | ||
1988 | else | ||
1989 | { | ||
1990 | return "WALK"; | ||
1991 | } | ||
1964 | } | 1992 | } |
1965 | } | 1993 | |
1966 | else if (PhysicsActor != null && !PhysicsActor.IsColliding && PhysicsActor.Velocity.Z < -2) | ||
1967 | { | ||
1968 | return "FALLDOWN"; | ||
1969 | } | ||
1970 | else if (PhysicsActor != null && !PhysicsActor.IsColliding && Velocity.Z > 1e-6 && | ||
1971 | (m_movementflag & (uint) AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0) | ||
1972 | { | ||
1973 | return "JUMP"; | ||
1974 | } | ||
1975 | else if (m_setAlwaysRun) | ||
1976 | { | ||
1977 | return "RUN"; | ||
1978 | } | 1994 | } |
1979 | else | 1995 | else |
1980 | { | 1996 | { |
1981 | return "WALK"; | 1997 | //We're not colliding. Colliding isn't cool these days. |
1998 | if (PhysicsActor.Flying) | ||
1999 | { | ||
2000 | //Are we moving forwards or backwards? | ||
2001 | if ((m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_AT_POS) != 0 || (m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG) != 0) | ||
2002 | { | ||
2003 | //Then we really are flying | ||
2004 | if (m_setAlwaysRun) | ||
2005 | { | ||
2006 | return "FLY"; | ||
2007 | } | ||
2008 | else | ||
2009 | { | ||
2010 | return "FLYSLOW"; | ||
2011 | } | ||
2012 | } | ||
2013 | else | ||
2014 | { | ||
2015 | if ((m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0) | ||
2016 | { | ||
2017 | return "HOVER_UP"; | ||
2018 | } | ||
2019 | else | ||
2020 | { | ||
2021 | return "HOVER_DOWN"; | ||
2022 | } | ||
2023 | } | ||
2024 | |||
2025 | } | ||
2026 | else if (m_movementAnimation == "JUMP") | ||
2027 | { | ||
2028 | //If we were already jumping, continue to jump until we collide | ||
2029 | return "JUMP"; | ||
2030 | |||
2031 | } | ||
2032 | else if (m_movementAnimation == "PREJUMP" && (m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) == 0) | ||
2033 | { | ||
2034 | //If we were in a prejump, and the UP key is no longer being held down | ||
2035 | //then we're not going to fly, so we're jumping | ||
2036 | return "JUMP"; | ||
2037 | |||
2038 | } | ||
2039 | else if ((m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0) | ||
2040 | { | ||
2041 | //They're pressing up, so we're either going to fly or jump | ||
2042 | return "PREJUMP"; | ||
2043 | } | ||
2044 | else | ||
2045 | { | ||
2046 | //If we're moving and not flying and not jumping and not colliding.. | ||
2047 | |||
2048 | if (m_movementAnimation == "WALK" || m_movementAnimation == "RUN") | ||
2049 | { | ||
2050 | //Let's not enter a FALLDOWN state here, since we're probably | ||
2051 | //not colliding because we're going down hill. | ||
2052 | return m_movementAnimation; | ||
2053 | } | ||
2054 | //Record the time we enter this state so we know whether to "land" or not | ||
2055 | m_animPersistUntil = DateTime.Now.Ticks; | ||
2056 | return "FALLDOWN"; | ||
2057 | |||
2058 | } | ||
1982 | } | 2059 | } |
1983 | } | 2060 | } |
1984 | else | 2061 | else |
1985 | { | 2062 | { |
1986 | // We are not moving | 2063 | //We're not moving. |
1987 | if (PhysicsActor != null && !PhysicsActor.IsColliding && PhysicsActor.Velocity.Z < -2 && !PhysicsActor.Flying) | 2064 | if (PhysicsActor.IsColliding) |
1988 | { | ||
1989 | return "FALLDOWN"; | ||
1990 | } | ||
1991 | else if (PhysicsActor != null && !PhysicsActor.IsColliding && Velocity.Z > 6 && !PhysicsActor.Flying) | ||
1992 | { | 2065 | { |
1993 | // HACK: We check if Velocity.Z > 6 for this animation in order to avoid false positives during normal movement. | 2066 | //But we are colliding. |
1994 | // TODO: set this animation only when on the ground and UP_POS is received? | 2067 | if (m_movementAnimation == "FALLDOWN") |
2068 | { | ||
2069 | //We're re-using the m_animPersistUntil value here to see how long we've been falling | ||
2070 | if ((DateTime.Now.Ticks - m_animPersistUntil) > TimeSpan.TicksPerSecond) | ||
2071 | { | ||
2072 | //Make sure we don't change state for a bit | ||
2073 | m_animPersistUntil = DateTime.Now.Ticks + TimeSpan.TicksPerSecond; | ||
2074 | return "LAND"; | ||
2075 | } | ||
2076 | else | ||
2077 | { | ||
2078 | //We haven't been falling very long, we were probably just walking down hill | ||
2079 | return "STAND"; | ||
2080 | } | ||
2081 | } | ||
2082 | else if (m_movementAnimation == "JUMP" || m_movementAnimation == "HOVER_DOWN") | ||
2083 | { | ||
2084 | //Make sure we don't change state for a bit | ||
2085 | m_animPersistUntil = DateTime.Now.Ticks + (1 * TimeSpan.TicksPerSecond); | ||
2086 | return "SOFT_LAND"; | ||
2087 | |||
2088 | } | ||
2089 | else if ((m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0) | ||
2090 | { | ||
2091 | return "PREJUMP"; | ||
2092 | } | ||
2093 | else if (PhysicsActor.Flying) | ||
2094 | { | ||
2095 | m_allowFalling = true; | ||
2096 | if ((m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) != 0) | ||
2097 | { | ||
2098 | return "HOVER_UP"; | ||
2099 | } | ||
2100 | else if ((m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) != 0) | ||
2101 | { | ||
2102 | return "HOVER_DOWN"; | ||
2103 | } | ||
2104 | else | ||
2105 | { | ||
2106 | return "HOVER"; | ||
2107 | } | ||
2108 | } | ||
2109 | else | ||
2110 | { | ||
2111 | return "STAND"; | ||
2112 | } | ||
1995 | 2113 | ||
1996 | // This is the standing jump | ||
1997 | return "JUMP"; | ||
1998 | } | ||
1999 | else if (PhysicsActor != null && PhysicsActor.Flying) | ||
2000 | { | ||
2001 | return "HOVER"; | ||
2002 | } | 2114 | } |
2003 | else | 2115 | else |
2004 | { | 2116 | { |
2005 | return "STAND"; | 2117 | //We're not colliding. |
2118 | if (PhysicsActor.Flying) | ||
2119 | { | ||
2120 | |||
2121 | return "HOVER"; | ||
2122 | |||
2123 | } | ||
2124 | else if ((m_movementAnimation == "JUMP" || m_movementAnimation == "PREJUMP") && (m_movementflag & (uint)AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) == 0) | ||
2125 | { | ||
2126 | |||
2127 | return "JUMP"; | ||
2128 | |||
2129 | } | ||
2130 | else | ||
2131 | { | ||
2132 | //Record the time we enter this state so we know whether to "land" or not | ||
2133 | m_animPersistUntil = DateTime.Now.Ticks; | ||
2134 | return "FALLDOWN"; | ||
2135 | } | ||
2006 | } | 2136 | } |
2007 | } | 2137 | } |
2008 | } | 2138 | } |
@@ -2012,8 +2142,18 @@ namespace OpenSim.Region.Framework.Scenes | |||
2012 | /// </summary> | 2142 | /// </summary> |
2013 | protected void UpdateMovementAnimations() | 2143 | protected void UpdateMovementAnimations() |
2014 | { | 2144 | { |
2015 | string animation = GetMovementAnimation(); | 2145 | string movementAnimation = GetMovementAnimation(); |
2016 | TrySetMovementAnimation(animation); | 2146 | |
2147 | if (movementAnimation == "FALLDOWN" && m_allowFalling == false) | ||
2148 | { | ||
2149 | movementAnimation = m_movementAnimation; | ||
2150 | } | ||
2151 | else | ||
2152 | { | ||
2153 | m_movementAnimation = movementAnimation; | ||
2154 | } | ||
2155 | |||
2156 | TrySetMovementAnimation(movementAnimation); | ||
2017 | } | 2157 | } |
2018 | 2158 | ||
2019 | /// <summary> | 2159 | /// <summary> |