# Recasting active auras (`src/mods/aurarecast.cpp`) Goal (user, 2026-10-15): auras / buffs can be cast again while active; the new cast renews the remaining time, it does not add to it. ## What blocks it (measured 2026-10-15) Heldenmut (0x3f7) on the hero: effects kind 1 and 2 (the buff) and kind 0x22 (the lock `cCreature::StartArtCooldown` 0x539ce0 adds), all with the aura's duration (66 s); its art cooldown (cArtCooldowns, 301.9 units) ran out while the aura still had 30 s left, and a cast order (0x105, art 0x3f7) was still ignored. `cCreature::IsValidArtTarget` (`0x51d680`) switches on the art: 0x28, 0x29, 0x41, 0x48, 0x3ed, 0x3f7, 0x3f8 and table entries for 0x3fa.. go to `0x51d8b1`, which rejects the target if it has any effect of the art (`cCreatureArts::HasEffectOfArt` `0x5829c0`, effect +0x1c). 0x3fa / 0x3fb and 0x446 have their own variants of the test right after it (not changed). ## The mod - The `je` after that test (`0x51d8bd`) becomes a `jmp`: the target is valid whether or not the effect is active. The art's cooldown still applies. - `cCreatureArts::AddEffect` (`0x582c10`, (kind, ?, value, duration, art, network, ?, ?), ret 0x20) is hooked: for a buff art (launch type SelfOrAlly) on a player hero, if an effect of the same kind and art exists, its remaining time is set to the new duration and nothing is added. The value of the old effect stays (a recast after raising the art's level keeps the old strength until it runs out). - The aura visual is an effect object (cObjectFX, vtable `0x88f99c`) each cast creates and attaches with a cEventFX 0x42 (owner +8, art +0x3c; the object keeps the owner at +0x68). `cObjectFX::ReceiveEvent` (`0x5a37b0`) is hooked: when a new one attaches to a player hero for a buff art, the previous one for the same hero and art is flagged dead (object +0x14 bit 0x10, as saving does). Untested whether the object manager removes it promptly.