Skip to content

Conversation

@taherbert
Copy link
Contributor

Summary

The doomsayer_trigger_t guard checks both doomsayer_in_combat and doomsayer_out_of_combat buffs (line 3161), but only expires doomsayer_in_combat (line 3172). If the out-of-combat buff were the active one when the trigger fires, it would not be consumed — allowing a double trigger on the next melee attack.

Fix

Expire both buffs unconditionally after the trigger fires. buff_t::expire() is a no-op on inactive buffs, so both calls are always safe.

BASE::p()->buff.doomsayer_in_combat->expire();
BASE::p()->buff.doomsayer_out_of_combat->expire();

In practice, the combat state callback (lines 9742-9753) normally swaps to doomsayer_in_combat before the first attack, so this is a latent correctness fix rather than a commonly triggered bug.

The doomsayer_trigger_t guard checks both doomsayer_in_combat and
doomsayer_out_of_combat buffs, but only expires doomsayer_in_combat.
If the out_of_combat buff were active when the trigger fires, it
would not be consumed, allowing a double trigger on the next attack.

Expire both buffs unconditionally (expire() is a no-op on inactive
buffs).
@ToppleTheNun ToppleTheNun merged commit a54f5ac into simulationcraft:midnight Feb 12, 2026
114 of 224 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants