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

5.7 KiB
Raw Blame History

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.