private static void OnTargetSpellDetection(Obj_AI_Base sender, GameObjectProcessSpellCastEventArgs args)
        {
            try
            {
                if (OnTargetSpell == null)
                {
                    return; // only if subscribers
                }
                if (sender.Position.Distance(ObjectManager.Player.Position) > DetectionRange)
                {
                    return; // only detect spells in range
                }
                if (!sender.IsValid <Obj_AI_Hero>())
                {
                    return; // only hero
                }
                if (!args.Target.IsValid <Obj_AI_Base>())
                {
                    return; // only targeted
                }
                if (args.SData.Name.ToLower().Contains("summoner") || args.SData.Name.ToLower().Contains("recall"))
                {
                    return; // ignore summoners TODO: add summoners to database
                }
                // TODO: add menu check

                var caster = (Obj_AI_Hero)sender;
                var target = (Obj_AI_Base)args.Target;
                var data   = TargetSpellDatabase.GetByName(args.SData.Name);

                if (Orbwalking.IsAutoAttack(args.SData.Name))
                {
                    data = new TargetSpellData(
                        caster.ChampionName.ToLower(),
                        args.SData.Name.ToLower(),
                        SpellSlot.Unknown,
                        SpellType.AutoAttack,
                        CcType.No,
                        caster.AttackRange,
                        caster.AttackDelay,
                        caster.BasicAttack.MissileSpeed); // TODO: check melee
                }

                if (data == null)
                {
                    Console.WriteLine("Target Spell not Found: " + args.SData.Name);
                    return;
                }

                ActiveTargeted.Add(new TargetSpell
                {
                    Caster        = caster,
                    Target        = target,
                    Spell         = data,
                    StartTick     = Environment.TickCount,
                    StartPosition = args.Start.To2D()
                });
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }
        }
        private static void OnTargetSpellDetection(Obj_AI_Base sender, GameObjectProcessSpellCastEventArgs args)
        {
            try
            {
                if (OnTargetSpell == null)
                    return; // only if subscribers

                if (sender.Position.Distance(ObjectManager.Player.Position) > DetectionRange)
                    return; // only detect spells in range

                if (!sender.IsValid<Obj_AI_Hero>())
                    return; // only hero

                if (!args.Target.IsValid<Obj_AI_Base>())
                    return; // only targeted

                if (args.SData.Name.ToLower().Contains("summoner") || args.SData.Name.ToLower().Contains("recall"))
                    return; // ignore summoners TODO: add summoners to database

                // TODO: add menu check

                var caster = (Obj_AI_Hero) sender;
                var target = (Obj_AI_Base) args.Target;
                var data = TargetSpellDatabase.GetByName(args.SData.Name);

                if (Orbwalking.IsAutoAttack(args.SData.Name))
                {
                    data = new TargetSpellData(
                        caster.ChampionName.ToLower(),
                        args.SData.Name.ToLower(),
                        SpellSlot.Unknown,
                        SpellType.AutoAttack,
                        CcType.No,
                        caster.AttackRange,
                        caster.AttackDelay,
                        caster.BasicAttack.MissileSpeed); // TODO: check melee
                }

                if (data == null)
                {
                    Console.WriteLine("Target Spell not Found: " + args.SData.Name);
                    return;
                }

                ActiveTargeted.Add(new TargetSpell
                {
                    Caster = caster,
                    Target = target,
                    Spell = data,
                    StartTick = Environment.TickCount,
                    StartPosition = args.Start.To2D()
                });
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }
        }