/// <summary> /// This method determines the proper movement related animation /// </summary> private string DetermineMovementAnimation() { const int FALL_DELAY = 800; const int PREJUMP_DELAY = 200; const int JUMP_PERIOD = 800; #region Inputs if (m_scenePresence.IsInTransit) { return(CurrentMovementAnimation); } if (m_scenePresence.SitGround) { currentControlState = motionControlStates.sitted; return("SITGROUND"); } if (m_scenePresence.ParentID != 0 || m_scenePresence.ParentUUID != UUID.Zero) { currentControlState = motionControlStates.sitted; return("SIT"); } AgentManager.ControlFlags controlFlags = (AgentManager.ControlFlags)m_scenePresence.AgentControlFlags; PhysicsActor actor = m_scenePresence.PhysicsActor; const AgentManager.ControlFlags ANYXYMASK = ( AgentManager.ControlFlags.AGENT_CONTROL_AT_POS | AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS | AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG | AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG | AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS | AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS | AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG | AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG ); // Check control flags /* not in use * bool heldForward = ((controlFlags & (AgentManager.ControlFlags.AGENT_CONTROL_AT_POS | AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS)) != 0); * bool heldBack = ((controlFlags & (AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG | AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG)) != 0); * bool heldLeft = ((controlFlags & (AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS | AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS)) != 0); * bool heldRight = ((controlFlags & (AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG | AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG)) != 0); */ bool heldTurnLeft = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT) == AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT; bool heldTurnRight = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT) == AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT; // bool heldUp = ((controlFlags & (AgentManager.ControlFlags.AGENT_CONTROL_UP_POS | AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_POS)) != 0); // excluded nudge up so it doesn't trigger jump state bool heldUp = ((controlFlags & (AgentManager.ControlFlags.AGENT_CONTROL_UP_POS)) != 0); bool heldDown = ((controlFlags & (AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG | AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG)) != 0); //bool flying = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) == AgentManager.ControlFlags.AGENT_CONTROL_FLY; //bool mouselook = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK) == AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK; bool heldOnXY = ((controlFlags & ANYXYMASK) != 0); if (heldOnXY || heldUp || heldDown) { heldTurnLeft = false; heldTurnRight = false; } #endregion Inputs // no physics actor case if (actor == null) { // well what to do? currentControlState = motionControlStates.onsurface; if (heldOnXY) { return("WALK"); } return("STAND"); } #region Flying bool isColliding = actor.IsColliding; if (actor.Flying) { m_animTickFall = 0; m_animTickJump = 0; m_jumping = false; Falling = false; currentControlState = motionControlStates.flying; if (heldOnXY) { return(m_scenePresence.Scene.m_useFlySlow ? "FLYSLOW" : "FLY"); } else if (heldUp) { return("HOVER_UP"); } else if (heldDown) { if (isColliding) { actor.Flying = false; currentControlState = motionControlStates.landing; m_animTickLand = Environment.TickCount; return("LAND"); } else { return("HOVER_DOWN"); } } else { return("HOVER"); } } else { if (isColliding && currentControlState == motionControlStates.flying) { currentControlState = motionControlStates.landing; m_animTickLand = Environment.TickCount; return("LAND"); } } #endregion Flying #region Falling/Floating/Landing if (!isColliding && currentControlState != motionControlStates.jumping) { float fallVelocity = actor.Velocity.Z; // if stable on Hover assume falling if (actor.PIDHoverActive && fallVelocity < 0.05f) { Falling = true; currentControlState = motionControlStates.falling; m_lastFallVelocity = fallVelocity; return("FALLDOWN"); } if (fallVelocity < -2.5f) { Falling = true; } if (m_animTickFall == 0 || (fallVelocity >= -0.5f)) { m_animTickFall = Environment.TickCount; } else { int fallElapsed = (Environment.TickCount - m_animTickFall); if ((fallElapsed > FALL_DELAY) && (fallVelocity < -3.0f)) { currentControlState = motionControlStates.falling; m_lastFallVelocity = fallVelocity; // Falling long enough to trigger the animation return("FALLDOWN"); } } // Check if the user has stopped walking just now if (CurrentMovementAnimation == "WALK" && !heldOnXY && !heldDown && !heldUp) { return("STAND"); } return(CurrentMovementAnimation); } m_animTickFall = 0; #endregion Falling/Floating/Landing #region Jumping // section added for jumping... if (isColliding && heldUp && currentControlState != motionControlStates.jumping && !actor.PIDHoverActive) { // Start jumping, prejump currentControlState = motionControlStates.jumping; m_jumping = true; Falling = false; m_animTickJump = Environment.TickCount; return("PREJUMP"); } if (currentControlState == motionControlStates.jumping) { int jumptime = Environment.TickCount - m_animTickJump; if ((jumptime > (JUMP_PERIOD * 1.5f)) && actor.IsColliding) { // end jumping m_jumping = false; Falling = false; actor.Selected = false; // borrowed for jumping flag m_animTickLand = Environment.TickCount; currentControlState = motionControlStates.landing; return("LAND"); } else if (jumptime > JUMP_PERIOD) { // jump down return("JUMP"); } else if (jumptime > PREJUMP_DELAY) { // jump up m_jumping = true; return("JUMP"); } return(CurrentMovementAnimation); } #endregion Jumping #region Ground Movement if (currentControlState == motionControlStates.falling) { Falling = false; currentControlState = motionControlStates.landing; m_animTickLand = Environment.TickCount; // TODO: SOFT_LAND support float fallVsq = m_lastFallVelocity * m_lastFallVelocity; if (fallVsq > 300f) // aprox 20*h { return("STANDUP"); } else if (fallVsq > 160f) { return("SOFT_LAND"); } else { return("LAND"); } } if (currentControlState == motionControlStates.landing) { Falling = false; int landElapsed = Environment.TickCount - m_animTickLand; int limit = 1000; if (CurrentMovementAnimation == "LAND") { limit = 350; } // NB if the above is set too long a weird anim reset from some place prevents STAND from being sent to client if ((m_animTickLand != 0) && (landElapsed <= limit)) { return(CurrentMovementAnimation); } else { currentControlState = motionControlStates.onsurface; m_animTickLand = 0; return("STAND"); } } // next section moved outside paren. and realigned for jumping if (heldOnXY) { currentControlState = motionControlStates.onsurface; Falling = false; // Walking / crouchwalking / running if (heldDown) { return("CROUCHWALK"); } // We need to prevent these animations if the user tries to make their avatar walk or run whilst // specifying AGENT_CONTROL_STOP (pressing down space on viewers). else if (!m_scenePresence.AgentControlStopActive) { if (m_scenePresence.SetAlwaysRun) { return("RUN"); } else { return("WALK"); } } } else { currentControlState = motionControlStates.onsurface; Falling = false; // Not walking if (heldDown) { return("CROUCH"); } else if (heldTurnLeft) { return("TURNLEFT"); } else if (heldTurnRight) { return("TURNRIGHT"); } else { return("STAND"); } } #endregion Ground Movement return(CurrentMovementAnimation); }
/// <summary> /// This method determines the proper movement related animation /// </summary> private string DetermineMovementAnimation() { const int FALL_DELAY = 800; const int PREJUMP_DELAY = 200; const int JUMP_PERIOD = 800; #region Inputs if (m_scenePresence.IsInTransit) return CurrentMovementAnimation; if (m_scenePresence.SitGround) { currentControlState = motionControlStates.sitted; return "SITGROUND"; } if (m_scenePresence.ParentID != 0 || m_scenePresence.ParentUUID != UUID.Zero) { currentControlState = motionControlStates.sitted; return "SIT"; } AgentManager.ControlFlags controlFlags = (AgentManager.ControlFlags)m_scenePresence.AgentControlFlags; PhysicsActor actor = m_scenePresence.PhysicsActor; const AgentManager.ControlFlags ANYXYMASK = ( AgentManager.ControlFlags.AGENT_CONTROL_AT_POS | AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS | AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG | AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG | AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS | AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS | AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG | AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG ); // Check control flags /* not in use bool heldForward = ((controlFlags & (AgentManager.ControlFlags.AGENT_CONTROL_AT_POS | AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS)) != 0); bool heldBack = ((controlFlags & (AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG | AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_NEG)) != 0); bool heldLeft = ((controlFlags & (AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS | AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_POS)) != 0); bool heldRight = ((controlFlags & (AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG | AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_LEFT_NEG)) != 0); */ bool heldTurnLeft = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT) == AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT; bool heldTurnRight = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT) == AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT; // bool heldUp = ((controlFlags & (AgentManager.ControlFlags.AGENT_CONTROL_UP_POS | AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_POS)) != 0); // excluded nudge up so it doesn't trigger jump state bool heldUp = ((controlFlags & (AgentManager.ControlFlags.AGENT_CONTROL_UP_POS)) != 0); bool heldDown = ((controlFlags & (AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG | AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG)) != 0); //bool flying = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) == AgentManager.ControlFlags.AGENT_CONTROL_FLY; //bool mouselook = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK) == AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK; bool heldOnXY = ((controlFlags & ANYXYMASK) != 0); if (heldOnXY || heldUp || heldDown) { heldTurnLeft = false; heldTurnRight = false; } #endregion Inputs // no physics actor case if (actor == null) { // well what to do? currentControlState = motionControlStates.onsurface; if (heldOnXY) return "WALK"; return "STAND"; } #region Flying bool isColliding = actor.IsColliding; if (actor.Flying) { m_animTickFall = 0; m_animTickJump = 0; m_jumping = false; Falling = false; currentControlState = motionControlStates.flying; if (heldOnXY) { return (m_scenePresence.Scene.m_useFlySlow ? "FLYSLOW" : "FLY"); } else if (heldUp) { return "HOVER_UP"; } else if (heldDown) { if (isColliding) { actor.Flying = false; currentControlState = motionControlStates.landing; m_animTickLand = Environment.TickCount; return "LAND"; } else return "HOVER_DOWN"; } else { return "HOVER"; } } else { if (isColliding && currentControlState == motionControlStates.flying) { currentControlState = motionControlStates.landing; m_animTickLand = Environment.TickCount; return "LAND"; } } #endregion Flying #region Falling/Floating/Landing if (!isColliding && currentControlState != motionControlStates.jumping) { float fallVelocity = actor.Velocity.Z; // if stable on Hover assume falling if(actor.PIDHoverActive && fallVelocity < 0.05f) { Falling = true; currentControlState = motionControlStates.falling; m_lastFallVelocity = fallVelocity; return "FALLDOWN"; } if (fallVelocity < -2.5f) Falling = true; if (m_animTickFall == 0 || (fallVelocity >= -0.5f)) { m_animTickFall = Environment.TickCount; } else { int fallElapsed = (Environment.TickCount - m_animTickFall); if ((fallElapsed > FALL_DELAY) && (fallVelocity < -3.0f)) { currentControlState = motionControlStates.falling; m_lastFallVelocity = fallVelocity; // Falling long enough to trigger the animation return "FALLDOWN"; } } // Check if the user has stopped walking just now if (CurrentMovementAnimation == "WALK" && !heldOnXY && !heldDown && !heldUp) return "STAND"; return CurrentMovementAnimation; } m_animTickFall = 0; #endregion Falling/Floating/Landing #region Jumping // section added for jumping... if (isColliding && heldUp && currentControlState != motionControlStates.jumping && !actor.PIDHoverActive) { // Start jumping, prejump currentControlState = motionControlStates.jumping; m_jumping = true; Falling = false; m_animTickJump = Environment.TickCount; return "PREJUMP"; } if (currentControlState == motionControlStates.jumping) { int jumptime = Environment.TickCount - m_animTickJump; if ((jumptime > (JUMP_PERIOD * 1.5f)) && actor.IsColliding) { // end jumping m_jumping = false; Falling = false; actor.Selected = false; // borrowed for jumping flag m_animTickLand = Environment.TickCount; currentControlState = motionControlStates.landing; return "LAND"; } else if (jumptime > JUMP_PERIOD) { // jump down return "JUMP"; } else if (jumptime > PREJUMP_DELAY) { // jump up m_jumping = true; return "JUMP"; } return CurrentMovementAnimation; } #endregion Jumping #region Ground Movement if (currentControlState == motionControlStates.falling) { Falling = false; currentControlState = motionControlStates.landing; m_animTickLand = Environment.TickCount; // TODO: SOFT_LAND support float fallVsq = m_lastFallVelocity * m_lastFallVelocity; if (fallVsq > 300f) // aprox 20*h return "STANDUP"; else if (fallVsq > 160f) return "SOFT_LAND"; else return "LAND"; } if (currentControlState == motionControlStates.landing) { Falling = false; int landElapsed = Environment.TickCount - m_animTickLand; int limit = 1000; if (CurrentMovementAnimation == "LAND") limit = 350; // NB if the above is set too long a weird anim reset from some place prevents STAND from being sent to client if ((m_animTickLand != 0) && (landElapsed <= limit)) { return CurrentMovementAnimation; } else { currentControlState = motionControlStates.onsurface; m_animTickLand = 0; return "STAND"; } } // next section moved outside paren. and realigned for jumping if (heldOnXY) { currentControlState = motionControlStates.onsurface; Falling = false; // Walking / crouchwalking / running if (heldDown) { return "CROUCHWALK"; } // We need to prevent these animations if the user tries to make their avatar walk or run whilst // specifying AGENT_CONTROL_STOP (pressing down space on viewers). else if (!m_scenePresence.AgentControlStopActive) { if (m_scenePresence.SetAlwaysRun) return "RUN"; else return "WALK"; } } else { currentControlState = motionControlStates.onsurface; Falling = false; // Not walking if (heldDown) return "CROUCH"; else if (heldTurnLeft) return "TURNLEFT"; else if (heldTurnRight) return "TURNRIGHT"; else return "STAND"; } #endregion Ground Movement return CurrentMovementAnimation; }