forked from phenom/healer-man
95 lines
4.8 KiB
Markdown
95 lines
4.8 KiB
Markdown
# Ordinary Creature Critical Block imports — 2026-10-06
|
||
|
||
## Import boundary
|
||
|
||
`src/game/enemyBlockAuras.ts` keeps
|
||
`supportedEnemyBlockAuraDefinition` fail-closed for Critical Block
|
||
(47294–47296) and Deterrence. The separate
|
||
`ordinaryCreatureSelfTargetCriticalBlockAuraDefinition` guard admits only
|
||
Critical Block after the caller supplies an
|
||
`EnemyNpcCriticalBlockImportProof` for one ordinary Creature self-cast. The
|
||
defender, caster, and target IDs must be the same nonempty ID; the proof must
|
||
explicitly identify an ordinary Creature and exclude a native defender, a
|
||
summon, and a character defender. It also carries the bounded applicability
|
||
token `azerothcore-e822d718-default-spellmod-path`.
|
||
|
||
The guard validates the complete raw spell signature, runtime contract, block
|
||
chance, and the exact aura-107 sibling list against the reviewed profile/rank
|
||
row before returning an aura-253 runtime definition. Aura 107 stays present in
|
||
the source signature and unsupported-effect metadata. Its no-op behavior is
|
||
specific to the reviewed default core path; a custom aura script/module or a
|
||
private server override invalidates that applicability proof. The WoW,
|
||
Ascension, and Epoch labels identify client DBC rows. They do not certify
|
||
private server overrides for those clients. Player and party casts must never
|
||
use this full-import guard.
|
||
|
||
## Reviewed Spell.dbc signatures
|
||
|
||
Each listed effect is type 6, mechanic 0, target A/B 1/0, radius 0, period 0;
|
||
spell range index is 1, school mask is 1, damage class is 0, duration is
|
||
permanent (`-1` in the raw signature), and stack amount is 0. The parsed
|
||
`basePoints` below are the client amount (`Spell.dbc` base-points field plus
|
||
one). The Spell.dbc hashes and source paths are pinned in
|
||
`NPC_BLOCK_AURA_PARITY_2026-10-06.md`.
|
||
|
||
| Profile | Spell | Aura effects (`auraType:basePoints:miscValue`) |
|
||
| --- | ---: | --- |
|
||
| WoW 3.3.5a | 47294 | `253:20:0`, `107:5:7` |
|
||
| WoW 3.3.5a | 47295 | `253:40:0`, `107:10:7` |
|
||
| WoW 3.3.5a | 47296 | `253:60:0`, `107:15:7` |
|
||
| Ascension | 47294 | `253:100:0`, `107:4:7`, `107:8:3` |
|
||
| Ascension | 47295 | `253:100:0`, `107:7:7`, `107:16:3` |
|
||
| Ascension | 47296 | `253:100:0`, `107:10:7`, `107:25:3` |
|
||
| Epoch | 47294 | `253:20:0`, `107:5:7` |
|
||
| Epoch | 47295 | `253:40:0`, `107:10:7` |
|
||
| Epoch | 47296 | `253:60:0`, `107:15:7` |
|
||
|
||
Aura 253 supplies the modeled critical-block chance. Aura 107 is
|
||
`SPELL_AURA_ADD_FLAT_MODIFIER`; misc 7 is the spell critical-chance modifier,
|
||
and Ascension also has misc 3 (`SPELLMOD_EFFECT1`). In the pinned AzerothCore
|
||
checkout at commit `e822d718322289dd036fb2daf8867ba41283bf9a`,
|
||
`SpellAuraEffects.cpp:780` sends aura spell modifiers through `ApplySpellMod`.
|
||
`ApplySpellMod` returns at lines 813–816 when the target is not a player, so
|
||
these aura-107 spell modifiers do not apply to an ordinary Creature on that
|
||
default path. This evidence does not cover custom aura scripts, custom modules,
|
||
or external server changes.
|
||
|
||
## Source assignment availability
|
||
|
||
The pinned AzerothCore base `creature_template_spell.sql` dump and checked
|
||
`db_world` SQL updates contain no `Spell` assignment for 47294, 47295, or
|
||
47296. This pass adds an importer guard and its evidence only; it does not
|
||
assign Critical Block to a creature. A real source creature assignment is
|
||
still required before any NPC receives the buff. Do not infer or fabricate one
|
||
from the player talent spell rows.
|
||
|
||
Deterrence remains outside the full importer because its source signatures
|
||
also contain effects (including aura 185 or aura 27) that are not represented
|
||
by ordinary NPC block inputs.
|
||
|
||
## Focused coverage
|
||
|
||
`src/game/enemyBlockAuras.test.ts` covers all three ranks in all three client
|
||
profiles, missing and malformed proof, mismatched self-target IDs, native,
|
||
summoned, and character-defender exclusions, the pinned applicability token,
|
||
generic importer fail-closed behavior, Deterrence exclusion, and raw signature
|
||
drift. The focused command is:
|
||
|
||
```text
|
||
npx vitest run src/game/enemyBlockAuras.test.ts
|
||
```
|
||
|
||
`combatStore.ts` uses this guard only for an ordinary source Creature's
|
||
self-target descriptor with a known template entry. The compiler pins all
|
||
three rank signatures in Ascension/Epoch, including aura-107 siblings, and
|
||
validates them even when no source NPC assignment uses them. Its duration-index
|
||
0 parser sentinel is 0; the guarded runtime definition normalizes the source
|
||
permanent aura to an `expiresAt=null` lifetime.
|
||
|
||
`enemyCriticalBlockImport.integration.test.ts` passes two actual runtime tests:
|
||
a clearly labeled synthetic self-cast applies the permanent aura without
|
||
damage, produces a deterministic critical block, and clears on reset; native,
|
||
summoned, character and non-self fixtures are excluded. This synthetic fixture
|
||
does not establish a real creature assignment. Regenerated campaign data is
|
||
byte-for-byte unchanged from this pass's starting snapshot.
|