From 6b0cc98b06226a177f665f3751ba669527d0839d Mon Sep 17 00:00:00 2001 From: Vayle Date: Mon, 9 Mar 2026 15:13:24 -0400 Subject: [PATCH 01/15] Fix suppressed buff effect restoration --- zone/client_packet.cpp | 89 +----------------- zone/mob.h | 1 + zone/spell_effects.cpp | 198 +++++++++++++++++++++++++++++++---------- 3 files changed, 154 insertions(+), 134 deletions(-) diff --git a/zone/client_packet.cpp b/zone/client_packet.cpp index 2c1537d10..92fdcfe57 100644 --- a/zone/client_packet.cpp +++ b/zone/client_packet.cpp @@ -520,100 +520,13 @@ void Client::ReapplyBuff(uint32 index, bool from_suppress) if (!IsValidSpell(buffs[index].spellid)) return; - const SPDat_Spell_Struct &spell = spells[buffs[index].spellid]; - int NimbusEffect = GetSpellNimbusEffect(buffs[index].spellid); if (NimbusEffect) { if (!IsNimbusEffectActive(NimbusEffect)) SendSpellEffect(NimbusEffect, 500, 0, 1, 3000, true); } - for (int x1 = 0; x1 < EFFECT_COUNT; x1++) { - switch (spell.effect_id[x1]) { - case SpellEffect::Illusion: { - if (GetIllusionBlock()) { - break; - } - - if (from_suppress || buffs[index].persistant_buff) { - Mob *caster = entity_list.GetMobID(buffs[index].casterid); - ApplySpellEffectIllusion(spell.id, caster, index, spell.base_value[x1], spell.limit_value[x1], spell.max_value[x1]); - } - break; - } - case SpellEffect::SummonHorse: { - if (!from_suppress && (RuleB(Character, PreventMountsFromZoning) || !zone->CanCastOutdoor())) { - BuffFadeByEffect(SpellEffect::SummonHorse); - } else { - SummonHorse(buffs[index].spellid); - } - break; - } - case SpellEffect::Silence: - { - Silence(true); - break; - } - case SpellEffect::Amnesia: - { - Amnesia(true); - break; - } - case SpellEffect::DivineAura: - { - invulnerable = true; - break; - } - case SpellEffect::Invisibility2: - case SpellEffect::Invisibility: - { - SendAppearancePacket(AppearanceType::Invisibility, Invisibility::Invisible); - break; - } - case SpellEffect::Levitate: - { - if (!zone->CanLevitate()) { - if (!GetGM()) { - SendAppearancePacket(AppearanceType::FlyMode, 0); - BuffFadeByEffect(SpellEffect::Levitate); - Message(Chat::Red, "You can't levitate in this zone."); - break; - } - - Message(Chat::White, "Your GM flag allows you to levitate in this zone."); - } - - SendAppearancePacket( - AppearanceType::FlyMode, - ( - spell.limit_value[x1] == 1 ? - EQ::constants::GravityBehavior::LevitateWhileRunning : - EQ::constants::GravityBehavior::Levitating - ), - true, - !from_suppress - ); - - break; - } - case SpellEffect::AddMeleeProc: - case SpellEffect::WeaponProc: - { - AddProcToWeapon(GetProcID(buffs[index].spellid, x1), false, 100 + spells[buffs[index].spellid].limit_value[x1], buffs[index].spellid, buffs[index].casterlevel, GetSpellProcLimitTimer(buffs[index].spellid, ProcType::MELEE_PROC)); - break; - } - case SpellEffect::DefensiveProc: - { - AddDefensiveProc(GetProcID(buffs[index].spellid, x1), 100 + spells[buffs[index].spellid].limit_value[x1], buffs[index].spellid, GetSpellProcLimitTimer(buffs[index].spellid, ProcType::DEFENSIVE_PROC)); - break; - } - case SpellEffect::RangedProc: - { - AddRangedProc(GetProcID(buffs[index].spellid, x1), 100 + spells[buffs[index].spellid].limit_value[x1], buffs[index].spellid, GetSpellProcLimitTimer(buffs[index].spellid, ProcType::RANGED_PROC)); - break; - } - } - } + ReapplyBuffEffects(index, from_suppress); } // Finish client connecting state diff --git a/zone/mob.h b/zone/mob.h index 6433b0ead..bd1e54971 100644 --- a/zone/mob.h +++ b/zone/mob.h @@ -452,6 +452,7 @@ public: void BuffFadeNonPersistDeath(); void BuffFadeDetrimental(); void BuffFadeBySlot(int slot, bool iRecalcBonuses = true, bool suppress = false, uint32 suppresstics = 0); + void ReapplyBuffEffects(uint32 index, bool from_suppress = false); void BuffFadeDetrimentalByCaster(Mob *caster); void BuffFadeBySitModifier(); void BuffFadeSongs(); diff --git a/zone/spell_effects.cpp b/zone/spell_effects.cpp index 6417a0efe..868903f67 100644 --- a/zone/spell_effects.cpp +++ b/zone/spell_effects.cpp @@ -4220,6 +4220,155 @@ void Mob::DoBuffTic(const Buffs_Struct &buff, int slot, Mob *caster) } // removes the buff in the buff slot 'slot' +void Mob::ReapplyBuffEffects(uint32 index, bool from_suppress) +{ + if (!IsValidSpell(buffs[index].spellid)) { + return; + } + + const auto &spell = spells[buffs[index].spellid]; + bool refresh_weapon_stance = false; + + for (int i = 0; i < EFFECT_COUNT; ++i) { + switch (spell.effect_id[i]) { + case SpellEffect::Illusion: + { + if (GetIllusionBlock()) { + break; + } + + if (from_suppress || buffs[index].persistant_buff) { + Mob *caster = entity_list.GetMobID(buffs[index].casterid); + ApplySpellEffectIllusion(spell.id, caster, index, spell.base_value[i], spell.limit_value[i], spell.max_value[i]); + } + break; + } + case SpellEffect::SummonHorse: + { + if (!IsClient()) { + break; + } + + if (!from_suppress && (RuleB(Character, PreventMountsFromZoning) || !zone->CanCastOutdoor())) { + BuffFadeByEffect(SpellEffect::SummonHorse); + } else { + CastToClient()->SummonHorse(buffs[index].spellid); + } + break; + } + case SpellEffect::Silence: + { + Silence(true); + break; + } + case SpellEffect::Amnesia: + { + Amnesia(true); + break; + } + case SpellEffect::DivineAura: + { + SetInvul(true); + break; + } + case SpellEffect::Invisibility2: + case SpellEffect::Invisibility: + { + if (IsClient()) { + SendAppearancePacket(AppearanceType::Invisibility, Invisibility::Invisible); + } + break; + } + case SpellEffect::Levitate: + { + if (!zone->CanLevitate()) { + if (IsClient()) { + if (CastToClient()->GetGM()) { + Message(Chat::White, "Your GM flag allows you to levitate in this zone."); + } else { + SendAppearancePacket(AppearanceType::FlyMode, 0); + BuffFadeByEffect(SpellEffect::Levitate); + Message(Chat::Red, "You can't levitate in this zone."); + break; + } + } else { + SendAppearancePacket(AppearanceType::FlyMode, 0); + BuffFadeByEffect(SpellEffect::Levitate); + break; + } + } + + if (IsClient()) { + SendAppearancePacket( + AppearanceType::FlyMode, + ( + spell.limit_value[i] == 1 ? + EQ::constants::GravityBehavior::LevitateWhileRunning : + EQ::constants::GravityBehavior::Levitating + ), + true, + !from_suppress + ); + } else { + SendAppearancePacket( + AppearanceType::FlyMode, + ( + spell.limit_value[i] == 1 ? + EQ::constants::GravityBehavior::LevitateWhileRunning : + EQ::constants::GravityBehavior::Levitating + ) + ); + } + + break; + } + case SpellEffect::AddMeleeProc: + case SpellEffect::WeaponProc: + { + AddProcToWeapon(GetProcID(buffs[index].spellid, i), false, 100 + spell.limit_value[i], buffs[index].spellid, buffs[index].casterlevel, GetSpellProcLimitTimer(buffs[index].spellid, ProcType::MELEE_PROC)); + break; + } + case SpellEffect::DefensiveProc: + { + AddDefensiveProc(GetProcID(buffs[index].spellid, i), 100 + spell.limit_value[i], buffs[index].spellid, GetSpellProcLimitTimer(buffs[index].spellid, ProcType::DEFENSIVE_PROC)); + break; + } + case SpellEffect::RangedProc: + { + AddRangedProc(GetProcID(buffs[index].spellid, i), 100 + spell.limit_value[i], buffs[index].spellid, GetSpellProcLimitTimer(buffs[index].spellid, ProcType::RANGED_PROC)); + break; + } + case SpellEffect::BindSight: + { + auto *caster = entity_list.GetMobID(buffs[index].casterid); + if (caster && caster->IsClient()) { + caster->CastToClient()->SetBindSightTarget(this); + } + break; + } + case SpellEffect::SetBodyType: + { + SetBodyType(spell.base_value[i], false); + break; + } + case SpellEffect::Weapon_Stance: + { + if (IsClient()) { + refresh_weapon_stance = true; + } + break; + } + default: + break; + } + } + + if (refresh_weapon_stance && IsClient()) { + CastToClient()->CalcBonuses(); + CastToClient()->ApplyWeaponsStance(); + } +} + void Mob::BuffFadeBySlot(int slot, bool iRecalcBonuses, bool suppress, uint32 suppresstics) { if(slot < 0 || slot > GetMaxTotalSlots()) @@ -4694,59 +4843,16 @@ void Mob::BuffFadeBySlot(int slot, bool iRecalcBonuses, bool suppress, uint32 su safe_delete(action_packet); client->ReapplyBuff(slot, true); } else if (IsPet() && GetOwner() && GetOwner()->IsClient()) { - // Reapply visual/state effects for client pets only - // Other non-client mobs (NPCs, bots, mercs) use the normal dispel mechanic if (IsValidSpell(buffs[slot].spellid)) { const auto& spell = spells[buffs[slot].spellid]; - // Restore nimbus (visual aura) effect before processing individual spell effects, - // mirroring Client::ReapplyBuff behavior for client-owned pets. if (spell.nimbus_effect > 0) { SetNimbusEffect(static_cast(spell.nimbus_effect)); } - for (int i = 0; i < EFFECT_COUNT; i++) { - switch (spell.effect_id[i]) { - case SpellEffect::Illusion: - ApplySpellEffectIllusion(spell.id, entity_list.GetMobID(buffs[slot].casterid), slot, spell.base_value[i], spell.limit_value[i], spell.max_value[i]); - break; - case SpellEffect::Silence: - Silence(true); - break; - case SpellEffect::Amnesia: - Amnesia(true); - break; - case SpellEffect::AddMeleeProc: - case SpellEffect::WeaponProc: - AddProcToWeapon(GetProcID(buffs[slot].spellid, i), false, 100 + spell.limit_value[i], buffs[slot].spellid, buffs[slot].casterlevel, GetSpellProcLimitTimer(buffs[slot].spellid, ProcType::MELEE_PROC)); - break; - case SpellEffect::DefensiveProc: - AddDefensiveProc(GetProcID(buffs[slot].spellid, i), 100 + spell.limit_value[i], buffs[slot].spellid, GetSpellProcLimitTimer(buffs[slot].spellid, ProcType::DEFENSIVE_PROC)); - break; - case SpellEffect::RangedProc: - AddRangedProc(GetProcID(buffs[slot].spellid, i), 100 + spell.limit_value[i], buffs[slot].spellid, GetSpellProcLimitTimer(buffs[slot].spellid, ProcType::RANGED_PROC)); - break; - case SpellEffect::Levitate: - { - // Restore levitate visual effects after suppression expires - if (!zone->CanLevitate()) { - SendAppearancePacket(AppearanceType::FlyMode, 0); - BuffFadeByEffect(SpellEffect::Levitate); - } else { - if (spell.limit_value[i] == 1) { - SendAppearancePacket(AppearanceType::FlyMode, EQ::constants::GravityBehavior::LevitateWhileRunning); - } else { - SendAppearancePacket(AppearanceType::FlyMode, EQ::constants::GravityBehavior::Levitating); - } - } - break; - } - default: - break; - } - } + ReapplyBuffEffects(slot, true); } + } else { + buffs[slot].spellid = SPELL_UNKNOWN; } - } else { - buffs[slot].spellid = SPELL_UNKNOWN; } if(IsPet() && GetOwner() && GetOwner()->IsClient()) { From d7290757e00b793b26038e35998325f224cb8322 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 9 Mar 2026 19:29:55 +0000 Subject: [PATCH 05/15] Fix misplaced comment: add proper description for ReapplyBuffEffects, restore original comment before BuffFadeBySlot Co-authored-by: Valorith <76063792+Valorith@users.noreply.github.com> --- zone/spell_effects.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/zone/spell_effects.cpp b/zone/spell_effects.cpp index 868903f67..7911320c2 100644 --- a/zone/spell_effects.cpp +++ b/zone/spell_effects.cpp @@ -4219,7 +4219,7 @@ void Mob::DoBuffTic(const Buffs_Struct &buff, int slot, Mob *caster) CalcBonuses(); } -// removes the buff in the buff slot 'slot' +// Re-applies runtime-only buff effects after unsuppression or zone-in void Mob::ReapplyBuffEffects(uint32 index, bool from_suppress) { if (!IsValidSpell(buffs[index].spellid)) { @@ -4369,6 +4369,7 @@ void Mob::ReapplyBuffEffects(uint32 index, bool from_suppress) } } +// removes the buff in the buff slot 'slot' void Mob::BuffFadeBySlot(int slot, bool iRecalcBonuses, bool suppress, uint32 suppresstics) { if(slot < 0 || slot > GetMaxTotalSlots()) From c10eeb0c16f989a5bfcbb2d6b4daf9a396b0505f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 9 Mar 2026 19:30:30 +0000 Subject: [PATCH 06/15] Fix: restore outer else-SPELL_UNKNOWN branch in BuffFadeBySlot Co-authored-by: Valorith <76063792+Valorith@users.noreply.github.com> --- zone/spell_effects.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/zone/spell_effects.cpp b/zone/spell_effects.cpp index 868903f67..d3d0ee397 100644 --- a/zone/spell_effects.cpp +++ b/zone/spell_effects.cpp @@ -4850,9 +4850,9 @@ void Mob::BuffFadeBySlot(int slot, bool iRecalcBonuses, bool suppress, uint32 su } ReapplyBuffEffects(slot, true); } - } else { - buffs[slot].spellid = SPELL_UNKNOWN; } + } else { + buffs[slot].spellid = SPELL_UNKNOWN; } if(IsPet() && GetOwner() && GetOwner()->IsClient()) { From dbb517e991eacc8f07106ad43d05cd3e7ceff5c3 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 9 Mar 2026 19:41:11 +0000 Subject: [PATCH 07/15] Fix BuffFadeBySlot: restore outer else for normal buff fade slot clearing Co-authored-by: Valorith <76063792+Valorith@users.noreply.github.com> --- zone/spell_effects.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/zone/spell_effects.cpp b/zone/spell_effects.cpp index 868903f67..d3d0ee397 100644 --- a/zone/spell_effects.cpp +++ b/zone/spell_effects.cpp @@ -4850,9 +4850,9 @@ void Mob::BuffFadeBySlot(int slot, bool iRecalcBonuses, bool suppress, uint32 su } ReapplyBuffEffects(slot, true); } - } else { - buffs[slot].spellid = SPELL_UNKNOWN; } + } else { + buffs[slot].spellid = SPELL_UNKNOWN; } if(IsPet() && GetOwner() && GetOwner()->IsClient()) { From 485614608bdf75527a4d85d2bb3a1f2eba43cbdb Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 9 Mar 2026 21:01:15 +0000 Subject: [PATCH 09/15] Apply PR feedback: bounds check, DivineAura client guard, levitate dedup Co-authored-by: Valorith <76063792+Valorith@users.noreply.github.com> --- zone/spell_effects.cpp | 29 +++++++++-------------------- 1 file changed, 9 insertions(+), 20 deletions(-) diff --git a/zone/spell_effects.cpp b/zone/spell_effects.cpp index 62814dae9..6328f9a22 100644 --- a/zone/spell_effects.cpp +++ b/zone/spell_effects.cpp @@ -4222,7 +4222,7 @@ void Mob::DoBuffTic(const Buffs_Struct &buff, int slot, Mob *caster) // Re-applies runtime-only buff effects after unsuppression or zone-in void Mob::ReapplyBuffEffects(uint32 index, bool from_suppress) { - if (!IsValidSpell(buffs[index].spellid)) { + if (index >= GetMaxTotalSlots() || !IsValidSpell(buffs[index].spellid)) { return; } @@ -4268,7 +4268,9 @@ void Mob::ReapplyBuffEffects(uint32 index, bool from_suppress) } case SpellEffect::DivineAura: { - SetInvul(true); + if (IsClient()) { + SetInvul(true); + } break; } case SpellEffect::Invisibility2: @@ -4298,26 +4300,13 @@ void Mob::ReapplyBuffEffects(uint32 index, bool from_suppress) } } + auto fly_mode = (spell.limit_value[i] == 1) + ? EQ::constants::GravityBehavior::LevitateWhileRunning + : EQ::constants::GravityBehavior::Levitating; if (IsClient()) { - SendAppearancePacket( - AppearanceType::FlyMode, - ( - spell.limit_value[i] == 1 ? - EQ::constants::GravityBehavior::LevitateWhileRunning : - EQ::constants::GravityBehavior::Levitating - ), - true, - !from_suppress - ); + SendAppearancePacket(AppearanceType::FlyMode, fly_mode, true, !from_suppress); } else { - SendAppearancePacket( - AppearanceType::FlyMode, - ( - spell.limit_value[i] == 1 ? - EQ::constants::GravityBehavior::LevitateWhileRunning : - EQ::constants::GravityBehavior::Levitating - ) - ); + SendAppearancePacket(AppearanceType::FlyMode, fly_mode); } break; From 1ccf5dd805d3a94db0f5daab4aad0792d9e5aa76 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 9 Mar 2026 21:34:30 +0000 Subject: [PATCH 12/15] Drop suppressed illusions on zone/relog session change Co-authored-by: Valorith <76063792+Valorith@users.noreply.github.com> --- zone/zonedb.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/zone/zonedb.cpp b/zone/zonedb.cpp index 9885af113..7683961f7 100644 --- a/zone/zonedb.cpp +++ b/zone/zonedb.cpp @@ -3053,6 +3053,13 @@ void ZoneDatabase::LoadBuffs(Client *client) for (int slot_id = 0; slot_id < max_buff_slots; ++slot_id) { if (buffs[slot_id].spellid == SPELL_SUPPRESSED) { + // Suppressed illusions should drop on zone/relog rather than being unsuppressed later + if (IsValidSpell(buffs[slot_id].suppressedid) && + IsEffectInSpell(buffs[slot_id].suppressedid, SpellEffect::Illusion)) { + buffs[slot_id].spellid = SPELL_UNKNOWN; + buffs[slot_id].suppressedid = SPELL_UNKNOWN; + buffs[slot_id].suppressedticsremaining = -1; + } continue; } From 7eb00262a0965e52812eeb9714ea3291ce98cf28 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 9 Mar 2026 21:34:58 +0000 Subject: [PATCH 13/15] Guard stale spell reference in ReapplyBuffEffects loop Co-authored-by: Valorith <76063792+Valorith@users.noreply.github.com> --- zone/spell_effects.cpp | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/zone/spell_effects.cpp b/zone/spell_effects.cpp index 6328f9a22..04855ffa9 100644 --- a/zone/spell_effects.cpp +++ b/zone/spell_effects.cpp @@ -4226,7 +4226,11 @@ void Mob::ReapplyBuffEffects(uint32 index, bool from_suppress) return; } - const auto &spell = spells[buffs[index].spellid]; + // Snapshot the spell ID before the loop so that if BuffFadeByEffect + // clears buffs[index].spellid mid-iteration the remaining effect + // handlers still reference the correct spell. + const uint32 spell_id = buffs[index].spellid; + const auto &spell = spells[spell_id]; bool refresh_weapon_stance = false; for (int i = 0; i < EFFECT_COUNT; ++i) { @@ -4251,8 +4255,9 @@ void Mob::ReapplyBuffEffects(uint32 index, bool from_suppress) if (!from_suppress && (RuleB(Character, PreventMountsFromZoning) || !zone->CanCastOutdoor())) { BuffFadeByEffect(SpellEffect::SummonHorse); + return; } else { - CastToClient()->SummonHorse(buffs[index].spellid); + CastToClient()->SummonHorse(spell_id); } break; } @@ -4291,12 +4296,12 @@ void Mob::ReapplyBuffEffects(uint32 index, bool from_suppress) SendAppearancePacket(AppearanceType::FlyMode, 0); BuffFadeByEffect(SpellEffect::Levitate); Message(Chat::Red, "You can't levitate in this zone."); - break; + return; } } else { SendAppearancePacket(AppearanceType::FlyMode, 0); BuffFadeByEffect(SpellEffect::Levitate); - break; + return; } } @@ -4314,17 +4319,17 @@ void Mob::ReapplyBuffEffects(uint32 index, bool from_suppress) case SpellEffect::AddMeleeProc: case SpellEffect::WeaponProc: { - AddProcToWeapon(GetProcID(buffs[index].spellid, i), false, 100 + spell.limit_value[i], buffs[index].spellid, buffs[index].casterlevel, GetSpellProcLimitTimer(buffs[index].spellid, ProcType::MELEE_PROC)); + AddProcToWeapon(GetProcID(spell_id, i), false, 100 + spell.limit_value[i], spell_id, buffs[index].casterlevel, GetSpellProcLimitTimer(spell_id, ProcType::MELEE_PROC)); break; } case SpellEffect::DefensiveProc: { - AddDefensiveProc(GetProcID(buffs[index].spellid, i), 100 + spell.limit_value[i], buffs[index].spellid, GetSpellProcLimitTimer(buffs[index].spellid, ProcType::DEFENSIVE_PROC)); + AddDefensiveProc(GetProcID(spell_id, i), 100 + spell.limit_value[i], spell_id, GetSpellProcLimitTimer(spell_id, ProcType::DEFENSIVE_PROC)); break; } case SpellEffect::RangedProc: { - AddRangedProc(GetProcID(buffs[index].spellid, i), 100 + spell.limit_value[i], buffs[index].spellid, GetSpellProcLimitTimer(buffs[index].spellid, ProcType::RANGED_PROC)); + AddRangedProc(GetProcID(spell_id, i), 100 + spell.limit_value[i], spell_id, GetSpellProcLimitTimer(spell_id, ProcType::RANGED_PROC)); break; } case SpellEffect::BindSight: From d557d7181297e2fd83979996e47ba916ab67137b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Mon, 9 Mar 2026 23:38:40 +0000 Subject: [PATCH 15/15] Remove incorrect BindSight restoration from ReapplyBuffEffects Co-authored-by: Valorith <76063792+Valorith@users.noreply.github.com> --- zone/spell_effects.cpp | 8 -------- 1 file changed, 8 deletions(-) diff --git a/zone/spell_effects.cpp b/zone/spell_effects.cpp index 04855ffa9..f8adf2874 100644 --- a/zone/spell_effects.cpp +++ b/zone/spell_effects.cpp @@ -4332,14 +4332,6 @@ void Mob::ReapplyBuffEffects(uint32 index, bool from_suppress) AddRangedProc(GetProcID(spell_id, i), 100 + spell.limit_value[i], spell_id, GetSpellProcLimitTimer(spell_id, ProcType::RANGED_PROC)); break; } - case SpellEffect::BindSight: - { - auto *caster = entity_list.GetMobID(buffs[index].casterid); - if (caster && caster->IsClient()) { - caster->CastToClient()->SetBindSightTarget(this); - } - break; - } case SpellEffect::SetBodyType: { SetBodyType(spell.base_value[i], false);