From 8bce79837742b8a38b591d54a9d7f7c2e20455a4 Mon Sep 17 00:00:00 2001 From: criller7070 Date: Wed, 24 Jun 2026 00:58:18 +0200 Subject: [PATCH 1/3] [Gear] Trinket - Font of Venomous Rage --- engine/player/unique_gear_midnight.cpp | 54 ++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/engine/player/unique_gear_midnight.cpp b/engine/player/unique_gear_midnight.cpp index 76dc1dc5739..9952786447e 100644 --- a/engine/player/unique_gear_midnight.cpp +++ b/engine/player/unique_gear_midnight.cpp @@ -3118,6 +3118,58 @@ 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 ); } + +// 1297908 driver +// 1297911 equip driver +// 1307222 Venom Splatter +void font_of_venomous_rage( special_effect_t& effect ) +{ + struct font_channel_t : public proc_spell_t + { + action_t* venom_splatter; + + font_channel_t( const special_effect_t& e ) : + proc_spell_t( "font_of_venemous_rage", e.player, e.driver() ) + { + unsigned equip_id = 1297911; + auto equip = find_special_effect( e.player, equip_id ); + assert( equip && "Font of Venomous Rage missing equip effect" ); + + channeled = true; + + base_td = equip->driver()->effectN( 1 ).average( e ); + base_td_multiplier *= role_mult( e ); + + venom_splatter = create_proc_action( "venom_splatter", e, e.player->find_spell( 1307222 ) ); + venom_splatter->base_dd_min = venom_splatter->base_dd_max = equip->driver()->effectN( 2 ).average( e ); + venom_splatter->base_multiplier *= role_mult( e ); + venom_splatter->dual = true; + } + + void execute() override + { + proc_spell_t::execute(); + event_t::cancel( player->readying ); + player->reset_auto_attacks( composite_dot_duration( execute_state ) ); + } + + void tick( dot_t* d ) override + { + proc_spell_t::tick( d ); + venom_splatter->execute_on_target( d->target ); + } + + void last_tick( dot_t* d ) override + { + bool was_channeling = player->channeling == this; + proc_spell_t::last_tick( d ); + if ( was_channeling && !player->readying ) + player->schedule_ready( rng().gauss( sim->channel_lag ) ); + } + }; + + effect.execute_action = create_proc_action( "font_of_venemous_rage", effect ); +} } // namespace trinkets namespace weapons @@ -4158,6 +4210,8 @@ void register_special_effects() set_min_version( wowv_t( 12, 1, 0 ) ); 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( 1297908, trinkets::font_of_venomous_rage ); + register_special_effect( 1297911, DISABLED_EFFECT ); // Font of Venomous Rage equip driver reset_version_check(); // Weapons register_special_effect( { 1253357, 1253359 }, weapons::torments_duality ); // umbral sabre & radiant foil From d9629fc79da8db01fc3179c47b3e570521d744eb Mon Sep 17 00:00:00 2001 From: Christian Seestern Hyllested Date: Wed, 24 Jun 2026 22:28:26 +0200 Subject: [PATCH 2/3] aoe damage does not hit main target --- engine/player/unique_gear_midnight.cpp | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/engine/player/unique_gear_midnight.cpp b/engine/player/unique_gear_midnight.cpp index 9952786447e..5ef3a9113d5 100644 --- a/engine/player/unique_gear_midnight.cpp +++ b/engine/player/unique_gear_midnight.cpp @@ -3124,6 +3124,20 @@ void vile_vial_of_volatile_venom( special_effect_t& effect ) // 1307222 Venom Splatter void font_of_venomous_rage( special_effect_t& effect ) { + struct venom_splatter_t : public generic_aoe_proc_t + { + venom_splatter_t( const special_effect_t& e ) : + generic_aoe_proc_t( e, "venom_splatter", e.player->find_spell( 1307222 ) ) + {} + + size_t available_targets( std::vector& tl ) const override + { + generic_aoe_proc_t::available_targets( tl ); + range::erase_remove( tl, target ); + return tl.size(); + } + }; + struct font_channel_t : public proc_spell_t { action_t* venom_splatter; @@ -3140,10 +3154,11 @@ void font_of_venomous_rage( special_effect_t& effect ) base_td = equip->driver()->effectN( 1 ).average( e ); base_td_multiplier *= role_mult( e ); - venom_splatter = create_proc_action( "venom_splatter", e, e.player->find_spell( 1307222 ) ); + venom_splatter = create_proc_action( "venom_splatter", e ); venom_splatter->base_dd_min = venom_splatter->base_dd_max = equip->driver()->effectN( 2 ).average( e ); venom_splatter->base_multiplier *= role_mult( e ); venom_splatter->dual = true; + add_child( venom_splatter ); } void execute() override From 10cd9f579ee0f8d1c29bc57abece15fec4722c93 Mon Sep 17 00:00:00 2001 From: Christian Seestern Hyllested Date: Thu, 25 Jun 2026 09:41:56 +0200 Subject: [PATCH 3/3] cleaner secondary targeting --- engine/player/unique_gear_midnight.cpp | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/engine/player/unique_gear_midnight.cpp b/engine/player/unique_gear_midnight.cpp index 5ef3a9113d5..573d5fd387d 100644 --- a/engine/player/unique_gear_midnight.cpp +++ b/engine/player/unique_gear_midnight.cpp @@ -3124,19 +3124,6 @@ void vile_vial_of_volatile_venom( special_effect_t& effect ) // 1307222 Venom Splatter void font_of_venomous_rage( special_effect_t& effect ) { - struct venom_splatter_t : public generic_aoe_proc_t - { - venom_splatter_t( const special_effect_t& e ) : - generic_aoe_proc_t( e, "venom_splatter", e.player->find_spell( 1307222 ) ) - {} - - size_t available_targets( std::vector& tl ) const override - { - generic_aoe_proc_t::available_targets( tl ); - range::erase_remove( tl, target ); - return tl.size(); - } - }; struct font_channel_t : public proc_spell_t { @@ -3154,10 +3141,11 @@ void font_of_venomous_rage( special_effect_t& effect ) base_td = equip->driver()->effectN( 1 ).average( e ); base_td_multiplier *= role_mult( e ); - venom_splatter = create_proc_action( "venom_splatter", e ); + venom_splatter = create_proc_action( "venom_splatter", e, e.player->find_spell( 1307222 ) ); venom_splatter->base_dd_min = venom_splatter->base_dd_max = equip->driver()->effectN( 2 ).average( e ); venom_splatter->base_multiplier *= role_mult( e ); venom_splatter->dual = true; + venom_splatter->target_filter_callback = secondary_targets_only(); add_child( venom_splatter ); }