예제 #1
0
        private static void Add(DetectedSkillshotData data)
        {
            if (data == null)
            {
                Console.WriteLine("Invalid DetectedSkillshotData");
                return;
            }

            if (!data.Data.AllowDuplicates)
            {
                if (SkillshotsDetected.Any(s => s.Missile != null && data.Missile == null && s.Caster != null && data.Caster != null && s.Caster.IdEquals(data.Caster) && s.Data.Equals(data.Data)))
                {
                    // Already Detected by Missile
                    return;
                }

                var replaceByMissile =
                    SkillshotsDetected.FirstOrDefault(s => s.Missile == null && data.Missile != null && s.Caster != null && data.Caster != null && s.Caster.IdEquals(data.Caster) && s.Data.Equals(data.Data));
                if (replaceByMissile != null)
                {
                    // Add the Missile
                    replaceByMissile.Missile = data.Missile;
                    replaceByMissile.End     = data.Missile.EndPosition.To2D();
                    replaceByMissile.Start   = data.Missile.StartPosition.To2D();
                    return;
                }

                if (SkillshotsDetected.Any(s => s.Caster != null && !s.DetectedMissile && s.Caster.IdEquals(data.Caster) && s.Data.Equals(data.Data)))
                {
                    return;
                }
            }

            OnSkillShotDetected.Invoke(data);
            SkillshotsDetected.Add(data);
        }
예제 #2
0
        private static void OnSkillShotUpdate_OnUpdate(DetectedSkillshotData args)
        {
            if (args.Caster == null || !Spells.E.IsReady() || !args.IsEnemy || !args.WillHit(Player.Instance))
            {
                return;
            }

            var spellname = args.Data.MenuItemName;
            var spell     = EnabledSpells.FirstOrDefault(s => s.SpellName.Equals(spellname));

            if (spell == null)
            {
                Logger.Warn($"{spellname} Not valid Spell");
                return;
            }

            if (!spell.Enabled && (!Meniu.BlockExecute || Player.Instance.PredictHealth(args.TravelTime(Player.Instance)) > args.GetSpellDamage(Player.Instance)))
            {
                Logger.Warn($"{spellname} Not Enabled from Menu");
                return;
            }

            Block(args, spell);
        }
예제 #3
0
        private static void Game_OnTick(EventArgs args)
        {
            foreach (var LuxR in DetectedLuxRParticals)
            {
                var data = SkillshotDatabase.List.FirstOrDefault(s => s.hero.Equals(Champion.Lux) && s.slot.Equals(SpellSlot.R));
                if (data == null)
                {
                    continue;
                }

                if (SkillshotsDetected.Any(s => s.Caster.IdEquals(LuxR.caster) && s.Data.Equals(data)))
                {
                    continue;
                }

                Vector3?start = null;
                Vector3?end   = null;

                if (start == null)
                {
                    if (LuxR.caster != null && LuxR.caster.IsHPBarRendered)
                    {
                        start = LuxR.caster.ServerPosition;
                    }
                    else
                    {
                        if (LuxR.Start.HasValue)
                        {
                            start = LuxR.Start;
                        }
                        else
                        {
                            if (LuxR.Mid.HasValue && LuxR.End.HasValue)
                            {
                                start = LuxR.End.Value.Extend(LuxR.Mid.Value, data.Range).To3DWorld();
                            }
                        }
                    }
                }

                if (end == null)
                {
                    if (LuxR.End.HasValue)
                    {
                        end = LuxR.End.Value;
                    }
                    else
                    {
                        if (LuxR.caster != null && LuxR.caster.IsHPBarRendered)
                        {
                            if (LuxR.End.HasValue)
                            {
                                end = LuxR.End.Value;
                            }
                            if (LuxR.Mid.HasValue)
                            {
                                end = LuxR.caster.ServerPosition.Extend(LuxR.Mid.Value, data.Range).To3DWorld();
                            }
                            else
                            {
                                if (LuxR.Start.HasValue)
                                {
                                    end = LuxR.caster.ServerPosition.Extend(LuxR.Start.Value, data.Range).To3DWorld();
                                }
                            }
                        }
                        else
                        {
                            if (LuxR.Start.HasValue && LuxR.Mid.HasValue)
                            {
                                end = LuxR.Start.Value.Extend(LuxR.Mid.Value, data.Range).To3DWorld();
                            }
                        }
                    }
                }

                if (start.HasValue && end.HasValue)
                {
                    if (!SkillshotsDetected.Any(s => s.Caster.IdEquals(LuxR.caster) && s.Data.Equals(data)))
                    {
                        var detected = new DetectedSkillshotData
                        {
                            Caster    = LuxR.caster,
                            StartTick = Core.GameTickCount,
                            Start     = start.Value.To2D(),
                            End       = end.Value.To2D(),
                            Data      = data
                        };

                        Add(detected);
                    }
                }
            }

            foreach (var skill in SkillshotsDetected)
            {
                OnSkillShotDetected.Invoke(skill);
            }

            DetectedLuxRParticals.RemoveAll(s => Core.GameTickCount - s.StartTick > s.Data.CastDelay);
            SkillshotsDetected.RemoveAll(s => s.Ended);
        }
예제 #4
0
        public static void Check(DetectedSkillshotData skill)
        {
            var collideobjects = new List <Obj_AI_Base>();
            var collidePoints  = new List <Vector2>();

            collideobjects.Clear();
            collidePoints.Clear();

            var collisionData = skill.Data.Collisions;

            skill.CollidePoint   = null;
            skill.CollideTarget  = null;
            skill.CollideTargets = null;

            if (collisionData == null || !collisionData.Any())
            {
                return;
            }

            var polygon = skill.OriginalPolygon;

            if (polygon == null)
            {
                return;
            }

            bool CollideWithWals = false;

            if (collisionData.Contains(Databases.SpellData.Collision.Heros))
            {
                var heros = EntityManager.Heroes.AllHeroes.Where(h => h.Team != skill.Caster.Team && !h.IsMe && h.IsValidTarget() && polygon.IsInside(h)).ToList();
                if (heros != null && heros.Any())
                {
                    collideobjects.AddRange(heros);
                    collidePoints.AddRange(heros.Select(h => h.ServerPosition.To2D()));
                }
            }

            if (collisionData.Contains(Databases.SpellData.Collision.Minions))
            {
                var minions = EntityManager.MinionsAndMonsters.Combined.Where(h => h.Team != skill.Caster.Team && !h.IsWard() && h.IsValidTarget() && polygon.IsInside(h)).ToList();
                if (minions != null && minions.Any())
                {
                    collideobjects.AddRange(minions);
                    collidePoints.AddRange(minions.Select(h => h.ServerPosition.To2D()));
                }
            }

            if (collisionData.Contains(Databases.SpellData.Collision.Walls))
            {
                var wallsDetected = CellsAnalyze(skill.Start, polygon).Select(c => c.WorldPosition.To2D()).ToList();
                if (wallsDetected != null && wallsDetected.Any())
                {
                    collidePoints.AddRange(wallsDetected);
                    CollideWithWals = true;
                }
            }

            var orderedPoints  = collidePoints.OrderBy(vector2 => vector2.Distance(skill.Start)).ToArray();
            var orderedObjects = collideobjects.OrderBy(obj => obj.Distance(skill.Start)).ToArray();

            if (CollideWithWals)
            {
                if (orderedPoints.Any())
                {
                    var range = orderedPoints[0].Distance(skill.Start);
                    skill.CollidePoint = skill.Start.Extend(skill.EndPosition, range);
                }
            }
            else
            {
                if (orderedPoints.Any())
                {
                    var range = orderedPoints[0].Distance(skill.Start);
                    if (skill.Data.CanCollide)
                    {
                        if (orderedPoints.Length > skill.Data.CollideCount)
                        {
                            var point = orderedPoints[skill.Data.CollideCount];
                            range = point.Distance(skill.Start);
                            var obj = orderedObjects.FirstOrDefault(o => o.ServerPosition.To2D().Equals(point));
                            if (obj != null)
                            {
                                range -= obj.BoundingRadius;
                            }

                            skill.CollidePoint = skill.Start.Extend(skill.EndPosition, range);
                        }
                    }
                    else
                    {
                        skill.CollidePoint = skill.Start.Extend(skill.EndPosition, range);
                    }
                }
            }

            if (orderedObjects.Any())
            {
                skill.CollideTargets = orderedObjects;
                skill.CollideTarget  = orderedObjects[0];
            }
        }
예제 #5
0
        private static void Obj_AI_Base_OnProcessSpellCast(Obj_AI_Base sender, GameObjectProcessSpellCastEventArgs args)
        {
            var caster = sender as AIHeroClient;
            var target = args.Target as AIHeroClient;

            if (caster == null || !caster.IsValid)
            {
                return;
            }

            var spellname = args.SData.Name;
            //Console.WriteLine(spellname);

            var data = GetData(caster, args, null);

            if (data == null)
            {
                //Console.WriteLine($"OnProcessSkillshots: {caster.ChampionName} - [{args.Slot} | {spellname}] - Not Detected");
                return;
            }

            var start = args.Start.To2D();
            var end   = args.End.To2D();

            if (data.StartsFromTarget && target != null)
            {
                if (data.hero == Champion.LeeSin && data.slot == SpellSlot.R)
                {
                    start = target.ServerPosition.To2D();
                    end   = start.Extend(caster, -data.Range);
                }
            }

            if (data.RangeScaleWithMoveSpeed)
            {
                data.Range = caster.MoveSpeed * data.MoveSpeedScaleMod;

                if (data.hero == Champion.Warwick && data.slot == SpellSlot.R)
                {
                    data.Range = Math.Max(275, caster.MoveSpeed * data.MoveSpeedScaleMod);
                }

                end = start.Extend(end, data.Range);
            }

            if (data.hero.Equals(Champion.Taric) && data.slot.Equals(SpellSlot.E))
            {
                var taricAllies = EntityManager.Heroes.AllHeroes.Where(h => h.IsValidTarget() && h.Team.Equals(caster.Team) && !h.IdEquals(caster) && h.HasBuff("taricwleashactive"));
                foreach (var ally in taricAllies)
                {
                    var taricAllyE = new DetectedSkillshotData
                    {
                        Caster    = ally,
                        Target    = target,
                        Start     = ally.ServerPosition.To2D(),
                        End       = ally.ServerPosition.To2D().Extend(end, data.Range),
                        Data      = data,
                        StartTick = Core.GameTickCount
                    };

                    Add(taricAllyE);
                }
            }

            if (data.SpellName.Equals("SiegeLaserAffixShot"))
            {
                var turret = EntityManager.Turrets.AllTurrets.FirstOrDefault(t => t.Team.Equals(caster.Team) && t.Buffs.Any(b => b.Caster.IdEquals(caster)));
                if (turret == null)
                {
                    return;
                }

                start = turret.ServerPosition.To2D();
                end   = start.Extend(args.End.To2D(), data.Range);
            }

            var detected = new DetectedSkillshotData
            {
                Caster    = caster,
                Target    = target,
                Start     = start,
                End       = end,
                Data      = data,
                StartTick = Core.GameTickCount
            };


            Add(detected);
        }
예제 #6
0
        private static void GameObject_OnCreate(GameObject sender, EventArgs args)
        {
            if (sender == null)
            {
                return;
            }

            var partical = sender as Obj_GeneralParticleEmitter;

            if (partical != null)
            {
                var pdata = SkillshotDatabase.List.FirstOrDefault(s => partical.Name.EndsWith(".troy") && ((!string.IsNullOrEmpty(s.ParticalName) && partical.Name.StartsWith(s.ParticalName)) ||
                                                                                                           (!string.IsNullOrEmpty(s.MissileName) && partical.Name.StartsWith(s.MissileName)) ||
                                                                                                           (s.ExtraMissileName != null && s.ExtraMissileName.Any(x => partical.Name.StartsWith(x)))));

                if (pdata != null)
                {
                    var pcaster       = EntityManager.Heroes.AllHeroes.OrderBy(e => e.Distance(partical)).FirstOrDefault(h => h.Hero.Equals(pdata.hero));
                    var correctObject = ObjectManager.Get <Obj_AI_Base>().OrderBy(o => o.Distance(partical)).FirstOrDefault(o => !string.IsNullOrEmpty(pdata.ParticalObjectName) && o.Name.Equals(pdata.ParticalObjectName));
                    if (correctObject != null)
                    {
                        var pdetected = new DetectedSkillshotData
                        {
                            Caster    = pcaster,
                            Start     = correctObject.Position.To2D(),
                            End       = correctObject.Position.To2D(),
                            Data      = pdata,
                            StartTick = Core.GameTickCount
                        };

                        Add(pdetected);
                    }
                    else
                    {
                        var start = partical.Position.To2D();
                        var end   = partical.Position.To2D();
                        if (pcaster != null)
                        {
                            //start = pcaster.ServerPosition.To2D();
                            switch (pcaster.ChampionName)
                            {
                            case "Zac":
                                if (start.Distance(end) > pdata.Range)
                                {
                                    start = end.Extend(start, pdata.Range);
                                }
                                break;
                            }
                        }

                        var pdetected = new DetectedSkillshotData
                        {
                            Caster    = pcaster,
                            Start     = start,
                            End       = end,
                            Data      = pdata,
                            StartTick = Core.GameTickCount
                        };

                        Add(pdetected);
                    }
                }
                else
                {
                    var StartluxR =
                        SkillshotDatabase.List.FirstOrDefault(p => !string.IsNullOrEmpty(p.StartParticalName) && partical.Name.StartsWith(p.StartParticalName) && partical.Name.EndsWith(".troy"));
                    var MidluxR =
                        SkillshotDatabase.List.FirstOrDefault(p => !string.IsNullOrEmpty(p.StartParticalName) && partical.Name.StartsWith(p.MidParticalName) && partical.Name.EndsWith(".troy"));
                    var EndluxR =
                        SkillshotDatabase.List.FirstOrDefault(p => !string.IsNullOrEmpty(p.StartParticalName) && partical.Name.StartsWith(p.MidParticalName) && partical.Name.EndsWith(".troy"));

                    AIHeroClient pcaster;
                    if (StartluxR != null || MidluxR != null || EndluxR != null)
                    {
                        pcaster = EntityManager.Heroes.AllHeroes.OrderBy(h => h.Distance(partical)).FirstOrDefault(h => h.ChampionName.Equals("Lux"));
                        if (pcaster != null)
                        {
                            var alreadyDetected = DetectedLuxRParticals.FirstOrDefault(p => p.caster != null && !p.FullyDetected && p.caster.IdEquals(pcaster));
                            if (alreadyDetected != null)
                            {
                                if (alreadyDetected.Start == null && StartluxR != null)
                                {
                                    alreadyDetected.Start = partical.Position;
                                }
                                if (alreadyDetected.Mid == null && MidluxR != null)
                                {
                                    alreadyDetected.Mid = partical.Position;
                                }
                                if (alreadyDetected.End == null && EndluxR != null)
                                {
                                    alreadyDetected.End = partical.Position;
                                }
                            }
                            else
                            {
                                var addnew = new LuxRPartical
                                {
                                    caster = pcaster,
                                    Start  = StartluxR != null ? partical.Position : (Vector3?)null,
                                    Mid    = MidluxR != null ? partical.Position : (Vector3?)null,
                                    End    = EndluxR != null ? partical.Position : (Vector3?)null,
                                    Data   = SkillshotDatabase.List.FirstOrDefault(s => s.hero.Equals(Champion.Lux) && s.slot.Equals(SpellSlot.R))
                                };

                                DetectedLuxRParticals.Add(addnew);
                            }
                        }
                    }
                }
            }

            var missile = sender as MissileClient;
            var caster  = missile?.SpellCaster;

            if (missile == null || caster == null || missile.IsAutoAttack() || !missile.IsValid)
            {
                return;
            }

            var missilename = missile.SData.Name;
            //Console.WriteLine($"{missilename} - mis - {missile.Slot}");

            var data = GetData(caster, null, missile);

            if (data == null)
            {
                //Console.WriteLine($"OnCreateSkillshots: {caster.ChampionName} - [{missile.Slot} | {missilename}] - Not Detected");
                return;
            }

            var Misstart = missile.StartPosition.To2D();
            var Misend   = missile.EndPosition.To2D();

            if (data.hero.Equals(Champion.Shen) && data.slot.Equals(SpellSlot.Q))
            {
                Misstart   = missile.Position.To2D();
                Misend     = caster.ServerPosition.To2D();
                data.Range = Misstart.Distance(Misend);
            }

            var detected = new DetectedSkillshotData
            {
                Caster    = caster,
                Missile   = missile,
                Start     = Misstart,
                End       = Misend,
                Data      = data,
                StartTick = Core.GameTickCount
            };

            Add(detected);
        }
예제 #7
0
 public CollisionResult(DetectedSkillshotData skillshot)
 {
     this.Check(skillshot);
 }
예제 #8
0
        internal static void Add(DetectedSkillshotData data)
        {
            if (data == null)
            {
                Console.WriteLine("Invalid DetectedSkillshot");
                return;
            }

            if (data.Data.IsTrap && SkillshotsDetected.Any(x => x.Trap != null && data.Trap.Equals(x.Trap)))
            {
                return;
            }

            if (data.Missile == null && data.Data.DetectByMissile)
            {
                return;
            }

            if (data.Data.type == Type.Cone)
            {
                if (SkillshotsDetected.Any(s => s.Caster.IdEquals(data.Caster) && s.Data.Equals(data.Data)))
                {
                    return;
                }
            }

            if (!data.Data.AllowDuplicates)
            {
                if (SkillshotsDetected.Any(s => s.Missile != null && data.Missile == null && s.Caster != null && data.Caster != null && s.Caster.IdEquals(data.Caster) && s.Data.Equals(data.Data)))
                {
                    // Already Detected by Missile
                    return;
                }

                var replaceByMissile =
                    SkillshotsDetected.FirstOrDefault(s => s.Missile == null && data.Missile != null && s.Caster != null && data.Caster != null && s.Caster.IdEquals(data.Caster) && s.Data.Equals(data.Data));
                if (replaceByMissile != null && data.Missile != null && !(data.Data.StaticStart && data.Data.StaticEnd))
                {
                    // Add the Missile
                    replaceByMissile.Missile = data.Missile;
                    replaceByMissile.End     = data.Missile.EndPosition.To2D();
                    replaceByMissile.Start   = data.Missile.StartPosition.To2D();
                    return;
                }

                if (SkillshotsDetected.Any(s => s.Caster != null && !s.DetectedByMissile && s.Caster.IdEquals(data.Caster) && s.Data.Equals(data.Data)))
                {
                    return;
                }
            }

            if (data.Data.StaticStart && data.Data.StaticEnd && data.Missile == null)
            {
                var start = data.Start;
                var end   = data.End;
                data.Start = end - (end - start).Normalized().Perpendicular() * (data.Range / 2);
                data.End   = end + (end - start).Normalized().Perpendicular() * (data.Range / 2);
            }

            if (data.Data.IsSpellName("YorickE"))
            {
                var start = data.End.Extend(data.Start, 200);
                var end   = data.End.Extend(data.Start, -450);
                data.Start = start;
                data.End   = end;
            }

            if (data.Data.CasterNames.Length == 3 && data.Data.type == Type.CircleMissile)
            {
                var obj = ObjectManager.Get <Obj_AI_Base>().FirstOrDefault(o => o.IsValid && !o.IsDead && o.Team == data.Caster.Team && data.Data.CasterNames[1].Equals(o.BaseSkinName) && data.Data.CasterNames[2].Equals(o.Model));
                if (obj != null)
                {
                    data.Start = obj.ServerPosition.To2D();
                    data.End   = obj.ServerPosition.To2D();
                }
            }

            if (data.Data.IsSpellName("JarvanIVDragonStrike"))
            {
                var jarvanFlag = ObjectManager.Get <Obj_AI_Base>().OrderBy(o => o.Distance(data.EndPosition)).FirstOrDefault(o => o.BaseSkinName.Equals("JarvanIVStandard") && o.Team == data.Caster.Team && o.IsValid && data.IsInside(o));
                if (jarvanFlag != null)
                {
                    var jarvanEQData = SkillshotDatabase.Current.FirstOrDefault(s => s.IsSpellName("JarvanIVEQ"));
                    if (jarvanEQData != null)
                    {
                        var jarvanEQ = new DetectedSkillshotData
                        {
                            Data      = jarvanEQData,
                            Start     = data.Start,
                            End       = jarvanFlag.ServerPosition.To2D(),
                            Caster    = data.Caster,
                            StartTick = Core.GameTickCount,
                        };

                        Add(jarvanEQ);
                        return;
                    }
                }
            }

            if (data.Data.DecaySpeedWithLessRange)
            {
                data.Speed = data.Data.Speed * (data.Start.Distance(data.EndPosition) / data.Data.Range);
            }

            data.DetectedByMissile = data.Missile != null;
            data.FromFOW           = !data.Caster.IsHPBarRendered;

            data.Update();
            SkillshotsDetected.Add(data);
            OnSkillShotDetected.Invoke(data);

            if (data.Data.IsSpellName("SyndraE"))
            {
                var qeData = SkillshotDatabase.Current.FirstOrDefault(s => s.IsSpellName("SyndraEQ"));
                if (qeData != null)
                {
                    var syndraBalls = ObjectManager.Get <Obj_AI_Base>().Where(o => o.BaseSkinName.Equals("SyndraSphere") && o.Team == data.Caster.Team && data.IsInside(o) && o.IsValid && o.Mana > 17.5);
                    foreach (var ball in syndraBalls)
                    {
                        var newDetect = new DetectedSkillshotData
                        {
                            Caster     = data.Caster,
                            Start      = ball.ServerPosition.To2D(),
                            End        = data.Start.Extend(ball.ServerPosition.To2D(), qeData.Range),
                            Data       = qeData,
                            StartTick  = Core.GameTickCount,
                            extraDelay = data.TravelTime(ball)
                        };

                        newDetect.Update();
                        SkillshotsDetected.Add(newDetect);
                        OnSkillShotDetected.Invoke(newDetect);
                    }
                }
            }
        }
예제 #9
0
        private static void GameObject_OnCreate(GameObject sender, EventArgs args)
        {
            if (sender == null)
            {
                return;
            }

            var partical = sender as Obj_GeneralParticleEmitter;

            if (partical != null)
            {
                var particleName = partical.Name.ToLower();
                var pdata        = SkillshotDatabase.Current.FirstOrDefault(s => !ExcludeEnds.Any(particleName.EndsWith) && s.IsParticleName(particleName) && ObjectManager.Get <Obj_AI_Base>().Any(s.HasBuff));
                if (pdata != null)
                {
                    var isAlly    = AlliedNames.Any(particleName.EndsWith);
                    var yasuoEQ   = partical.Name.StartsWith("Yasuo_Base_EQ_SwordGlow");
                    var jungleMob = pdata.IsCasterName("jungle");

                    Obj_AI_Base pcaster =
                        jungleMob ? ObjectManager.Get <Obj_AI_Base>().Where(m => pdata.IsCasterName(m.BaseSkinName) && m.IsValid && !m.IsDead).OrderBy(m => m.Distance(partical)).FirstOrDefault()
                        : yasuoEQ?EntityManager.Heroes.AllHeroes.OrderBy(m => m.Distance(partical)).FirstOrDefault(h => h.ChampionName == "Yasuo" && h.IsValid && !h.IsDead)
                            : EntityManager.Heroes.AllHeroes.OrderByDescending(h => h.Distance(partical)).FirstOrDefault(h => h.IsInRange(partical, 3000) && pdata.IsCasterName(h.BaseSkinName) &&
                                                                                                                         (isAlly ? h.IsAlly : h.IsEnemy) && h.IsValid && !h.IsDead && pdata.HasBuff(h));

                    var correctObject = ObjectManager.Get <Obj_AI_Base>().OrderBy(o => o.Distance(partical)).FirstOrDefault(o => !string.IsNullOrEmpty(pdata.ParticalObjectName) &&
                                                                                                                            (o.Name.Equals(pdata.ParticalObjectName) || o.BaseSkinName.Equals(pdata.ParticalObjectName) || o.Model.Equals(pdata.ParticalObjectName) || pdata.HasBuff(o)));
                    if (correctObject != null)
                    {
                        var buff          = correctObject.Buffs.FirstOrDefault(b => b.Caster is Obj_AI_Base);
                        var correctCaster = buff?.Caster as Obj_AI_Base;
                        if (correctCaster != null)
                        {
                            pcaster = correctCaster;
                        }

                        if (pcaster != null)
                        {
                            var pdetected = new DetectedSkillshotData
                            {
                                Caster    = pcaster,
                                Start     = correctObject.Position.To2D(),
                                End       = correctObject.Position.To2D(),
                                Data      = pdata,
                                StartTick = Core.GameTickCount,
                                Particle  = partical
                            };

                            Add(pdetected);
                        }
                    }
                    else
                    {
                        var start = partical.Position.To2D();
                        var end   = partical.Position.To2D();
                        if (pcaster != null)
                        {
                            //start = pcaster.ServerPosition.To2D();
                            switch (pcaster.BaseSkinName)
                            {
                            case "Yasuo":
                            {
                                var alreadydetected = SkillshotsDetected.FirstOrDefault(s => s.Caster.IdEquals(pcaster));
                                if (alreadydetected != null)
                                {
                                    var qcircle = SkillshotDatabase.Current.FirstOrDefault(s => s.IsCasterName(Champion.Yasuo) && s.IsDisplayName(pcaster.HasBuff("YasuoQ3W") ? "E Q3" : "E Q"));
                                    if (qcircle != null)
                                    {
                                        alreadydetected.Data = qcircle;
                                        alreadydetected.End  = pcaster.GetDashInfo() != null?pcaster.GetDashInfo().EndPos.To2D() : pcaster.ServerPosition.To2D();

                                        alreadydetected.Update();
                                    }
                                }
                                return;
                            }

                            case "Zac":
                                start = pcaster.IsHPBarRendered ? pcaster.ServerPosition.To2D() : end.Extend(pcaster, pdata.Range);
                                break;
                            }

                            var pdetected = new DetectedSkillshotData
                            {
                                Caster    = pcaster,
                                Start     = start,
                                End       = end,
                                Data      = pdata,
                                StartTick = Core.GameTickCount,
                                Particle  = partical
                            };

                            Add(pdetected);
                        }
                    }
                }
                else
                {
                    var StartluxR =
                        SkillshotDatabase.Current.FirstOrDefault(p => !string.IsNullOrEmpty(p.StartParticalName) && partical.Name.StartsWith(p.StartParticalName) && partical.Name.EndsWith(".troy"));
                    var MidluxR =
                        SkillshotDatabase.Current.FirstOrDefault(p => !string.IsNullOrEmpty(p.MidParticalName) && partical.Name.StartsWith(p.MidParticalName) && partical.Name.EndsWith(".troy"));
                    var EndluxR =
                        SkillshotDatabase.Current.FirstOrDefault(p => !string.IsNullOrEmpty(p.EndParticalName) && partical.Name.StartsWith(p.EndParticalName) && partical.Name.EndsWith(".troy"));

                    AIHeroClient pcaster;
                    if (StartluxR != null || MidluxR != null || EndluxR != null)
                    {
                        pdata = SkillshotDatabase.Current.FirstOrDefault(s => s.IsCasterName(Champion.Lux) && s.IsSlot(SpellSlot.R));
                        var luxInStart = EntityManager.Heroes.AllHeroes.FirstOrDefault(h => h.Hero.Equals(Champion.Lux) && h.IsValidTarget() && h.IsInRange(partical, 275));
                        pcaster = luxInStart ?? EntityManager.Heroes.AllHeroes.OrderBy(h => h.Distance(partical)).FirstOrDefault(h => h.BaseSkinName.Equals("Lux") && (h.Spellbook.IsChanneling || h.Spellbook.IsCharging || h.Spellbook.IsCastingSpell || !h.IsHPBarRendered));

                        if (pcaster != null)
                        {
                            var alreadyDetected = DetectedLuxRParticals.FirstOrDefault(p => p.caster != null && !p.FullyDetected && p.caster.IdEquals(pcaster));
                            if (alreadyDetected != null)
                            {
                                if (alreadyDetected.Start == null && StartluxR != null)
                                {
                                    alreadyDetected.Start = partical.Position.To2D();
                                }
                                if (alreadyDetected.Mid == null && MidluxR != null)
                                {
                                    alreadyDetected.Mid = partical.Position.To2D();
                                }
                                if (alreadyDetected.End == null && EndluxR != null)
                                {
                                    alreadyDetected.End = partical.Position.To2D();
                                }
                                return;
                            }
                            var addnew = new LuxRPartical
                            {
                                caster                                                                                              = pcaster,
                                Start                                                                                               = StartluxR != null?partical.Position.To2D() : (Vector2?)null,
                                                                           Mid                                                      = MidluxR != null?partical.Position.To2D() : (Vector2?)null,
                                                                                                          End                       = EndluxR != null?partical.Position.To2D() : (Vector2?)null,
                                                                                                                               Data = pdata
                            };

                            DetectedLuxRParticals.Add(addnew);
                            return;
                        }
                    }
                }
            }

            var missile = sender as MissileClient;
            var caster  = missile?.SpellCaster;

            if (missile == null || caster == null || !missile.IsValid)
            {
                return;
            }

            //var missilename = missile.SData.Name;
            //Console.WriteLine($"{missilename} - mis - {missile.Slot}");

            var data = GetData(caster, null, missile);

            if (data == null)
            {
                //Console.WriteLine($"OnCreateSkillshots: {caster.ChampionName} - [{missile.Slot} | {missilename}] - Not Detected");
                return;
            }

            var Misstart = missile.StartPosition.To2D();
            var Misend   = missile.EndPosition.To2D();

            if (data.IsCasterName(Champion.Shen) && data.IsSlot(SpellSlot.Q))
            {
                Misstart   = missile.Position.To2D();
                Misend     = caster.ServerPosition.To2D();
                data.Range = Misstart.Distance(Misend);
            }

            var detected = new DetectedSkillshotData
            {
                Caster    = caster,
                Target    = missile.Target as AIHeroClient,
                Missile   = missile,
                Start     = Misstart,
                End       = Misend,
                Data      = data,
                StartTick = Core.GameTickCount
            };

            Add(detected);
        }
예제 #10
0
        public static void OnSkillShotDetected_OnDetect(DetectedSkillshotData args)
        {
            if (args.Caster == null || !args.Caster.IsEnemy || !args.WillHit(Player.Instance) || !Program.SubMenu["enabled"].Cast <CheckBox>().CurrentValue)
            {
                return;
            }

            var hero   = args.Caster as AIHeroClient;
            var player = Player.Instance;

            #region Skillshots

            foreach (var shot in Shots.Where(shot => args.Data.MissileName == shot))
            {
                if (player.BaseSkinName == "Zyra")
                {
                    W = new Spell.SimpleSkillshot(SpellSlot.W);
                    E = new Spell.SimpleSkillshot(SpellSlot.E);
                    {
                        if (hero != null && W.IsReady() && E.IsReady())
                        {
                            W.Cast((Vector3)player.ServerPosition.Extend(hero.ServerPosition, 80));
                            E.Cast((Vector3)player.ServerPosition.Extend(hero.ServerPosition, 80));
                        }
                    }
                }

                if (player.BaseSkinName == "Sivir")
                {
                    E = new Spell.Active(SpellSlot.E);
                    {
                        if (hero != null && E.IsReady())
                        {
                            E.Cast();
                        }
                    }
                }

                if (player.BaseSkinName == "Heimerdinger")
                {
                    Q = new Spell.SimpleSkillshot(SpellSlot.Q);
                    {
                        if (hero != null && Q.IsReady())
                        {
                            Q.Cast((Vector3)player.ServerPosition.Extend(hero.ServerPosition, 80));
                        }
                    }
                }

                if (player.BaseSkinName == "Leblanc")
                {
                    R  = new Spell.Active(SpellSlot.R);
                    R1 = new Spell.SimpleSkillshot(SpellSlot.R);
                    {
                        if (hero != null && R.IsReady())
                        {
                            if (player.Spellbook.Spells[3].Name == "LeblancR")
                            {
                                R.Cast();
                                R1.Cast((Vector3)player.ServerPosition.Extend(hero.ServerPosition, 80));
                            }
                            else
                            {
                                R1.Cast((Vector3)player.ServerPosition.Extend(hero.ServerPosition, 80));
                            }
                        }
                    }
                }

                if (player.BaseSkinName == "Shaco")
                {
                    W = new Spell.SimpleSkillshot(SpellSlot.W);
                    {
                        if (hero != null && W.IsReady())
                        {
                            W.Cast((Vector3)player.ServerPosition.Extend(hero.ServerPosition, 80));
                        }
                    }
                }

                if (player.BaseSkinName == "Fiora")
                {
                    W = new Spell.SimpleSkillshot(SpellSlot.W);
                    {
                        if (hero != null && W.IsReady())
                        {
                            W.Cast(hero.ServerPosition);
                        }
                    }
                }

                if (player.BaseSkinName == "Fizz")
                {
                    W = new Spell.Active(SpellSlot.E);
                    {
                        if (hero != null && E.IsReady() && E.ToggleState != 1)
                        {
                            E.Cast();
                        }
                    }
                }

                if (player.BaseSkinName == "Malzahar")
                {
                    W = new Spell.SimpleSkillshot(SpellSlot.W);
                    {
                        if (hero != null && W.IsReady())
                        {
                            W.Cast((Vector3)player.ServerPosition.Extend(hero.ServerPosition, 80));
                        }
                    }
                }

                if (player.BaseSkinName == "MonkeyKing")
                {
                    W = new Spell.Active(SpellSlot.W);
                    {
                        if (hero != null && W.IsReady())
                        {
                            W.Cast();
                        }
                    }
                }

                if (player.BaseSkinName == "Yasuo")
                {
                    W = new Spell.SimpleSkillshot(SpellSlot.W);
                    {
                        if (hero != null && W.IsReady())
                        {
                            W.Cast((Vector3)player.ServerPosition.Extend(hero.ServerPosition, 5));
                        }
                    }
                }

                if (player.BaseSkinName == "Nocturne")
                {
                    E = new Spell.Active(SpellSlot.E);
                    {
                        if (hero != null && E.IsReady())
                        {
                            E.Cast();
                        }
                    }
                }
            }

            #endregion

            #region Hooks

            foreach (var hook in Hooks.Where(hook => args.Data.MissileName == hook))
            {
                if (player.BaseSkinName == "Zyra")
                {
                    W = new Spell.SimpleSkillshot(SpellSlot.W);
                    E = new Spell.SimpleSkillshot(SpellSlot.E);
                    {
                        if (hero != null && W.IsReady() && E.IsReady())
                        {
                            W.Cast((Vector3)player.ServerPosition.Extend(hero.ServerPosition, 80));
                            E.Cast((Vector3)player.ServerPosition.Extend(hero.ServerPosition, 80));
                        }
                    }
                }

                if (player.BaseSkinName == "Sivir")
                {
                    E = new Spell.Active(SpellSlot.E);
                    {
                        if (hero != null && E.IsReady())
                        {
                            E.Cast();
                        }
                    }
                }

                if (player.BaseSkinName == "Anivia")
                {
                    W = new Spell.SimpleSkillshot(SpellSlot.W);
                    {
                        if (hero != null && W.IsReady())
                        {
                            Core.DelayAction(() => W.Cast((Vector3)player.ServerPosition.Extend(hero.ServerPosition, 50)), (int)player.Distance(hero) / 2);
                        }
                    }
                }

                if (player.BaseSkinName == "Heimerdinger")
                {
                    Q = new Spell.SimpleSkillshot(SpellSlot.Q);
                    {
                        if (hero != null && Q.IsReady())
                        {
                            Q.Cast((Vector3)player.ServerPosition.Extend(hero.ServerPosition, 80));
                        }
                    }
                }

                if (player.BaseSkinName == "Leblanc")
                {
                    R  = new Spell.Active(SpellSlot.R);
                    R1 = new Spell.SimpleSkillshot(SpellSlot.R);
                    {
                        if (hero != null && R.IsReady())
                        {
                            if (player.Spellbook.Spells[3].Name == "LeblancR")
                            {
                                R.Cast();
                                R1.Cast((Vector3)player.ServerPosition.Extend(hero.ServerPosition, 80));
                            }
                            else
                            {
                                R1.Cast((Vector3)player.ServerPosition.Extend(hero.ServerPosition, 50));
                            }
                        }
                    }
                }

                if (player.BaseSkinName == "Shaco")
                {
                    W = new Spell.SimpleSkillshot(SpellSlot.W);
                    {
                        if (hero != null && W.IsReady())
                        {
                            W.Cast((Vector3)player.ServerPosition.Extend(hero.ServerPosition, 80));
                        }
                    }
                }

                if (player.BaseSkinName == "Fiora")
                {
                    W = new Spell.SimpleSkillshot(SpellSlot.W);
                    {
                        if (hero != null && W.IsReady())
                        {
                            W.Cast(hero.ServerPosition);
                        }
                    }
                }

                if (player.BaseSkinName == "Fizz")
                {
                    E = new Spell.Active(SpellSlot.E);
                    {
                        if (hero != null && E.IsReady() && E.ToggleState != 1)
                        {
                            E.Cast();
                        }
                    }
                }

                if (player.BaseSkinName == "Malzahar")
                {
                    W = new Spell.SimpleSkillshot(SpellSlot.W);
                    {
                        if (hero != null && W.IsReady())
                        {
                            W.Cast((Vector3)player.ServerPosition.Extend(hero.ServerPosition, 80));
                        }
                    }
                }

                if (player.BaseSkinName == "Trundle")
                {
                    E = new Spell.SimpleSkillshot(SpellSlot.E, 1000);
                    {
                        if (hero != null && E.IsReady())
                        {
                            Core.DelayAction(() => E.Cast((Vector3)player.ServerPosition.Extend(hero.ServerPosition, 50)), (int)player.Distance(hero) / 2);
                        }
                    }
                }

                if (player.BaseSkinName == "MonkeyKing")
                {
                    W = new Spell.Active(SpellSlot.W);
                    {
                        if (hero != null && W.IsReady())
                        {
                            W.Cast();
                        }
                    }
                }

                if (player.BaseSkinName == "Yasuo")
                {
                    W = new Spell.SimpleSkillshot(SpellSlot.W);
                    {
                        if (hero != null && W.IsReady())
                        {
                            W.Cast((Vector3)player.ServerPosition.Extend(hero.ServerPosition, 5));
                        }
                    }
                }

                if (player.BaseSkinName == "Nocturne")
                {
                    E = new Spell.Active(SpellSlot.E);
                    {
                        if (hero != null && E.IsReady())
                        {
                            E.Cast();
                        }
                    }
                }
            }

            #endregion
        }