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); }
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); }
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); } } } }