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

8.1 KiB
Raw Blame History

Enemy weapon debuffs source audit — 2026-10-05

This note records the source contract for enemy Disarm (6713) and Infected Wound (17230). The active game uses the selected Ascension or Epoch Spell.dbc profile; the repository compiler's source rows are in scripts/dungeon-pipeline/compile-campaign-catalog.mjs, and the pure contracts and channel predicates are in src/game/enemyWeaponDebuffs.ts. Character-side Disarm checks are in src/game/enemyDisarmRuntime.ts.

Pinned client rows

The Ascension source is ../LadiksMPQEditor/client-current/area-52/patch-D/DBFilesClient/Spell.dbc, SHA-256 2f77f18b91ffbae32a19568e4bc05ec78ee384b6ba8dd2a6e05f0e97abbb2dce. The Epoch source is ../HealerMan-Storage/pipeline-work/dungeons/epoch-client/DBFilesClient/Spell.dbc, SHA-256 d5cce1a83550dcfa9eb2f0251dbb11fd24c272534b2b1a9b230924a44d817ab3. The pinned duration and radius fallback tables are the shared patch-S tables recorded in src/game/enemySourceAuras.ts.

Both profiles define Disarm 6713 as range index 2, physical school mask 1, melee damage class 2, mechanic 3, duration 5 seconds, zero stacks, no dispel, and EquippedItemClass = -1 (no caster weapon requirement). Ascension has Aura 67 (main-hand) and Aura 278 (ranged); Epoch has Aura 67 only. Aura 254 (off-hand) is absent from both rows. These effects disable only the named weapon attack channels; they do not silence spell casts. The profile helper requires the target to have at least one affected usable weapon slot before application. For a player, an already-disarmed slot is no longer usable for this check, so a repeated cast may fail before refreshing that slot; a creature target is checked by the presence of its virtual item slot instead. When a cast is accepted, the zero-stack aura refreshes its duration. The source-derived Disarm spell itself applies only after its melee hit result lands.

Both profiles define Infected Wound 17230 as range index 2, Nature school mask 8, damage class 0, duration 300 seconds, zero stacks, Disease dispel type 3, and no caster weapon requirement. Its single Aura 14 effect has amount +6 and misc value 1 (physical school mask). Aura 14 adds six flat damage to matching physical packets; it is not a six-percent modifier. The aura refreshes without stacking and can be removed by a friendly Disease dispel. As a damage-class NONE aura-only spell, the AzerothCore hit-result path has no miss/dodge roll for it after its ordinary immunity/evade checks. A caller modeling it as part of a separate landed weapon attack must use that attack result as its own gate.

Historical core behavior

The sibling ../wow-pvt-server-backups-2/azerothcore-wotlk tree is used only as read-only behavior evidence:

  • src/server/game/Spells/SpellInfo.cpp checks the target's matching weapon channels for mechanic Disarm. Players use a usable equipped weapon; creatures use virtual item slots. Main-hand, off-hand, and ranged channels are checked independently.
  • src/server/game/Spells/Auras/SpellAuraEffects.cpp maps Aura 67 to main-hand, Aura 254 to off-hand, and Aura 278 to ranged. Applying a channel removes the player's item-dependent aura and damage contribution, keeps the item equipped, then sets the corresponding unit flag. Creatures with configured equipment recalculate their physical damage. Clearing the aura reverses the temporary weapon changes.
  • src/server/game/Entities/Unit/Unit.h maps those flags through CanUseAttackType. Unit::AttackerStateUpdate does not gate ordinary main-hand swings on that flag, so the character still makes an unarmed main-hand swing. Player::_ApplyWeaponDamage clears disarmed ranged weapon damage and resets its delay; for a non-feral main hand it sets base damage to 1–2 and attack time to 2000 ms while preserving equipped item stats. Feral forms return before that weapon reset. Spell.cpp chooses melee m_attackType as main-hand by default or off-hand when the spell has REQUIRES_OFF_HAND_WEAPON; ranged spells use the ranged channel only when marked as ranged-weapon spells. The source flags for strict main-hand and off-hand requirements are Spell AttributesEx3 bits 0x00000400 and 0x01000000. NPC CheckItems rejects a damage-class melee/ranged spell when its selected attack channel is unavailable. Player CheckItems checks explicit item requirements through GetUseableItemByPos; class -1 passes without an equipment gate, while class-2 requirements scan usable matching weapons across main-hand, off-hand, and ranged slots. A matching off-hand weapon therefore keeps a generic class-2 requirement usable under Ascension or Epoch Disarm. For a nonpassive aura spell, the core also preserves casting when the matching item remains equipped but Disarm made it unusable; the explicit strict main/off-hand attribute checks still require that slot's weapon. Item::IsFitToSpellRequirements applies class, subclass, and inventory-type masks.
  • Unit.cpp applies Aura 14 through MeleeDamageBonusTaken for weapon damage, before armor mitigation. Non-direct spell packets, including periodic packets, reach SpellBaseDamageBonusTaken through SpellDamageBonusTaken and get the flat amount when the aura's misc school mask overlaps. The direct spell damage path returns before SpellBaseDamageBonusTaken, so this audit does not claim a bonus for ordinary direct magic spells. This aura has no charges, so the core's special charged-aura DoT exclusion does not apply. The bonus enters before armor mitigation; melee/ranged spell block follows armor, and damage absorbs resolve after the damage calculation.
  • Unit::SpellHitResult sends Disarm's melee damage class through melee miss, dodge, and parry resolution. Infected Wound's damage class is NONE and its only effect is an aura, so it does not take that melee result path.

The contract deliberately does not turn Disarm into root, stun, silence, or a general physical-action lock. Runtime callers own weapon-specific equipment state, resolved spell hit outcomes, armor/block/absorb ordering, and aura application/removal.

The player Disarm handler removes weapon-dependent auras and recalculates the weapon damage contribution while the item remains equipped. It does not call the item-stat removal routine, so the weapon's equipped STR/AP/stamina modifiers remain. The helper enemyDisarmInvalidatesAbilityRequirement models explicit spell item class and subclass gates from currently usable equipped items; it leaves requirements with item class -1 unblocked and only reports a Disarm-caused failure when every matching item is in a channel this source row disables. enemyDisarmBlocksAbilityCast adds the core exception for nonpassive aura casts and the strict main/off-hand flags. Runtime attack checks derive channels from the unexpired exact enemy-disarm:<profile>:<slot> tags; they never mutate saved equipment or nonweapon stats. Ascension item-requirement metadata uses the corrected WotLK Spell.dbc fields 68/69/70 (class, subclass mask, inventory mask). The previous generator read 67/68, which incorrectly exported class 0 and a subclass value from the class column; regeneration changed only those three equipped-item fields and the generated timestamp. WoW-ruleset main-hand auto damage uses the source unarmed 1–2 base and 2-second delay while retaining character AP and other equipped stats; an unaffected off-hand remains active, and feral forms keep their form profile. Ranged auto channels named by the active source profile are suppressed. Native RoM unarmed damage is left to its existing amount path because no bound core formula was verified. This pass also does not claim complete removal of all weapon-dependent item aura bonuses or generic ability formulas that derive damage from raw weapon stats.

Focused validation

Run npx vitest run src/game/enemyWeaponDebuffs.test.ts src/game/enemyDisarmRuntime.test.ts src/game/enemyDisarmRuntime.integration.test.ts for profile signatures, target/channel eligibility, refresh/dispel, cast gates, metadata projection, and pre-mitigation school matching. Player and companion execution are additionally covered by their focused integration tests.