Pre-patch BfA tank script for blood death knight
johnnylam88 opened this issue ยท 2 comments
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()
}
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)
Adding the script in the next release 8bef929