コード例 #1
0
        private static async Task <bool> Excogitation()
        {
            if (!SuritoSettingsModel.Instance.UseExcogitation || ActionResourceManager.Arcanist.Aetherflow.Equals(0))
            {
                return(false);
            }

            var target = HealManager.FirstOrDefault(hm => !hm.IsMe &&
                                                    hm.CurrentHealthPercent <= SuritoSettingsModel.Instance.ExcogitationHpPct &&
                                                    (hm.IsTank() || !SuritoSettingsModel.Instance.UseExcogitationOnTankOnly));

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

            return(await Spells.Excogitation.CastBuff(target, true, Auras.Excogitation));
        }
コード例 #2
0
        private static async Task <bool> PlenaryIndulgence()
        {
            if (!MikotoSettingsModel.Instance.UsePlenaryIndulgence)
            {
                return(false);
            }

            if (!HealManager.Any(hm => hm.HasAura(Auras.Confession)))
            {
                return(false);
            }

            if (HealManager.Count(hm => hm.CurrentHealthPercent < MikotoSettingsModel.Instance.PlenaryIndulgenceHpPct) < MikotoSettingsModel.Instance.PlenaryIndulgencePlayerCount)
            {
                return(false);
            }

            return(await Spells.PlenaryIndulgence.Use(Me, true));
        }
コード例 #3
0
        private static async Task <bool> PresenceOfMind()
        {
            if (!MikotoSettingsModel.Instance.UsePresenceofMind)
            {
                return(false);
            }

            if (HealManager.Count(hm => hm.CurrentHealthPercent <= MikotoSettingsModel.Instance.PresenceofMindHpPct) < MikotoSettingsModel.Instance.PresenceofMindPlayerCount && !MikotoSettingsModel.Instance.UsePresenceofMindOnTankOnly)
            {
                return(false);
            }

            if (MikotoSettingsModel.Instance.UsePresenceofMindOnTankOnly && !HealManager.Any(hm => hm.IsTank() && hm.CurrentHealthPercent < MikotoSettingsModel.Instance.PresenceofMindHpPct))
            {
                return(false);
            }

            return(await Spells.PresenceofMind.CastBuff(Me, true, Auras.PresenceofMind));
        }
コード例 #4
0
        private static async Task <bool> Largesse()
        {
            if (!SuritoSettingsModel.Instance.UseLargesse)
            {
                return(false);
            }

            if (HealManager.Count(hm => hm.CurrentHealthPercent <= SuritoSettingsModel.Instance.LargesseHpPct) < SuritoSettingsModel.Instance.LargessePlayerCount && !SuritoSettingsModel.Instance.UseLargesseOnTankOnly)
            {
                return(false);
            }

            if (SuritoSettingsModel.Instance.UseLargesseOnTankOnly && !HealManager.Any(hm => hm.IsTank() && hm.CurrentHealthPercent < SuritoSettingsModel.Instance.LargesseHpPct))
            {
                return(false);
            }

            return(await Spells.Largesse.CastBuff(Me, true, Auras.Largesse));
        }
コード例 #5
0
        internal static async Task <bool> Swap()
        {
            if (!CecilSettingsModel.Instance.Swap)
            {
                return(false);
            }

            var OtherTank = HealManager.FirstOrDefault(hm => hm.IsTank() && !hm.IsMe);

            if (OtherTank == null)
            {
                CecilSettingsModel.Instance.Swap = false;
                return(false);
            }

            if (!CecilSettingsModel.Instance.MainTank)
            {
                var provokeTarget = OtherTank.TargetGameObject;

                if (provokeTarget != null)
                {
                    if (await Spells.Provoke.Use(provokeTarget, true))
                    {
                        Logger.CecilLog(@"====> Provoking {0} to Pull Aggro From {1}", provokeTarget.Name, OtherTank.Name);
                        CecilSettingsModel.Instance.MainTank = true;
                        CecilSettingsModel.Instance.Swap     = false;
                        return(true);
                    }
                }
            }

            if (CecilSettingsModel.Instance.MainTank)
            {
                if (await Shirk(OtherTank))
                {
                    Logger.CecilLog(@"====> Shirking to {0} to lose Aggro from {1}", OtherTank.Name, Target.Name);
                    CecilSettingsModel.Instance.MainTank = false;
                    CecilSettingsModel.Instance.Swap     = false;
                    return(true);
                }
            }
            return(false);
        }
コード例 #6
0
        private static async Task <bool> CureII()
        {
            if (!MikotoSettingsModel.Instance.UseCure2)
            {
                return(false);
            }

            var target = HealManager.FirstOrDefault(hm => hm.CurrentHealthPercent <= MikotoSettingsModel.Instance.Cure2HpPct);

            if (Me.HasAura(Auras.Freecure))
            {
                target = HealManager.FirstOrDefault(hm => hm.CurrentHealthPercent < (MikotoSettingsModel.Instance.CureHpPct));
            }

            if (target != null)
            {
                return(await Spells.CureII.Use(target, true, true));
            }
            return(false);
        }
コード例 #7
0
        private static async Task <bool> EyeForAnEye()
        {
            if (!SuritoSettingsModel.Instance.UseEyeforanEye)
            {
                return(false);
            }

            var target = HealManager.FirstOrDefault(hm => hm.IsTank() && (!SuritoSettingsModel.Instance.UseEyeforanEyeOnlyAfterAdloquium || hm.HasAura(Auras.Adloquium, true)));

            if (target == null)
            {
                target = HealManager.FirstOrDefault(hm => !hm.IsMe && (!SuritoSettingsModel.Instance.UseEyeforanEyeOnlyAfterAdloquium || hm.HasAura(Auras.Adloquium, true)));
            }

            if (target != null)
            {
                return(await Spells.EyeforanEye.Use(target, !target.HasAura(Auras.EyeforanEye)));
            }
            return(false);
        }
コード例 #8
0
        private static async Task <bool> Cure()
        {
            var target = HealManager.FirstOrDefault(hm => hm.CurrentHealthPercent <= MikotoSettingsModel.Instance.CureHpPct);

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

            if (target.IsTank())
            {
                if (MikotoSettingsModel.Instance.RegenCureFloorTanks && target.HasAura(Auras.Regen) && target.CurrentHealthPercent > MikotoSettingsModel.Instance.RegenCureFloorPct)
                {
                    return(false);
                }

                return(await Spells.Cure.Use(target, true, true));
            }

            if (target.IsHealer())
            {
                if (MikotoSettingsModel.Instance.RegenCureFloorHealers && target.HasAura(Auras.Regen) && target.CurrentHealthPercent > MikotoSettingsModel.Instance.RegenCureFloorPct)
                {
                    return(false);
                }

                return(await Spells.Cure.Use(target, true, true));
            }

            if (!target.IsDps())
            {
                return(false);
            }

            if (MikotoSettingsModel.Instance.RegenCureFloorDps && target.HasAura(Auras.Regen) && target.CurrentHealthPercent > MikotoSettingsModel.Instance.RegenCureFloorPct)
            {
                return(false);
            }

            return(await Spells.Cure.Use(target, true, true));
        }
コード例 #9
0
        private static async Task <bool> EyeForAnEye()
        {
            if (!MikotoSettingsModel.Instance.UseEyeforanEye)
            {
                return(false);
            }

            var target = HealManager.FirstOrDefault(hm => hm.IsTank() && !hm.HasAura(Auras.EyeforanEye) && hm.CurrentHealthPercent <= MikotoSettingsModel.Instance.EyeforanEyeHpPct);

            if (target == null)
            {
                target = HealManager.FirstOrDefault(hm => !hm.IsMe && !hm.HasAura(Auras.EyeforanEye) && hm.CurrentHealthPercent <= MikotoSettingsModel.Instance.EyeforanEyeHpPct);
            }

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

            return(await Spells.EyeforanEye.Use(target, true));
        }
コード例 #10
0
        private static async Task <bool> EmergencyTactics()
        {
            if (!SuritoSettingsModel.Instance.UseEmergencyTactics)
            {
                return(false);
            }

            if (!SuritoSettingsModel.Instance.UseEmergencyTacticsOnTankOnly && HealManager.Count(hm => hm.CurrentHealthPercent <= SuritoSettingsModel.Instance.EmergencyTacticsSuccorHpPct) >= SuritoSettingsModel.Instance.SuccorPlayerCount)
            {
                return(await Spells.EmergencyTactics.CastBuff(Me, true, Auras.EmergencyTactics));
            }
            var target = HealManager.FirstOrDefault(hm =>
                                                    hm.CurrentHealthPercent <= SuritoSettingsModel.Instance.EmergencyTacticsAdloquiumHpPct);

            if (target != null && (target.IsTank() || !SuritoSettingsModel.Instance.UseEmergencyTacticsOnTankOnly))
            {
                return(await Spells.EmergencyTactics.CastBuff(Me, true, Auras.EmergencyTactics));
            }

            return(false);
        }
コード例 #11
0
ファイル: Program.cs プロジェクト: riwalry1/AIO
        private static void OnUpdate(EventArgs args)
        {
            HealManager.Heal();
            Killsteal.KillSteal();
            Modes.Flee();

            if (Orbwalker.ActiveModesFlags.HasFlag(Orbwalker.ActiveModes.Combo))
            {
                Modes.Combo();
            }

            if (Orbwalker.ActiveModesFlags.HasFlag(Orbwalker.ActiveModes.Combo))
            {
                Modes.Harass();
            }

            if (Orbwalker.ActiveModesFlags.HasFlag(Orbwalker.ActiveModes.LaneClear) || Orbwalker.ActiveModesFlags.HasFlag(Orbwalker.ActiveModes.JungleClear))
            {
                Modes.Lane();
                Modes.Jungle();
            }
        }
コード例 #12
0
        private static async Task <bool> Aetherpact()
        {
            if (!SuritoSettingsModel.Instance.UseAetherpact || Me.Pet == null)
            {
                return(false);
            }

            if (ActionResourceManager.Scholar.FaerieGauge < SuritoSettingsModel.Instance.AetherpactMinGuage)
            {
                return(false);
            }

            var target = HealManager.FirstOrDefault(hm => hm.Distance(Me.Pet) <= 12 &&
                                                    hm.CurrentHealthPercent <= SuritoSettingsModel.Instance.AetherpactHpPct &&
                                                    (hm.IsTank() || !SuritoSettingsModel.Instance.UseAetherpactOnTankOnly));

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

            return(await Spells.Aetherpact2.CastBuff(target, true, Auras.FeyUnion));
        }
コード例 #13
0
ファイル: Program.cs プロジェクト: wade1990/PortAIO
        private static void OnUpdate(EventArgs args)
        {
            //   var target = TargetSelector.GetSelectedTarget();
            //   Chat.Print("Buffs: {0}", string.Join(" | ", target.Buffs.Where(b => b.Caster.NetworkId == Player.NetworkId).Select(b => b.DisplayName)));
            HealManager.Heal();
            Killsteal.KillSteal();
            Modes.Flee();
            switch (Orb.ActiveMode)
            {
            case Orbwalking.OrbwalkingMode.Combo:
                Modes.Combo();
                break;

            case Orbwalking.OrbwalkingMode.LaneClear:
                Modes.Lane();
                Modes.Jungle();
                break;

            case Orbwalking.OrbwalkingMode.Mixed:
                Modes.Harass();
                break;
            }
        }
コード例 #14
0
        public static async Task <bool> ExecuteOpener()
        {
            if (OpenerFinished || Me.ClassLevel < 70)
            {
                return(false);
            }

            if (ShinraEx.Settings.CooldownMode == CooldownModes.Disabled)
            {
                AbortOpener("Please enable cooldown mode to use an opener.");
                return(false);
            }

            #region GetOpener

            switch (Me.CurrentJob)
            {
            case ClassJobType.Bard:
                current    = BardOpener.List;
                usePotion  = ShinraEx.Settings.BardPotion;
                potionStep = 0;
                potionType = PotionIds.Dex;
                break;

            case ClassJobType.BlackMage:
                current    = BlackMageOpener.List;
                usePotion  = ShinraEx.Settings.BlackMagePotion;
                potionStep = 7;
                potionType = PotionIds.Int;
                break;

            case ClassJobType.DarkKnight:
                current    = DarkKnightOpener.List;
                usePotion  = ShinraEx.Settings.DarkKnightPotion;
                potionStep = 3;
                potionType = PotionIds.Str;
                break;

            case ClassJobType.Dragoon:
                current    = DragoonOpener.List;
                usePotion  = ShinraEx.Settings.DragoonPotion;
                potionStep = 7;
                potionType = PotionIds.Str;
                break;

            case ClassJobType.Machinist:
                current    = MachinistOpener.List;
                usePotion  = ShinraEx.Settings.MachinistPotion;
                potionStep = 0;
                potionType = PotionIds.Dex;
                break;

            case ClassJobType.Monk:
                current    = MonkOpener.List;
                usePotion  = ShinraEx.Settings.MonkPotion;
                potionStep = 4;
                potionType = PotionIds.Str;
                break;

            case ClassJobType.Ninja:
                current    = NinjaOpener.List;
                usePotion  = ShinraEx.Settings.NinjaPotion;
                potionStep = 7;
                potionType = PotionIds.Dex;
                break;

            case ClassJobType.Paladin:
                current    = PaladinOpener.List;
                usePotion  = ShinraEx.Settings.PaladinPotion;
                potionStep = 8;
                potionType = PotionIds.Str;
                break;

            case ClassJobType.RedMage:
                current    = RedMageOpener.List;
                usePotion  = ShinraEx.Settings.RedMagePotion;
                potionStep = 3;
                potionType = PotionIds.Int;
                break;

            case ClassJobType.Samurai:
                current    = SamuraiOpener.List;
                usePotion  = ShinraEx.Settings.SamuraiPotion;
                potionStep = 4;
                potionType = PotionIds.Str;
                break;

            case ClassJobType.Summoner:
                current    = SummonerOpener.List;
                usePotion  = ShinraEx.Settings.SummonerPotion;
                potionStep = 2;
                potionType = PotionIds.Int;
                break;

            case ClassJobType.Warrior:
                current    = WarriorOpener.List;
                usePotion  = ShinraEx.Settings.WarriorPotion;
                potionStep = 5;
                potionType = PotionIds.Str;
                break;

            default:
                current = null;
                break;
            }

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

            #endregion

            if (OpenerStep >= current.Count)
            {
                AbortOpener("ShinraEx >>> Opener Finished");
                return(false);
            }

            if (usePotion && OpenerStep == potionStep)
            {
                if (await UsePotion(potionType))
                {
                    return(true);
                }
            }

            var spell = current.ElementAt(OpenerStep);
            resetTime = DateTime.Now.AddSeconds(10);

            #region Job-Specific

            switch (Me.CurrentJob)
            {
            case ClassJobType.Bard:
                if (Resource.Bard.Repertoire == 3)
                {
                    await Bard.PitchPerfect.Cast(null, false);
                }
                break;

            case ClassJobType.BlackMage:
                if ((spell.Name == BlackMage.BlizzardIV.Name || spell.Name == BlackMage.FireIV.Name) && !Resource.BlackMage.Enochian)
                {
                    AbortOpener("Aborted opener due to Enochian.");
                    return(true);
                }
                break;

            case ClassJobType.DarkKnight:

                if (spell.Name == DarkKnight.BloodWeapon.Name && Me.HasAura(DarkKnight.Grit.Name))
                {
                    Debug($"Skipping opener step {OpenerStep} due to Grit >>> {spell.Name}");
                    OpenerStep++;
                    return(true);
                }
                if ((spell.Name == DarkKnight.Bloodspiller.Name || spell.Name == DarkKnight.Delirium.Name) &&
                    Resource.DarkKnight.BlackBlood < 50)
                {
                    Debug($"Skipping opener step {OpenerStep} due to Blood >>> {spell.Name}");
                    OpenerStep++;
                    return(true);
                }
                if (spell.Name == DarkKnight.BlackestNight.Name && ShinraEx.Settings.DarkKnightOffTank)
                {
                    await UpdateHealManager();

                    var target = HealManager.FirstOrDefault(hm => hm.IsTank() && !hm.IsMe);

                    if (target != null && await DarkKnight.BlackestNight.Cast(target, false))
                    {
                        Debug($"Casting opener step {OpenerStep} on the main tank >>> {spell.Name}");
                        OpenerStep++;
                        return(true);
                    }
                }
                break;

            case ClassJobType.Dragoon:
                if (OpenerStep > 4 && Resource.Dragoon.Timer == TimeSpan.Zero)
                {
                    AbortOpener("Aborted opener due to Blood of the Dragon.");
                    return(true);
                }
                if (spell.Name == Dragoon.DragonSight.Name)
                {
                    var target = Managers.DragonSight.FirstOrDefault();

                    if (target == null)
                    {
                        break;
                    }

                    if (await Dragoon.DragonSight.Cast(target, false))
                    {
                        Debug($"Executed opener step {OpenerStep} >>> {spell.Name}");
                        OpenerStep++;
                        return(true);
                    }
                }
                break;

            case ClassJobType.Machinist:
                if (PetManager.ActivePetType != PetType.Rook_Autoturret)
                {
                    var castLocation = ShinraEx.Settings.MachinistTurretLocation == CastLocations.Self ? Me : Target;

                    if (await Machinist.RookAutoturret.Cast(castLocation, false))
                    {
                        return(true);
                    }
                }
                if (Pet != null)
                {
                    if (await Machinist.Hypercharge.Cast(null, false))
                    {
                        return(true);
                    }
                }
                break;

            case ClassJobType.Monk:
                switch (OpenerStep)
                {
                case 0 when !Me.HasAura(109):
                    if (Me.HasAura(108))
                    {
                        await Monk.TwinSnakes.Cast();
                    }
                    await Monk.Bootshine.Cast();

                    return(true);

                case 0 when !Me.HasAura(105):
                    await Monk.FistsOfWind.Cast(null, false);

                    return(true);
                }
                if (spell.Name == Monk.RiddleOfWind.Name && Monk.RiddleOfWind.Cooldown() > 0)
                {
                    return(true);
                }
                if (spell.Name == Monk.ForbiddenChakra.Name && Resource.Monk.FithChakra != 5)
                {
                    Debug($"Skipping opener step {OpenerStep} due to Chakras >>> {spell.Name}");
                    OpenerStep++;
                    return(true);
                }
                if (spell.Name == Monk.TornadoKick.Name && Resource.Monk.GreasedLightning != 3)
                {
                    Debug($"Skipping opener step {OpenerStep} due to Greased Lightning >>> {spell.Name}");
                    OpenerStep++;
                    return(true);
                }
                if (spell.Name == Monk.PerfectBalance.Name)
                {
                    if (Monk.PerfectBalance.Cooldown() <= 0)
                    {
                        AbortOpener("Aborted opener due to Perfect Balance.");
                        return(true);
                    }
                    if (Monk.Bootshine.Cooldown() > 700)
                    {
                        return(true);
                    }
                }
                if (ShinraEx.LastSpell.Name != Monk.PerfectBalance.Name && Monk.PerfectBalance.Cooldown() > 0 &&
                    ActionManager.CanCast(Monk.Bootshine.Name, Target) && !ActionManager.CanCast(spell.Name, Target) &&
                    !ActionManager.CanCast(spell.Name, Me))
                {
                    AbortOpener("Aborted opener due to Perfect Balance.");
                    return(true);
                }
                break;

            case ClassJobType.Ninja:
                if (OpenerStep == 1 && (Resource.Ninja.HutonTimer == TimeSpan.Zero || Ninja.Ninjutsu.Cooldown() > 0))
                {
                    AbortOpener("Aborted opener due to Ninjutsu.");
                    return(true);
                }
                if (spell.Name == Ninja.Kassatsu.Name && Ninja.Kassatsu.Cooldown() > 0)
                {
                    AbortOpener("Aborted opener due to Kassatsu.");
                    return(true);
                }
                if (spell.Name == Ninja.TrickAttack.Name && !Me.HasAura(Ninja.Suiton.Name))
                {
                    Debug($"Skipping opener step {OpenerStep} due to Suiton >>> {spell.Name}");
                    OpenerStep++;
                    return(true);
                }
                break;

            case ClassJobType.RedMage:
                if (!ActionManager.HasSpell("Swiftcast"))
                {
                    AbortOpener("Aborting opener as Swiftcast is not set.");
                    return(false);
                }
                if (spell.Name == RedMage.Verstone.Name && !Me.HasAura("Verstone Ready"))
                {
                    AbortOpener("Aborting opener due to cooldowns.");
                    return(false);
                }
                if (spell.Name == RedMage.EnchantedRiposte.Name && (Resource.RedMage.WhiteMana < 80 || Resource.RedMage.BlackMana < 80))
                {
                    AbortOpener("Aborted opener due to mana levels.");
                    return(true);
                }
                break;

            case ClassJobType.Samurai:
                if (spell.Name == Samurai.MeikyoShisui.Name && Samurai.MeikyoShisui.Cooldown() > 0 ||
                    OpenerStep > 9 && !Me.HasAura(Samurai.MeikyoShisui.Name))
                {
                    AbortOpener("Aborted opener due to Meikyo Shisui.");
                    return(true);
                }
                if (spell.Name == Samurai.HissatsuGuren.Name && Resource.Samurai.Kenki < 70)
                {
                    Debug($"Skipping opener step {OpenerStep} due to Kenki >>> {spell.Name}");
                    OpenerStep++;
                    return(true);
                }
                if (spell.Name == Samurai.Higanbana.Name && MovementManager.IsMoving)
                {
                    return(true);
                }
                break;

            case ClassJobType.Summoner:
                if (!ActionManager.HasSpell("Swiftcast"))
                {
                    AbortOpener("Aborting opener as Swiftcast is not set.");
                    return(false);
                }
                if (PetManager.ActivePetType == PetType.Ifrit_Egi && PetManager.PetMode != PetMode.Sic)
                {
                    if (await Coroutine.Wait(1000, () => PetManager.DoAction("Sic", Me)))
                    {
                        Logging.Write(Colors.GreenYellow, @"[ShinraEx] Casting >>> Sic");
                        return(await Coroutine.Wait(3000, () => PetManager.PetMode == PetMode.Sic));
                    }
                }
                if (OpenerStep == 1)
                {
                    if (PetManager.ActivePetType == PetType.Garuda_Egi && PetManager.PetMode == PetMode.Obey)
                    {
                        if (await Summoner.Contagion.Cast())
                        {
                            return(true);
                        }
                    }
                    if (Resource.Arcanist.Aetherflow < 3 && Summoner.Aetherflow.Cooldown() > 15000)
                    {
                        AbortOpener("Aborting opener due to Aetherflow charges.");
                        return(false);
                    }
                }
                if (spell.Name == Summoner.SummonIII.Name)
                {
                    if (!ShinraEx.Settings.SummonerOpenerGaruda || PetManager.ActivePetType == PetType.Ifrit_Egi ||
                        !Me.HasAura(Summoner.Role.Swiftcast.Name))
                    {
                        Debug($"Skipping opener step {OpenerStep} due to Swiftcast/not using Garuda >>> {spell.Name}");
                        OpenerStep++;
                        return(true);
                    }
                }
                if (spell.Name == Summoner.Fester.Name)
                {
                    if (Resource.Arcanist.Aetherflow > 0 && spell.Cooldown() > 0)
                    {
                        return(true);
                    }
                    if (Resource.Arcanist.Aetherflow == 0)
                    {
                        Debug($"Skipping opener step {OpenerStep} due to Aetherflow charges >>> {spell.Name}");
                        OpenerStep++;
                        return(true);
                    }
                }
                if (spell.Name == Summoner.DreadwyrmTrance.Name && Resource.Arcanist.AetherAttunement < 3)
                {
                    await Coroutine.Wait(2000, () => Resource.Arcanist.AetherAttunement == 3);

                    if (Resource.Arcanist.AetherAttunement < 3)
                    {
                        AbortOpener("Aborting opener due to Aethertrail Attunement.");
                        return(false);
                    }
                }
                break;

            case ClassJobType.Warrior:
                if (OpenerStep == 0 && !Me.HasAura(Warrior.Deliverance.Name))
                {
                    if (ShinraEx.LastSpell.Name != Warrior.Deliverance.Name && Warrior.Deliverance.Cooldown() > 3000)
                    {
                        AbortOpener("Aborting opener due to Deliverance cooldown.");
                        return(false);
                    }
                    await Warrior.Deliverance.Cast();

                    return(true);
                }
                if (spell.Name == Warrior.FellCleave.Name)
                {
                    if (Resource.Warrior.BeastGauge < 50 && !Me.HasAura(1177))
                    {
                        Debug($"Skipping opener step {OpenerStep} due to Beast Gauge >>> {spell.Name}");
                        OpenerStep++;
                        return(true);
                    }
                }
                if (spell.Name == Warrior.InnerRelease.Name)
                {
                    if (DataManager.GetSpellData(31).Cooldown.TotalMilliseconds > 700)
                    {
                        return(true);
                    }
                }
                break;
            }

            #endregion

            if (await spell.Cast(null, false))
            {
                Debug($"Executed opener step {OpenerStep} >>> {spell.Name}");
                OpenerStep++;
                if (spell.Name == "Swiftcast")
                {
                    await Coroutine.Wait(3000, () => Me.HasAura("Swiftcast"));
                }

                if (OpenerStep == 1)
                {
                    DisplayToast("ShinraEx >>> Opener Started", 2500);
                }

                #region Job-Specific

                // Bard
                if (spell.Name == Bard.IronJaws.Name)
                {
                    DotManager.Add(Target);
                }

                // Machinist
                if (spell.Name == Machinist.Flamethrower.Name)
                {
                    await Coroutine.Wait(3000, () => Me.HasAura(Machinist.Flamethrower.Name));

                    await Coroutine.Wait(5000, () => Resource.Machinist.Heat == 100 || !Me.HasAura(Machinist.Flamethrower.Name));
                }

                // Red Mage
                if (spell.Name == RedMage.Manafication.Name)
                {
                    await Coroutine.Wait(3000, () => ActionManager.CanCast(RedMage.CorpsACorps.Name, Target));
                }

                #endregion
            }
            else if (spell.Cooldown(true) > 3000 && spell.Cooldown() > 500 && !Me.IsCasting)
            {
                Debug($"Skipped opener step {OpenerStep} due to cooldown >>> {spell.Name}");
                OpenerStep++;
            }
            return(true);
        }
コード例 #15
0
ファイル: Paine_Methods.cs プロジェクト: Fryheit/Kefka
        private static async Task <bool> ExProvoke()
        {
            if (Target == null || !Target.CanAttack || !CecilSettingsModel.Instance.UseProvoke)
            {
                return(false);
            }

            if (!PartyManager.IsInParty)
            {
                return(false);
            }

            if (CecilSettingsModel.Instance.MainTank)
            {
                if (GameObjectManager.Attackers.Count(r => r.Distance(Me) <= 5 && r.TargetGameObject == HealManager.FirstOrDefault(hm => hm.BeingTargeted() && !hm.IsMe && !hm.IsTank())) > 1)
                {
                    if (await Ultimatum())
                    {
                        Logger.CecilLog(@"====> Ultimatum used to regain Aggro");
                        Logger.CecilLog(@"====> Unleashing to establish Aggro");
                        return(await Spells.Unleash.Use(Me, true));
                    }
                }

                var provokeTarget = GameObjectManager.Attackers.FirstOrDefault(r => r.Distance(Me) <= 25 && r.TargetGameObject == HealManager.FirstOrDefault(hm => hm.BeingTargeted() && !hm.IsMe && !hm.IsTank()));

                if (provokeTarget != null)
                {
                    if (await Spells.Provoke.Use(provokeTarget, true))
                    {
                        Logger.CecilLog(@"====> Provoking {0} to Pull Aggro From {1}", provokeTarget.Name, provokeTarget.TargetGameObject.Name);
                        if (provokeTarget?.Distance(Me) > 5 && CecilSettingsModel.Instance.UseUnmend)
                        {
                            Logger.CecilLog(@"====> Unmending {0} to Pull Aggro From {1}", provokeTarget.Name, provokeTarget.TargetGameObject.Name);
                            return(await Spells.Unmend.Use(provokeTarget, true));
                        }
                        return(true);
                    }
                }
            }

            if (!CecilSettingsModel.Instance.MainTank)
            {
                var OtherTank = HealManager.FirstOrDefault(hm => hm.IsTank() && !hm.IsMe);

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

                if (await Shirk(OtherTank))
                {
                    Logger.CecilLog(@"====> Shirking Aggro from {0} to Main Tank, {1}", Target.Name, OtherTank.SafeName());
                    return(true);
                }
            }
            return(false);
        }
コード例 #16
0
        private static async Task <bool> Intervention()
        {
            var target = HealManager.FirstOrDefault(hm => hm.Distance2D(Me) <= 30 && hm.CurrentHealthPercent <= BeatrixSettingsModel.Instance.InterventionHpPct);

            return(await Spells.Intervention.CastDot(Target, true, Auras.Intervention));
        }
コード例 #17
0
        private static async Task <bool> PetAction()
        {
            if (Me.HasAura(Auras.Dissipation) || Me.Pet == null || HealManager.Any(hm => hm.HasAura(Auras.FeyUnion)) || CombatHelper.GcdTimeRemaining < 10)
            {
                return(false);
            }

            var target = HealManager.FirstOrDefault(hm => hm.InCombat);

            switch (SuritoSettingsModel.Instance.SelectedSuritoSummon)
            {
            case SuritoSummonMode.Eos:
                if (SuritoSettingsModel.Instance.UseWhisperingDawn &&
                    PetManager.CanCast(Spells.WhisperingDawn.LocalizedName, Me.Pet) &&
                    HealManager.Count(hm => hm.Distance2D(Me.Pet) <= 15 && hm.CurrentHealthPercent <= SuritoSettingsModel.Instance.WhisperingDawnHpPct) >= SuritoSettingsModel.Instance.PetAoEPlayerCount)
                {
                    return(PetManager.DoAction(Spells.WhisperingDawn.LocalizedName, Me.Pet));
                }

                if (SuritoSettingsModel.Instance.UseFeyCovenant &&
                    PetManager.CanCast(Spells.FeyCovenant.LocalizedName, Me.Pet) &&
                    HealManager.Count(hm => hm.Distance2D(Me.Pet) <= 15 && hm.CurrentHealthPercent <= SuritoSettingsModel.Instance.FeyCovenantHpPct) >= SuritoSettingsModel.Instance.PetAoEPlayerCount)
                {
                    return(PetManager.DoAction(Spells.FeyCovenant.LocalizedName, Me.Pet));
                }

                if (SuritoSettingsModel.Instance.UseFeyIllumination &&
                    PetManager.CanCast(Spells.FeyIllumination.LocalizedName, Me.Pet) &&
                    HealManager.Count(hm => hm.Distance2D(Me.Pet) <= 15 && hm.CurrentHealthPercent <= SuritoSettingsModel.Instance.FeyIlluninationHpPct) >= SuritoSettingsModel.Instance.PetAoEPlayerCount)
                {
                    return(PetManager.DoAction(Spells.FeyIllumination.LocalizedName, Me.Pet));
                }

                if (SuritoSettingsModel.Instance.UseEmbrace)
                {
                    target = HealManager.FirstOrDefault(hm => hm.CurrentHealthPercent <= SuritoSettingsModel.Instance.EmbraceHpPct);
                    if (target != null && PetManager.CanCast(Spells.Embrace.LocalizedName, target))
                    {
                        return(PetManager.DoAction(Spells.Embrace.LocalizedName, target));
                    }
                }
                break;

            case SuritoSummonMode.Selene:
                if (SuritoSettingsModel.Instance.UseEmbrace)
                {
                    target = HealManager.FirstOrDefault(hm => hm.CurrentHealthPercent <= SuritoSettingsModel.Instance.EmbraceHpPct);
                    if (target != null && PetManager.CanCast(Spells.Embrace.LocalizedName, target))
                    {
                        return(PetManager.DoAction(Spells.Embrace.LocalizedName, target));
                    }
                }

                if (SuritoSettingsModel.Instance.UseSilentDusk)
                {
                    target = HealManager.FirstOrDefault(hm => hm.CanSilence());
                    if (target != null && PetManager.CanCast(Spells.SilentDusk.LocalizedName, target))
                    {
                        return(PetManager.DoAction(Spells.SilentDusk.LocalizedName, target));
                    }
                }

                if (SuritoSettingsModel.Instance.UseFeyCaress &&
                    PetManager.CanCast(Spells.FeyCaress.LocalizedName, Me.Pet) &&
                    HealManager.Count(hm => hm.Distance2D(Me.Pet) <= 20) >= SuritoSettingsModel.Instance.PetAoEPlayerCount)
                {
                    return(await CleanseManager.PetCleanse());
                }

                if (SuritoSettingsModel.Instance.UseFeyWind &&
                    PetManager.CanCast(Spells.FeyWind.LocalizedName, Me.Pet) &&
                    HealManager.Count(hm => hm.IsDps() && hm.Distance2D(Me.Pet) <= 20) >= SuritoSettingsModel.Instance.PetAoEPlayerCount)
                {
                    return(PetManager.DoAction(Spells.FeyWind.LocalizedName, Me.Pet));
                }
                break;
            }
            return(false);
        }
コード例 #18
0
        private static async Task <bool> ExProvoke()
        {
            if (Target == null || !Target.CanAttack || !BeatrixSettingsModel.Instance.UseProvoke || CombatHelper.LastSpell == Spells.Flash)
            {
                return(false);
            }

            if (!PartyManager.IsInParty)
            {
                return(false);
            }

            if (BeatrixSettingsModel.Instance.MainTank)
            {
                if (GameObjectManager.Attackers.Count(r => r.Distance(Me) <= 5 && r.TargetGameObject == HealManager.FirstOrDefault(hm => hm.BeingTargeted() && !hm.IsMe) && (!r.TargetGameObject.HasAura(Auras.ShieldOath) && !r.TargetGameObject.HasAura(Auras.Defiance) && !r.TargetGameObject.HasAura(Auras.Grit))) > 1)
                {
                    if (await Ultimatum())
                    {
                        Logger.BeatrixLog(@"====> Ultimatum used to regain Aggro");
                        FlashCount = 0;
                    }
                }
                var provokeTarget = GameObjectManager.Attackers.FirstOrDefault(r => r.Distance(Me) <= 25 && r.TargetGameObject == HealManager.FirstOrDefault(hm => hm.BeingTargeted() && !hm.IsMe) && (!r.TargetGameObject.HasAura(Auras.ShieldOath) && !r.TargetGameObject.HasAura(Auras.Defiance) && !r.TargetGameObject.HasAura(Auras.Grit)));

                if (provokeTarget != null)
                {
                    if (await Spells.Provoke.Use(provokeTarget, true))
                    {
                        Logger.BeatrixLog(@"====> Provoking {0} to Pull Aggro From {1}", provokeTarget.Name, provokeTarget.TargetGameObject.Name);
                        if (provokeTarget?.Distance(Me) > 5 && BeatrixSettingsModel.Instance.UseShieldLob)
                        {
                            Logger.BeatrixLog(@"====> Sheild Lobbing {0} to Pull Aggro From {1}", provokeTarget.Name, provokeTarget.TargetGameObject.Name);
                            return(await Spells.ShieldLob.Use(provokeTarget, true));
                        }
                        return(true);
                    }
                }
            }
            if (!BeatrixSettingsModel.Instance.MainTank)
            {
                var OtherTank = HealManager.FirstOrDefault(hm => hm.IsTank() && !hm.IsMe);

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

                if (await Shirk(OtherTank))
                {
                    Logger.BeatrixLog(@"====> Shirking Aggro from {0} to Main Tank, {1}", Target.Name, OtherTank.SafeName());
                    return(true);
                }
            }
            return(false);
        }
コード例 #19
0
        public static async Task <bool> Heal()
        {
            if (await Resurrection())
            {
                return(true);
            }
            if (Me.HasAura(Auras.Swiftcast) && HealManager.Any(hm => hm.IsDead && !hm.HasAura(Auras.Raise) && !hm.HasAura(Auras.Raise2)))
            {
                return(false);
            }

            if (await Healbusters())
            {
                return(true);
            }
            if (await Indomitability())
            {
                return(true);
            }
            if (await Largesse())
            {
                return(true);
            }
            if (await Lustrate())
            {
                return(true);
            }
            if (await Aetherpact())
            {
                return(true);
            }
            if (await Excogitation())
            {
                return(true);
            }
            if (await SacredSoil())
            {
                return(true);
            }
            if (await Rouse())
            {
                return(true);
            }
            if (await Dissipation())
            {
                return(true);
            }
            if (await EyeForAnEye())
            {
                return(true);
            }
            if (await DeploymentTactics())
            {
                return(true);
            }
            if (await EmergencyTactics())
            {
                return(true);
            }
            if (await LucidDreaming())
            {
                return(true);
            }
            if (await Succor())
            {
                return(true);
            }
            if (await Adloquium())
            {
                return(true);
            }
            if (await Physick())
            {
                return(true);
            }
            if (await Esuna())
            {
                return(true);
            }
            if (await Protect())
            {
                return(true);
            }
            if (Me.ClassLevel <= 2)
            {
                return(await Common_Utils.HpPotion());
            }
            return(await PetAction());
        }
コード例 #20
0
 private static async Task <bool> ClericStance()
 {
     return(await Spells.ClericStance.CastBuff(Me, HealManager.All(hm => hm.CurrentHealthPercent > SuritoSettingsModel.Instance.PhysickHpPct) && Me.CurrentManaPercent >= SuritoSettingsModel.Instance.DamageMinMpPct, Auras.ClericStance));
 }
コード例 #21
0
        private static async Task <bool> SacredSoil()
        {
            if (!SuritoSettingsModel.Instance.UseSacredSoil || ActionResourceManager.Arcanist.Aetherflow.Equals(0))
            {
                return(false);
            }

            var target = HealManager.FirstOrDefault(hm => hm.CurrentHealthPercent <= SuritoSettingsModel.Instance.SacredSoilHpPct && HealManager.Count(hm2 => hm2.CurrentHealthPercent <= SuritoSettingsModel.Instance.SacredSoilHpPct && hm2.Distance2D(hm) <= 8) >= SuritoSettingsModel.Instance.SacredSoilPlayerCount);

            return(await Spells.SacredSoil.Use(target, true, true));
        }