Skip to main content

wowlab_engine_combat/pipeline/
channel_start.rs

1use super::{
2    CombatCtx, DamageFlags, RuntimeDamageDef, SpellData, apply_cast_aura,
3    player_aura_for_triggered_payload, process_followup_effects, resolve_payload_flags,
4};
5
6pub(super) fn process_channel_start_payload(ctx: &mut CombatCtx<'_>, spell: &SpellData) {
7    if spell.applies_aura.is_none() && spell.followup_effects.len == 0 {
8        return;
9    }
10
11    let base_flags = spell.damage_attribute_flags
12        | if spell.behavior.is_pet {
13            DamageFlags::PET
14        } else {
15            DamageFlags::empty()
16        }
17        | if spell.damage_policy.may_crit {
18            DamageFlags::empty()
19        } else {
20            DamageFlags::NO_CRIT
21        };
22    let Some(flags) = resolve_payload_flags(
23        ctx,
24        spell.spell_id,
25        RuntimeDamageDef::None,
26        spell.applies_aura,
27        spell.followup_effects,
28        base_flags,
29    ) else {
30        return;
31    };
32    let aura_before_payload = player_aura_for_triggered_payload(ctx.state, spell);
33
34    if let Some(aura_local) = aura_before_payload {
35        apply_cast_aura(ctx, aura_local, None, flags);
36    }
37
38    if let Some(aura_local) = spell
39        .applies_aura
40        .filter(|aura_local| Some(*aura_local) != aura_before_payload)
41    {
42        apply_cast_aura(ctx, aura_local, None, flags);
43    }
44
45    process_followup_effects(ctx, spell, flags);
46}