wowlab_engine_content/hooks/items/
sporecallers_blooming_loop.rs1use wowlab_engine_combat::{AuraOps as _, DamageOps as _, HookCtx, ImpactEvent, ProcOps as _};
2use wowlab_engine_domain::dbc::{ResolvedGameDataEffectExt as _, SpellSchoolMask};
3use wowlab_types::{constants::HUNDRED, sim::SpellIdx};
4
5use crate::generated::items::sporecallers_blooming_loop::{AURA, EFFECT, ITEM_ID};
6
7pub(crate) fn on_player_impact(ctx: &mut HookCtx<'_>, impact: ImpactEvent) {
8 let school = ctx
9 .game_data()
10 .school_mask(SpellIdx::from_raw(impact.spell_id))
11 .map(SpellSchoolMask::from_dbc)
12 .unwrap_or_default();
13
14 if !school.contains(SpellSchoolMask::NATURE) || !ctx.roll_item_rppm(ITEM_ID) {
15 return;
16 }
17
18 if let Some(remaining) = ctx.flat_periodic_damage_remaining_id(AURA::ROTBLOOM) {
19 let multiplier = ctx
20 .game_data()
21 .effect_base_points(EFFECT::CONSUME_MULTIPLIER)
22 / HUNDRED;
23
24 ctx.expire_aura_id(AURA::ROTBLOOM);
25 ctx.deal_damage_flat(EFFECT::VIRULENT_DAMAGE.0, remaining * multiplier);
26 } else {
27 ctx.apply_aura_id(AURA::ROTBLOOM);
28 }
29}