wowlab_engine_content/hooks/beast_mastery_hunter/
config.rs1use wowlab_engine_combat::{
2 BuffEffect, BuiltCombatSystem, DamageEffectRef, DamageReplication, DamageSource,
3};
4use wowlab_engine_domain::dbc::ResolvedGameDataEffectExt as _;
5use wowlab_engine_ports::HandlerParams;
6use wowlab_types::{constants::HUNDRED};
7
8use crate::generated::specs::beast_mastery_hunter::{AURA_BEAST_CLEAVE, EFFECT};
9
10fn target_count(value: f64) -> Result<u8, wowlab_engine_ports::EngineError> {
11 if !value.is_finite()
12 || value < 0.0
13 || value > f64::from(u8::MAX)
14 || value.fract().abs() > f64::EPSILON
15 {
16 return Err(wowlab_engine_ports::EngineError::spec_construction(
17 "Beast Cleave reduced-target count must be an integer from 0 through 255",
18 ));
19 }
20
21 Ok(wowlab_types::numeric::f64_to_u8_saturating_trunc(value))
22}
23
24pub(super) fn register_beast_cleave(
25 built: &mut BuiltCombatSystem,
26 params: &HandlerParams<'_>,
27) -> Result<(), wowlab_engine_ports::EngineError> {
28 let data = ¶ms.game_data;
29 let fraction = data.require_effect_base_points(EFFECT::BEAST_CLEAVE_FRACTION)? / HUNDRED;
30 let reduced_targets =
31 target_count(data.require_effect_base_points(EFFECT::BEAST_CLEAVE_REDUCED_TARGETS)?)?;
32
33 built.set_aura_effect(
34 AURA_BEAST_CLEAVE,
35 BuffEffect::DamageReplication(DamageReplication {
36 fraction,
37 effect: DamageEffectRef::new(
38 EFFECT::BEAST_CLEAVE_DAMAGE.0,
39 EFFECT::BEAST_CLEAVE_DAMAGE.1,
40 ),
41 source: DamageSource::Pet,
42 source_spells: &[],
43 include_magic: false,
44 include_indirect: false,
45 include_primary: false,
46 max_targets: 0,
47 reduced_targets,
48 }),
49 );
50
51 Ok(())
52}