private bool MoveIntoActionRange(EasyFarm.Context.IGameContext context, IUnit target, BattleAbility action) { if (target.Distance > action.Distance) { var path = context.NavMesh.FindPathBetween(context.API.Player.Position, context.Target.Position); if (path.Count > 0) { context.API.Navigator.DistanceTolerance = 3.0; while (path.Count > 0 && path.Peek().Distance(context.API.Player.Position) <= context.API.Navigator.DistanceTolerance) { path.Dequeue(); } if (path.Count > 0) { if (path.Peek().Distance(context.Target.Position) <= action.Distance || context.API.Player.Position.Distance(context.Target.Position) <= action.Distance) { context.API.Navigator.DistanceTolerance = action.Distance; } context.API.Navigator.GotoNPC(target.Id, path.Peek(), true); } else { context.API.Navigator.GotoNPC(target.Id, target.Position, false); context.API.Navigator.FaceHeading(target.Position, false); } } return(false); } return(true); }
public void UseTargetedActions(EasyFarm.Context.IGameContext context, IEnumerable <BattleAbility> actions, IUnit target) { if (actions == null) { throw new ArgumentNullException(nameof(actions)); } if (target == null) { throw new ArgumentNullException(nameof(target)); } foreach (var action in actions) { var isInRange = MoveIntoActionRange(context, target, action); _fface.Navigator.FaceHeading(target.Position); Player.SetTarget(_fface, target); if (isInRange) { _fface.Navigator.Reset(); TimeWaiter.Pause(100); if (ResourceHelper.IsSpell(action.AbilityType)) { CastSpell(action); } else { CastAbility(action); } action.Usages++; action.LastCast = DateTime.Now.AddSeconds(action.Recast); TimeWaiter.Pause(Config.Instance.GlobalCooldown); } } }