wowlab_engine_content/hooks/items/
sporecallers_blooming_loop.rs1use wowlab_engine_combat::{AuraOps as _, DamageOps as _, HookCtx, ImpactEvent, ProcOps as _};
2use wowlab_types::constants::HUNDRED;
3
4use crate::{
5 generated::items::sporecallers_blooming_loop::{AURA_BINDING, RPPM_BINDING},
6 hooks::items::{bound_aura, bound_rppm},
7};
8
9pub(crate) fn on_player_impact(ctx: &mut HookCtx<'_>, impact: ImpactEvent) {
10 if !ctx.impact_is_nature(impact)
11 || !bound_rppm(ctx, RPPM_BINDING).is_some_and(|rppm| ctx.roll_rppm(rppm))
12 {
13 return;
14 }
15
16 let Some(rotbloom) = bound_aura(ctx, AURA_BINDING::ROTBLOOM) else {
17 return;
18 };
19
20 if let Some(remaining) = ctx.flat_periodic_damage_remaining(rotbloom) {
21 let multiplier = ctx.effect_base_points(
22 crate::generated::items::sporecallers_blooming_loop::DAMAGE_EFFECT::CONSUME_MULTIPLIER,
23 ) / HUNDRED;
24
25 ctx.expire_aura(rotbloom);
26 ctx.deal_damage_flat(
27 crate::generated::items::sporecallers_blooming_loop::DAMAGE_EFFECT::VIRULENT_DAMAGE
28 .action(),
29 remaining * multiplier,
30 );
31 } else {
32 ctx.apply_aura(rotbloom);
33 }
34}