Пример #1
0
        public void Action(long elapsed)
        {
            try
            {
                if (IsMove)
                {
                    Creature.Position.X += MoveVector.X;
                    Creature.Position.Y += MoveVector.Y;

                    IsMove = false;
                }

                if (!IsActive)
                {
                    return;
                }

                if (TargetDistance != 0)
                {
                    double d = TargetPosition.DistanceTo2D(Creature.Position) - 10;
                    double a = Geom.GetHeading(Creature.Position, Creature.Target.Position) * Math.PI / 32768;

                    TargetPosition.X = Creature.Position.X + (float)(Math.Cos(a) * d);
                    TargetPosition.Y = Creature.Position.Y + (float)(Math.Sin(a) * d);

                    TargetDistance = 0;
                }

                double distance = TargetPosition.DistanceTo2D(Creature.Position);

                if (distance < 10)
                {
                    TargetPosition.CopyTo(Creature.Position);
                    IsActive = false;
                    return;
                }

                int speed = GetSpeed();

                if (IsNewDirection)
                {
                    IsNewDirection = false;
                    Global.Global.VisibleService.Send(Creature, new SpNpcMove(Creature, TargetPosition.X, TargetPosition.Y, TargetPosition.Z, (Creature.Target != null) ? 2 : 1));
                }

                double angle = Geom.GetHeading(Creature.Position) * Math.PI / 32768;

                MoveVector.X = (float)(Math.Cos(angle));
                MoveVector.Y = (float)(Math.Sin(angle));

                IsMove = true;
            }
            catch (Exception e)
            {
                Log.ErrorException("NpcMoveController.Action():", e);
            }
        }
Пример #2
0
        public void Action(long elapsed)
        {
            if (IsMove)
            {
                MoveVector.Multiple(elapsed / 1000f);
                Creature.Position.X += MoveVector.X;
                Creature.Position.Y += MoveVector.Y;

                if (Projectile != null)
                {
                    Creature.Position.Z += MoveVector.Z;
                }

                //Global.GeoService.FixZ(Npc.Position);

                IsMove = false;
            }

            if (!IsActive)
            {
                return;
            }

            Creature.Position.Heading = Geom.GetHeading(Creature.Position, TargetPosition);

            if (TargetDistance != 0)
            {
                double d = TargetPosition.DistanceTo2D(Creature.Position);
                double a = Creature.Position.Heading * Math.PI / 32768;

                TargetPosition.X = Creature.Position.X + (float)(d * Math.Cos(a));
                TargetPosition.Y = Creature.Position.Y + (float)(d * Math.Sin(a));

                TargetDistance = 0;
            }

            double distance = TargetPosition.DistanceTo2D(Creature.Position);

            if (distance < 10)
            {
                TargetPosition.CopyTo(Creature.Position);
                IsActive = false;
                return;
            }

            int speed = GetSpeed();

            if (Projectile == null && IsNewDirection)
            {
                IsNewDirection = false;
                Global.VisibleService.Send(Creature, new SpNpcMove(Creature, (short)speed, TargetPosition.X, TargetPosition.Y, TargetPosition.Z));
            }

            double angle = Creature.Position.Heading * Math.PI / 32768;

            MoveVector.X = speed * (float)Math.Cos(angle);
            MoveVector.Y = speed * (float)Math.Sin(angle);

            if (Projectile != null)
            {
                MoveVector.Z = speed * (TargetPosition.Z - Creature.Position.Z) / (float)distance;
            }

            IsMove = true;
        }
Пример #3
0
 public void MoveTo(Point3D position, int distance = 0)
 {
     position.CopyTo(TargetPosition);
     TargetDistance = distance;
     Move();
 }