8.1 KiB
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.cppchecks 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.cppmaps 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.hmaps those flags throughCanUseAttackType.Unit::AttackerStateUpdatedoes not gate ordinary main-hand swings on that flag, so the character still makes an unarmed main-hand swing.Player::_ApplyWeaponDamageclears 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.cppchooses meleem_attackTypeas main-hand by default or off-hand when the spell hasREQUIRES_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 bits0x00000400and0x01000000. NPCCheckItemsrejects a damage-class melee/ranged spell when its selected attack channel is unavailable. PlayerCheckItemschecks explicit item requirements throughGetUseableItemByPos; class-1passes 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::IsFitToSpellRequirementsapplies class, subclass, and inventory-type masks.Unit.cppapplies Aura 14 throughMeleeDamageBonusTakenfor weapon damage, before armor mitigation. Non-direct spell packets, including periodic packets, reachSpellBaseDamageBonusTakenthroughSpellDamageBonusTakenand get the flat amount when the aura's misc school mask overlaps. The direct spell damage path returns beforeSpellBaseDamageBonusTaken, 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::SpellHitResultsends 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.