# mod-dragon-legacy v1: lets a player transform into a dragon on command, taught by an NPC. First slice of a bigger idea — see the project notes for planned follow-ups (dragons turning neutral toward a transformed player, custom quests/interactions). ## What it does - **Aerion Dragonspeaker** (creature entry `901000`, spawned next to Deputy Willem in Northshire Valley as a placeholder — move with `.npc move` to wherever fits better, e.g. Wyrmrest Temple) offers to unlock the way of the dragon via gossip. Picking the option writes a row to `mod_dragon_legacy_unlocked` (characters DB) rather than teaching a spell — see "Why a command, not a learned spell" below. - **`.dragon-rawr`** (`SEC_PLAYER`) toggles **Dragon Form**: if unlocked and not already transformed, casts spell `900000` (a self-only `SPELL_AURA_TRANSFORM` into a Black Dragon Whelp, triggered server-side, not learned/cast by the player); if already transformed, cancels it. Can also be cancelled the normal way, by right-clicking its buff icon — that still works since it's just an active aura. Mounting also cancels it. Dying cancels it automatically (core behavior, no code needed). Logging out while transformed cancels it too (`DragonLegacy_Player::OnPlayerBeforeLogout`) so it doesn't carry over to the next login. - **`.dragon-rawr breath`** (`SEC_PLAYER`) casts **Whelp Breath** (spell `900001`, a single-target fire bolt) at the player's current target. Only works while Dragon Form is active — checked both in the command handler and via `spell_dragon_legacy_whelp_breath`'s `OnCheckCast` hook checking `HasAura(SPELL_DRAGON_FORM)`. The `OnCheckCast` gating pattern is what to copy for any future dragon-only abilities; the "command instead of spellbook" pattern is what to copy for how players actually trigger them. ### Why a command, not a learned spell Dragon Form and Whelp Breath are from-scratch spell IDs (900000/900001) with no entry in the client's own `Spell.dbc`. v1 taught them via `Player::learnSpell()` — that persisted correctly to `character_spell` server-side, but the client had nothing to render or cast: no name, no icon, no macro resolution, since the 3.3.5a client's spellbook/cast bar/macro system reads from its own local DBC, not anything the server sends. `.dragon-rawr` sidesteps this entirely: the transform is applied via a **triggered** `CastSpell` from server-side C++, never something the player casts by name themselves, so the client never needs to resolve the spell to trigger it. Same lesson independently confirmed in `mod-waygate-network` — see `PLAN.md`'s "v1.1: spell → command pivot" for the full writeup, and its `PLAN.md`'s "Deferred / rejected" section for the general rule. ## Known v1.1 limitations - No custom visual/animation for Whelp Breath — it works mechanically but has no spell visual yet (no `SpellVisualID` set). - Dragon Form's buff icon may render blank/generic even though the transform itself works, since icon art is tied to client-side `SpellIcon.dbc`/`Spell.dbc` data the client doesn't have an entry for. Cosmetic, not functional — not yet confirmed in-game either way. - The NPC's spawn point is a placeholder next to an existing starting-zone NPC, picked because its coordinates were already verified valid in the world DB — not because it's thematically right. Relocate it once the module is live. ## Custom ID ranges To avoid colliding with Blizzard content or other custom modules, this module reserves: - **Spell IDs 900000–900099** (`data/sql/db-world/base/dragon_legacy_spells.sql`) - **Creature entries / npc_text IDs 901000–901099** (`data/sql/db-world/base/dragon_legacy_npc.sql`) Checked against `data/sql/base/db_world/{spell_dbc,creature_template}.sql` at the time this module was written: normal content topped out well under 200000. Re-check with the DB directly before adding more content to this module, in case other custom content has been added since. ## Config See `conf/mod_dragon_legacy.conf.dist`: - `DragonLegacy.Enable` (default `1`) — toggles whether the NPC offers to teach Dragon Form.