# Disarm weapon contribution audit — 2026-10-05 This pass adds reusable character-side projections for item-dependent auras, spell-selected weapon channels, and temporary weapon damage under the source-backed Ascension/Epoch Disarm tags. The helpers are in `src/game/enemyDisarmRuntime.ts`; the checks are in `src/game/enemyDisarmRuntime.test.ts`. ## Core behavior verified In the read-only historical AzerothCore tree, `SpellAuraEffects.cpp` maps Aura 67/254/278 to main-hand/off-hand/ranged flags. Applying Disarm recalculates the player's item-dependent auras and weapon damage while retaining equipped item stats. Removing Disarm clears the flag and recalculates the affected channel's weapon auras. Creature spells use `Spell::CheckItems` to reject damage-class melee/ranged spells whose selected attack type is unavailable. `Player::HasItemFitToSpellRequirements` searches other usable equipped items for a class/subclass/inventory-mask match. Passive item-requirement auras are removed when Disarm leaves no matching usable weapon. The core keeps an active nonpassive aura spell through the specific aura-cast exception. Separately, `UpdateWeaponDependentAuras` recalculates weapon-aura contributions per attack type, and `CheckAttackFitToAuraRequirement` tests the item in that channel. `Spell` selects main-hand for a melee damage-class spell by default and off-hand when AttributesEx3 `0x01000000` is set. A ranged damage-class spell uses ranged when the core classifies it as a ranged-weapon spell; that decision uses AttributesEx `USES_RANGED_SLOT` (`0x00000002`), the ranged weapon subclass mask, or a Hunter-family exception. Other ranged damage-class spells use the main-hand attack type. The player item check does not impose a blanket gate on all physical damage-class casts. The source was read from: - `../wow-pvt-server-backups-2/azerothcore-wotlk/src/server/game/Spells/Auras/SpellAuraEffects.cpp` - `../wow-pvt-server-backups-2/azerothcore-wotlk/src/server/game/Entities/Player/Player.cpp` - `../wow-pvt-server-backups-2/azerothcore-wotlk/src/server/game/Spells/Spell.cpp` - `../wow-pvt-server-backups-2/azerothcore-wotlk/src/server/game/Spells/SpellInfo.cpp` - `../wow-pvt-server-backups-2/azerothcore-wotlk/src/server/shared/SharedDefines.h` - `../wow-pvt-server-backups-2/azerothcore-wotlk/src/server/game/Entities/Item/ItemTemplate.h` ## Helper contracts `enemyDisarmItemDependentAuraSuppressionIds` returns source-caster-owned passive aura instance IDs whose matching equipped weapon slots are all disabled. It preserves nonpassive aura spells and the stored aura state, so a caller can build an effective combat aura view that restores the passive contribution automatically when Disarm expires. `enemyDisarmAurasForWeaponChannel` creates the attack-type-specific aura view. It keeps an item-requirement aura contribution only when the selected usable weapon matches the aura requirement, and suppresses it while that channel is disarmed. This allows an enabled matching off-hand contribution to remain available while the main-hand calculation uses the unarmed profile. `enemyDisarmAbilityWeaponChannel` mirrors the source spell attack-type choice. `enemyDisarmAdjustedAbilityWeapon` returns the 1–2 damage, 2-second unarmed main-hand profile, no weapon for disabled off-hand/ranged channels, or the unchanged weapon for other channels. Feral main-hand weapon stats remain unchanged. `enemyDisarmBlocksNpcWeaponAbility` exposes the NPC-only selected damage-class channel gate separately from player ability requirement checks. ## Integration boundary and limits The party runtime uses `effectiveActorAuras` for global passive suppression and channel-specific weapon-aura views. Party ability casts retain the player-style equipped-item requirement gate, and generic amount calculations receive the member's active Disarm channel set so source-selected weapon contribution can be adjusted without rejecting unrelated physical casts. Party main-hand autos use the source 1–2 / 2-second WoW punch; the dual-wield integration case confirms an enabled off-hand still contributes. The party auto path also asks the native Runewaker helper for a verified unarmed main-hand profile and cadence, while ranged autos retain their existing channel behavior. Periodic party effects are applied through `CombatStore.applyTimedActorEffect`; its native snapshot path checks the source actor's active main-hand channel before passing the verified profile into the native periodic calculator. Generated party characters use the player's class item-requirement rules. The hostile creature `Spell::CheckItems` channel gate remains available as a separate helper and is not imposed on party class builds. The centralized combat store owns the player and party passive-aura projection and generic ability weapon contribution. The simulator still cannot infer item durability or equipment eligibility missing from its resolved loadout. Native Runewaker unarmed main-hand damage is implemented only when the active five training profile is source-verifiable. Its sidecar does not model `Main_DMG_Per`, `DMG_AllWeapon`, `DMG_Unarmed`, `AtkSpeed`, `Main_ATKSpeed_Per`, `AttackSpeed_AllWeapon`, or `AttackSpeed_Unarmed`; those rate channels remain an explicit neutral-rate boundary. Unsupported profiles keep their existing fallback behavior rather than borrowing the WoW punch profile. ## Focused validation `npx vitest run src/game/enemyWeaponDebuffs.test.ts src/game/enemyDisarmRuntime.test.ts src/game/enemyDisarmRuntime.integration.test.ts src/game/romNativeDisarm.test.ts` passes: 4 files, 21 tests. The party integration tests cover player and companion cast handling, an enabled party off-hand, native main-hand damage/cadence, and the existing ranged Scout channel behavior.