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); } }
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; }