wowlab_engine_content/hooks/vengeance_demon_hunter/
handler.rs1use 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#[derive(Debug)]
25pub(crate) struct VengeanceHandler {
26 inner: CombatHandler,
27}
28
29impl VengeanceHandler {
30 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, ¶ms.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}