private static void DodgeSkillShots() { if (!Situation.ShouldDodge()) { IsDodging = false; return; } if (IsDodging) { if (LastPosInfo == null) { return; } var lastBestPosition = LastPosInfo.Position; if (!ObjectCache.MenuCache.Cache["ClickOnlyOnce"].Enabled && MyHero.Path.Count() > 0 && LastPosInfo.Position.Distance(MyHero.Path.Last().To2D()) < 5) { return; } EvadeCommand.MoveTo(lastBestPosition); LastEvadeOrderTime = Environment.TickCount; } else { //Check if hero will walk into a skillshot var path = MyHero.Path; if (path.Length <= 0) { return; } var movePos = path[path.Length - 1].To2D(); if (!EvadeHelper.CheckMovePath(movePos)) { return; } var posInfo = EvadeHelper.GetBestPositionMovementBlock(movePos); if (posInfo != null) { EvadeCommand.MoveTo(posInfo.Position); } } }
private void Game_OnIssueOrder(Obj_AI_Base hero, Obj_AI_BaseIssueOrderEventArgs args) { if (!hero.IsMe) { return; } if (!Situation.ShouldDodge()) { return; } if (args.OrderType == OrderType.MoveTo) { if (IsDodging && SpellDetector.Spells.Any()) { var limitDelay = ObjectCache.MenuCache.Cache["TickLimiter"].As <MenuSlider>(); //Tick limiter if (Environment.TickCount - LastTickCount < limitDelay.Value) { LastTickCount = Environment.TickCount; args.ProcessEvent = false; return; } CheckHeroInDanger(); LastBlockedUserMoveTo = new EvadeCommand { Order = EvadeOrderCommand.MoveTo, TargetPosition = args.Position.To2D(), Timestamp = Environment.TickCount, IsProcessed = false }; var posInfoTest = EvadeHelper.CanHeroWalkToPos(args.Position.To2D(), ObjectCache.MyHeroCache.MoveSpeed, 0, 0, false); if (posInfoTest.IsDangerousPos) { args.ProcessEvent = false; } else { LastPosInfo.Position = args.Position.To2D(); args.ProcessEvent = true; } } else { var movePos = args.Position.To2D(); var extraDelay = ObjectCache.MenuCache.Cache["ExtraPingBuffer"].As <MenuSlider>().Value; if (EvadeHelper.CheckMovePath(movePos, ObjectCache.GamePing + extraDelay)) { LastBlockedUserMoveTo = new EvadeCommand { Order = EvadeOrderCommand.MoveTo, TargetPosition = args /*.Target*/.Position.To2D(), Timestamp = Environment.TickCount, IsProcessed = false }; args.ProcessEvent = false; if (Environment.TickCount - LastMovementBlockTime < 500 && LastMovementBlockPos.Distance(args./*Target.*/ Position) < 100) { return; } LastMovementBlockPos = args./*Target.*/ Position; LastMovementBlockTime = Environment.TickCount; var posInfo = EvadeHelper.GetBestPositionMovementBlock(movePos); if (posInfo != null) { EvadeCommand.MoveTo(posInfo.Position); } return; } LastBlockedUserMoveTo.IsProcessed = true; } } else { if (IsDodging) { args.ProcessEvent = false; } else { if (args.OrderType == OrderType.AttackUnit) { var target = args.Target; if (target != null && target.IsValid) { var baseTarget = target as Obj_AI_Base; if (baseTarget != null && ObjectCache.MyHeroCache.ServerPos2D.Distance(baseTarget.ServerPosition.To2D()) > MyHero.AttackRange + ObjectCache.MyHeroCache.BoundingRadius + baseTarget.BoundingRadius) { var movePos = args.Position.To2D(); var extraDelay = ObjectCache.MenuCache.Cache["ExtraPingBuffer"].As <MenuSlider>().Value; if (EvadeHelper.CheckMovePath(movePos, ObjectCache.GamePing + extraDelay)) { args.ProcessEvent = false; return; } } } } } } if (!args.ProcessEvent) { return; } LastIssueOrderGameTime = Game.ClockTime * 1000; LastIssueOrderTime = Environment.TickCount; LastIssueOrderArgs = args; switch (args.OrderType) { case OrderType.MoveTo: LastMoveToPosition = args /*.Target*/.Position.To2D(); LastMoveToServerPos = MyHero.ServerPosition.To2D(); break; case OrderType.Stop: LastStopPosition = MyHero.ServerPosition.To2D(); break; } }