Files
healer-man/docs/ENEMY_BLOODLUST_2026-10-05.md
2026-10-06 22:25:34 -04:00

91 lines
4.6 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Enemy Bloodlust source contract — 2026-10-05
`src/game/enemyBloodlust.ts` records the sourced NPC contract for spell 6742
and exposes the melee swing-interval calculation used when independent
Aura 138 haste effects overlap. It models one explicitly selected friendly
creature per application. It does not infer Shaman player-party semantics from
the similarly named player spell.
## Pinned client rows
The active Ascension Spell.dbc is
`../LadiksMPQEditor/client-current/area-52/patch-D/DBFilesClient/Spell.dbc`
(SHA-256
`2f77f18b91ffbae32a19568e4bc05ec78ee384b6ba8dd2a6e05f0e97abbb2dce`). The
Epoch Spell.dbc is
`../HealerMan-Storage/pipeline-work/dungeons/epoch-client/DBFilesClient/Spell.dbc`
(SHA-256
`d5cce1a83550dcfa9eb2f0251dbb11fd24c272534b2b1a9b230924a44d817ab3`). Both
contain the same spell 6742 fields:
| Spell.dbc field | Value |
| --- | ---: |
| Range index | 4 |
| School mask / damage class | 8 / 1 |
| Duration index / resolved duration | 9 / 30,000 ms |
| Dispel / stack amount | 1 (Magic) / 0 |
| Attributes 0–7 | 0 |
| Effect | 6 (`APPLY_AURA`) |
| Aura / base points | 138 (`MOD_MELEE_HASTE`) / +30 |
| Implicit targets A / B | 21 (`TARGET_UNIT_TARGET_ALLY`) / 0 |
| Radius / misc value / period | 0 / 0 / 0 |
| Trigger spell | 0 |
The duration comes from the pinned shared patch-S SpellDuration.dbc
(`eeae44ef0185924f3d6ec57ab2701c66566db86e51ab0bae017a9449126eb3a0`); the
shared SpellRadius.dbc fallback is
`dba6ed2f165f75c84dda5f32ae46b1a01fe562efd88fa51fd19365705c3e6a44`. SpellRange
index 4 comes from shared patch-S SpellRange.dbc (SHA-256
`bb899631818942a7a7100abfb7a970612a79ac99637b1b459561e2b108125ddd`): both
friendly and hostile ranges are 0–30 yards, with flags 0. This row and the
effect target describe a selected friendly unit, not an area target; the
effect has no radius.
## Historical NPC selection and cast gates
The read-only AzerothCore world snapshot's `creature_template_spell.sql` lists
Hamhock (entry 1717) with spells 6742 and 421. Its `smart_scripts.sql` rows
provide two separate Bloodlust paths:
- Update-in-combat event 0 has a fixed 5,000 ms initial delay, no repeat timer,
100% chance, and NOT_REPEATABLE flag 1. It casts spell 6742 with cast flags
32 (`SMARTCAST_AURA_NOT_PRESENT`) on target type 1 (self). AzerothCore only
processes this event while Hamhock is engaged; the cast flag skips recasting
while that target already has Bloodlust.
- Friendly-missing-buff event 16 uses spell 6742, radius 30, repeat interval
10,000 ms, and `onlyInCombat=0`. It casts spell 6742 with flags 0 on target
type 7 (`SMART_TARGET_ACTION_INVOKER`), the selected missing-buff recipient.
The event starts active without an initial delay and resets its 10-second
repeat timer after it processes a recipient.
The historical `FriendlyMissingBuffInRange` predicate further requires the
candidate creature to be alive, in combat, non-hostile to the caster, within
30 yards on the same map and phase, and missing spell 6742. The search uses a
creature-list searcher, so this AI path selects creatures rather than the
player party. Its predicate has no self-exclusion or line-of-sight check;
the normal, untriggered cast still uses ordinary spell validation. Distance
checks include the source and target object sizes. These are source gates; the
current game entity state has no faction, phase, or collision-radius data and
must document its corresponding selection approximation.
## Haste stacking
AzerothCore maps Aura 138 to `HandleModMeleeSpeedPct`, which applies a separate
percentage attack-speed factor to main-hand and off-hand swing intervals. The
same-effect spell-group lookup suppresses weaker members only when the data
places them in an exclusive group. The historical `spell_group.sql` does not
place either 6742 or Enrage 8599 in its “Melee Haste Buffs” group. Their two
+30% effects therefore combine as separate factors: an active Bloodlust and
Enrage yield `1 / (1.3 × 1.3)`, or about 0.591716 of the prior swing interval.
They do not become one additive +60% modifier (0.625 interval factor).
`enemyMeleeHasteIntervalMultiplier` applies the sourced positive and negative
Aura 138 interval factors to marked source modifiers in the already-filtered
active aura list for one enemy, then preserves the existing additive interval
calculation for unmarked haste modifiers. It leaves auto-attack ability
cooldowns and unrelated haste channels unchanged. The Bloodlust contract
itself exposes only melee haste, Magic dispel, a 30-second duration, and the
explicit-friendly 30-yard target shape.
Focused validation is `npx vitest run src/game/enemyBloodlust.test.ts src/game/enemyBloodlust.integration.test.ts`.