# Mote spell ranks: Spell Display window + cast bar (staged 2026-09-30, Trevor test only)

dinput8.dll md5 e33d2570e16941f62a8dca10ac80192c, built from client_dll/hjclient.c (previous source:
client_dll/hjclient.c.bak-mote; previous DLL 3692f773 = mana fix + 28 buff slots: client_dll/dinput8.dll.bak-mote).
Everything 3692f773 had, plus two hooks. verify_sites.py against patch_files/eqgame.exe (md5 e5ea76b0):
28 hooks + 6 byte patches + 1 call site, 0 problems.

uifiles/default/EQUI_SpellDisplay.xml md5 9c9c93e4379ea98945a6a409570c8d88: the stock file plus three children
(HJSR_List, HJSR_Place, HJSR_Upgrade), the description box shortened to make room, default height 190 -> 350.
Stock copy in Trevor's client: uifiles/default/EQUI_SpellDisplay.xml.bak-mote. Without the DLL the new children
just stay empty. Not in patch_files / the manifest (patcher_ignore.txt lists it anyway).

Installed in Trevor's client 2026-09-30 (backup dinput8.dll.bak-mote); patcher_ignore.txt: dinput8.dll,
uifiles/default/EQUI_SpellDisplay.xml.

## New hooks
1. CSpellDisplayWnd::UpdateStrings 0x75EAC0 (site 83 ec 08 53 56): after the stock text, the title gets the rank
   numeral ("Ignite Blood VI"), the list gets the server's rows for that spell, and "/say #spellrank show <id>" is sent
   (hidden; at most every 1.5 s per spell). Place Mote -> "#spellrank place <id>" (the server reads the cursor),
   Upgrade -> "#spellrank upgrade <id>", clicking a mote row -> "#spellrank select <id> <tier>".
2. CharacterZoneClient::GetCastingTimeModifier 0x4336D0 (site 83 ec 08 56 8b f1): the cast bar of a ranked spell is
   shortened by base * (rank-1) * Custom:SpellRankCastTimePct / 100, the same term the zone uses.
Zone-in: "#spellrank sync" fills the rank cache (RANKCLR / RANKCFG / RANKS lines).
Kill switch: /moteui on|off (hides the rank rows/buttons and the numeral; the cast bar follows the server rule).
Evidence: Obsidian Projects/THJ Client RE.md (rows 0x75EAC0 and 0x4336D0).

Server side: quests lua_modules/spell_rank_engine.lua (+ commands/spellrank.lua), sql/spell_ranks.sql, zone C++
(Custom:SpellRank* rules). Test world only.
