Files
healer-man/docs/DETERRENCE_CATALOG_2026-10-07.md
2026-10-07 13:05:04 -04:00

8.9 KiB
Raw Permalink Blame History

Hunter Deterrence catalog selection — 2026-10-07

Result

The selected Hunter catalog now exposes the exact Spell.dbc player action Deterrence 19263 as wow335-hunter-deterrence, with its source level, cooldown, resource, GCD, target, item requirement, source attributes, and three parent aura rows preserved. Its 67801 linked-aura rows remain a separate, explicit package descriptor; 67801 is not a learned action or a triggered-spell child.

The generated progression file and its generator were not changed. The catalog-local fallback is inserted only when the generated Hunter chains contain no Deterrence name or package IDs. An imported candidate is accepted only if its selected row matches the verified source fields; a same-name 65871 row, an imported linked child, or any candidate drift suppresses the package rather than substituting a row.

Why the generated Hunter entry was missing

The read-only source was the local 3.3.5a patch-enUS.MPQ at ../wow335a/Data/enUS/patch-enUS.MPQ, SHA-256 c1c06b0d0c34c331b21df7cdd25cc422a650efbd477e42b80849ba30b2e5fc99. Its SkillLineAbility.dbc contains this row for 19263:

[10865, 51, 19263, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0]

The Hunter source in scripts/generate-wow335-abilities.mjs includes skill line 51 and class mask 4, but classSpellIds also requires the row's class-mask field 4 to contain bit 4. The selected row has class mask zero, so the import filter drops it even though the Hunter skill-line row is present. A read-only generation to a temporary output reproduced the omission; no generated files were written.

Selected parent row

The same archive's Spell.dbc has 239 fields and selects spell 19263 named Deterrence. The imported field shift is six. The exact catalog values are:

Field Selected value
Source and base level 60 / 60
Maximum scaling level 0
Target and range Self, range index 1, 0–0
Cast time 0 ms
Duration index 28, 5,000 ms
Cooldown 90,000 ms; category recovery 0
Global cooldown 0 ms
Power Mana, 0 flat cost, 0 percent cost
Prevention type 0 (NONE)
Equipped item class 2, subclass mask 173555, inventory mask 0
Attributes 0–7 [327696, 16, 0, 0, 0, 0, 0, 0]
Damage class / school mask 0 / 1
Icon Ability_Whirlwind

The exact DBC effect rows are self-targeted APPLY_AURA effects with no triggered spells, period, radius, or mechanic:

Index Aura Parsed amount Raw base points DBC coefficient
0 47 +100 99 1
1 287 +100 99 1
2 25 0 -1 0

wow335AbilityCatalog.ts maps this one verified row through the ordinary rank path, then uses the source-bound parent aura descriptors from wow335DeterrenceRuntime.ts. That override matters for Aura 47: its source payload is +100 parry percentage points, so the descriptor uses a flat parry modifier. The generic Aura 47 mapper uses a percent multiplier and would not represent this row correctly. The descriptors preserve the existing source IDs and five-second duration; the 287 effect has no generic deflect tag.

The parent row's selected client tooltip resolves to: “When activated, increases parry chance by 100% and grants a 100% chance to deflect spells. While Deterrence is active, you cannot attack. Lasts 5 sec.” The linked server row (19263, 67801, 2, 'Deterrence') and exact 67801 child signature are documented in the source audit.

The same DBC field distinguishes attacks blocked by the pacify prevention type from silence-only spells. In the 239-field archive, PreventionType is at raw field 220 (the import shift of six from field 214 in the pinned 234-field layout). The source enum defines 2 as PACIFY, 1 as SILENCE, and 0 as NONE. Direct read-only parsing of the pinned archive verified every one of the 189 selected Hunter rank rows plus Deterrence: 32 NONE, 67 SILENCE, and 91 PACIFY. Five additional IDs appear in generated Hunter spell chains but do not become selected cast ranks: rank-zero Tame Beast 13481 and Volley damage children 42234, 42243, 42244, and 42245. They are excluded from the runtime lookup because the ability mapper selects the player cast/channel wrappers. Arcane Shot (3044), Steady Shot (56641), Aimed Shot (19434), and Wing Clip (2974) are PACIFY; Explosive Trap (13813) and Mend Pet (136) are SILENCE; Deterrence (19263) is NONE. The complete spell-ID table is in WOW335_HUNTER_PREVENTION_TYPES_BY_SPELL_ID in src/game/wow335AbilityCatalog.ts. The lookup also checks the selected Hunter/source identity and accepts the public stable ID used when a generated source action overlays a core action. Unknown IDs, another class, source, or name return no prevention value.

The static cast-gate table is deliberately local to the selected catalog. It was read from Spell.dbc with the archive's WDBC record framing and the same six-field schema shift implemented by scripts/generate-wow335-abilities.mjs::parseSpells; the DBC generator does not currently retain PreventionType. A second read-only comparison against all 190 table IDs verified every stored value against raw field 220. The DBC source pin is WoW build 3.3.5a.12340 and the MPQ SHA-256 recorded above. Field semantics are pinned to AzerothCore revision e822d718322289dd036fb2daf8867ba41283bf9a: src/server/shared/SharedDefines.h defines NONE=0, SILENCE=1, and PACIFY=2, and src/server/game/Spells/Spell.cpp gates casts using those values. A future change to the selected archive, DBC field layout, selected Hunter ranks, or source profile must re-verify the raw table and update this local mapping. It should move into generated metadata only with explicit profile, class, source-row, and rank provenance; this change does not broaden the generated schema.

Linked package and runtime boundary

wow335DeterrenceRuntime.ts owns three parent apply-aura descriptors and two linked 67801 descriptors. The child source effects are Aura 288 (+100, raw base 99) and Aura 185 (-100, raw base -101), each lasting 5,000 ms. Aura 185 retains its ordinary incoming-ranged-hit modifier. Aura 288 has no generic tag; its ignore-facing meaning is resolved only from the complete source-bound Deterrence package.

The catalog exposes the selected parent action in Hunter progression at level 60 and keeps the two linked child descriptors separate. Shared cast/runtime integration applies and removes the full five-aura package atomically. The runtime validator requires the exact parent ability identity and all five active aura instances to share source owner, target, applied time, and exact expiry. It rejects partial, duplicate, expired, foreign-profile, or same-name 65871 packages. See src/game/wow335DeterrenceRuntime.ts, src/game/wow335DeterrenceRuntime.test.ts, and the Deterrence integration report.

Hunter NPC defensive selection

The configured Hunter companion can now select the learned 19263 action from its own eligible abilities. The early self-defensive branch considers only engaged mobs currently targeting that companion, and requires the companion to have no active cast and no active Deterrence package. It triggers below the configured defensive-health threshold (55% by default) or when a recognized incoming cooldown mechanic is imminent. The source action must also pass the normal readiness and target checks, including cooldown, resource, equipment, and current pacify restrictions. The branch uses the ordinary ability commit and execution path, preserving its source cost, 90-second cooldown, and zero GCD. The runtime package applies all five source-linked auras and expires them together.

This is a Hunter-specific defensive choice based on the companion's own threat and health/mechanic state; it does not change the general NPC defensive candidate rules. The player and companion cast gates both consult the exact selected-row PreventionType lookup: PACIFY (2) spells are blocked while the actor has an active pacified aura, while SILENCE (1) actions such as Explosive Trap and Mend Pet remain available. Ordinary melee attacks keep their existing pacify gate. The focused catalog prevention test covers every selected Hunter rank and merged public IDs; shared cast/runtime evidence is in the Deterrence integration report.

Focused verification

npx vitest run src/game/wow335AbilityCatalog.test.ts -t "selects Hunter Deterrence|retains pinned PreventionType" passes both selected catalog tests. The Deterrence case checks the stable selected ID, level 60 unlock, 90-second cooldown, zero cost/GCD, exact source attributes and weapon requirement, all three parent aura rows, both linked child rows, and rejection of 65871/67801 as independent Hunter actions. The prevention case checks all 190 selected rank IDs against the source map, class/source/name/rank rejection, and public merged IDs for Arcane Shot and Steady Shot. Source-contract tests separately cover profile, parent/child, and link drift.