• Knack117 released this 2026-05-11 18:55:27 +00:00 | 11 commits to main since this release

    Summary

    Paragon cross-class talent expansion pass + Warrior stance bypass (server and client) + Mirror Image now mimics the caster's spellbook instead of stock Frostbolt / Fire Blast.

    Server commit: e649402
    Default config flag still: Paragon.WildcardFamilyMatching = 1 (.reload config to toggle).


    Talent expansions (Paragon owners only — stock classes unchanged)

    • Cold Snap (11958) — resets cooldown of any Frost-school spell.
    • Nature's Swiftness (17116, 16188) + Predator's Swiftness (69369) — instant-cast on any Nature-school spell.
    • Vampiric Embrace (15286) — leech-heals from any single-target Shadow-school spell.
    • Fingers of Frost (44543/44545) + Frostbite (11071/12496/12497) — proc from any Frost-school chill effect (DK Howling Blast / Icy Touch / Chains of Ice, Hunter Frost Trap, Shaman Frost Shock, cross-class chill auras applying SPELL_AURA_MOD_DECREASE_SPEED).
    • Maelstrom Weapon (53817) — now also affects Mage Fireball (133), Frostbolt (116), and Arcane Blast (30451) at every rank, both for the cast-time/cost spellmod and for stack consumption on cast.

    Warrior stance bypass

    • Server: SpellInfo::CheckShapeshift returns SPELL_CAST_OK whenever a Paragon caster hits any Stances != 0 spell (no SpellFamilyName gate). Stock classes still see the regular form rules.
    • Client (patch-enUS-4.MPQ): Stances zeroed on every SPELLFAMILY_WARRIOR Spell.dbc row (105 spells) so the engine's pre-cast "Must be in Battle/Defensive/Berserker Stance" check stops eating CMSG_CAST_SPELL packets. Server bypass enforces the actual decision; stock Warriors still see the server-side stance error mid-cast if they actually click while out of stance.
    • Client (patch-enUS-5.MPQ): Lua tooltip post-processor recolors and appends (Paragon: bypassed) to the "Requires Stance" line on Warrior abilities. Action-bar UseAction wrapper routes stance-gated Warrior spell clicks through CastSpellByName so the stance-zero DBC + server bypass actually run instead of the engine's local IsUsableSpell path firing the error sound.

    Mirror Image

    • npc_pet_mage_mirror_image rebuilds its spell list from the Paragon owner's spellbook on InitializeAI and JustEngagedWith (the second pass + events.Reset() clears stale events the CasterAI base scheduler may have queued from the stock 59637/59638 entries before the rebuild ran).
    • Curated filter keeps single-target damaging spells (instant, cast-time, or channeled) with a base cooldown ≤ 10 s. The "damaging" definition includes SPELL_EFFECT_TRIGGER_MISSILE and SPELL_AURA_PERIODIC_TRIGGER_SPELL, so Arcane Missiles qualifies. Rejects passives, AoE, melee/ranged weapon strikes, item/reagent/stance/equip-gated, and lower spell ranks.
    • UpdateAI picks a random spell from the curated list per cast (so each image's rotation is independent and varied) and reschedules the next pick by the actually-cast spell's cast/channel duration + 750 ms breather, so a 5 s Arcane Missiles channel waits its full duration before re-rolling rather than visually looping across four images.
    • Tooltip on Mirror Image (55342) appends a Paragon line noting the random-spellbook behavior.

    Engine helpers

    • Unit::IsParagonWildcardCaller / Unit::ParagonFamilyMatches used by Spell.cpp, SpellInfo.cpp, Player.cpp, SpellAuraEffects.cpp, and the spell scripts.
    • SpellInfo::CheckShapeshift signature gains an optional caster pointer; all call sites updated.

    SQL migrations (auto-applied by DBUpdater)

    Under modules/mod-paragon/data/sql/db-world/updates/:

    • 2026_05_11_01.sql — Vampiric Embrace spell_proc relax + script gate (spell_pri_vampiric_embrace::CheckProc enforces stock for non-Paragon).
    • 2026_05_11_02.sql — Maelstrom Weapon spell_proc relax (initial; superseded by _04 for the stack-consumption fix below).
    • 2026_05_11_03.sql — Fingers of Frost / Frostbite spell_proc relax + spell_script_names binding.
    • 2026_05_11_04.sql — Maelstrom Weapon spell_proc fixup: restore SpellPhaseMask=1 (CAST) and AttributesMask=8 (PROC_ATTR_REQ_SPELLMOD); previous _02 set 8/0 which silently dropped every proc event.

    Diagnostics

    The chatty [paragon-diag] Mirror Image probe / kept / cast / engage logs from the debugging session were demoted from LOG_INFO to LOG_DEBUG, so production logs are quiet but the probes remain available if regressions need reproducing.

    Client patches

    • patch-enUS-4.MPQ — DBC bake now also runs _patch_spell_dbc_stances.py (zeros Stances on every SPELLFAMILY_WARRIOR row).
    • patch-enUS-5.MPQPlayerFrame.lua adds the spell-tooltip post-processor (Warrior stance / Maelstrom Weapon / Mirror Image) and a Warrior-stance UseAction wrapper.
    • patch-enUS-6.MPQ — unchanged from v0.7.15.
    • Wow.exe — unchanged from v0.7.15.

    Deploy

    1. Pull main (commit e649402).
    2. docker compose build ac-worldserver ac-db-import
    3. docker compose up -d ac-db-import (applies the four new SQL migrations).
    4. docker compose restart ac-worldserver.
    5. Players replace Data/enUS/patch-enUS-4.MPQ and Data/enUS/patch-enUS-5.MPQ with the assets attached to this release. patch-enUS-6.MPQ and Wow.exe are unchanged from v0.7.15 and only need to be (re)installed by anyone who skipped the previous release.
    Downloads