Skip to main content

wowlab_engine_content/hooks/vengeance_demon_hunter/
handler.rs

1use wowlab_engine_combat::{BuffEffect, BuiltCombatSystem, CombatHandler, PassiveDriverEffect};
2use wowlab_engine_domain::dbc::ResolvedGameDataEffectExt as _;
3use wowlab_engine_ports::{CombatStats, HandlerParams, SimContext};
4use wowlab_engine_gamedata::{ResolvedGameData};
5
6use crate::generated::specs::vengeance_demon_hunter::EFFECT;
7
8use super::config::register_annihilator;
9
10fn register_fel_blood(built: &mut BuiltCombatSystem, stats: &CombatStats, data: &ResolvedGameData) {
11    let ap_pct = data.resolved_effect_points(EFFECT::FEL_BLOOD, stats.mastery);
12
13    if ap_pct <= 0.0 {
14        return;
15    }
16
17    built.register_passive_driver_effect(PassiveDriverEffect::new(
18        EFFECT::FEL_BLOOD.0,
19        BuffEffect::AttackPowerPercent(ap_pct),
20    ));
21}
22
23/// Vengeance Demon Hunter combat handler.
24#[derive(Debug)]
25pub(crate) struct VengeanceHandler {
26    inner: CombatHandler,
27}
28
29impl VengeanceHandler {
30    /// Finishes the specialization handler from the shared-content composition stage.
31    pub(crate) fn try_new(
32        parts: crate::composition::ContentHandlerParts,
33        params: &HandlerParams<'_>,
34    ) -> Result<Self, wowlab_engine_ports::EngineError> {
35        let mut built = parts.into_built();
36
37        register_fel_blood(&mut built, params.stats, &params.game_data);
38        register_annihilator(&mut built, params)?;
39
40        Ok(Self {
41            inner: CombatHandler::from_built(built),
42        })
43    }
44}
45
46crate::hooks::define_spec_handler! {
47impl VengeanceHandler(self, inner) {
48    fn on_sim_start(&mut self, ctx: &mut SimContext) {
49        self.inner.on_sim_start(ctx);
50    }
51}
52}