From 9e4f73a09e31965475b37f31680ddc4c594289a3 Mon Sep 17 00:00:00 2001 From: Arma Date: Tue, 23 Jun 2026 01:12:09 -0700 Subject: [PATCH 1/2] [Deathknight] Blood MID2 2pc and partial 4pc --- engine/class_modules/sc_death_knight.cpp | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/engine/class_modules/sc_death_knight.cpp b/engine/class_modules/sc_death_knight.cpp index 44d643fc74f..c88fe152d51 100644 --- a/engine/class_modules/sc_death_knight.cpp +++ b/engine/class_modules/sc_death_knight.cpp @@ -861,6 +861,7 @@ struct death_knight_t : public parse_player_effects_t propagate_const blightfall; // Tier Sets propagate_const blighted; + propagate_const relentless_riders_precision; // Blood MID2 4pc // Rider of the Apocalypse propagate_const a_feast_of_souls; @@ -1471,6 +1472,7 @@ struct death_knight_t : public parse_player_effects_t // Blood Tier Set Spells const spell_data_t* rejuvenating_blood; // 2pc rp gain + const spell_data_t* relentless_riders_precision_buff; // MID2 4pc // Frost const spell_data_t* runic_empowerment_gain; @@ -9366,6 +9368,9 @@ struct death_and_decay_base_t : public death_knight_spell_t { p()->buffs.crimson_scourge->decrement(); + if ( p()->sets->has_set_bonus( DEATH_KNIGHT_BLOOD, MID2, B4 ) ) + p()->buffs.relentless_riders_precision->trigger(); + if ( p()->talent.blood.perseverance_of_the_ebon_blade.ok() ) p()->buffs.perseverance_of_the_ebon_blade->trigger(); @@ -14833,6 +14838,7 @@ void death_knight_t::spell_lookups() // Blood Tier set spells spell.rejuvenating_blood = conditional_spell_lookup( sets->has_set_bonus( DEATH_KNIGHT_BLOOD, MID1, B2 ), 1271198 ); + spell.relentless_riders_precision_buff = conditional_spell_lookup( sets->has_set_bonus( DEATH_KNIGHT_BLOOD, MID2, B4 ), 1300369 ); // Frost spell.murderous_efficiency_gain = conditional_spell_lookup( talent.frost.murderous_efficiency.ok(), 207062 ); @@ -15824,6 +15830,9 @@ void death_knight_t::create_buffs() // Tier Sets buffs.blighted = make_fallback( sets->has_set_bonus( DEATH_KNIGHT_UNHOLY, MID1, B4 ), this, "blighted", spell.blighted_buff ); + + buffs.relentless_riders_precision = + make_fallback( sets->has_set_bonus( DEATH_KNIGHT_BLOOD, MID2, B4 ), this, "relentless_riders_precision", spell.relentless_riders_precision_buff ); } // death_knight_t::init_gains =============================================== @@ -16467,6 +16476,7 @@ void death_knight_t::apply_action_effects( action_t* a, bool pet ) action->parse_effects( buffs.sanguinary_burst ); action->parse_effects( buffs.hemostasis ); action->parse_effects( buffs.ossuary ); + action->parse_effects( buffs.relentless_riders_precision ); break; case DEATH_KNIGHT_FROST: action->parse_effects( buffs.rime ); From 0fcd60c2a62cfe0e378dee1b6ccd9a0ae9f74586 Mon Sep 17 00:00:00 2001 From: Arma Date: Tue, 23 Jun 2026 01:47:20 -0700 Subject: [PATCH 2/2] [Deathknight] Blood MID2 4pc --- engine/class_modules/sc_death_knight.cpp | 32 +++++++++++++++++++++--- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/engine/class_modules/sc_death_knight.cpp b/engine/class_modules/sc_death_knight.cpp index c88fe152d51..10ceaf6f6dd 100644 --- a/engine/class_modules/sc_death_knight.cpp +++ b/engine/class_modules/sc_death_knight.cpp @@ -9250,6 +9250,22 @@ struct death_and_decay_damage_t final : public death_and_decay_damage_base_t } }; +// Blood MID2 4pc Empowered DnD damage (2x multiplier) when triggered by Crimson Scourge +struct death_and_decay_damage_empowered_t final : public death_and_decay_damage_base_t +{ + death_and_decay_damage_empowered_t( std::string_view name, death_knight_t* p ) + : death_and_decay_damage_base_t( name, p, p->spell.death_and_decay_damage ) + { + } + + double composite_da_multiplier( const action_state_t* s ) const override + { + double m = death_and_decay_damage_base_t::composite_da_multiplier( s ); + m *= 2.0; + return m; + } +}; + // Relish in Blood healing and RP generation struct relish_in_blood_t final : public death_knight_heal_t { @@ -9275,7 +9291,7 @@ struct relish_in_blood_t final : public death_knight_heal_t struct death_and_decay_base_t : public death_knight_spell_t { death_and_decay_base_t( death_knight_t* p, std::string_view name, const spell_data_t* spell ) - : death_knight_spell_t( name, p, spell ), params(), damage( nullptr ) + : death_knight_spell_t( name, p, spell ), params(), damage( nullptr ), damage_empowered( nullptr ) { base_tick_time = dot_duration = 0_ms; // Handled by event ignore_false_positive = true; // TODO: Is this necessary? @@ -9338,6 +9354,8 @@ struct death_and_decay_base_t : public death_knight_spell_t { death_knight_spell_t::init_finished(); add_child( damage ); + if ( damage_empowered ) + add_child( damage_empowered ); } double runic_power_generation_multiplier( const action_state_t* state ) const override @@ -9356,15 +9374,17 @@ struct death_and_decay_base_t : public death_knight_spell_t { death_knight_spell_t::execute(); + // Capture Crimson Scourge state before consumption for MID2 4pc empowered DnD + bool cs_was_up = p()->specialization() == DEATH_KNIGHT_BLOOD && p()->buffs.crimson_scourge->up(); + // If bone shield isn't up, Relish in Blood doesn't heal or generate any RP - if ( p()->specialization() == DEATH_KNIGHT_BLOOD && p()->buffs.crimson_scourge->up() && - p()->talent.blood.relish_in_blood.ok() && p()->buffs.bone_shield->up() ) + if ( cs_was_up && p()->talent.blood.relish_in_blood.ok() && p()->buffs.bone_shield->up() ) { // The heal's energize data automatically handles RP generation relish_in_blood->execute(); } - if ( p()->specialization() == DEATH_KNIGHT_BLOOD && p()->buffs.crimson_scourge->up() ) + if ( cs_was_up ) { p()->buffs.crimson_scourge->decrement(); @@ -9379,6 +9399,8 @@ struct death_and_decay_base_t : public death_knight_spell_t } init_params( target ); + if ( cs_was_up && damage_empowered && p()->sets->has_set_bonus( DEATH_KNIGHT_BLOOD, MID2, B4 ) ) + params.action( damage_empowered ); make_event( *sim, p(), params, true /* Immediate pulse */ ); } @@ -9394,6 +9416,7 @@ struct death_and_decay_base_t : public death_knight_spell_t public: action_t* damage; + action_t* damage_empowered; }; struct death_and_decay_t final : public death_and_decay_base_t @@ -9402,6 +9425,7 @@ struct death_and_decay_t final : public death_and_decay_base_t : death_and_decay_base_t( p, "death_and_decay", p->spec.death_and_decay ) { damage = get_action( "death_and_decay_damage", p ); + damage_empowered = get_action( "death_and_decay_damage_empowered", p ); parse_options( options_str ); } };