예제 #1
0
        public static bool TryToMoveToSafePosition()
        {
            //timeUntilHit in form of MS
            CustomPolygon closestTimePolygon = Player.Instance.FindSpellInfoWithClosestTime();

            if (closestTimePolygon == null)
            {
                return(false);
            }

            if (safePosition != Vector3.Zero && safePosition.IsSafe(Player.Instance))
            {
                Orbwalker.MoveTo(safePosition.Extend(Player.Instance.Position, -100).To3DFromNavMesh());
                return(true);
            }

            TimeOfLastMovementCheck = Game.Time;
            float timeUntilHit  = closestTimePolygon.TimeUntilHitsChampion(Player.Instance);
            float movementSpeed = Player.Instance.MoveSpeed;
            //d = ts/1000
            //capped at 500 to remove massive fps drops
            float DistancePlayerCanWalkToBeforeBeingHit = Math.Min(timeUntilHit * movementSpeed / 1000, 500);

            List <Vector3> walkingPositions = GetSafePositions(Player.Instance, DistancePlayerCanWalkToBeforeBeingHit);

            if (walkingPositions.Count > 0)
            {
                Console.WriteLine("PossibleSafePositions: " + walkingPositions.Count);
                Vector3 safePos = walkingPositions.Where(a => a != null && a != Vector3.Zero && Player.Instance.GetPath(a).All(b => !b.IsWall()) && IsSafer(Player.Instance.GetPath(a), timeUntilHit)).OrderBy(a => a.Distance(Player.Instance)).FirstOrDefault();
                if (safePos != null && safePos != Vector3.Zero)
                {
                    Console.WriteLine("Set");
                    //move past the position so that the player isn't hit by the skillshot
                    Orbwalker.MoveTo(safePos.Extend(Player.Instance.Position, -Player.Instance.BoundingRadius).To3DFromNavMesh());
                    safePosition = safePos;
                    return(true);
                }
            }
            else
            {
                Console.WriteLine("No Safe Positions");
            }
            return(false);
        }
예제 #2
0
        private static void DrawSafeWalkingDistance()
        {
            if (MenuHandler.DrawMenu.GetCheckboxValue("Draw Safe Position Radius"))
            {
                CustomPolygon closestTimePolygon = Player.Instance.FindSpellInfoWithClosestTime();

                if (closestTimePolygon == null)
                {
                    return;
                }

                float timeUntilHit  = closestTimePolygon.TimeUntilHitsChampion(Player.Instance);
                float movementSpeed = Player.Instance.MoveSpeed;
                //d = ts/1000
                float DistancePlayerCanWalkToBeforeBeingHit = timeUntilHit * movementSpeed / 1000;

                Drawing.DrawCircle(Player.Instance.Position, DistancePlayerCanWalkToBeforeBeingHit, drawColor);
            }
        }
예제 #3
0
        public static void HandleDodging()
        {
            AIHeroClient self = Player.Instance;

            if (!self.IsSafe())
            {
                //every 20th of a second it can check for movements. This is to avoid FPS drops.
                if (Game.Time - TimeOfLastMovementCheck >= 0.05f && !TryToMoveToSafePosition())
                {
                    List <CustomPolygon> polysThatHitMe = self.GetPolygonsThatHitMe();
                    List <SpellInfo>     selfSpells     = self.GetSpells();
                    Menu          mainMenu = MenuHandler.mainChampionEvadeMenu;
                    float         highestDangerValueIncoming = polysThatHitMe.OrderByDescending(a => a.GetDangerValue()).FirstOrDefault().GetDangerValue();
                    CustomPolygon closestSpell = self.FindSpellInfoWithClosestTime();

                    #region UseSpellShield
                    if (highestDangerValueIncoming >= mainMenu.GetSliderValue("Spell Shield Danger Level") && selfSpells.Any(a => a.BuffType == SpellInfo.Buff.SpellShield && closestSpell.TimeUntilHitsChampion(self) <= a.Duration && a.IsOffCooldown()))
                    {
                        SpellInfo spellShield = selfSpells.FirstOrDefault(a => a.BuffType == SpellInfo.Buff.SpellShield && closestSpell.TimeUntilHitsChampion(self) <= a.Duration && a.IsOffCooldown());

                        //Sivir W/Nocturne W
                        if (spellShield.SpellType == SpellInfo.SpellTypeInfo.PassiveSpell ||
                            spellShield.SpellType == SpellInfo.SpellTypeInfo.PassiveSpellWithBuff ||
                            spellShield.SpellType == SpellInfo.SpellTypeInfo.PassiveSpellWithDuration)
                        {
                            Spell.Active spell  = new Spell.Active(self.GetSpellSlotFromName(spellShield.SpellName));
                            bool         casted = spell.Cast();
                            if (casted)
                            {
                                return;
                            }
                        }
                        //Morgana W
                        else if (spellShield.SpellType == SpellInfo.SpellTypeInfo.TargetedPassiveSpell)
                        {
                            Spell.Targeted spell  = new Spell.Targeted(self.GetSpellSlotFromName(spellShield.SpellName), (uint)spellShield.Range);
                            bool           casted = spell.Cast(self);
                            if (casted)
                            {
                                return;
                            }
                        }
                    }
                    #endregion

                    #region FlashFromSpell

                    if (highestDangerValueIncoming >= mainMenu.GetSliderValue("Spell Shield Danger Level"))
                    {
                        Spell.Skillshot flash = new Spell.Skillshot(self.GetSpellSlotFromName("SummonerFlash"), 425, SkillShotType.Linear, 0, 0, 0);

                        if (flash.IsReady())
                        {
                            Vector3 flashPos = GetSafePositions(self, flash.Range - 5).OrderByDescending(a => a.DistanceFromClosestEnemy()).FirstOrDefault();
                            bool    casted   = flash.Cast(flashPos);
                            if (casted)
                            {
                                return;
                            }
                        }
                    }
                    #endregion
                }
            }
            else
            {
                safePosition = Vector3.Zero;
            }
        }