Hemario / Ovale_TankScripts

Custom tank scripts for Ovale (wow)
2 stars 3 forks source link

Pre-patch BfA tank script for blood death knight #11

Closed johnnylam88 closed 3 years ago

johnnylam88 commented 3 years ago

This is a standalone script that doesn't rely on the correct spells listed in ovale_common or ovale_death_knight_spells. It also includes a different set of main actions for tanking Mythic+ dungeons from Kyrasis.

I would normally submit a pull request for this but I don't have access to Git right now.

# 9.0.1 (36272) BfA Blood Death Knight

# Talents
Define(antimagic_barrier_talent 11)
Define(blood_tap_talent 9)
Define(blooddrinker_talent 2)
Define(bonestorm_talent 21)
Define(consumption_talent 6)
Define(foul_bulwark_talent 7)
Define(heartbreaker_talent 1)
Define(mark_of_blood_talent 12)
Define(relish_in_blood_talent 8)
Define(tightening_grasp_talent 14)
Define(tombstone_talent 3)
Define(voracious_talent 16)

# Spells
Define(antimagic_shell 48707)
    SpellInfo(antimagic_shell cd=60 offgcd=1 duration=5)
    SpellInfo(antimagic_shell addcd=-20 addduration=2 talent=antimagic_barrier_talent specialization=blood)
Define(asphyxiate_blood 221562)
    SpellInfo(asphyxiate_blood cd=45 duration=5)
    SpellAddTargetDebuff(asphyxiate_blood asphyxiate_blood=1)
Define(blood_tap 221699)
    SpellInfo(blood_tap cd=60 runes=-1 talent=blood_tap_talent)
Define(blooddrinker 206931)
    SpellInfo(blooddrinker runes=1 runicpower=-10 cd=30 duration=3 channel=3 tick=1 talent=blooddrinker_talent)
    SpellAddTargetDebuff(blooddrinker blooddrinker=1)
Define(bonestorm 194844)
    SpellInfo(bonestorm runicpower=10 cd=60 duration=1 tick=1 talent=bonestorm_talent)
    SpellAddBuff(bonestorm bonestorm=1 talent=bonestorm_talent)
Define(consumption 274156)
    SpellInfo(consumption cd=30 talent=consumption_talent)
Define(dancing_rune_weapon 49028)
    SpellInfo(dancing_rune_weapon cd=120)
Define(death_and_decay 43265)
    SpellInfo(death_and_decay cd=30 runes=1 runicpower=-10)
Define(death_grip 49576)
    SpellInfo(death_grip cd=25)
Define(death_strike 49998)
    SpellInfo(death_strike runicpower=45)
Define(gorefiends_grasp 108199)
    SpellInfo(gorefiends_grasp cd=120)
    SpellInfo(gorefiends_grasp addcd=-30 talent=tightening_grasp_talent)
Define(heart_strike 206930)
    SpellInfo(heart_strike runes=1 runicpower=-10 duration=8)
    SpellInfo(heart_strike addrunicpower=-5 level=23)
    SpellInfo(heart_strike addrunicpower=-2 talent=heartbreaker_talent)
    SpellAddTargetDebuff(heart_strike heart_strike=1)
Define(icebound_fortitude 48792)
    SpellInfo(icebound_fortitude cd=180 offgcd=1 duration=8)
Define(mark_of_blood 206940)
    SpellInfo(mark_of_blood cd=6 duration=15 talent=mark_of_blood_talent)
    SpellAddTargetDebuff(mark_of_blood mark_of_blood=1 talent=mark_of_blood_talent)
Define(marrowrend 195182)
    SpellInfo(marrowrend runes=2 runicpower=-20)
Define(mind_freeze 47528)
    SpellInfo(mind_freeze cd=15 offgcd=1 interrupt=1)
Define(rune_tap 194679)
    SpellInfo(rune_tap cd=25 offgcd=1 runes=1 runicpower=-10 duration=4)
Define(tombstone 219809)
    SpellInfo(tombstone cd=60 duration=8 runicpower=-6 talent=tombstone_talent)
    SpellAddBuff(tombstone tombstone=1 talent=tombstone_talent)
Define(vampiric_blood 55233)
    SpellInfo(vampiric_blood cd=90 offgcd=1 duration=10)
    SpellInfo(vampiric_blood addduration=2 level=56)
    SpellAddBuff(vampiric_blood vampiric_blood=1)
Define(war_stomp 20549)
    SpellInfo(war_stomp cd=90 duration=2 offgcd=1)
    SpellAddTargetDebuff(war_stomp war_stomp=1)

# Buffs & debuffs
Define(blood_boil 50842)
    SpellInfo(blood_boil cd=7.5)
Define(blood_plague_debuff 55078)
    SpellInfo(blood_plague_debuff duration=24)
Define(blood_shield_buff 77535)
    SpellInfo(blood_shield_buff duration=10)
    SpellAddBuff(death_strike blood_shield_buff=1)
Define(bone_shield_buff 195181)
    SpellInfo(bone_shield_buff duration=30 max_stacks=10)
    SpellAddBuff(marrowrend bone_shield_buff=3)
    SpellAddBuff(tombstone bone_shield_buff=-5 talent=tombstone_talent)
Define(crimson_scourge_buff 81141)
    SpellInfo(crimson_scourge_buff duration=15)
    SpellAddBuff(death_and_decay crimson_scourge_buff=0 specialization=blood)
    SpellRequire(death_and_decay runes 0=buff,crimson_scourge_buff specialization=blood)
    SpellRequire(death_and_decay runicpower 0=buff,crimson_scourge_buff talent=blood_tap_talent specialization=blood)
    SpellRequire(death_and_decay runicpower 0=buff,crimson_scourge_buff talent=foul_bulwark_talent specialization=blood)
    SpellRequire(death_and_decay runicpower -10=buff,crimson_scourge_buff talent=relish_in_blood_talent specialization=blood)
Define(dancing_rune_weapon_buff 81256)
    SpellInfo(dancing_rune_weapon_buff duration=8)
    SpellAddBuff(dancing_rune_weapon dancing_rune_weapon_buff=1)
Define(death_and_decay_buff 188290)
    SpellInfo(death_and_decay_buff duration=10)
    SpellAddBuff(death_and_decay death_and_decay_buff=1)
Define(hemostasis_buff 273947)
    SpellInfo(hemostasis_buff duration=15 max_stacks=5)
    SpellAddBuff(death_strike hemostasis_buff=0 specialization=blood)
Define(lifeblood_buff 295137)

# Essences (ranks 3 & 4)
Define(anima_of_death 300003)
    SpellInfo(anima_of_death cd=120)
Define(concentrated_flame 299353)
    SpellInfo(concentrated_flame cd=30 tag=main)
Define(concentrated_flame_burn_debuff 295368)
    SpellInfo(concentrated_flame_burn_debuff duration=6)
    SpellAddTargetDebuff(concentrated_flame concentrated_flame_burn_debuff=1)
Define(memory_of_lucid_dreams 299374)
    SpellInfo(memory_of_lucid_dreams cd=120 duration=15)
    SpellAddBuff(memory_of_lucid_dreams memory_of_lucid_dreams=1)
Define(worldvein_resonance 299334)
    SpellInfo(worldvein_resonance cd=60)

# Items
Define(item_abyssal_healing_potion 169451)
Define(item_battle_potion_of_stamina 163225)
Define(item_coastal_healing_potion 152494)
Define(item_healthstone 5512)
Define(item_steelskin_potion 152557)
Define(item_superior_battle_potion_of_stamina 168499)
Define(item_superior_steelskin_potion 168501)

AddCheckBox(opt_interrupt L(interrupt) default specialization=blood)
AddCheckBox(opt_melee_range L(not_in_melee_range) specialization=blood)
AddCheckBox(opt_use_consumables L(opt_use_consumables) default specialization=blood)
AddCheckBox(opt_mythic_plus_rotation L(mythic_plus_rotation) specialization=blood)

AddFunction UseHealthPotions
{
    Item(item_healthstone usable=1)
    Item(item_abyssal_healing_potion usable=1)
    Item(item_coastal_healing_potion usable=1)
}

AddFunction AzeriteEssenceMain
{
    if target.DebuffExpires(concentrated_flame_burn_debuff) Spell(concentrated_flame)
}

AddFunction AzeriteEssenceOffensiveCooldowns
{
    if BuffStacks(lifeblood_buff) < 4 Spell(worldvein_resonance)
    Spell(anima_of_death)
}

AddFunction AzeriteEssenceDefensiveCooldowns
{
    Spell(memory_of_lucid_dreams)
}

AddFunction BloodPoolingForBoneStorm
{
    Talent(bonestorm_talent) and SpellCooldown(bonestorm) < 3 and Enemies() >= 3 and RunicPower() < 100
}

AddFunction BloodDeathStrikeMinHealing
{
    MaxHealth() * (7 + 3 * Talent(voracious_talent)) / 100
}

AddFunction BloodDeathStrikeBaseHealing
{
    if (IncomingDamage(5) / 4 > BloodDeathStrikeMinHealing()) IncomingDamage(5) / 4
    BloodDeathStrikeMinHealing()
}

AddFunction BloodDeathStrikeHealing
{
    # Death Strike healing is increased by both Voracious and Hemostatis talents.
    BloodDeathStrikeBaseHealing() * ((100 + 20 * Talent(voracious_talent)) / 100) * ((100 + 8 * BuffStacks(hemostasis_buff)) / 100)
}

AddFunction BloodPrecombatShortCdActions
{
    # Only Rune Tap if Bone Shield is down or Runic Power is low.
    if not BuffPresent(rune_tap) and (not BuffPresent(bone_shield_buff) or RunicPower() < 30) Spell(rune_tap)
}

AddFunction BloodDefaultShortCdActions
{
    BloodHealMeShortCd()
    if CheckBoxOn(opt_melee_range) and not target.InRange(death_strike) Texture(misc_arrowlup help=L(not_in_melee_range))
}

AddFunction BloodHealMeShortCd
{
    unless(DebuffPresent(healing_immunity_debuff)) 
    {
        if (HealthPercent() < 35) UseHealthPotions()
    }
}

AddFunction BloodHealMeMain
{
    unless DebuffPresent(healing_immunity_debuff)
    {
        if (HealthPercent() <= 75) 
        {
            if (Enemies() >= 3 and RunicPower() >= 70) Spell(bonestorm)
            if (not BloodPoolingForBoneStorm() and BloodDeathStrikeHealing() <= HealthMissing()) Spell(death_strike)
            if (HealthPercent() <= 50) Spell(death_strike)
        } 
    }
}

AddFunction BloodDefaultMainActions
{
    # Heal
    BloodHealMeMain()

    AzeriteEssenceMain()

    # keep marrowrend up
    if (InCombat() and BuffRemaining(bone_shield_buff) < TimeToRunes(3)) Spell(marrowrend)
    # AoE
    if (Enemies() >= 3 and RunicPower() >= 100) Spell(bonestorm)
    if (Enemies() >= 3) Spell(consumption)
    # Death Strike
    if (BuffPresent(blood_shield_buff) and BuffRemaining(blood_shield_buff) < 3) Spell(death_strike)
    if (not BloodPoolingForBoneStorm() and RunicPowerDeficit() <= 20) Spell(death_strike)
    # Mark of Blood is not worth using even if it is a baseline ability
    #if (target.DebuffExpires(mark_of_blood) and target.IsTargetingPlayer()) Spell(mark_of_blood)
    # Blooddrinker
    if not BuffPresent(dancing_rune_weapon_buff) Spell(blooddrinker)
    # Blood boil
    if (Charges(blood_boil count=0) >= 1.8) Spell(blood_boil)
    if (DebuffCountOnAny(blood_plague_debuff) < Enemies(tagged=1) or target.DebuffRefreshable(blood_plague_debuff)) Spell(blood_boil)
    # Marrowrend (279502 = trait Bones of the Damned)
    if (BuffStacks(bone_shield_buff) <= 7-HasAzeriteTrait(279502)-3*BuffPresent(dancing_rune_weapon_buff)) Spell(marrowrend)
    # Blood Tap
    if (Rune() < 3 and Charges(blood_tap) >= 1.8 or RunicPower() < 73) Spell(blood_tap)
    # dump runes while keeping at most 3 runes on cooldown
    if TimeToRunes(3) < GCD()
    {
        if (Enemies() >= 3) Spell(death_and_decay)
        if (BuffStacks(bone_shield_buff) >= 6) Spell(heart_strike)
    }
    # pool runic power for emergency Death Strike
    if (RunicPower() < 45) Spell(heart_strike)
    # fillers
    if BuffPresent(dancing_rune_weapon_buff) Spell(blood_boil)
    if BuffPresent(crimson_scourge_buff) Spell(death_and_decay)
    Spell(blood_boil)
}

# Core Ability Priority List from "[8.3] Advanced Blood Death Knight M+ Guide" by Kyrasis-Stormreaver
AddFunction BloodMythicPlusMainActions
{
    unless(DebuffPresent(healing_immunity_debuff)) 
    {
        # Bonestorm if you are below 75% health with 3+ targets and Runic Power is above 70.
        if (HealthPercent() <= 75 and Enemies() >= 3 and RunicPower() >= 70) Spell(bonestorm)
        # Death Strike if you are below 60% Health.
        if (HealthPercent() <= 60 and not BloodPoolingForBoneStorm() and BloodDeathStrikeHealing() <= HealthMissing()) Spell(death_strike)
    }
    # Marrowrend if Bone Shield is not active or about to expire.
    if (InCombat() and BuffRemaining(bone_shield_buff) < GCD() + 2) Spell(marrowrend)
    if not BuffPresent(memory_of_lucid_dreams) and not BuffPresent(dancing_rune_weapon_buff)
    {
        # Use Crucible of Flame major essence (from SimC).
        if (target.DebuffRemaining(concentrated_flame_burn_debuff) < 2) Spell(concentrated_flame)
        # Blooddrinker if Dancing Rune Weapon is not active (from SimC).
        Spell(blooddrinker)
    }
    # Blood Boil if a target does not have Blood Plague.
    if (DebuffCountOnAny(blood_plague_debuff) < Enemies(tagged=1) or target.DebuffRefreshable(blood_plague_debuff)) Spell(blood_boil)
    # Bonestorm with 3+ targets and Runic Power is above 100 (from SimC).
    if (not BuffPresent(dancing_rune_weapon_buff) and Enemies() >= 3 and RunicPower() >= 100) Spell(bonestorm)
    # Consumption with 3+ targets.
    if (Enemies() >= 3) Spell(consumption)
    # Death Strike when Runic Power within one Rune spent of being capped.
    if (not BloodPoolingForBoneStorm() and RunicPowerDeficit() < 10) Spell(death_strike)
    # Marrowrend if below 8 stacks of Bone Shield (below 7 with Bones of the Damned)
    if (BuffStacks(bone_shield_buff) < 8 - HasAzeriteTrait(279502) - 3 * BuffPresent(dancing_rune_weapon_buff)) Spell(marrowrend)
    # Blood Tap at less than 3 Runes and at, or close to having, 2 charges.
    # Blood Tap at less than 3 Runes on 1 charge and Runic Power is below the cost of two Death Strike minus the gain from Heart Strike.
    if (Rune() < 3 and Charges(blood_tap) >= 1.8 or RunicPower() < 73) Spell(blood_tap)
    # Heart Strike with or when 1.5 second away from having more than 3 Runes.
    if (TimeToRunes(3) < GCD()) Spell(heart_strike)
    if not BuffPresent(memory_of_lucid_dreams)
    {
        # Death and Decay when Crimson Scourge procs with either 3+ targets or Bloody Runeblade.
        if (BuffPresent(crimson_scourge_buff) and (Enemies() >= 3 or HasAzeriteTrait(289347))) Spell(death_and_decay)
        # Blood Boil with 2 charges and less than 5 stacks of Hemostasis.
        if (Charges(blood_boil) >= 1.8 and BuffStacks(hemostasis_buff) < 5) Spell(blood_boil)
    }
    # Heart Strike with 3 Runes.
    if (Rune() >= 3) Spell(heart_strike)
    # Heart Strike with:
    #   ((Dancing Rune Weapon and less than 76 RP) or
    #    (Death and Decay with 3+ targets without Dancing Rune Weapon and less than 81 RP))
    #   and 8+ stacks of Bone Shield and 7.5+ seconds left of Bone Shield duration.
    if BuffStacks(bone_shield_buff) >= 8 and BuffRemaining(bone_shield_buff) >= 7.5
    {
        if (BuffPresent(dancing_rune_weapon_buff) and RunicPowerDeficit() > 40) Spell(heart_strike)
        if (not BuffPresent(dancing_rune_weapon_buff) and BuffPresent(death_and_decay_buff) and Enemies() >= 3 and RunicPowerDeficit() > 35) Spell(heart_strike)
    }
    if not BuffPresent(memory_of_lucid_dreams)
    {
        # Blood Boil with 1 Blood Boil charge and less than 5 stacks of Hemostasis.
        if (BuffStacks(hemostasis_buff) < 5) Spell(blood_boil)
        # Death and Decay with a Crimson Scourge proc.
        if BuffPresent(crimson_scourge_buff) Spell(death_and_decay)
    }
    # Mark of Blood wouldn't be worth using even if it was a baseline ability.
    #if (target.DebuffExpires(mark_of_blood) and target.IsTargetingPlayer()) Spell(mark_of_blood)
}

AddFunction BloodDefaultCdActions
{
    if CheckBoxOff(opt_deathknight_blood_offensive) BloodDefaultOffensiveActions()

    if (IncomingDamage(1.5 magic=1) > 0) Spell(antimagic_shell)
    if (BuffStacks(bone_shield_buff) >= 6) Spell(tombstone)
    Item(Trinket0Slot usable=1 text=13)
    Item(Trinket1Slot usable=1 text=14)

    AzeriteEssenceDefensiveCooldowns()

    Spell(vampiric_blood)
    Spell(icebound_fortitude)
    if CheckBoxOn(opt_use_consumables) 
    {
        Item(item_superior_steelskin_potion usable=1)
        Item(item_steelskin_potion usable=1)
        Item(item_superior_battle_potion_of_stamina usable=1)
        Item(item_battle_potion_of_stamina usable=1)
    }
}

AddFunction BloodDefaultOffensiveActions
{
    BloodInterruptActions()
    AzeriteEssenceOffensiveCooldowns()
    BloodDefaultOffensiveCooldowns()
}

AddFunction BloodInterruptActions
{
    if CheckBoxOn(opt_interrupt) and not target.IsFriend() and target.Casting()
    {
        if (target.InRange(mind_freeze) and target.IsInterruptible()) Spell(mind_freeze)
        if not target.Classification(worldboss) 
        {
            if target.InRange(asphyxiate_blood) Spell(asphyxiate_blood)
            if target.InRange(death_grip) Spell(death_grip)
            if (target.Distance() < 15) Spell(gorefiends_grasp)
            if (target.Distance() < 5) Spell(war_stomp)
        }
    }
}

AddFunction BloodDefaultOffensiveCooldowns
{
    Spell(dancing_rune_weapon)
}

AddCheckBox(opt_deathknight_blood_aoe L(AOE) default specialization=blood)

AddIcon help=shortcd specialization=blood
{
    # InCombat() always returns false is bugged in Ovale 9.0.4.
    #if not InCombat() BloodPrecombatShortCdActions()
    BloodDefaultShortCdActions()
}

AddIcon enemies=1 help=main specialization=blood
{
    if CheckBoxOn(opt_advanced_mythicplus_rotation) BloodMythicPlusMainActions()
    if CheckBoxOff(opt_advanced_mythicplus_rotation) BloodDefaultMainActions()
}

AddIcon checkbox=opt_deathknight_blood_aoe help=aoe specialization=blood
{
    if CheckBoxOn(opt_advanced_mythicplus_rotation) BloodMythicPlusMainActions()
    if CheckBoxOff(opt_advanced_mythicplus_rotation) BloodDefaultMainActions()
}

AddIcon help=cd specialization=blood
{
    BloodDefaultCdActions()
}

AddCheckBox(opt_deathknight_blood_offensive L(seperate_offensive_icon) default specialization=blood)
AddIcon checkbox=opt_deathknight_blood_offensive size=small specialization=blood
{
    BloodDefaultOffensiveActions()
}
johnnylam88 commented 3 years ago

The two places that suggest Blood Tap are missing some parentheses and can be refined a bit. They should be changed to: if ((Rune() < 3) and ((Charges(blood_tap) >= 1.8) or (HealthPercent() < 75 and RunicPower() < 63))) Spell(blood_tap)

Hemario commented 3 years ago

Adding the script in the next release https://github.com/Hemario/Ovale_TankScripts/commit/8bef92925ccd2bdb03fd8af625589012895d7b07