Server-side batch following v0.7.18, all gated to Paragon (or applied
server-wide where the design discussion called for it):
* Cross-class stance / form / presence / aspect exclusivity (server-wide).
New `IsFracturedExclusiveStanceSpell()` (`Unit.cpp`/`Unit.h`) returns
true for the union of warrior stances + druid forms (combat AND utility:
Travel, Aquatic, Flight, Swift Flight) + Ghost Wolf + base Stealth +
Shadowform + Metamorphosis + DK Presences + Hunter Aspects (combat AND
utility: Cheetah, Pack). `Aura::CanStackWith` (`SpellAuras.cpp`) refuses
to stack two spells from this set, which routes through
`_RemoveNoStackAurasDueToAura` to drop the older aura -- the same
mechanism Battle Elixirs / Curses use. Plugs the stock-AC gap where DK
Presences and Hunter Aspects (regular auras, just rendered in the
stance bar) coexisted with engine-shapeshifts.
* Stances / Presences / Aspects cancellable like Druid forms.
`SpellInfoCorrections.cpp` now zeroes `CategoryEntry` on warrior
stances, DK presences, and every rank of every hunter aspect (moves
them out of SpellCategory 47 "Combat States", which gates the client's
right-click / `/cancelaura` path), AND clears `AttributesEx6` bit
`0x1000` on warrior stances + DK presences (a second client-UI gate
surfaced via DBC diff -- aspects don't have it set). Mirrored client-
side by `_patch_spell_dbc_presences_cancelable.py`. Aspects / presences
do NOT swap action bars (those are owned by `SPELL_AURA_MOD_SHAPESHIFT`,
not by Category / AttrEx6) -- only warrior stances and druid forms keep
the bar swap, matching the design requirement that presences/aspects
not change the player's action bar.
* Hunter ammo soft-fail (server-wide).
Replaced both `SPELL_FAILED_NO_AMMO` returns in `Spell::CheckCast` with
`break;` so ranged + thrown abilities cast through with zero ammo;
`_ApplyAmmoBonuses` continues to gate the actual arrow/bullet DPS bonus
on a non-empty stack, so equipping ammo still pays off. New programmatic
`ApplySpellFix`-style block in `SpellInfoCorrections.cpp` iterates every
Hunter-family spell whose `EquippedItemClass == ITEM_CLASS_WEAPON` and
`EquippedItemSubClassMask` includes Bow/Gun/Crossbow and sets
`EquippedItemClass = -1` (skipping a small DENYLIST of Quiver / Ammo
Pouch passive haste auras + Aynasha's Bow + Legendary Bow Haste -- those
are item-equip-driven and must keep gating on the ranged weapon being
equipped). Server log: ">> Fractured: dropped EquippedItemClass on 196
hunter shot abilities". Mirrored client-side by the new
`_patch_spell_dbc_hunter_ammo.py` so the 3.3.5a client preflight stops
blocking the cast packet with "Ammo needs to be in the paper doll ammo
slot before it can be fired." `Spell::TakeAmmo` no longer clears
`PLAYER_AMMO_ID` to 0 when the bag empties (defense in depth so a half-
deployed pair degrades to soft-fail rather than hard-reject). Adds
`#include "ItemTemplate.h"` for `ITEM_SUBCLASS_WEAPON_*`.
* Feral Cat scaling (server-wide, cat-only).
`StatSystem.cpp` `UpdateAttackPowerAndDamage` FORM_CAT branch doubles
the AGI coefficient (1.0 -> 2.0). `SpellAuraEffects.cpp` Master
Shapeshifter FORM_CAT branch doubles the talent's bp before triggering
48420 (R1: 2% -> 4% crit, R2: 4% -> 8%). FORM_BEAR / FORM_DIREBEAR /
FORM_MOONKIN / FORM_TREE branches all left untouched so bear stays
"already fine" per the resident Feral expert. Client tooltip drift on
Cat Form (768) + Master Shapeshifter (48411 / 48412) + Pestilence
(50842) handled by `_patch_spell_dbc_feral_tooltips.py`.
* Pestilence spreads / refreshes Devouring Plague for Paragon casters.
`spell_dk.cpp` `spell_dk_pestilence::HandleScriptEffect` now also
spreads (and Glyph-of-Disease refreshes) Priest Devouring Plague when
`IsParagonWildcardCaller(caster)`. Uses `GetAuraOfRankedSpell(2944)` so
the spread copy carries the caster's actual rank. Stock DKs cannot
cast Devouring Plague at all, so this branch is a no-op for them.
* Dancing Rune Weapon: Paragon copies melee, not casts.
`spell_dk.cpp` `spell_dk_dancing_rune_weapon::CheckProc` for Paragon
callers requires `eventInfo.GetDamageInfo()` and
`spellInfo->DmgClass == SPELL_DAMAGE_CLASS_MELEE`, so the ghostly
weapon now copies cross-class melee strikes (Hamstring, Sinister Strike,
Heart Strike, Frost Strike, ...) and auto-attacks instead of re-casting
the DK's nukes. Stock DK gating below is untouched.
* Maelstrom Weapon: drop Arcane Blast from the allowlist.
`SpellInfo.cpp` and `spell_shaman.cpp` allowlists now match Fireball
and Frostbolt only -- Arcane Blast stacked with its own self-buff was
too potent.
* `BALANCE-TODO.md` added under `contrib/fractured-dev-extras/` to
capture the resident Feral expert's recommendation, the levers we
considered, and the cat-only Master-Shapeshifter / AGI-doubling
resolution we shipped, plus the next-lever knobs if field reports
still flag cat as weak.
DBC patcher pipeline (lives outside the repo in `fractured-tooling/`)
documented run order: runes -> reagents -> stances -> presences_cancelable
-> hunter_ammo -> feral_tooltips -> _make_paragon_dbc_patch.
No SQL migrations.
Co-authored-by: Cursor <cursoragent@cursor.com>
Documents the four binary artifacts that pair with this server
(patch-enUS-4/5/6.MPQ + patched Wow.exe), where they live (the
Releases page; not in the tree per the repo-tidy policy), and how a
contributor installs them on top of a clean 3.3.5a client. Cross-
referenced from the contrib/fractured-dev-extras README.
Co-authored-by: Cursor <cursoragent@cursor.com>
Stock AzerothCore does not ship CLAUDE.md, BUILD-NATIVE.md, or local build
logs at repo root. Park them under contrib/fractured-dev-extras/ so the
repo root stays close to upstream and dev clutter is contained.
- mv CLAUDE.md, BUILD-NATIVE.md -> contrib/fractured-dev-extras/
- mv build-worldserver.log + _build_paragon_*.log there (untracked / ignored)
- add contrib/fractured-dev-extras/README.txt explaining the layout
- gitignore: contrib/fractured-dev-extras/*.log
Co-authored-by: Cursor <cursoragent@cursor.com>