From b8b6e21e40fc307751a3330cc043794775929480 Mon Sep 17 00:00:00 2001 From: Aezeor Date: Sat, 21 Mar 2026 07:34:55 -0400 Subject: [PATCH 1/5] void fall meteor base execute to impact action --- engine/class_modules/sc_demon_hunter.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/engine/class_modules/sc_demon_hunter.cpp b/engine/class_modules/sc_demon_hunter.cpp index db015d41059..80051db01d8 100644 --- a/engine/class_modules/sc_demon_hunter.cpp +++ b/engine/class_modules/sc_demon_hunter.cpp @@ -6562,9 +6562,9 @@ struct voidfall_meteor_base_t : public demon_hunter_spell_t voidfall_meteor_base_t( util::string_view n, demon_hunter_t* p, const spell_data_t* s ) : demon_hunter_spell_t( n, p, s ) { - execute_action = p->get_background_action( fmt::format( "{}_damage", name() ), + impact_action = p->get_background_action( fmt::format( "{}_damage", name() ), s->effectN( 2 ).trigger() ); - add_child( execute_action ); + add_child( impact_action ); } }; From 33f3605c59f72ef90392edca322dd50f6f56c0f2 Mon Sep 17 00:00:00 2001 From: Aezeor Date: Sat, 21 Mar 2026 08:31:09 -0400 Subject: [PATCH 2/5] reap and eradicate damage scheduling delayed --- engine/class_modules/sc_demon_hunter.cpp | 51 ++++++++++++++---------- 1 file changed, 29 insertions(+), 22 deletions(-) diff --git a/engine/class_modules/sc_demon_hunter.cpp b/engine/class_modules/sc_demon_hunter.cpp index 80051db01d8..3f5041c26cc 100644 --- a/engine/class_modules/sc_demon_hunter.cpp +++ b/engine/class_modules/sc_demon_hunter.cpp @@ -6120,19 +6120,23 @@ struct reap_base_t : public voidfall_spending_trigger_tbuff.reap->trigger(); base_t::execute(); - unsigned fragments_consumed = p()->consume_soul_fragments( soul_fragment::LESSER, true, souls_to_consume() ); + unsigned fragments_consumed = souls_to_consume(); + + p()->consume_soul_fragments( soul_fragment::LESSER, false, fragments_consumed ); - damage_action->set_target( target ); - action_state_t* damage_state = damage_action->get_state(); - damage_state->target = target; - damage_action->snapshot_state( damage_state, result_amount_type::DMG_DIRECT ); - - if ( p()->talent.devourer.soulshaper->ok() ) - { - damage_state->da_multiplier *= 1.0 + fragments_consumed * p()->talent.devourer.soulshaper->effectN( 1 ).percent(); - } + make_event( *p()->sim, 220_ms, [ this, fragments_consumed ] { + damage_action->set_target( target ); + action_state_t* damage_state = damage_action->get_state(); + damage_state->target = target; + damage_action->snapshot_state( damage_state, result_amount_type::DMG_DIRECT ); - damage_action->schedule_execute( damage_state ); + if ( p()->talent.devourer.soulshaper->ok() ) + { + damage_state->da_multiplier *= + 1.0 + fragments_consumed * p()->talent.devourer.soulshaper->effectN( 1 ).percent(); + } + damage_action->schedule_execute( damage_state ); + } ); p()->buff.moment_of_craving->expire(); } @@ -6206,21 +6210,24 @@ struct eradicate_t : public voidfall_spending_trigger_tconsume_soul_fragments( soul_fragment::LESSER, true, souls_to_consume() ); + unsigned fragments_consumed = souls_to_consume(); + p()->consume_soul_fragments( soul_fragment::LESSER, false, fragments_consumed ); auto damage = p()->buff.metamorphosis->up() ? damage_action_meta : damage_action; - damage->set_target( target ); - action_state_t* damage_state = damage->get_state(); - damage_state->target = target; - damage->snapshot_state( damage_state, result_amount_type::DMG_DIRECT ); - - if ( p()->talent.devourer.soulshaper->ok() ) - { - damage_state->da_multiplier *= 1.0 + fragments_consumed * p()->talent.devourer.soulshaper->effectN( 1 ).percent(); - } + make_event( *p()->sim, 220_ms, [ this, fragments_consumed, damage ] { + damage->set_target( target ); + action_state_t* damage_state = damage->get_state(); + damage_state->target = target; + damage->snapshot_state( damage_state, result_amount_type::DMG_DIRECT ); - damage->schedule_execute( damage_state ); + if ( p()->talent.devourer.soulshaper->ok() ) + { + damage_state->da_multiplier *= + 1.0 + fragments_consumed * p()->talent.devourer.soulshaper->effectN( 1 ).percent(); + } + damage->schedule_execute( damage_state ); + } ); p()->buff.moment_of_craving->expire(); p()->buff.eradicate->expire(); From bda3ee7e1faa5931f2d8bab0bfeca4d700cc526d Mon Sep 17 00:00:00 2001 From: Aezeor Date: Sat, 21 Mar 2026 09:30:20 -0400 Subject: [PATCH 3/5] added tochecks --- engine/class_modules/sc_demon_hunter.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/engine/class_modules/sc_demon_hunter.cpp b/engine/class_modules/sc_demon_hunter.cpp index 3f5041c26cc..b7465ed70cd 100644 --- a/engine/class_modules/sc_demon_hunter.cpp +++ b/engine/class_modules/sc_demon_hunter.cpp @@ -6124,6 +6124,7 @@ struct reap_base_t : public voidfall_spending_trigger_tconsume_soul_fragments( soul_fragment::LESSER, false, fragments_consumed ); + // TOCHECK: This delay is a guess based on averages in logs as there is no spelldata make_event( *p()->sim, 220_ms, [ this, fragments_consumed ] { damage_action->set_target( target ); action_state_t* damage_state = damage_action->get_state(); @@ -6214,6 +6215,7 @@ struct eradicate_t : public voidfall_spending_trigger_tconsume_soul_fragments( soul_fragment::LESSER, false, fragments_consumed ); auto damage = p()->buff.metamorphosis->up() ? damage_action_meta : damage_action; + // TOCHECK: This delay is a guess based on averages in logs as there is no spelldata make_event( *p()->sim, 220_ms, [ this, fragments_consumed, damage ] { damage->set_target( target ); action_state_t* damage_state = damage->get_state(); From e6add0e6729927dc20357eb19357a3afb69ecba7 Mon Sep 17 00:00:00 2001 From: Aezeor Date: Sat, 21 Mar 2026 10:29:05 -0400 Subject: [PATCH 4/5] correct fragments_consumed for soulshaper count --- engine/class_modules/sc_demon_hunter.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/engine/class_modules/sc_demon_hunter.cpp b/engine/class_modules/sc_demon_hunter.cpp index b7465ed70cd..bd6df090dbf 100644 --- a/engine/class_modules/sc_demon_hunter.cpp +++ b/engine/class_modules/sc_demon_hunter.cpp @@ -6120,9 +6120,7 @@ struct reap_base_t : public voidfall_spending_trigger_tbuff.reap->trigger(); base_t::execute(); - unsigned fragments_consumed = souls_to_consume(); - - p()->consume_soul_fragments( soul_fragment::LESSER, false, fragments_consumed ); + unsigned fragments_consumed = p()->consume_soul_fragments( soul_fragment::LESSER, false, souls_to_consume() ); // TOCHECK: This delay is a guess based on averages in logs as there is no spelldata make_event( *p()->sim, 220_ms, [ this, fragments_consumed ] { @@ -6211,8 +6209,7 @@ struct eradicate_t : public voidfall_spending_trigger_tconsume_soul_fragments( soul_fragment::LESSER, false, fragments_consumed ); + unsigned fragments_consumed = p()->consume_soul_fragments( soul_fragment::LESSER, false, souls_to_consume() ); auto damage = p()->buff.metamorphosis->up() ? damage_action_meta : damage_action; // TOCHECK: This delay is a guess based on averages in logs as there is no spelldata From d8a6079f6b6335d049ee14f638d52105b86a3196 Mon Sep 17 00:00:00 2001 From: Aezeor Date: Sat, 21 Mar 2026 11:07:05 -0400 Subject: [PATCH 5/5] add delays to voidfall meteors from meteoric fall --- engine/class_modules/sc_demon_hunter.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/engine/class_modules/sc_demon_hunter.cpp b/engine/class_modules/sc_demon_hunter.cpp index bd6df090dbf..d1d985618be 100644 --- a/engine/class_modules/sc_demon_hunter.cpp +++ b/engine/class_modules/sc_demon_hunter.cpp @@ -3035,12 +3035,14 @@ struct meteoric_fall_trigger_t : public BASE for ( int i = 0; i < stacks; ++i ) { - BASE::p()->active.voidfall_meteor->execute_on_target( BASE::target ); + make_event( *BASE::sim, BASE::p(), BASE::p()->active.voidfall_meteor, BASE::target, + ( BASE::p()->active.voidfall_meteor->travel_time() * i ) ); } if ( BASE::p()->talent.annihilator.world_killer->ok() ) { - BASE::p()->active.world_killer->execute_on_target( BASE::target ); + make_event( *BASE::sim, BASE::p(), BASE::p()->active.world_killer, BASE::target, + ( stacks * BASE::p()->active.voidfall_meteor->travel_time() ) ); } } };