Update Healer Man server
This commit is contained in:
1 parent
6114a2295f
commit
69809f7228
593 files changed
+903643
-40774
No files matched your search
@@ -0,0 +1,139 @@
|
||||
# Enemy shout speed and immunity audit — 2026-10-06
|
||||
|
||||
This follow-up pins the parent movement-speed effect and the immunity-related
|
||||
source scalars for Intimidating Shout `5246 -> 20511` and Frightening Shout
|
||||
`19134 -> 29544`. The earlier
|
||||
[`ENEMY_TRIGGERED_SHOUTS_2026-10-06.md`](ENEMY_TRIGGERED_SHOUTS_2026-10-06.md)
|
||||
remains the targeting and timed-control reference. The runtime attaches the
|
||||
sourced speed modifier and tag to the existing parent control aura, and both
|
||||
player and party movement consume that target-local multiplier. Shout target
|
||||
selection also includes eligible owned summons, but the current summon action
|
||||
loop holds a controlled summon before its movement step. The +25% speed is
|
||||
therefore sourced on that recipient without changing its movement during the
|
||||
shared fear/control lifetime; no fear-flee behavior is claimed.
|
||||
|
||||
## Client source rows
|
||||
|
||||
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 shared patch-S `SpellDuration.dbc` and `SpellRadius.dbc` fallbacks
|
||||
recorded in `enemySourceAuras.ts`.
|
||||
|
||||
Raw `Spell.dbc` field 3 (`Mechanic`) is 5 on all four rows, which the selected
|
||||
core defines as `MECHANIC_FEAR`. Effect-level `EffectMechanic` is 0 on every
|
||||
effect. `DamageClass` is field 213; `Dispel` is field 2. The attribute tuple
|
||||
below lists raw fields 4 through 11 in order (`Attributes0` through
|
||||
`Attributes7`):
|
||||
|
||||
| Spell | Profile | Spell mechanic | Damage class | Dispel | Attributes0–7 |
|
||||
| --- | --- | ---: | ---: | ---: | --- |
|
||||
| 5246 parent | Ascension | 5 | 1 (Magic) | 0 | `[0, 0, 0, 0, 0, 0, 0x02000000, 0]` |
|
||||
| 20511 child | Ascension | 5 | 1 (Magic) | 0 | `[0, 0, 0, 0x00090000, 0x00800000, 0, 0, 0]` |
|
||||
| 19134 parent | Ascension | 5 | 1 (Magic) | 0 | `[0x00050010, 0, 0, 0, 0, 0, 0, 0]` |
|
||||
| 29544 child | Ascension | 5 | 0 (None) | 0 | `[0, 0, 0, 0, 0, 0, 0, 0]` |
|
||||
| 5246 parent | Epoch | 5 | 1 (Magic) | 0 | `[0x00050010, 136, 0, 0, 0, 0, 0x00800000, 0]` |
|
||||
| 20511 child | Epoch | 5 | 0 (None) | 0 | `[0, 0, 0, 0, 0, 0, 0, 0]` |
|
||||
| 19134 parent | Epoch | 5 | 1 (Magic) | 0 | `[0x00050010, 0, 0, 0, 0, 0, 0, 0]` |
|
||||
| 29544 child | Epoch | 5 | 0 (None) | 0 | `[0, 0, 0, 0, 0, 0, 0, 0]` |
|
||||
|
||||
None of these rows sets `ATTR0_NO_IMMUNITIES`, `ATTR2_NO_SCHOOL_IMMUNITIES`,
|
||||
`ATTR3_ALWAYS_HIT`, `ATTR4_NO_PARTIAL_IMMUNITY`, or
|
||||
`ATTR7_NO_ATTACK_MISS`. The source does not mark a spell as always hitting or
|
||||
as bypassing immunity. Both parent casts are Magic-class rows. Child 20511 is
|
||||
Magic class only in Ascension; 20511 in Epoch and child 29544 in both profiles
|
||||
are `DamageClass=None` aura-only rows. The historical core routes Magic-class
|
||||
spells through its magic hit calculation and applies its ordinary aura-only
|
||||
handling to None-class rows. The HealerMan runtime does not implement the
|
||||
general hit, resist, or deflect calculation in this pass.
|
||||
|
||||
## Parent speed effect
|
||||
|
||||
Both parents have effect 2 `APPLY_AURA` (`effectType=6`) with aura 31
|
||||
`MOD_INCREASE_SPEED`, base points 25, target A 22 (`TARGET_SRC_CASTER`),
|
||||
target B 15 (`TARGET_UNIT_SRC_AREA_ENEMY`), and radius index 14 (8 yd). Thus
|
||||
the aura grants +25% movement speed to eligible hostile recipients in the
|
||||
same caster-centered 8-yard area as parent fear. Its duration follows the
|
||||
parent row:
|
||||
|
||||
| Parent | Ascension | Epoch |
|
||||
| --- | ---: | ---: |
|
||||
| 5246 Intimidating Shout | 5 s | 8 s |
|
||||
| 19134 Frightening Shout | 4 s | 6 s |
|
||||
|
||||
`enemyTriggeredShoutMovementSpeedEffect` exposes this only when effect 2 still
|
||||
matches the source aura, amount, target pair, radius, and area contract. Its
|
||||
modifier uses the ActiveAura fraction (`0.25`) and the tag
|
||||
`enemy-triggered-shout:parent-movement-speed`. The target-local multiplier
|
||||
helper ignores expired, permanent, differently targeted, and untagged auras;
|
||||
if multiple shout speed effects are active it returns the strongest positive
|
||||
bonus, matching the historical core's `GetMaxPositiveAuraModifier` handling
|
||||
for `SPELL_AURA_MOD_INCREASE_SPEED`.
|
||||
|
||||
The runtime stores the speed modifier on the existing per-target parent
|
||||
`enemy-control:source-spell-5246` or
|
||||
`enemy-control:source-spell-19134` aura. This keeps same-caster refresh,
|
||||
different-caster preserve-existing behavior, and caster-removal persistence
|
||||
with the parent control record. PlayerRig and PartyPopulation movement consume
|
||||
the target-local multiplier. The summon loop currently returns for the
|
||||
parent's active control before moving, so this pass does not introduce summon
|
||||
movement or fear-flee AI. The control and speed effects share one duration. The
|
||||
table gives the DBC duration baseline; historical core
|
||||
`Spell::DoSpellHitOnUnit` computes one duration for the shared aura, then
|
||||
`Unit::ModSpellDuration` derives mechanic duration modifiers from the complete
|
||||
spell, including its spell-level fear mechanic. A fear-duration modifier can
|
||||
therefore shorten the combined fear and speed aura together.
|
||||
|
||||
The runtime attaches the speed modifier only when it accepts the parent spell
|
||||
application. This is important for fear immunity: the source rows have
|
||||
spell-level `Mechanic=5`, and the historical core checks that mechanic in
|
||||
`Unit::IsImmunedToSpell` before resolving the per-effect aura immunities.
|
||||
`Unit::SpellHitResult` calls that whole-spell check. Under the runtime's
|
||||
whole-spell fear-immunity policy, a fear-immune recipient does not receive the
|
||||
parent's fear or +25% speed effect. While fear is active, the existing player
|
||||
and party locomotion policy blocks movement; the speed multiplier is tracked
|
||||
on the shared aura but does not override that fear movement policy.
|
||||
|
||||
## Child control and immunity behavior
|
||||
|
||||
Child 20511 has aura 12 (`MOD_STUN`) for 5 seconds in Ascension and 8 seconds
|
||||
in Epoch. Ascension also has a separate aura 87 effect that increases physical
|
||||
damage taken by 15% for 5 seconds; Epoch has no such rider. Child 29544 has
|
||||
only fear aura 7, for 3 seconds in Ascension and 6 seconds in Epoch.
|
||||
|
||||
The whole-spell fear mechanic applies to all four rows. A fear mechanic
|
||||
immunity therefore rejects the parent or triggered child as a whole in the
|
||||
selected core. A stun-state immunity is narrower: it filters child 20511's
|
||||
aura-12 effect. In Ascension the separate aura-87 physical damage-taken rider
|
||||
can remain; Epoch's 20511 row has no remaining child effect. The source
|
||||
children have `Dispel=0`, so neither is dispellable by category. The same
|
||||
source-caster refresh and different-caster preserve-existing policy remains in
|
||||
`applyEnemySourceAura`; the shared parent control aura IDs already survive
|
||||
caster removal. Recipient removal removes the combined fear and speed aura.
|
||||
|
||||
## Targeting and implementation boundary
|
||||
|
||||
The parent effect-0 trigger remains a separate cast on its explicit victim;
|
||||
the child is not selected from the area list. Effects 1 and 2 remain the
|
||||
independent caster-centered area pair at 8 yards, with the existing cap of 5
|
||||
for 5246 and unlimited (`MaxAffectedTargets=0`) for 19134. A qualifying
|
||||
explicit victim may also receive the area effects. The prior targeting report
|
||||
documents the separate LOS rules, overlap, and random-ordering boundary.
|
||||
|
||||
Historical AzerothCore sources were read-only under
|
||||
`../wow-pvt-server-backups-2/azerothcore-wotlk/src/server/game/Spells/` and
|
||||
`../wow-pvt-server-backups-2/azerothcore-wotlk/src/server/game/Entities/Unit/`.
|
||||
The relevant paths are `Spell::EffectTriggerSpell`,
|
||||
`Spell::AddUnitTarget`, `Unit::IsImmunedToSpell`,
|
||||
`Unit::IsImmunedToSpellEffect`, `Unit::SpellHitResult`,
|
||||
`Unit::MagicSpellHitResult`, and `Unit::UpdateSpeed`. The current simulation
|
||||
still does not model general magic hit/resist/deflect rolls or creature-specific
|
||||
exceptions. The level-80 cap, loot, readiness, and publication scope are
|
||||
unchanged.
|
||||
|
||||
Focused verification passed: `npx vitest run src/game/enemyTriggeredShouts.test.ts src/game/enemySourceAuras.test.ts` (2 files, 12 tests). The root-owned shout integration suite also passed during integration; the owner runs final repository checks after shared changes settle.
|
||||
Reference in new issue
Block a user