public bool GrabControl(Skill skill)
 {
     if (_totalControl && TotalControl == skill)
     {
         return(true);
     }
     if (_totalControl && TotalControl.GetPriority() < skill.GetPriority())
     {
         TotalControl.TryTerminate(_context);
         TotalControl  = skill;
         _cancelUpdate = true;
         return(true);
     }
     // ReSharper disable once LoopCanBeConvertedToQuery
     foreach (var currentSkill in Skills)
     {
         if (skill != currentSkill && currentSkill.NeedsControl() && currentSkill.GetEnabled(_context.GetOrbwalker().ActiveMode) && currentSkill.GetPriority() >= skill.GetPriority())
         {
             return(false);
         }
     }
     _totalControl = true;
     TotalControl  = skill;
     _cancelUpdate = true;
     return(true);
 }
        /// <summary>
        /// override in sub class to add champion combo logic. for example Garen has a fixed combo, but wants to do W not in order, but when he gets damage.
        /// In this example you would override Update and have a seperate logic for W instead of adding it to the skill routines.
        /// </summary>
        /// <param name="context"></param>
        public virtual void Update(IMainContext context)
        {
            Target = TargetSelector.GetTarget(TargetRange, DamageType);
            IgniteManager.Update(context, Target);
            Skills.Sort(); //Todo: check if expensive. Will do that event-based otherwise

            if (_totalControl)
            {
                TotalControl.Update(_orbwalker.ActiveMode, context, this, Target);

                if (!TotalControl.NeedsControl())
                {
                    TotalControl.TryTerminate(_context);
                    _totalControl = false;
                    Update(context);
                    return;
                }

                // ReSharper disable once LoopCanBeConvertedToQuery
                foreach (var skill in Skills.Where(item => item.GetPriority() > TotalControl.GetPriority()))
                {
                    skill.Update(_orbwalker.ActiveMode, context, this, Target);
                }
            }
            else
            {
                foreach (var item in Skills)
                {
                    if (_cancelUpdate)
                    {
                        _cancelUpdate = false;
                        return;
                    }
                    item.Update(_orbwalker.ActiveMode, context, this, Target);
                }
            }
        }