diff --git a/common/spdat.h b/common/spdat.h index 8c5726c53..91bacaebf 100644 --- a/common/spdat.h +++ b/common/spdat.h @@ -752,8 +752,8 @@ typedef enum { #define SE_CastOnCurer 386 // implemented - Casts a spell on the person curing #define SE_CastOnCure 387 // implemented - Casts a spell on the cured person #define SE_SummonCorpseZone 388 // implemented - summons a corpse from any zone(nec AA) -#define SE_FcTimerRefresh 389 // implemented, @Fc, On Caster, reset all recast timers, base: 1 -//#define SE_FcTimerLockout 390 // *not implemented - Sets recast timers to specific value, focus limited. +#define SE_FcTimerRefresh 389 // implemented, @Fc, On Caster, reset all recast timers, base: 1, Note: Applied from casted spells only +#define SE_FcTimerLockout 390 // implemented, @Fc, On Caster, set a spell to be on recast timer, base: recast duration milliseconds, Note: Applied from casted spells only #define SE_LimitManaMax 391 // implemented, @Ff, Mininum mana of spell that can be focused, base1: mana amt #define SE_FcHealAmt 392 // implemented, @Fc, On Caster, spell healing mod flat amt, base: amt #define SE_FcHealPctIncoming 393 // implemented, @Fc, On Target, heal received critical chance mod, base: chance pct diff --git a/zone/bonuses.cpp b/zone/bonuses.cpp index cf1a0ccc0..4b3d8e340 100644 --- a/zone/bonuses.cpp +++ b/zone/bonuses.cpp @@ -4007,6 +4007,8 @@ uint8 Mob::IsFocusEffect(uint16 spell_id,int effect_index, bool AA,uint32 aa_eff return focusFcMute; case SE_FcTimerRefresh: return focusFcTimerRefresh; + case SE_FcTimerLockout: + return focusFcTimerLockout; case SE_Fc_Cast_Spell_On_Land: return focusFcCastSpellOnLand; case SE_FcStunTimeMod: diff --git a/zone/common.h b/zone/common.h index 4945a880c..e107d0abe 100644 --- a/zone/common.h +++ b/zone/common.h @@ -143,7 +143,8 @@ typedef enum { //focus types focusIncreaseNumHits, //@Fc, SPA: 421, SE_FcIncreaseNumHits, On Caster, numhits mod flat amt, base: amt focusFcLimitUse, //@Fc, SPA: 420, SE_FcLimitUse, On Caster, numhits mod pct, base: pct focusFcMute, //@Fc, SPA: 357, SE_FcMute, On Caster, prevents spell casting, base: chance pct - focusFcTimerRefresh, //@Fc, SPA: 389, SE_FcTimerRefresh, On Caster, reset all recast timers, base: 1 + focusFcTimerRefresh, //@Fc, SPA: 389, SE_FcTimerRefresh, On Caster, reset spell recast timer, base: 1 + focusFcTimerLockout, //@Fc, SPA: 390, SE_FcTimerLockout, On Caster, set a spell to be on recast timer, base: recast duration milliseconds focusFcStunTimeMod, //@Fc, SPA: 133, SE_FcStunTimeMod, On Caster, stun time mod pct, base: chance pct focusFcResistIncoming, //@Fc, SPA: 510, SE_Fc_Resist_Incoming, On Target, resist modifier, base: amt focusFcAmplifyMod, //@Fc, SPA: 507, SE_Fc_Amplify_Mod, On Caster, damage-heal-dot mod pct, base: pct diff --git a/zone/spell_effects.cpp b/zone/spell_effects.cpp index 5db67a2b8..793980c98 100644 --- a/zone/spell_effects.cpp +++ b/zone/spell_effects.cpp @@ -2559,6 +2559,35 @@ bool Mob::SpellEffect(Mob* caster, uint16 spell_id, float partial, int level_ove break; } + case SE_FcTimerLockout: { + if (IsClient()) { + for (unsigned int mem_spell : CastToClient()->m_pp.mem_spells) { + if (IsValidSpell(mem_spell)) { + int32 new_recast_timer = CalcFocusEffect( + focusFcTimerLockout, + spell_id, + mem_spell + ); + if (new_recast_timer) { + bool apply_recast_timer = true; + if (IsCasting() && casting_spell_id == mem_spell) { + apply_recast_timer = false; + } + if (apply_recast_timer) { + new_recast_timer = new_recast_timer / 1000; + CastToClient()->GetPTimers().Start( + pTimerSpellStart + mem_spell, + static_cast(new_recast_timer) + ); + } + } + } + } + SetMana(GetMana()); + } + break; + } + case SE_HealGroupFromMana: { if(!caster) break; @@ -5753,6 +5782,12 @@ int32 Mob::CalcFocusEffect(focusType type, uint16 focus_id, uint16 spell_id, boo } break; + case SE_FcTimerLockout: + if (type == focusFcTimerLockout) { + value = focus_spell.base[i]; + } + break; + case SE_Fc_Cast_Spell_On_Land: if (type == focusFcCastSpellOnLand) { if (zone->random.Roll(focus_spell.base[i])) {