/// <summary> /// Executes the module given a target. /// </summary> /// <param name="target">The target.</param> public void Execute(Obj_AI_Base target) { try { if (target is AIHeroClient) { var targetHero = target as AIHeroClient; if (targetHero.IsValidTarget()) { //If the Harass mode is agressive and the target has 1 W Stacks + 1 for current AA then we Q for the third. if (Orbwalker.ActiveModesFlags.HasFlag(Orbwalker.ActiveModes.Harass) && targetHero.GetWBuff().Count != 1 && MenuGenerator.HarassMenu["TDVaynemixedmode"].Cast <Slider>().CurrentValue == 1) { return; } //If they are autoattacking or winding up and Harass mode is passive we AA them then Q backwards. if (Orbwalker.ActiveModesFlags.HasFlag(Orbwalker.ActiveModes.Harass) && MenuGenerator.HarassMenu["TDVaynemixedmode"].Cast <Slider>().CurrentValue == 0 && (targetHero.Spellbook.IsAutoAttacking || targetHero.Spellbook.IsAutoAttacking) && AutoAttacks.IsAutoAttack(target.LastCastedSpellName()) && target.LastCastedSpellTarget().IsValid&& target.LastCastedSpellTarget() is AIHeroClient) { var backwardsPosition = ObjectManager.Player.ServerPosition.Extend(target.ServerPosition, -300f); if (backwardsPosition.To3D().IsSafe()) { CastTumble(backwardsPosition.To3D(), targetHero); } return; } if (MenuGenerator.QMenu["TDVaynemisctumblesmartQ"].Cast <CheckBox>().CurrentValue) { var position = Provider.GetTDVayneQPosition(); if (position != Vector3.Zero) { CastTumble(position, targetHero); } } else { var position = ObjectManager.Player.ServerPosition.Extend(Game.CursorPos, 300f); if (position.To3D().IsSafe()) { CastTumble(position.To3D(), targetHero); } } } } } catch (NullReferenceException kappa) { } }
private static void Obj_AI_Base_OnPlayAnimation(Obj_AI_Base sender, GameObjectPlayAnimationEventArgs args) { if (!sender.IsMe) { return; } if (AutoAttacks.IsDashAutoAttackReset(Player.Instance, args)) { LastAAReset = Core.GameTickCount; } }
/// <summary> /// Called when an unit has executed the windup time for a skill. /// </summary> /// <param name="sender">The unit.</param> /// <param name="args">The <see cref="GameObjectProcessSpellCastEventArgs" /> instance containing the event data.</param> private void OnDoCast(Obj_AI_Base sender, GameObjectProcessSpellCastEventArgs args) { if (sender.IsMe && AutoAttacks.IsAutoAttack(args.SData.Name) && args.Target is Obj_AI_Base) { foreach (var skill in Variables.skills) { if (skill.GetSkillMode() == SkillMode.OnAfterAA) { if ((Orbwalker.ActiveModesFlags.HasFlag(Orbwalker.ActiveModes.Combo) || Orbwalker.ActiveModesFlags.HasFlag(Orbwalker.ActiveModes.Harass)) && args.Target != null) { skill.Execute(args.Target as Obj_AI_Base); } if (Orbwalker.ActiveModesFlags.HasFlag(Orbwalker.ActiveModes.LaneClear) && args.Target != null) { skill.ExecuteFarm(args.Target as Obj_AI_Base); } } } } }
/// <summary> /// Fired when the game processes a spell cast. /// </summary> /// <param name="sender">The sender.</param> /// <param name="args">The <see cref="GameObjectProcessSpellCastEventArgs" /> instance containing the event data.</param> private static void ObjAiBaseOnOnProcessSpellCast(Obj_AI_Base sender, GameObjectProcessSpellCastEventArgs args) { if (!sender.IsValidTarget(3000, false) || sender.Team != ObjectManager.Player.Team || sender is AIHeroClient || !AutoAttacks.IsAutoAttack(args.SData.Name) || !(args.Target is Obj_AI_Base)) { return; } var target = (Obj_AI_Base)args.Target; ActiveAttacks.Remove(sender.NetworkId); var attackData = new PredictedDamage( sender, target, Core.GameTickCount - Game.Ping / 2, sender.AttackCastDelay * 1000, sender.AttackDelay * 1000 - (sender is Obj_AI_Turret ? 70 : 0), sender.IsMelee ? int.MaxValue : (int)args.SData.MissileSpeed, sender.GetAutoAttackDamage(target, true)); ActiveAttacks.Add(sender.NetworkId, attackData); }
/// <summary> /// Loads this instance. /// </summary> public override void Load() { var superParent = new SuperParent(this.DisplayName); var orbwalkerModule = new OrbwalkerModule(); orbwalkerModule.Load(); var graphGeneratorModule = new GraphGeneratorModule(null); var pathfinderModule = new PathfinderModule(); var damageCalculator = new DamageCalculatorParent(); //var ireliaP = new IreliaP(); var ireliaQ = new IreliaQ(graphGeneratorModule, pathfinderModule); graphGeneratorModule.IreliaQ = ireliaQ; var ireliaW = new IreliaW(); var ireliaE = new IreliaE(); var ireliaR = new IreliaR(); var aa = new AutoAttacks(); damageCalculator.Add(aa); damageCalculator.Add(ireliaQ); damageCalculator.Add(ireliaW); damageCalculator.Add(ireliaE); damageCalculator.Add(ireliaR); graphGeneratorModule.IreliaQ = ireliaQ; var spellInterrupterModule = new SpellInterrupterModule(new SpellInterrupter(ireliaE.Spell, sender => ireliaE.CanStun(sender))); var dashToMouseModule = new PathfindToMouseModule(ireliaQ); var spellParent = new SpellParent.SpellParent(); spellParent.Add(new List <Base> { ireliaQ, ireliaW, ireliaE, ireliaR, }); spellParent.Load(); var comboParent = new OrbwalkingParent( "Combo", orbwalkerModule.OrbwalkerInstance, Orbwalking.OrbwalkingMode.Combo); var laneClearParent = new OrbwalkingParent( "LaneClear", orbwalkerModule.OrbwalkerInstance, Orbwalking.OrbwalkingMode.LaneClear); var lastHitParent = new OrbwalkingParent( "LastHit", orbwalkerModule.OrbwalkerInstance, Orbwalking.OrbwalkingMode.LastHit, Orbwalking.OrbwalkingMode.Mixed, Orbwalking.OrbwalkingMode.LaneClear); var mixedParent = new OrbwalkingParent( "Mixed", orbwalkerModule.OrbwalkerInstance, Orbwalking.OrbwalkingMode.Mixed); var drawingParent = new Parent("Drawings"); comboParent.Add( new List <Base> { new Q(ireliaQ, damageCalculator).Guardian(new SpellMustBeReady(SpellSlot.Q)), new W(ireliaW, ireliaQ).Guardian(new SpellMustBeReady(SpellSlot.W)), new E(ireliaE).Guardian(new SpellMustBeReady(SpellSlot.E)).Guardian(new PlayerMustNotBeWindingUp()), new R(ireliaR, ireliaQ, damageCalculator).Guardian(new SpellMustBeReady(SpellSlot.R)) .Guardian(new PlayerMustNotBeWindingUp()) }); laneClearParent.Add( new List <Base> { new LaneClear.W(ireliaW).Guardian(new SpellMustBeReady(SpellSlot.W)), new LaneClear.E(ireliaE).Guardian(new SpellMustBeReady(SpellSlot.E)) .Guardian(new PlayerMustNotBeWindingUp()) }); lastHitParent.Add( new List <Base> { new LastHit.Q(ireliaQ).Guardian(new SpellMustBeReady(SpellSlot.Q)), new LastHit.E(ireliaE).Guardian(new SpellMustBeReady(SpellSlot.E)) .Guardian(new PlayerMustNotBeWindingUp()) }); mixedParent.Add( new List <Base> { new Q(ireliaQ, damageCalculator).Guardian(new SpellMustBeReady(SpellSlot.Q)), new W(ireliaW, ireliaQ).Guardian(new SpellMustBeReady(SpellSlot.W)), new Mixed.E(ireliaE).Guardian(new SpellMustBeReady(SpellSlot.E)) .Guardian(new PlayerMustNotBeWindingUp()) }); var module = new DamageDrawingParent("Damage Drawings"); const byte defaultAlpha = 50 * 255 / 100; module.Add( new List <IDamageDrawing> { new DamageDrawingChild("Auto-Attacks", aa.GetDamage) { Color = new Color(40, 175, 175) { A = defaultAlpha }, }, new DamageDrawingChild("Q", ireliaQ.GetDamage) { Color = new Color(25, 100, 125) { A = defaultAlpha } }, new DamageDrawingChild("W", ireliaW.GetDamage) { Color = new Color(40, 175, 175) { A = defaultAlpha } }, new DamageDrawingChild("E", ireliaE.GetDamage) { Color = new Color(255, 210, 95) { A = defaultAlpha } }, new DamageDrawingChild("R", ireliaR.GetDamage) { Color = new Color(240, 150, 75) { A = defaultAlpha } } }); var spellRangeParent = new Parent("Ranges"); spellRangeParent.Add( new List <Base> { new RangeDrawingChild(ireliaQ.Spell, "Q"), new RangeDrawingChild(ireliaE.Spell, "E"), new RangeDrawingChild(ireliaR.Spell, "R", true), }); drawingParent.Add(new List <Base> { spellRangeParent, module }); superParent.Add( new List <Base> { orbwalkerModule, spellParent, damageCalculator, pathfinderModule, graphGeneratorModule, comboParent, laneClearParent, lastHitParent, mixedParent, dashToMouseModule, spellInterrupterModule, drawingParent }); superParent.Load(); superParent.Menu.Style = FontStyle.Bold; superParent.Menu.Color = Color.Firebrick; }
/// <summary> /// Returns the last GameTickCount for the Attack. /// </summary> public static float?LastPlayerAttack(this Obj_AI_Base target) { return(AutoAttacks.FirstOrDefault(a => a.Attacker.NetworkId.Equals(target.NetworkId) && 300 + (a.Attacker.AttackCastDelay * 1000) + (a.Attacker.AttackDelay * 1000) > Core.GameTickCount - a.LastAttackTick)?.LastAttackTick); }
/// <summary> /// Returns True if the target is attacking a player. /// </summary> public static bool IsAttackPlayer(this Obj_AI_Base target) { return(AutoAttacks.FirstOrDefault(a => a.Attacker.NetworkId.Equals(target.NetworkId) && 500 + (a.Attacker.AttackCastDelay * 1000) + (a.Attacker.AttackDelay * 1000) > Core.GameTickCount - a.LastAttackTick) != null); }