wowlab_engine_combat/pipeline/
channel_start.rs1use 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}