public async Task <bool> UseItems(UnitBase unitBase) { if (!unitBase.Hero.CanUseItems()) { return(true); } if (unitBase is Tempest) { var ability = unitBase.Hero.GetItemById(ItemId.item_sphere); if (ability != null && ability.CanBeCasted() && ability.CanHit(Core.MainHero.Hero)) { ability.UseAbility(Core.MainHero.Hero); var delayTime = ability.GetAbilityDelay(); Printer.Both( $"[{unitBase}][Linken] To main hero-> ({delayTime})"); await Await.Delay(delayTime, Core.ComboToken.Token); } if (OrderManager.CurrentOrder is DefaultCombo) { ability = unitBase.Hero.GetItemById(ItemId.item_solar_crest) ?? unitBase.Hero.GetItemById(ItemId.item_medallion_of_courage); if (ability != null && ability.CanBeCasted() && ability.CanHit(Core.MainHero.Hero)) { ability.UseAbility(Core.MainHero.Hero); var delayTime = ability.GetAbilityDelay(); Printer.Both( $"[{unitBase}][Solar] To main hero-> ({delayTime})"); await Await.Delay(delayTime, Core.ComboToken.Token); } } } var counter = 0; foreach (var ability in unitBase.GetItems()) { if (!ability.CanBeCasted(Core.Target)) { Printer.Log($"cant use {ability.Name} to {Core.Target.Name}"); continue; } var canHit = (ability.GetItemId() == ItemId.item_blink ? unitBase.Hero.Distance2D(Core.Target) - MenuManager.GetBlinkExtraRange < ability.TravelDistance() : ability.CanHit(Core.Target)) || _afterBlink.Sleeping; var isNoTarget = ability.IsAbilityBehavior(AbilityBehavior.NoTarget) && (unitBase.Hero.Distance2D(Core.Target) <= 750 || ability.IsInvis()); if (!canHit && !isNoTarget) { Printer.Both($"{ability.Name} cant hit target!"); continue; } /*if (isNoTarget && unitBase.Hero.Distance2D(Core.Target)>=800) * continue;*/ // if (canHit || _afterBlink) if (_afterInvis.Sleeping || unitBase.Hero.IsInvisible()) { Printer.Both($"{ability.Name} cant cast, cuz under invis!"); continue; } var delayTime = 0; if (ability.IsAbilityBehavior(AbilityBehavior.NoTarget)) { if (ability.IsInvis()) { _afterInvis.Sleep(500); } ability.UseAbility(); } else if (ability.IsAbilityBehavior(AbilityBehavior.UnitTarget)) { if (ability.GetItemId() == ItemId.item_hurricane_pike) { ability.UseAbility(unitBase.Hero); } else if (ability.TargetTeamType == TargetTeamType.Enemy || ability.TargetTeamType == TargetTeamType.All || ability.TargetTeamType == TargetTeamType.Custom || ability.TargetTeamType == (TargetTeamType)7) { var amWithAghUnderLinken = Core.Target.ClassId == ClassId.CDOTA_Unit_Hero_AntiMage && Core.Target.GetItemById(ItemId.item_ultimate_scepter) != null && Core.Target.GetAbilityById(AbilityId.antimage_spell_shield) .CanBeCasted(); var isDisable = ability.IsDisable(); if ((Core.Target.IsLinkensProtected() || amWithAghUnderLinken) && (isDisable || ability.IsDagon() || ability.GetItemId() == ItemId.item_ethereal_blade)) { counter++; continue; } if (ability.GetItemId() == ItemId.item_ethereal_blade && unitBase.GetItems() .Any( x => (x.GetItemId() == ItemId.item_dagon || x.GetItemId() == ItemId.item_dagon_2 || x.GetItemId() == ItemId.item_dagon_3 || x.GetItemId() == ItemId.item_dagon_4 || x.GetItemId() == ItemId.item_dagon_5) && x.CanBeCasted())) { ability.UseAbility(Core.Target); await Core.Target.WaitGainModifierAsync("modifier_item_ethereal_blade_ethereal", 2, Core.ComboToken.Token); } else { var slarkMod = Core.Target.HasModifiers( new[] { "modifier_slark_dark_pact", "modifier_slark_dark_pact_pulses" }, false); var lotusMid = Core.Target.HasModifier("modifier_item_lotus_orb_active"); if ((slarkMod || lotusMid) && isDisable) { counter++; continue; } if (ability.GetItemId() == ItemId.item_sheepstick && GlobalHexSleeper.Sleeping) { counter++; continue; } if ((ability.GetItemId() == ItemId.item_orchid || ability.GetItemId() == ItemId.item_bloodthorn) && GlobalOrchidSleeper.Sleeping) { counter++; continue; } if (isDisable) { if (Core.Target.IsUnitState(UnitState.Stunned) || Core.Target.IsUnitState(UnitState.Hexed)) { var time = Ensage.Common.Utils.DisableDuration(Core.Target); if (time >= 0.35f) { counter++; continue; } } ability.UseAbility(Core.Target); GlobalHexSleeper.Sleep(800); } else { if (ability.IsSilence()) { if (Core.Target.IsSilenced()) { counter++; continue; } GlobalOrchidSleeper.Sleep(800); } ability.UseAbility(Core.Target); } } } else { ability.UseAbility(unitBase.Hero); } } else { if (ability.GetItemId() == ItemId.item_blink) { _afterBlink.Sleep(1000); var pos = (Core.Target.NetworkPosition - unitBase.Hero.NetworkPosition).Normalized(); var firstDist = Core.Target.NetworkPosition.Distance2D(unitBase.Hero.NetworkPosition); pos *= firstDist <= ability.TravelDistance() ? 50 : MenuManager.GetBlinkExtraRange; pos = Core.Target.NetworkPosition - pos; if (pos.Distance2D(unitBase.Hero.NetworkPosition) < MenuManager.GetBlinkMinRange) { counter++; continue; } ability.UseAbility(pos); } else { ability.UseAbility(Core.Target.Position); } } delayTime = ability.GetAbilityDelay(); Printer.Both( $"[{unitBase}][item] {ability.Name} ({delayTime}) [After Blink: {_afterBlink.Sleeping}] [{ability.TravelDistance()}]"); await Await.Delay(delayTime, Core.ComboToken.Token); await Task.Delay(150, Core.ComboToken.Token); } Printer.Log("now we can use abilities -> " + (unitBase.GetItems().Count(x => x.CanBeCasted()) <= counter)); return(unitBase.GetItems().Count(x => x.CanBeCasted()) <= counter); }
public async Task <bool> UseItems(UnitBase unitBase) { if (!unitBase.Hero.CanUseItems()) { return(true); } foreach (var ability in unitBase.GetItems()) { if (!ability.CanBeCasted(Core.Target)) { continue; } var canHit = ability.CanHit(Core.Target) || _afterBlink.Sleeping; var isNoTarget = ability.IsAbilityBehavior(AbilityBehavior.NoTarget) && unitBase.Hero.Distance2D(Core.Target) <= 750; if (!canHit && !isNoTarget) { Printer.Both($"{ability.Name} cant hit target!"); continue; } /*if (isNoTarget && unitBase.Hero.Distance2D(Core.Target)>=800) * continue;*/ // if (canHit || _afterBlink) var delayTime = 0; if (ability.IsAbilityBehavior(AbilityBehavior.NoTarget)) { ability.UseAbility(); } else if (ability.IsAbilityBehavior(AbilityBehavior.UnitTarget)) { if (ability.GetItemId() == ItemId.item_hurricane_pike) { ability.UseAbility(unitBase.Hero); } else if (ability.TargetTeamType == TargetTeamType.Enemy || ability.TargetTeamType == TargetTeamType.All || ability.TargetTeamType == TargetTeamType.Custom || ability.TargetTeamType == (TargetTeamType)7) { var isDisable = ability.IsDisable(); if (Core.Target.IsLinkensProtected() && isDisable) { continue; } if (ability.GetItemId() == ItemId.item_ethereal_blade && unitBase.GetItems() .Any( x => (x.GetItemId() == ItemId.item_dagon || x.GetItemId() == ItemId.item_dagon_2 || x.GetItemId() == ItemId.item_dagon_3 || x.GetItemId() == ItemId.item_dagon_4 || x.GetItemId() == ItemId.item_dagon_5) && x.CanBeCasted())) { ability.UseAbility(Core.Target); await Core.Target.WaitGainModifierAsync("modifier_item_ethereal_blade_ethereal", 2, Core.ComboToken.Token); } else { var slarkMod = Core.Target.HasModifiers( new[] { "modifier_slark_dark_pact", "modifier_slark_dark_pact_pulses" }, false); if (slarkMod && isDisable) { continue; } if (ability.GetItemId() == ItemId.item_sheepstick && GlobalHexSleeper.Sleeping) { continue; } if ((ability.GetItemId() == ItemId.item_orchid || ability.GetItemId() == ItemId.item_bloodthorn) && GlobalOrchidSleeper.Sleeping) { continue; } if (isDisable) { if (Core.Target.IsUnitState(UnitState.Stunned) || Core.Target.IsUnitState(UnitState.Hexed)) { var time = Ensage.Common.Utils.DisableDuration(Core.Target); if (time >= 0.35f) { continue; } } ability.UseAbility(Core.Target); GlobalHexSleeper.Sleep(800); } else { if (ability.IsSilence()) { if (Core.Target.IsSilenced()) { continue; } GlobalOrchidSleeper.Sleep(800); } ability.UseAbility(Core.Target); } } } else { ability.UseAbility(unitBase.Hero); } } else { if (ability.GetItemId() == ItemId.item_blink) { _afterBlink.Sleep(500); var pos = (Core.Target.NetworkPosition - unitBase.Hero.NetworkPosition).Normalized(); pos *= 50; pos = Core.Target.NetworkPosition - pos; ability.UseAbility(pos); } else { ability.UseAbility(Core.Target.Position); } } delayTime = ability.GetAbilityDelay(); Printer.Both( $"[{unitBase}][item] {ability.Name} ({delayTime}) [After Blink: {_afterBlink.Sleeping}] [{ability.AbilityBehavior}]"); await Await.Delay(delayTime, Core.ComboToken.Token); } return(!unitBase.GetItems().Any(x => x.CanBeCasted())); }