示例#1
0
        public override void RemoveAvatar(PhysicsCharacter actor)
        {
            BasicCharacterActor act = (BasicCharacterActor)actor;

            if (_actors.Contains(act))
            {
                _actors.Remove(act);
            }
        }
 private void ResetAvatar(PhysicsCharacter physicsObject, PhysicsState physicsState, float direction)
 {
     physicsObject.Position = physicsState.Position;
     physicsObject.ForceSetPosition(physicsState.Position);
     physicsObject.Orientation        = physicsState.Rotation;
     physicsObject.RotationalVelocity = physicsState.AngularVelocity * direction;
     physicsObject.Velocity           = physicsState.LinearVelocity * direction;
     physicsObject.ForceSetVelocity(physicsState.LinearVelocity * direction);
     physicsObject.RequestPhysicsterseUpdate();
 }
            public void AddAvatar(PhysicsCharacter prm)
            {
                PhysicsState state = new PhysicsState
                {
                    Position        = prm.Position,
                    AngularVelocity = prm.RotationalVelocity,
                    LinearVelocity  = prm.Velocity,
                    Rotation        = prm.Orientation
                };

                m_activePrims[prm.UUID] = state;
            }
示例#4
0
        public override void RemoveAvatar(PhysicsCharacter actor)
        {
            // MainConsole.Instance.DebugFormat("{0}: RemoveAvatar", LogHeader);
            if (actor is BSCharacter)
            {
                ((BSCharacter)actor).Destroy();
            }

            try
            {
                lock (m_avatars) m_avatars.Remove(actor.LocalID);
            }
            catch (Exception e)
            {
                MainConsole.Instance.WarnFormat("{0}: Attempt to remove avatar that is not in physics scene: {1}", LogHeader, e);
            }
        }
示例#5
0
        public override void RemoveAvatar(PhysicsCharacter actor)
        {
            lock (BulletLock)
            {
                BulletDotNETCharacter chr = (BulletDotNETCharacter)actor;

                if (!Locked)
                {
                    chr.Remove();
                    AddPhysicsActorTaint(chr);
                    //chr = null;
                }
                else
                {
                    RemoveQueue.Add(actor);
                }
                m_charactersLocalID.Remove(chr.m_localID);
            }
        }
示例#6
0
        /// <summary>
        ///   This method determines the proper movement related animation
        /// </summary>
        public string GetMovementAnimation()
        {
            const float STANDUP_TIME         = 2f;
            const float BRUSH_TIME           = 3.5f;
            const float FALL_AFTER_MOVE_TIME = 0.75f;
            const float SOFTLAND_FORCE       = 80;

            #region Inputs

            if (m_scenePresence.SitGround)
            {
                return("SIT_GROUND_CONSTRAINED");
            }
            AgentManager.ControlFlags controlFlags = (AgentManager.ControlFlags)m_scenePresence.AgentControlFlags;
            PhysicsCharacter          actor        = m_scenePresence.PhysicsActor;

            // Create forward and left vectors from the current avatar rotation
            Vector3 fwd  = Vector3.UnitX * m_scenePresence.Rotation;
            Vector3 left = Vector3.UnitY * m_scenePresence.Rotation;

            // Check control flags
            bool heldForward =
                (((controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_AT_POS) ==
                  AgentManager.ControlFlags.AGENT_CONTROL_AT_POS) ||
                 ((controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS) ==
                  AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_AT_POS));
            bool yawPos = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_YAW_POS) ==
                          AgentManager.ControlFlags.AGENT_CONTROL_YAW_POS;
            bool yawNeg = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_YAW_NEG) ==
                          AgentManager.ControlFlags.AGENT_CONTROL_YAW_NEG;
            bool heldBack = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG) ==
                            AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG;
            bool heldLeft = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS) ==
                            AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS;
            bool heldRight = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG) ==
                             AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG;
            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_UP_POS;
            bool heldDown = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) ==
                            AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG;
            //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;

            // Direction in which the avatar is trying to move
            Vector3 move = Vector3.Zero;
            if (heldForward)
            {
                move.X += fwd.X;
                move.Y += fwd.Y;
            }
            if (heldBack)
            {
                move.X -= fwd.X;
                move.Y -= fwd.Y;
            }
            if (heldLeft)
            {
                move.X += left.X;
                move.Y += left.Y;
            }
            if (heldRight)
            {
                move.X -= left.X;
                move.Y -= left.Y;
            }
            if (heldUp)
            {
                move.Z += 1;
            }
            if (heldDown)
            {
                move.Z -= 1;
            }
            float fallVelocity = (actor != null) ? actor.Velocity.Z : 0.0f;

            if (heldTurnLeft && yawPos && !heldForward &&
                !heldBack && actor != null && !actor.IsJumping &&
                !actor.Flying && move.Z == 0 &&
                fallVelocity == 0.0f && !heldUp &&
                !heldDown && move.CompareTo(Vector3.Zero) == 0)
            {
                return("TURNLEFT");
            }
            if (heldTurnRight && yawNeg && !heldForward &&
                !heldBack && actor != null && !actor.IsJumping &&
                !actor.Flying && move.Z == 0 &&
                fallVelocity == 0.0f && !heldUp &&
                !heldDown && move.CompareTo(Vector3.Zero) == 0)
            {
                return("TURNRIGHT");
            }

            // Is the avatar trying to move?
            //            bool moving = (move != Vector3.Zero);

            #endregion Inputs

            #region Standup

            float standupElapsed = (Util.EnvironmentTickCount() - m_animTickStandup) / 1000f;
            if (m_scenePresence.PhysicsActor != null && standupElapsed < STANDUP_TIME &&
                m_useSplatAnimation)
            {
                // Falling long enough to trigger the animation
                m_scenePresence.FallenStandUp         = true;
                m_scenePresence.PhysicsActor.Velocity = Vector3.Zero;
                return("STANDUP");
            }
            else if (standupElapsed < BRUSH_TIME &&
                     m_useSplatAnimation)
            {
                m_scenePresence.FallenStandUp = true;
                return("BRUSH");
            }
            else if (m_animTickStandup != 0 || m_scenePresence.FallenStandUp)
            {
                m_scenePresence.FallenStandUp = false;
                m_animTickStandup             = 0;
            }

            #endregion Standup

            #region Flying

//            if (actor != null && actor.Flying)
            if (actor != null &&
                (m_scenePresence.AgentControlFlags & (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY) ==
                (uint)AgentManager.ControlFlags.AGENT_CONTROL_FLY || m_scenePresence.ForceFly)
            {
                m_animTickFall = 0;
                if (move.X != 0f || move.Y != 0f)
                {
                    if (move.Z == 0)
                    {
                        if (m_scenePresence.Scene.PhysicsScene.UseUnderWaterPhysics &&
                            actor.Position.Z < m_scenePresence.Scene.RegionInfo.RegionSettings.WaterHeight)
                        {
                            return("SWIM_FORWARD");
                        }
                        else
                        {
                            if (m_timesBeforeSlowFlyIsOff < SLOWFLY_DELAY)
                            {
                                m_timesBeforeSlowFlyIsOff++;
                                return("FLYSLOW");
                            }
                            else
                            {
                                return("FLY");
                            }
                        }
                    }
                    else if (move.Z > 0)
                    {
                        if (m_scenePresence.Scene.PhysicsScene.UseUnderWaterPhysics &&
                            actor.Position.Z < m_scenePresence.Scene.RegionInfo.RegionSettings.WaterHeight)
                        {
                            return("SWIM_UP");
                        }
                        else
                        {
                            return("FLYSLOW");
                        }
                    }
                    if (m_scenePresence.Scene.PhysicsScene.UseUnderWaterPhysics &&
                        actor.Position.Z < m_scenePresence.Scene.RegionInfo.RegionSettings.WaterHeight)
                    {
                        return("SWIM_DOWN");
                    }
                    else
                    {
                        return("FLY");
                    }
                }
                else if (move.Z > 0f)
                {
                    //This is for the slow fly timer
                    m_timesBeforeSlowFlyIsOff = 0;
                    if (m_scenePresence.Scene.PhysicsScene.UseUnderWaterPhysics &&
                        actor.Position.Z < m_scenePresence.Scene.RegionInfo.RegionSettings.WaterHeight)
                    {
                        return("SWIM_UP");
                    }
                    else
                    {
                        return("HOVER_UP");
                    }
                }
                else if (move.Z < 0f)
                {
                    wasLastFlying = true;
                    //This is for the slow fly timer
                    m_timesBeforeSlowFlyIsOff = 0;
                    if (m_scenePresence.Scene.PhysicsScene.UseUnderWaterPhysics &&
                        actor.Position.Z < m_scenePresence.Scene.RegionInfo.RegionSettings.WaterHeight)
                    {
                        return("SWIM_DOWN");
                    }
                    else
                    {
                        ITerrainChannel channel = m_scenePresence.Scene.RequestModuleInterface <ITerrainChannel>();
                        if (channel != null)
                        {
                            float groundHeight =
                                channel.GetNormalizedGroundHeight((int)m_scenePresence.AbsolutePosition.X,
                                                                  (int)m_scenePresence.AbsolutePosition.Y);
                            if (actor != null && (m_scenePresence.AbsolutePosition.Z - groundHeight) < 2)
                            {
                                return("LAND");
                            }
                            else
                            {
                                return("HOVER_DOWN");
                            }
                        }
                        else
                        {
                            return("HOVER_DOWN");
                        }
                    }
                }
                else
                {
                    //This is for the slow fly timer
                    m_timesBeforeSlowFlyIsOff = 0;
                    if (m_scenePresence.Scene.PhysicsScene.UseUnderWaterPhysics &&
                        actor.Position.Z < m_scenePresence.Scene.RegionInfo.RegionSettings.WaterHeight)
                    {
                        return("SWIM_HOVER");
                    }
                    else
                    {
                        return("HOVER");
                    }
                }
            }

            m_timesBeforeSlowFlyIsOff = 0;

            #endregion Flying

            #region Jumping

            if (actor != null && actor.IsJumping)
            {
                return("JUMP");
            }
            if (actor != null && actor.IsPreJumping)
            {
                return("PREJUMP");
            }

            #endregion

            #region Falling/Floating/Landing

            float walkElapsed = (Util.EnvironmentTickCount() - m_animTickWalk) / 1000f;
            if (actor != null && actor.IsPhysical && !actor.IsJumping && (!actor.IsColliding) && actor.Velocity.Z < -2 &&
                walkElapsed > FALL_AFTER_MOVE_TIME)
            {
                //Always return falldown immediately as there shouldn't be a waiting period
                if (m_animTickFall == 0)
                {
                    m_animTickFall = Util.EnvironmentTickCount();
                }
                return("FALLDOWN");
            }

            #endregion Falling/Floating/Landing

            #region Ground Movement

            if (m_movementAnimation == "FALLDOWN")
            {
                float fallElapsed = (Util.EnvironmentTickCount() - m_animTickFall) / 1000f;
                if (fallElapsed < 0.75)
                {
                    m_animTickFall = Util.EnvironmentTickCount();

                    return("SOFT_LAND");
                }
                else if (fallElapsed < 1.1 || (Math.Abs(actor.Velocity.X) > 1 && Math.Abs(actor.Velocity.Y) > 1 && actor.Velocity.Z < 3))
                {
                    m_animTickFall = Util.EnvironmentTickCount();

                    return("LAND");
                }
                else
                {
                    if (m_useSplatAnimation)
                    {
                        m_animTickStandup = Util.EnvironmentTickCount();
                        return("STANDUP");
                    }
                    else
                    {
                        return("LAND");
                    }
                }
            }
            else if (m_movementAnimation == "LAND")
            {
                if (actor != null && actor.Velocity.Z != 0)
                {
                    if (actor.Velocity.Z < SOFTLAND_FORCE)
                    {
                        return("LAND");
                    }
                    return("SOFT_LAND");
                }
                //return "LAND";
            }

            m_animTickFall = 0;

            if (move.Z <= 0f)
            {
                if (actor != null && (move.X != 0f || move.Y != 0f ||
                                      actor.Velocity.X != 0 && actor.Velocity.Y != 0))
                {
                    wasLastFlying = false;
                    if (actor.IsColliding)
                    {
                        m_animTickWalk = Util.EnvironmentTickCount();
                    }
                    // Walking / crouchwalking / running
                    if (move.Z < 0f)
                    {
                        return("CROUCHWALK");
                    }
                    else if (m_scenePresence.SetAlwaysRun)
                    {
                        return("RUN");
                    }
                    else
                    {
                        return("WALK");
                    }
                }
                else
                {
                    // Not walking
                    if (move.Z < 0f && !wasLastFlying)
                    {
                        return("CROUCH");
                    }
                    else
                    {
                        return("STAND");
                    }
                }
            }

            #endregion Ground Movement

            return(m_movementAnimation);
        }
示例#7
0
 /// <summary>
 /// Removes physics plugin scene representation of this agent if it exists.
 /// </summary>
 public virtual void RemoveFromPhysicalScene ()
 {
     try
     {
         if (PhysicsActor != null)
         {
             if (OnRemovePhysics != null)
                 OnRemovePhysics();
             if (m_physicsActor != null)
                 m_scene.PhysicsScene.RemoveAvatar(m_physicsActor);
             if (m_physicsActor != null)
                 m_physicsActor.OnCollisionUpdate -= PhysicsCollisionUpdate;
             if (m_physicsActor != null)
                 m_physicsActor.OnRequestTerseUpdate -= SendPhysicsTerseUpdateToAllClients;
             if (m_physicsActor != null)
                 m_physicsActor.OnSignificantMovement -= CheckForSignificantMovement;
             if (m_physicsActor != null)
                 m_physicsActor.OnPositionAndVelocityUpdate -= PhysicsUpdatePosAndVelocity;
             if (m_physicsActor != null)
                 m_physicsActor.OnCheckForRegionCrossing -= CheckForBorderCrossing;
             if (m_physicsActor != null)
                 m_physicsActor.OnOutOfBounds -= OutOfBoundsCall;
             if (m_physicsActor != null)
                 m_scene.PhysicsScene.RemoveAvatar(PhysicsActor);
             if (m_physicsActor != null)
                 m_physicsActor.UnSubscribeEvents();
             m_physicsActor = null;
         }
     }
     catch { }
 }
示例#8
0
        /// <summary>
        /// Adds a physical representation of the avatar to the Physics plugin
        /// </summary>
        public virtual void AddToPhysicalScene (bool isFlying, bool AddAvHeightToPosition)
        {
            //Make sure we arn't already doing this
            if (m_creatingPhysicalRepresentation)
                return;

            //Set this so we don't do it multiple times
            m_creatingPhysicalRepresentation = true;

            IAvatarAppearanceModule appearance = RequestModuleInterface<IAvatarAppearanceModule> ();
            if (appearance != null)
            {
                if (appearance.Appearance.AvatarHeight == 0)
                    appearance.Appearance.SetHeight ();

                if (appearance.Appearance.AvatarHeight != 0)
                    m_avHeight = appearance.Appearance.AvatarHeight;
            }

            PhysicsScene scene = m_scene.PhysicsScene;

            Vector3 pVec = AbsolutePosition;

            if(AddAvHeightToPosition) //This is here so that after teleports, you arrive just slightly higher so that you don't fall through the ground/objects
                pVec.Z += m_avHeight;

            m_physicsActor = scene.AddAvatar(Name, pVec, Rotation,
                                                 new Vector3 (0f, 0f, m_avHeight), isFlying, LocalId, UUID);

            scene.AddPhysicsActorTaint(m_physicsActor);
            m_physicsActor.OnRequestTerseUpdate += SendPhysicsTerseUpdateToAllClients;
            m_physicsActor.OnSignificantMovement += CheckForSignificantMovement;
            m_physicsActor.OnCollisionUpdate += PhysicsCollisionUpdate;
            m_physicsActor.OnPositionAndVelocityUpdate += PhysicsUpdatePosAndVelocity;
            m_physicsActor.OnCheckForRegionCrossing += CheckForBorderCrossing;

            m_physicsActor.OnOutOfBounds += OutOfBoundsCall; // Called for PhysicsActors when there's something wrong
            m_physicsActor.SubscribeEvents(500);
            m_physicsActor.Orientation = Rotation;

            //Tell any events about it
            if (OnAddPhysics != null)
                OnAddPhysics();

            //All done, reset this
            m_creatingPhysicalRepresentation = false;
        }
示例#9
0
 public abstract void RemoveAvatar(PhysicsCharacter actor);
示例#10
0
 public override void RemoveAvatar(PhysicsCharacter actor)
 {
 }
示例#11
0
 public void getPhysical(PhysicsWorld physics_world)
 {
     _physics_character = new PhysicsCharacter(physics_world, EngineHelper.otk2bullet(-_character.spatial.position), 2.0f);
     _previous_position = _character.spatial.position;
     _physical          = false;
 }