From f126c60fa325a58b550cca9eb45962c552837e8a Mon Sep 17 00:00:00 2001 From: criller7070 Date: Wed, 24 Jun 2026 01:20:49 +0200 Subject: [PATCH 1/3] [Gear] Trinket - Fang of Umbral Malignance --- engine/player/unique_gear_midnight.cpp | 57 ++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/engine/player/unique_gear_midnight.cpp b/engine/player/unique_gear_midnight.cpp index 71137a4471d..31577c48fe0 100644 --- a/engine/player/unique_gear_midnight.cpp +++ b/engine/player/unique_gear_midnight.cpp @@ -3134,7 +3134,63 @@ void vile_vial_of_volatile_venom( special_effect_t& effect ) effect.disable_buff(); effect.has_use_buff_override = true; effect.execute_action = create_proc_action( "empowering_venom", effect ); +} +// Fang of Umbral Malignance +// 1295219 Driver +// 1305853 Umbral Malignance DoT +// 1305854 Bursting Malignance AoE +void fang_of_umbral_malignance( special_effect_t& effect ) +{ + // Bugged on ptr, doesn't seem to ever proc + bool bugged = true; + + if ( !bugged ) + { + auto burst = create_proc_action( "bursting_malignance", effect, 1305854 ); + burst->base_multiplier *= role_mult( effect ); + + struct fang_cb_t : public dbc_proc_callback_t + { + action_t* dot; + + fang_cb_t( const special_effect_t& e, action_t* burst_action ) : dbc_proc_callback_t( e.player, e ) + { + dot = create_proc_action( "umbral_malignance", e, 1305853 ); + dot->dot_max_stack = dot->data().max_stacks(); + dot->base_td = e.driver()->effectN( 1 ).average( e ); + dot->base_td_multiplier *= role_mult( e ); + dot->add_child( burst_action ); + + target_debuff = e.player->find_spell( 1305853 ); + } + + void execute( const spell_data_t*, player_t* t, action_state_t* ) override + { + dot->execute_on_target( t ); + get_debuff( t )->trigger(); + } + }; + + auto cb = new fang_cb_t( effect, burst ); + auto burst_pct = effect.driver()->effectN( 2 ).percent(); + + effect.player->register_on_kill_callback( [ cb, burst, burst_pct ]( player_t* t ) { + if ( t->sim->event_mgr.canceled ) + return; + + if ( auto d = cb->dot->find_dot( t ); d && d->is_ticking() ) + { + burst->base_dd_min = burst->base_dd_max = d->tick_damage_over_remaining_time() * burst_pct; + burst->execute(); + for ( auto new_target : cb->dot->target_list() ) + { + cb->dot->execute_on_target( new_target ); + cb->get_debuff( new_target )->trigger(); + } + } + } ); + } } } // namespace trinkets @@ -4177,6 +4233,7 @@ void register_special_effects() register_special_effect( 1295058, trinkets::wavecallers_seastone ); register_special_effect( 1293316, trinkets::vile_vial_of_volatile_venom ); register_special_effect( 1295179, DISABLED_EFFECT ); // Vile Vial of Volatile Venom equip driver + register_special_effect( 1295219, trinkets::fang_of_umbral_malignance ); reset_version_check(); // Weapons register_special_effect( { 1253357, 1253359 }, weapons::torments_duality ); // umbral sabre & radiant foil From c13bc36b6871e0f780af264ad0136bd0c0cccd1d Mon Sep 17 00:00:00 2001 From: criller7070 Date: Thu, 25 Jun 2026 16:48:38 +0200 Subject: [PATCH 2/3] trinket now works on ptr --- engine/player/unique_gear_midnight.cpp | 72 ++++++++++++-------------- 1 file changed, 33 insertions(+), 39 deletions(-) diff --git a/engine/player/unique_gear_midnight.cpp b/engine/player/unique_gear_midnight.cpp index 31577c48fe0..ff91adf0a5b 100644 --- a/engine/player/unique_gear_midnight.cpp +++ b/engine/player/unique_gear_midnight.cpp @@ -3135,62 +3135,56 @@ void vile_vial_of_volatile_venom( special_effect_t& effect ) effect.has_use_buff_override = true; effect.execute_action = create_proc_action( "empowering_venom", effect ); } + // Fang of Umbral Malignance // 1295219 Driver // 1305853 Umbral Malignance DoT // 1305854 Bursting Malignance AoE void fang_of_umbral_malignance( special_effect_t& effect ) { - // Bugged on ptr, doesn't seem to ever proc - bool bugged = true; + auto burst = create_proc_action( "bursting_malignance", effect, 1305854 ); + burst->base_multiplier *= role_mult( effect ); - if ( !bugged ) + struct fang_cb_t : public dbc_proc_callback_t { - auto burst = create_proc_action( "bursting_malignance", effect, 1305854 ); - burst->base_multiplier *= role_mult( effect ); + action_t* dot; - struct fang_cb_t : public dbc_proc_callback_t + fang_cb_t( const special_effect_t& e, action_t* burst_action ) : dbc_proc_callback_t( e.player, e ) { - action_t* dot; - - fang_cb_t( const special_effect_t& e, action_t* burst_action ) : dbc_proc_callback_t( e.player, e ) - { - dot = create_proc_action( "umbral_malignance", e, 1305853 ); - dot->dot_max_stack = dot->data().max_stacks(); - dot->base_td = e.driver()->effectN( 1 ).average( e ); - dot->base_td_multiplier *= role_mult( e ); - dot->add_child( burst_action ); + dot = create_proc_action( "umbral_malignance", e, 1305853 ); + dot->dot_max_stack = dot->data().max_stacks(); + dot->base_td = e.driver()->effectN( 1 ).average( e ); + dot->base_td_multiplier *= role_mult( e ); + dot->add_child( burst_action ); + target_debuff = e.player->find_spell( 1305853 ); + } - target_debuff = e.player->find_spell( 1305853 ); - } + void execute( const spell_data_t*, player_t* t, action_state_t* ) override + { + dot->execute_on_target( t ); + get_debuff( t )->trigger(); + } + }; - void execute( const spell_data_t*, player_t* t, action_state_t* ) override - { - dot->execute_on_target( t ); - get_debuff( t )->trigger(); - } - }; + auto cb = new fang_cb_t( effect, burst ); + auto burst_pct = effect.driver()->effectN( 2 ).percent(); - auto cb = new fang_cb_t( effect, burst ); - auto burst_pct = effect.driver()->effectN( 2 ).percent(); + effect.player->register_on_kill_callback( [ cb, burst, burst_pct ]( player_t* t ) { + if ( t->sim->event_mgr.canceled ) + return; - effect.player->register_on_kill_callback( [ cb, burst, burst_pct ]( player_t* t ) { - if ( t->sim->event_mgr.canceled ) - return; + if ( auto d = cb->dot->find_dot( t ); d && d->is_ticking() ) + { + burst->base_dd_min = burst->base_dd_max = d->tick_damage_over_remaining_time() * burst_pct; + burst->execute(); - if ( auto d = cb->dot->find_dot( t ); d && d->is_ticking() ) + for ( auto new_target : cb->dot->target_list() ) { - burst->base_dd_min = burst->base_dd_max = d->tick_damage_over_remaining_time() * burst_pct; - burst->execute(); - - for ( auto new_target : cb->dot->target_list() ) - { - cb->dot->execute_on_target( new_target ); - cb->get_debuff( new_target )->trigger(); - } + cb->dot->execute_on_target( new_target ); + cb->get_debuff( new_target )->trigger(); } - } ); - } + } + } ); } } // namespace trinkets From 9a3caf10956cf2dcbb1c1f179e0b88deddf8e07f Mon Sep 17 00:00:00 2001 From: criller7070 Date: Thu, 25 Jun 2026 18:12:34 +0200 Subject: [PATCH 3/3] removed extra debuff --- engine/player/unique_gear_midnight.cpp | 3 --- 1 file changed, 3 deletions(-) diff --git a/engine/player/unique_gear_midnight.cpp b/engine/player/unique_gear_midnight.cpp index ff91adf0a5b..47bc54b3504 100644 --- a/engine/player/unique_gear_midnight.cpp +++ b/engine/player/unique_gear_midnight.cpp @@ -3156,13 +3156,11 @@ void fang_of_umbral_malignance( special_effect_t& effect ) dot->base_td = e.driver()->effectN( 1 ).average( e ); dot->base_td_multiplier *= role_mult( e ); dot->add_child( burst_action ); - target_debuff = e.player->find_spell( 1305853 ); } void execute( const spell_data_t*, player_t* t, action_state_t* ) override { dot->execute_on_target( t ); - get_debuff( t )->trigger(); } }; @@ -3181,7 +3179,6 @@ void fang_of_umbral_malignance( special_effect_t& effect ) for ( auto new_target : cb->dot->target_list() ) { cb->dot->execute_on_target( new_target ); - cb->get_debuff( new_target )->trigger(); } } } );