예제 #1
0
        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);
        }
예제 #2
0
        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);
                }
            }
        }