Exemplo n.º 1
0
        private static SkillshotData GetData(Obj_AI_Base caster, GameObjectProcessSpellCastEventArgs args, MissileClient missile = null)
        {
            var spellName    = args?.SData.Name ?? missile?.SData.Name;
            var slot         = args?.Slot ?? missile?.Slot;
            var target       = (args?.Target ?? missile?.Target) as Obj_AI_Base;
            var isAutoAttack = (args?.IsAutoAttack() ?? missile?.IsAutoAttack()).GetValueOrDefault();

            SkillshotData result = SkillshotDatabase.Current.FirstOrDefault(s =>
                                                                            s.IsCasterName(caster.BaseSkinName) && (missile != null || s.IsSlot(slot)) && s.HasBuff(caster) &&
                                                                            ((missile == null && s.IsSpellName(spellName)) || (args == null && s.IsMissileName(spellName))) &&
                                                                            (!s.DetectByMissile || missile != null) &&
                                                                            (!(s.EndSticksToTarget || s.StartsFromTarget || s.IsAutoAttack) || (target != null && !target.IsMe)) &&
                                                                            (!isAutoAttack || s.IsAutoAttack));

            return(result);
        }
Exemplo n.º 2
0
        internal static SkillshotData GetData(Obj_AI_Base caster, GameObjectProcessSpellCastEventArgs args, MissileClient missile)
        {
            SkillshotData result = null;
            var           hero   = caster as AIHeroClient;

            List <SkillshotData> AllData = SkillshotDatabase.List.FindAll(s => hero != null ? s.hero.Equals(Champion.Unknown) || s.hero.Equals(hero.Hero) : !string.IsNullOrEmpty(s.CasterName) && caster.BaseSkinName.StartsWith(s.CasterName));

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

            if (missile == null)
            {
                var slotData = AllData.FindAll(s => s.slot.Equals(args.Slot) || s.slot.Equals(SpellSlot.Unknown));
                if (slotData != null && slotData.Any())
                {
                    var spellname = args.SData.Name;
                    var data      =
                        slotData.FirstOrDefault(
                            s =>
                            !string.IsNullOrEmpty(s.SpellName) && s.SpellName.Equals(spellname, StringComparison.CurrentCultureIgnoreCase) ||
                            s.ExtraSpellName != null && s.ExtraSpellName.Any(x => x.Equals(spellname, StringComparison.CurrentCultureIgnoreCase)));

                    if (data != null && !data.DetectByMissile && (string.IsNullOrEmpty(data.RequireBuff) || caster.GetBuffCount(data.RequireBuff) >= data.RequireBuffCount) && (data.StartsFromTarget && args.Target != null || !data.StartsFromTarget))
                    {
                        result = data;
                    }
                }
            }
            else
            {
                var missilename = missile.SData.Name;
                var data        =
                    AllData.FirstOrDefault(
                        s =>
                        !string.IsNullOrEmpty(s.MissileName) && s.MissileName.Equals(missilename, StringComparison.CurrentCultureIgnoreCase) ||
                        s.ExtraMissileName != null && s.ExtraMissileName.Any(x => x.Equals(missilename, StringComparison.CurrentCultureIgnoreCase)));

                if (data != null && (string.IsNullOrEmpty(data.RequireBuff) || caster.GetBuffCount(data.RequireBuff) >= data.RequireBuffCount) && !data.StartsFromTarget)
                {
                    result = data;
                }
            }
            return(result);
        }
Exemplo n.º 3
0
        private static void Obj_AI_Base_OnProcessSpellCast(Obj_AI_Base sender, GameObjectProcessSpellCastEventArgs args)
        {
            if (sender.IsMe)
            {
                foreach (var o in SkillshotDatabase.Spells.Where(x => x.SpellName == args.SData.Name))
                {
                    foreach (var i in Damage.Spells
                             .Where(d => d.Key == o.ChampionName)
                             .SelectMany(item => item.Value).Where(i => i.Slot == (SpellSlot)o.Slot))
                    {
                        if (i.DamageType == Damage.DamageType.Physical)
                        {
                            CanManamune = true;
                        }
                    }
                }

                foreach (var o in TargetSpellDatabase.Spells.Where(x => x.Name == args.SData.Name.ToLower()))
                {
                    foreach (var i in Damage.Spells.Where(d => d.Key == o.ChampionName)
                             .SelectMany(item => item.Value).Where(i => i.Slot == (SpellSlot)o.Spellslot))
                    {
                        if (i.DamageType == Damage.DamageType.Physical)
                        {
                            CanManamune = true;
                        }
                    }
                }

                if (Me.GetSpellSlot(args.SData.Name) == SpellSlot.Unknown &&
                    (Origin.Item("usecombo").GetValue <KeyBind>().Active || args.Target.Type == Me.Type))
                {
                    CanManamune = true;
                }
                else
                {
                    Utility.DelayAction.Add(400, () => CanManamune = false);
                }
            }

            Attacker = null;
            if (sender.Type == GameObjectType.obj_AI_Hero && sender.IsEnemy)
            {
                var heroSender = ObjectManager.Get <Obj_AI_Hero>().First(x => x.NetworkId == sender.NetworkId);
                if (heroSender.GetSpellSlot(args.SData.Name) == SpellSlot.Unknown && args.Target.Type == Me.Type)
                {
                    Danger      = false; Dangercc = false; DangerUlt = false;
                    AggroTarget = ObjectManager.GetUnitByNetworkId <Obj_AI_Hero>(args.Target.NetworkId);

                    IncomeDamage = (float)heroSender.GetAutoAttackDamage(AggroTarget);

                    Logger(LogType.Damage,
                           heroSender.SkinName + " hit (Auto Attack) " + AggroTarget.SkinName + " for: " + IncomeDamage);
                }

                Attacker = heroSender;
                foreach (var o in TargetSpellDatabase.Spells.Where(x => x.Name == args.SData.Name.ToLower()))
                {
                    Stealth = o.Stealth;
                    if (o.Type == SpellType.Skillshot)
                    {
                        continue;
                    }

                    if (o.Type == SpellType.Self)
                    {
                        Utility.DelayAction.Add((int)(o.Delay), delegate
                        {
                            AggroTarget =
                                ObjectManager.Get <Obj_AI_Hero>()
                                .OrderBy(x => x.Distance(heroSender.ServerPosition))
                                .FirstOrDefault(x => x.IsAlly);

                            if (AggroTarget != null && AggroTarget.Distance(heroSender.ServerPosition, true) <= o.Range * o.Range)
                            {
                                IncomeDamage = (float)heroSender.GetSpellDamage(AggroTarget, (SpellSlot)o.Spellslot);

                                if (o.Wait)
                                {
                                    return;
                                }

                                Spell     = true;
                                Danger    = Origin.Item(o.Name.ToLower() + "ccc").GetValue <bool>();
                                DangerUlt = Origin.Item(o.Name.ToLower() + "ccc").GetValue <bool>() && o.Spellslot.ToString() == "R";
                                Dangercc  = o.CcType != CcType.No && o.Type != SpellType.AutoAttack;

                                Logger(LogType.Damage, "Danger (Self: " + o.Spellslot + "): " + Danger);
                                Logger(LogType.Damage,
                                       heroSender.SkinName + " hit (Self: " + o.Spellslot + ") " + AggroTarget.SkinName + " for: " + IncomeDamage);
                            }
                        });
                    }

                    if (o.Type == SpellType.Targeted && args.Target.Type == Me.Type)
                    {
                        Utility.DelayAction.Add((int)(o.Delay), delegate
                        {
                            AggroTarget =
                                ObjectManager.GetUnitByNetworkId <Obj_AI_Hero>(args.Target.NetworkId);

                            IncomeDamage = (float)heroSender.GetSpellDamage(AggroTarget, (SpellSlot)o.Spellslot);

                            Logger(LogType.Damage, "Dangerous (Targetd: " + o.Spellslot + "): " + Danger);
                            Logger(LogType.Damage,
                                   heroSender.SkinName + " hit (Targeted: " + o.Spellslot + ") " + AggroTarget.SkinName + " for: " + IncomeDamage);

                            if (o.Wait)
                            {
                                return;
                            }

                            Spell     = true;
                            Danger    = Origin.Item(o.Name.ToLower() + "ccc").GetValue <bool>();
                            DangerUlt = Origin.Item(o.Name.ToLower() + "ccc").GetValue <bool>() && o.Spellslot.ToString() == "R";
                            Dangercc  = o.CcType != CcType.No && o.Type != SpellType.AutoAttack;
                        });
                    }
                }

                foreach (var o in SkillshotDatabase.Spells.Where(x => x.SpellName == args.SData.Name))
                {
                    var skillData =
                        new SkillshotData(o.ChampionName, o.SpellName, o.Slot, o.Type, o.Delay, o.Range,
                                          o.Radius, o.MissileSpeed, o.AddHitbox, o.FixedRange, o.DangerValue);

                    var endPosition = args.Start.To2D() +
                                      o.Range * (args.End.To2D() - heroSender.ServerPosition.To2D()).Normalized();

                    var skillShot = new Skillshot(DetectionType.ProcessSpell, skillData, Environment.TickCount,
                                                  heroSender.ServerPosition.To2D(), endPosition, heroSender);

                    var castTime = (o.DontAddExtraDuration ? 0 : o.ExtraDuration) + o.Delay +
                                   (int)(1000 * heroSender.Distance(Friendly().ServerPosition) / o.MissileSpeed) -
                                   (Environment.TickCount - skillShot.StartTick);

                    AggroTarget =
                        ObjectManager.Get <Obj_AI_Hero>()
                        .FirstOrDefault(x => !skillShot.IsSafe(x.ServerPosition.To2D()) && x.IsAlly);

                    if (AggroTarget != null)
                    {
                        Utility.DelayAction.Add(castTime - 400, delegate
                        {
                            Spell        = true;
                            Danger       = Origin.Item(o.SpellName.ToLower() + "ccc").GetValue <bool>();
                            DangerUlt    = Origin.Item(o.SpellName.ToLower() + "ccc").GetValue <bool>() && o.Slot.ToString() == "R";
                            IncomeDamage = (float)heroSender.GetSpellDamage(AggroTarget, (SpellSlot)skillShot.SkillshotData.Slot);

                            Logger(LogType.Damage, "Dangerous (Skillshot " + o.Slot + "): " + Danger);
                            Logger(LogType.Damage,
                                   heroSender.SkinName + " may hit (SkillShot: " + o.Slot + ") " + AggroTarget.SkinName + " for: " + IncomeDamage);
                        });
                    }
                }
            }

            if (sender.Type == GameObjectType.obj_AI_Minion && sender.IsEnemy)
            {
                if (args.Target.Type == Me.Type)
                {
                    Danger      = false; Dangercc = false; DangerUlt = false;
                    AggroTarget = ObjectManager.GetUnitByNetworkId <Obj_AI_Hero>(args.Target.NetworkId);

                    MinionDamage =
                        (float)sender.CalcDamage(AggroTarget, Damage.DamageType.Physical,
                                                 sender.BaseAttackDamage + sender.FlatPhysicalDamageMod);
                }
            }

            if (sender.Type == GameObjectType.obj_AI_Turret && sender.IsEnemy)
            {
                if (args.Target.Type == Me.Type)
                {
                    Danger = false; Dangercc = false; DangerUlt = false;
                    if (sender.Distance(Friendly().ServerPosition, true) <= 900 * 900)
                    {
                        AggroTarget = ObjectManager.GetUnitByNetworkId <Obj_AI_Hero>(args.Target.NetworkId);

                        IncomeDamage =
                            (float)sender.CalcDamage(AggroTarget, Damage.DamageType.Physical,
                                                     sender.BaseAttackDamage + sender.FlatPhysicalDamageMod);

                        Logger(LogType.Damage,
                               sender.Name + " (Turret Attack) " + AggroTarget.SkinName + " for: " + IncomeDamage);
                    }
                }
            }
        }