public void HandleBuffs()
        {
            List <string> myAuras = CombatUtils.GetAuras(LuaUnit.player);

            if (!myAuras.Contains("demon armor"))
            {
                CombatUtils.CastSpellByName(Me, Target, "Demon Armor", true);
            }
            if (!myAuras.Contains("blood pact"))
            {
                CombatUtils.CastSpellByName(Me, Target, "Summon Imp", true);
            }
        }
        private void DoAttackRoutine()
        {
            List <string> targetAuras = CombatUtils.GetAuras(LuaUnit.target);

            Me?.Update();
            // Restore Mana
            if (Me.EnergyPercentage < 30 && Me.HealthPercentage > 50)
            {
                CombatUtils.CastSpellByName(Me, Target, "Life Tap", true);
                return;
            }

            Target?.Update();
            // DoT's to apply
            if (!targetAuras.Contains("curse of agony"))
            {
                CombatUtils.CastSpellByName(Me, Target, "Curse of Agony", false);
                return;
            }
            if (!targetAuras.Contains("corruption"))
            {
                CombatUtils.CastSpellByName(Me, Target, "Corruption", false);
                return;
            }
            if (!targetAuras.Contains("unstable affliction"))
            {
                CombatUtils.CastSpellByName(Me, Target, "Unstable Affliction", false);
                return;
            }
            if (!targetAuras.Contains("haunt"))
            {
                CombatUtils.CastSpellByName(Me, Target, "Haunt", false);
                return;
            }

            Target?.Update();
            // Active-Damage Spell
            if (Target?.HealthPercentage < 25)
            {
                CombatUtils.CastSpellByName(Me, Target, "Drain Soul", false);
                return;
            }
            else
            {
                CombatUtils.CastSpellByName(Me, Target, "Shadow Bolt", false);
                return;
            }
        }
Пример #3
0
        public Spell DoRoutine(Me me, Unit target, Unit pet)
        {
            if (CombatUtils.IsUnitValid(me) &&
                CombatUtils.IsUnitValid(target))
            {
                return(null);
            }

            List <string> myAuras     = AmeisenCore.GetAuras(LuaUnit.player);
            List <string> targetAuras = AmeisenCore.GetAuras(LuaUnit.target);

            Spell  spellToUse     = null;
            double targetDistance = Utils.GetDistance(me.pos, target.pos);

            // our Buff
            if (IsMarkOfTheWildKnown && !targetAuras.Contains("mark of the wild"))
            {
                spellToUse = TryUseSpell("Mark of the Wild", me);
                if (spellToUse != null)
                {
                    return(spellToUse);
                }
            }

            // our Barkskin
            if (IsMarkOfTheWildKnown && !myAuras.Contains("barkskin"))
            {
                spellToUse = TryUseSpell("Barkskin", me);
                if (spellToUse != null)
                {
                    CombatUtils.CastSpellByName(me, target, "Barkskin", true);
                }                                                                                      // only cast on me
            }

            // Innervate mana regen
            if (IsInnervateKnown && me.ManaPercentage < 20)
            {
                spellToUse = TryUseSpell("Innervate", me);
                if (spellToUse != null)
                {
                    CombatUtils.CastSpellByName(me, target, "Innervate", true);
                }                                                                                       // only cast on me
            }

            // main spell rotation
            if (targetDistance < 38)
            {
                // Swiftmend burst heal
                if (IsSwiftmendKnown && target.HealthPercentage < 40 && targetAuras.Contains("rejuvenation"))
                {
                    spellToUse = TryUseSpell("Swiftmend", me);
                    if (spellToUse != null)
                    {
                        return(spellToUse);
                    }
                }

                // Regrowth HOT
                if (IsRegrowthKnown && target.HealthPercentage < 80 && !targetAuras.Contains("regrowth"))
                {
                    spellToUse = TryUseSpell("Regrowth", me);
                    if (spellToUse != null)
                    {
                        return(spellToUse);
                    }
                }

                // Lifebloom HOT
                if (IsLifebloomKnown && target.HealthPercentage < 90 && !targetAuras.Contains("lifebloom"))
                {
                    spellToUse = TryUseSpell("Lifebloom", me);
                    if (spellToUse != null)
                    {
                        return(spellToUse);
                    }
                }

                // Wild Growth HOT
                if (IsWildGrowthKnown && target.HealthPercentage < 70 && !targetAuras.Contains("wild growth"))
                {
                    spellToUse = TryUseSpell("Wild Growth", me);
                    if (spellToUse != null)
                    {
                        return(spellToUse);
                    }
                }

                // Rejuvenation HOT
                if (IsRejuvenationKnown && target.HealthPercentage < 70 && !targetAuras.Contains("rejuvenation"))
                {
                    spellToUse = TryUseSpell("Rejuvenation", me);
                    if (spellToUse != null)
                    {
                        return(spellToUse);
                    }
                }
            }

            return(null);
        }
Пример #4
0
        public override void DoThings()
        {
            // Updte me, target and pet
            Me?.Update();
            Target?.Update();
            Pet?.Update();

            // Handle pending movement actions
            if (WaypointQueue.Count > 0)
            {
                base.DoThings();
            }

            // Try to get a target
            if (AmeisenDataHolder.IsHealer)
            {
                CombatUtils.TargetTargetToHeal(Me, AmeisenDataHolder.ActiveWoWObjects);
                Me?.Update();
                Target?.Update();
            }
            else
            {
                // clear all friendly targets
                AmeisenCore.ClearTargetIfItIsFriendly();

                if (Me.TargetGuid == 0 || CombatUtils.IsUnitValid(Target))
                {
                    CombatUtils.AssistParty(Me, AmeisenDataHolder.ActiveWoWObjects, AmeisenDataHolder.Partymembers);
                    // clear all friendly targets again
                    AmeisenCore.ClearTargetIfItIsFriendly();
                    Me?.Update();
                    Target?.Update();
                }

                if (Me.TargetGuid == 0 || CombatUtils.IsUnitValid(Target))
                {
                    CombatUtils.TargetNearestEnemy();
                    Me?.Update();
                    Target?.Update();

                    if (Me.TargetGuid == 0 || CombatUtils.IsUnitValid(Target))
                    {
                        // by now we should have a target
                        return;
                    }
                }
            }

            // Attack target if we are no healer
            if (!Me.InCombat && !AmeisenDataHolder.IsHealer)
            {
                CombatUtils.AttackTarget();
            }

            // Cast the Spell selected for this Iteration
            if (CombatPackage.SpellStrategy != null)
            {
                Me?.Update();
                Target?.Update();

                Spell spellToUse = CombatPackage.SpellStrategy.DoRoutine(Me, Target, Pet);
                if (spellToUse != null)
                {
                    // try to get in line of sight
                    while (!IsInLineOfSight(Me, Target))
                    {
                        HandleMovement(Target.pos);
                        Thread.Sleep(500);
                    }

                    CombatUtils.CastSpellByName(Me, Target, spellToUse.Name, false, true);
                }
                else
                {
                    Thread.Sleep(200);
                }
            }

            // Handle Movement stuff
            if (CombatPackage.MovementStrategy != null)
            {
                Me?.Update();
                Target?.Update();
                HandleMovement(CombatPackage.MovementStrategy.CalculatePosition(Me, Target));
            }
        }
Пример #5
0
        public Spell DoRoutine(Me me, Unit target, Unit pet)
        {
            if (CombatUtils.IsUnitValid(me)
                && CombatUtils.IsUnitValid(target))
            {
                return null;
            }

            List<string> myAuras = AmeisenCore.GetAuras(LuaUnit.player);
            List<string> targetAuras = AmeisenCore.GetAuras(LuaUnit.target);

            Spell spellToUse = null;
            double targetDistance = Utils.GetDistance(me.pos, target.pos);

            // our Seal
            if (IsSealOfVengeanceKnown)
            {
                if (!myAuras.Contains("seal of vengeance"))
                {
                    spellToUse = TryUseSpell("Seal of Vengeance", me);
                    if (spellToUse != null) { return spellToUse; }
                }
            }

            // our Buff
            if (IsBlessingOfMightKnown)
            {
                if (!myAuras.Contains("blessing of might"))
                {
                    spellToUse = TryUseSpell("Blessing of Might", me);
                    if (spellToUse != null) { return spellToUse; }
                }
            }

            // if we go under 70% Mana, use Divine Plea
            if (IsDivinePleaKnown && me.HealthPercentage < 70)
            {
                spellToUse = TryUseSpell("Divine Plea", me);
                if (spellToUse != null)
                {
                    CombatUtils.CastSpellByName(me, target, "Divine Plea", false, true); // doesn't trigger GCD
                }
            }

            // if we go under 10% health, use our insta-full-heal
            if (IsLayOnHandsKnown && me.HealthPercentage < 10 && !myAuras.Contains("forbearance"))
            {
                spellToUse = TryUseSpell("Lay on Hands", me);
                if (spellToUse != null) { return spellToUse; }
            }

            // if we go under 70% health, use Flash Heal
            if (IsFlashHealKnown && me.HealthPercentage < 70)
            {
                spellToUse = TryUseSpell("Flash Heal", me);
                if (spellToUse != null) { return spellToUse; }
            }

            // if we go under 40% health, use Holy Light
            if (IsHolyLightKnown && me.HealthPercentage < 40)
            {
                spellToUse = TryUseSpell("Holy Light", me);
                if (spellToUse != null) { return spellToUse; }
            }

            // Avenging Wrath cooldown
            if (IsAvengingWrathKnown)
            {
                spellToUse = TryUseSpell("Avenging Wrath", me);
                if (spellToUse != null)
                {
                    CombatUtils.CastSpellByName(me, target, "Avenging Wrath", false, true); // doesn't trigger GCD
                }
            }

            // stun
            if (targetDistance < 5)
            {
                // try to Fear it away lmao
                if (IsHammerOfJusticeKnown)
                {
                    spellToUse = TryUseSpell("Hammer of Justice", me);
                    if (spellToUse != null) { return spellToUse; }
                }
            }

            // main spell rotation
            if (targetDistance < 30)
            {
                // apply our Judgement
                if (IsJudgementOfWisdomKnown)
                {
                    spellToUse = TryUseSpell("Judgement of Wisdom", me);
                    if (spellToUse != null) { return spellToUse; }
                }
                else if (IsJudgementOfLightKnown)
                {
                    spellToUse = TryUseSpell("Judgement of Light", me);
                    if (spellToUse != null) { return spellToUse; }
                }

                // if target is over 20% use Hammer of Wrath
                if (target.HealthPercentage < 20)
                {
                    if (IsHammerOfWrathKnown)
                    {
                        spellToUse = TryUseSpell("Hammer of Wrath", me);
                        if (spellToUse != null) { return spellToUse; }
                    }
                }

                // use Crusader Strike
                if (IsCrusaderStrikeKnown)
                {
                    spellToUse = TryUseSpell("Crusader Strike", me);
                    if (spellToUse != null) { return spellToUse; }
                }

                // use Divine Storm
                if (IsDivineStormKnown)
                {
                    spellToUse = TryUseSpell("Divine Storm", me);
                    if (spellToUse != null) { return spellToUse; }
                }

                // use Consecration
                if (IsConsecrationKnown)
                {
                    spellToUse = TryUseSpell("Consecration", me);
                    if (spellToUse != null) { return spellToUse; }
                }

                // use Exorcism
                if (IsExorcismKnown)
                {
                    spellToUse = TryUseSpell("Exorcism", me);
                    if (spellToUse != null) { return spellToUse; }
                }
            }

            return null;
        }
Пример #6
0
        public Spell DoRoutine(Me me, Unit target, Unit pet)
        {
            if (CombatUtils.IsUnitValid(me) &&
                CombatUtils.IsUnitValid(target))
            {
                return(null);
            }

            List <string> myAuras     = AmeisenCore.GetAuras(LuaUnit.player);
            List <string> targetAuras = AmeisenCore.GetAuras(LuaUnit.target);

            Spell  spellToUse     = null;
            double targetDistance = Utils.GetDistance(me.pos, target.pos);

            // our Buff
            if (IsPowerwordFortitudeKnown && !targetAuras.Contains("power word: fortitude"))
            {
                spellToUse = TryUseSpell("Power Word: Fortitude", me);
                if (spellToUse != null)
                {
                    return(spellToUse);
                }
            }

            // our defensive buff
            if (IsInnerFireKnown && !myAuras.Contains("inner fire"))
            {
                spellToUse = TryUseSpell("Inner Fire", me);
                if (spellToUse != null)
                {
                    CombatUtils.CastSpellByName(me, target, "Inner Fire", true);
                }                                                                                        // only cast on me
            }

            // Shadowfiend mana regen
            if (IsShadowfiendKnown && me.ManaPercentage < 20)
            {
                spellToUse = TryUseSpell("Shadowfiend", me);
                if (spellToUse != null)
                {
                    CombatUtils.TargetNearestEnemy(); // use shadowfiend on something around us
                    CombatUtils.CastSpellByName(me, target, "Shadowfiend", false);
                }
            }

            // main spell rotation
            if (targetDistance < 38)
            {
                // Renew HOT
                if (IsRenewKnown && target.HealthPercentage < 80 && !targetAuras.Contains("renew"))
                {
                    spellToUse = TryUseSpell("Renew", me);
                    if (spellToUse != null)
                    {
                        return(spellToUse);
                    }
                }

                // Binding Heal if me is low too, otherwise Flash Heal until Serendipity is stacked, then use Greater Heal
                if (target.HealthPercentage < 70)
                {
                    if (IsBindingHealKnown && me.HealthPercentage < 80)
                    {
                        spellToUse = TryUseSpell("Binding Heal", me);
                        if (spellToUse != null)
                        {
                            return(spellToUse);
                        }
                    }
                    else
                    {
                        if (IsGreaterHealKnown && myAuras.Contains("serendipity"))
                        {
                            spellToUse = TryUseSpell("Greater Heal", me);
                            if (spellToUse != null)
                            {
                                return(spellToUse);
                            }
                        }
                        else if (IsFlashHealKnown)
                        {
                            spellToUse = TryUseSpell("Flash Heal", me);
                            if (spellToUse != null)
                            {
                                return(spellToUse);
                            }
                        }
                    }
                }
            }

            return(null);
        }
Пример #7
0
        public Spell DoRoutine(Me me, Unit target, Unit pet)
        {
            if (CombatUtils.IsUnitValid(me) &&
                CombatUtils.IsUnitValid(target))
            {
                return(null);
            }

            List <string> myAuras     = AmeisenCore.GetAuras(LuaUnit.player);
            List <string> targetAuras = AmeisenCore.GetAuras(LuaUnit.target);

            Spell  spellToUse     = null;
            double targetDistance = Utils.GetDistance(me.pos, target.pos);

            // if we are low on HP try to use Enraged Regeneration

            /*if (me.HealthPercentage < 40)
             * {
             *  if (IsEnragedRegenerationKnown)
             *  {
             *      spellToUse = TryUseSpell("Enraged Regeneration", me);
             *      if (spellToUse != null) { return spellToUse; }
             *  }
             * }*/

            // hold Berserker Rage on cooldown
            if (IsBerserkerRageKnown && !IsInMainCombo)
            {
                spellToUse = TryUseSpell("Berserker Rage", me);
                if (spellToUse != null)
                {
                    return(spellToUse);
                }
            }

            // main spell rotation
            if (targetDistance < 3)
            {
                // if we got enough rage and nothing better to do, use Heroic Strike
                if (me.Rage > 50 && target.HealthPercentage > 15)
                {
                    // Heroic Strike wont't interrupt main-combo
                    if (IsHeroicStrikeKnown)
                    {
                        CombatUtils.CastSpellByName(me, target, "Heroic Strike", false, false); // don't wait on cooldown
                    }
                }

                // if we are in our main-combo, use the second part of it, whirlwind
                if (IsWhirlwindKnown && IsInMainCombo && IsBerserkerStanceKnown)
                {
                    // dont't interrupt main-combo
                    spellToUse = TryUseSpell("Whirlwind", me);
                    if (spellToUse != null)
                    {
                        IsInMainCombo = false;
                    }
                    // normally whirlwind has 10s cooldown, bloodthirst only 5 so use it if we are still in that 10s
                    else if (IsBloodthirstKnown)
                    {
                        spellToUse = TryUseSpell("Bloodthirst", me);
                    }

                    return(spellToUse);
                }
                else if (!IsBerserkerStanceKnown)
                {
                    IsInMainCombo = false;
                }

                // use hamstring so our enemy can't escape
                if (IsHamstringKnown && !targetAuras.Contains("hamstring"))
                {
                    spellToUse = TryUseSpell("Hamstring", me);
                    if (spellToUse != null)
                    {
                        return(spellToUse);
                    }
                }

                // when da slam procs, use it
                if (IsSlamKnown && myAuras.Contains("slam!"))
                {
                    spellToUse = TryUseSpell("Slam", me);
                    if (spellToUse != null)
                    {
                        return(spellToUse);
                    }
                }

                // start our main-combo
                if (IsBloodthirstKnown)
                {
                    spellToUse = TryUseSpell("Bloodthirst", me);

                    if (spellToUse != null)
                    {
                        IsInMainCombo = true;
                        return(spellToUse);
                    }
                }

                // hold Recklessness on cooldown
                if (IsRecklessnessKnown && !IsInMainCombo)
                {
                    spellToUse = TryUseSpell("Recklessness", me);
                    if (spellToUse != null)
                    {
                        return(spellToUse);
                    }
                }

                // hold Death Wish on cooldown
                if (IsDeathWishKnown && !IsInMainCombo)
                {
                    spellToUse = TryUseSpell("Death Wish", me);
                    if (spellToUse != null)
                    {
                        return(spellToUse);
                    }
                }

                // hold Battleshout on cooldown
                if (IsBattleShoutKnown && !IsInMainCombo && !myAuras.Contains("battle shout"))
                {
                    spellToUse = TryUseSpell("Battle Shout", me);
                    if (spellToUse != null)
                    {
                        return(spellToUse);
                    }
                }

                if (me.Rage > 50)
                {
                    if (IsExecuteKnown && target.HealthPercentage < 15 && !IsInMainCombo)
                    {
                        spellToUse = TryUseSpell("Execute", me);
                        if (spellToUse != null)
                        {
                            return(spellToUse);
                        }
                    }
                }
            }
            else if (targetDistance > 8 && targetDistance < 25)
            {
                // try to charge to our target
                if (IsInterceptKnown)
                {
                    spellToUse = TryUseSpell("Intercept", me);
                    if (spellToUse != null)
                    {
                        return(spellToUse);
                    }
                }
            }
            else if (targetDistance < 30)
            {
                // if there is really nothing other to do, throw something
                if (IsHeroicThrowKnown)
                {
                    spellToUse = TryUseSpell("Heroic Throw", me);
                    if (spellToUse != null)
                    {
                        return(spellToUse);
                    }
                }
            }
            return(null);
        }
Пример #8
0
        public Spell DoRoutine(Me me, Unit target, Unit pet)
        {
            if (CombatUtils.IsUnitValid(me) &&
                CombatUtils.IsUnitValid(target))
            {
                return(null);
            }

            List <string> myAuras     = AmeisenCore.GetAuras(LuaUnit.player);
            List <string> targetAuras = AmeisenCore.GetAuras(LuaUnit.target);

            Spell  spellToUse     = null;
            double targetDistance = Utils.GetDistance(me.pos, target.pos);

            // our Buff
            if (IsPowerwordFortitudeKnown && !myAuras.Contains("power word: fortitude"))
            {
                spellToUse = TryUseSpell("Power Word: Fortitude", me);
                if (spellToUse != null)
                {
                    return(spellToUse);
                }
            }

            // Shadowform
            if (IsShadowformKnown && !myAuras.Contains("shadowform"))
            {
                spellToUse = TryUseSpell("Shadowform", me);
                if (spellToUse != null)
                {
                    return(spellToUse);
                }
            }

            // our Vampiric Embrace
            if (IsVampiricEmbraceKnown && !myAuras.Contains("vampiric embrace"))
            {
                spellToUse = TryUseSpell("Vampiric Embrace", me);
                if (spellToUse != null)
                {
                    CombatUtils.CastSpellByName(me, target, "Vampiric Embrace", true);
                }                                                                                              // only cast on me
            }

            // Heal oruself using Flash Heal
            if (IsFlashHealKnown && me.HealthPercentage < 50)
            {
                spellToUse = TryUseSpell("Vampiric Embrace", me);
                if (spellToUse != null)
                {
                    CombatUtils.CastSpellByName(me, target, "Vampiric Embrace", true);
                }                                                                                              // only cast on me
            }

            // main spell rotation
            if (targetDistance < 28)
            {
                // Vampiric Touch
                if (IsVampiricTouchKnown && !targetAuras.Contains("vampiric touch"))
                {
                    spellToUse = TryUseSpell("Vampiric Touch", me);
                    if (spellToUse != null)
                    {
                        return(spellToUse);
                    }
                }

                // Devouring Plague
                if (IsDevouringPlagueKnown && !targetAuras.Contains("devouring plague"))
                {
                    spellToUse = TryUseSpell("Scorch", me);
                    if (spellToUse != null)
                    {
                        return(spellToUse);
                    }
                }

                // Shadow Word: Pain
                if (IsShadowWordPainKnown && !targetAuras.Contains("shadow word: pain"))
                {
                    spellToUse = TryUseSpell("Shadow Word: Pain", me);
                    if (spellToUse != null)
                    {
                        return(spellToUse);
                    }
                }

                // Mind Blast
                if (IsMindBlastKnown && !targetAuras.Contains("mind trauma"))
                {
                    spellToUse = TryUseSpell("Mind Blast", me);
                    if (spellToUse != null)
                    {
                        return(spellToUse);
                    }
                }

                // Spam Mind Flay
                if (IsMindFlayKnown)
                {
                    spellToUse = TryUseSpell("Mind Flay", me);
                    if (spellToUse != null)
                    {
                        return(spellToUse);
                    }
                }
            }

            return(null);
        }
Пример #9
0
        public Spell DoRoutine(Me me, Unit target, Unit pet)
        {
            if (CombatUtils.IsUnitValid(me) &&
                CombatUtils.IsUnitValid(target))
            {
                return(null);
            }

            List <string> myAuras     = AmeisenCore.GetAuras(LuaUnit.player);
            List <string> targetAuras = AmeisenCore.GetAuras(LuaUnit.target);

            Spell  spellToUse     = null;
            double targetDistance = Utils.GetDistance(me.pos, target.pos);

            // our Buff
            if (IsArcaneIntellectKnown && !myAuras.Contains("arcane intellect"))
            {
                spellToUse = TryUseSpell("Arcane Intellect", me);
                if (spellToUse != null)
                {
                    return(spellToUse);
                }
            }

            // our Mage Armor
            if (IsMageArmorKnown && me.ManaPercentage > 10 && !myAuras.Contains("mage armor"))
            {
                spellToUse = TryUseSpell("Mage Armor", me);
                if (spellToUse != null)
                {
                    CombatUtils.CastSpellByName(me, target, "Mage Armor", true);
                }                                                                                        // only cast on me
            }

            // our Molten Armor
            if (IsMoltenArmorKnown && me.ManaPercentage < 10 && !myAuras.Contains("molten armor"))
            {
                spellToUse = TryUseSpell("Molten Armor", me);
                if (spellToUse != null)
                {
                    CombatUtils.CastSpellByName(me, target, "Molten Armor", true);
                }                                                                                          // only cast on me
            }

            // Evocation mana regen
            if (IsEvocationKnown && me.ManaPercentage < 20)
            {
                spellToUse = TryUseSpell("Evocation", me);
                if (spellToUse != null)
                {
                    return(spellToUse);
                }
            }

            // Mirror Image CD
            if (IsMirrorImageKnown)
            {
                spellToUse = TryUseSpell("Mirror Image", me);
                if (spellToUse != null)
                {
                    return(spellToUse);
                }
            }

            // Mana Shield
            if (IsManaShieldKnown && me.HealthPercentage < 70)
            {
                spellToUse = TryUseSpell("Mana Shield", me);
                if (spellToUse != null)
                {
                    return(spellToUse);
                }
            }

            // Ice Block if we are about to die
            if (IsIceBlockKnown && me.HealthPercentage < 20)
            {
                spellToUse = TryUseSpell("Ice Block", me);
                if (spellToUse != null)
                {
                    return(spellToUse);
                }
            }

            // main spell rotation
            if (targetDistance < 28)
            {
                // Hot Streak proc
                if (IsPyroblastKnown && myAuras.Contains("hot streak"))
                {
                    spellToUse = TryUseSpell("Pyroblast", me);
                    if (spellToUse != null)
                    {
                        return(spellToUse);
                    }
                }

                // Scorch crit debuff
                if (IsScorchKnown && !targetAuras.Contains("improved scorch"))
                {
                    spellToUse = TryUseSpell("Scorch", me);
                    if (spellToUse != null)
                    {
                        return(spellToUse);
                    }
                }

                // Living Bomb
                if (IsLivingBombKnown && !targetAuras.Contains("living bomb"))
                {
                    spellToUse = TryUseSpell("Living Bomb", me);
                    if (spellToUse != null)
                    {
                        return(spellToUse);
                    }
                }

                // Spam Forstfire Bolt
                if (IsForstfireBoltKnown)
                {
                    spellToUse = TryUseSpell("Frostfire Bolt", me);
                    if (spellToUse != null)
                    {
                        return(spellToUse);
                    }
                }

                // Spam Fireball
                if (IsFireballKnown)
                {
                    spellToUse = TryUseSpell("Fireball", me);
                    if (spellToUse != null)
                    {
                        return(spellToUse);
                    }
                }
            }

            return(null);
        }