Update Healer Man server
This commit is contained in:
1 parent
6114a2295f
commit
69809f7228
593 files changed
+903643
-40774
No files matched your search
@@ -0,0 +1,128 @@
|
||||
# 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.
|
||||
Reference in new issue
Block a user