6.9 KiB
Enemy triggered shout audit — 2026-10-06
This report covers only separate-victim child spells from Intimidating Shout 5246 and Frightening Shout 19134. It preserves the existing caster-centered fear source contract and keeps unsupported source effects explicit.
Pinned client evidence
The Ascension input is
../LadiksMPQEditor/client-current/area-52/patch-D/DBFilesClient/Spell.dbc,
SHA-256
2f77f18b91ffbae32a19568e4bc05ec78ee384b6ba8dd2a6e05f0e97abbb2dce. The
Epoch input is
../HealerMan-Storage/pipeline-work/dungeons/epoch-client/DBFilesClient/Spell.dbc,
SHA-256
d5cce1a83550dcfa9eb2f0251dbb11fd24c272534b2b1a9b230924a44d817ab3. Both
use the existing shared patch-S SpellDuration.dbc and SpellRadius.dbc
fallbacks; Epoch is not represented as carrying untouched sibling support
tables. The matching source pins also live in enemySourceAuras.ts.
Direct reads from both WDBC inputs confirm raw Spell.dbc field 212 is
MaxAffectedTargets (5246 = 5; 19134 = 0) and field 2 is Dispel (0 for
both parents and both children). DamageClass is field 213; Attributes2 is
field 6 and is zero on all four rows. The profile signatures below are kept
separate, including Epoch 5246's Attributes1 value 136.
| Parent cast | Explicit child spell | Parent range | Parent area | Area target cap | Parent fear duration: Asc / Epoch | Child control duration: Asc / Epoch |
|---|---|---|---|---|---|---|
| 5246 Intimidating Shout | 20511 Intimidating Shout | 8 yd | Caster-centered hostile radius 8 yd | 5 | 5 s / 8 s | Stun 5 s / 8 s |
| 19134 Frightening Shout | 29544 Frightening Shout | 10 yd | Caster-centered hostile radius 8 yd | 0 (unlimited) | 4 s / 6 s | Fear 3 s / 6 s |
Each parent has effect 0 TRIGGER_SPELL (effect type 64), target A 6
(TARGET_UNIT_TARGET_ENEMY), and the exact child ID shown above. Each child
has target A 6, target B 0. Parent effects 1 and 2 use target A 22
(TARGET_SRC_CASTER) plus target B 15 (TARGET_UNIT_SRC_AREA_ENEMY) at
radius index 14 (8 yd). The first area aura is fear, aura 7. Effect 2 is aura
31 (MOD_INCREASE_SPEED, +25%) and remains unsupported.
Child 20511 is stun aura 12 on both profiles. Ascension also has aura 87
(MOD_DAMAGE_PERCENT_TAKEN) for +15% physical damage taken over 5 seconds;
it has no direct damage effect. Epoch 20511 contains only the 8-second stun.
Child 29544 is fear aura 7 only: 3 seconds in Ascension and 6 seconds in
Epoch. It likewise has no direct damage effect. Battle Shout 9128 and
Demoralizing Shouts 16244/13730 have no DBC trigger ID in either selected
profile, so their names do not qualify them for this triggered-child path.
The existing direct aura baseline remains owned by enemySourceAuras.ts and
its existing attack-catalog contract. This report does not replace those rows
with the triggered-shout child contracts or claim full implementation of
parent effect 2.
Targeting and core behavior
The read-only historical source used for the targeting audit is under
../wow-pvt-server-backups-2/azerothcore-wotlk/src/server/game/Spells/.
SpellEffects.cpp Spell::EffectTriggerSpell supplies the parent effect's
unitTarget to the child when NeedsToBeTriggeredByCaster is true;
SpellInfo.cpp returns true when the child requires an explicit unit target.
That establishes one child victim: the parent's explicit hostile victim.
The runtime helper therefore accepts that victim only if the caller's
hostile/range/LOS recheck still considers it eligible. It never chooses a
different secondary target for the child.
The same source's Spell::SelectEffectImplicitTargets combines area effects
whose target A/B, implicit conditions and calculated radius match. Here
effects 1 and 2 share the same pair and radius, so one caster-centered area
recipient selection receives their effect mask. SelectImplicitAreaTargets
limits that set using MaxAffectedTargets when nonzero, then
AddUnitTarget merges effect masks when a target GUID already exists. There
is no exclusion of the explicit cast victim from the area result: if it is
also a valid hostile within 8 yards, it can receive both the child and the
parent area aura. Accordingly planEnemyTriggeredShoutTargets returns the
eligible explicit child victim separately and preserves the area list
unchanged.
WorldObjectSpellAreaTargetCheck applies 3D radius and the base spell target
check; WorldObjectSpellTargetCheck applies hostile eligibility. These area
checks do not add a per-recipient line-of-sight test. The parent explicit
victim still follows ordinary explicit-cast checks. Spell.dbc has no
Attributes2 ignore-LOS flag for these parents. The caller remains
responsible for game-specific visibility/LOS eligibility when forming each
input list; the pure targeting helper does not perform spatial queries.
The area cap applies to the parent area recipients only: 5 for 5246 and no cap for 19134. The child is a separate triggered cast with one explicit unit target. No extra max-target cap is applied to the parent's area list, and no synthetic damage packet is introduced for either child.
Overlap and lifecycle contract
Parent and child control remain separate named timed auras so control-removal
paths, expiry and caster refresh can retain each sourced timer. The shared utility tag is
enemy-control-source:<fear|stun>. Effective shout control is resolved from
currently active tagged auras on the requested target: the aura with the
latest expiry supplies the runtime mechanic/timer, with stun winning an exact
expiry tie. Thus an Ascension 19134 overlap resolves to parent fear through
4 seconds after its child fear expires at 3 seconds; a 5246 child stun wins
when its expiry ties the parent fear. Epoch 19134 ties are both fear, while
Epoch 5246 ties resolve to stun.
All four DBC rows have Dispel 0, so the source does not mark these control
auras as dispellable. The source children have stack amount zero and no
AURA_UNIQUE bit in either profile. The project aura policy refreshes an existing same-caster copy and
preserves a different caster's active same-spell application. Removal of a
shout caster retains these four timed control aura IDs on other targets:
enemy-control:source-spell-20511, enemy-control:source-spell-29544,
enemy-control:source-spell-5246, and enemy-control:source-spell-19134.
Removing the recipient still removes its auras.
Boundaries
This source pass does not model parent aura 31's +25% movement speed, immune target exceptions, creature-specific AoE immunity, random selection ordering when 5246 has more than five area recipients, or every server/database script override. Historical SmartAI rows establish source NPC casts but do not change the DBC target geometry. The runtime's incoming eligible target snapshots remain authoritative. A client/core difference or changed source pin must fail the exact signature check rather than broaden behavior by spell name.
Focused verification: npx vitest run src/game/enemyTriggeredShouts.test.ts src/game/enemySourceAuras.test.ts.