diff options
Diffstat (limited to 'src')
-rwxr-xr-x | src/server/game/Combat/HostileRefManager.cpp | 15 | ||||
-rwxr-xr-x | src/server/game/Combat/HostileRefManager.h | 2 | ||||
-rwxr-xr-x | src/server/game/Entities/Unit/Unit.cpp | 2 | ||||
-rwxr-xr-x | src/server/game/Entities/Unit/Unit.h | 1 | ||||
-rwxr-xr-x | src/server/game/Spells/Spell.cpp | 6 | ||||
-rwxr-xr-x | src/server/game/Spells/SpellEffects.cpp | 22 |
6 files changed, 27 insertions, 21 deletions
diff --git a/src/server/game/Combat/HostileRefManager.cpp b/src/server/game/Combat/HostileRefManager.cpp index 029725fa128..6af228c9117 100755 --- a/src/server/game/Combat/HostileRefManager.cpp +++ b/src/server/game/Combat/HostileRefManager.cpp @@ -185,3 +185,18 @@ void HostileRefManager::setOnlineOfflineState(Unit *pCreature, bool bIsOnline) //================================================= +void HostileRefManager::UpdateVisibility() +{ + HostileReference* ref = getFirst(); + while (ref) + { + HostileReference* nextRef = ref->next(); + if (!ref->getSource()->getOwner()->canSeeOrDetect(getOwner())) + { + HostileReference* nextRef = ref->next(); + ref->removeReference(); + delete ref; + } + ref = nextRef; + } +} diff --git a/src/server/game/Combat/HostileRefManager.h b/src/server/game/Combat/HostileRefManager.h index 6d57f1a0453..0972a4538d8 100755 --- a/src/server/game/Combat/HostileRefManager.h +++ b/src/server/game/Combat/HostileRefManager.h @@ -66,6 +66,8 @@ class HostileRefManager : public RefManager<Unit, ThreatManager> // delete one reference, defined by Unit void deleteReference(Unit *pCreature); + + void UpdateVisibility(); }; //================================================= #endif diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index 84ff41a67dd..9c0c436aa76 100755 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -100,7 +100,7 @@ Unit::Unit(): WorldObject(), m_movedPlayer(NULL), IsAIEnabled(false), NeedChangeAI(false), m_ControlledByPlayer(false), i_AI(NULL), i_disabledAI(NULL), m_procDeep(0), m_removedAurasCount(0), i_motionMaster(this), m_ThreatManager(this), m_vehicle(NULL), -m_vehicleKit(NULL), m_unitTypeMask(UNIT_MASK_NONE), m_HostileRefManager(this) +m_vehicleKit(NULL), m_unitTypeMask(UNIT_MASK_NONE), m_HostileRefManager(this), m_lastSanctuaryTime(0) { #ifdef _MSC_VER #pragma warning(default:4355) diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index b7f0cc36ba4..cd32be5910d 100755 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1774,6 +1774,7 @@ class Unit : public WorldObject void UpdateObjectVisibility(bool forced = true); SpellImmuneList m_spellImmune[MAX_SPELL_IMMUNITY]; + uint32 m_lastSanctuaryTime; // Threat related methods bool CanHaveThreatList() const; diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index f912a6f20b5..9ce3d89a99d 100755 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -1138,6 +1138,9 @@ void Spell::DoAllEffectOnTarget(TargetInfo *target) if (unit->isAlive() != target->alive) return; + if (getState() == SPELL_STATE_DELAYED && !IsPositiveSpell(m_spellInfo->Id) && (getMSTime() - target->timeDelay) <= unit->m_lastSanctuaryTime) + return; // No missinfo in that case + // Get original caster (if exist) and calculate damage/healing from him data Unit *caster = m_originalCaster ? m_originalCaster : m_caster; @@ -3414,7 +3417,10 @@ uint64 Spell::handle_delayed(uint64 t_offset) if (ihit->processed == false) { if (single_missile || ihit->timeDelay <= t_offset) + { + ihit->timeDelay = t_offset; DoAllEffectOnTarget(&(*ihit)); + } else if (next_time == 0 || ihit->timeDelay < next_time) next_time = ihit->timeDelay; } diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index b2fc0ec4032..d1bb898d228 100755 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -5326,27 +5326,9 @@ void Spell::EffectSanctuary(SpellEffIndex /*effIndex*/) if (!unitTarget) return; - std::list<Unit*> targets; - Trinity::AnyUnfriendlyUnitInObjectRangeCheck u_check(unitTarget, unitTarget, m_caster->GetMap()->GetVisibilityRange()); - Trinity::UnitListSearcher<Trinity::AnyUnfriendlyUnitInObjectRangeCheck> searcher(unitTarget, targets, u_check); - unitTarget->VisitNearbyObject(m_caster->GetMap()->GetVisibilityRange(), searcher); - for (std::list<Unit*>::iterator iter = targets.begin(); iter != targets.end(); ++iter) - { - if (!(*iter)->hasUnitState(UNIT_STAT_CASTING)) - continue; - - for (uint32 i = CURRENT_FIRST_NON_MELEE_SPELL; i < CURRENT_MAX_SPELL; i++) - { - if ((*iter)->GetCurrentSpell(i) - && (*iter)->GetCurrentSpell(i)->m_targets.getUnitTargetGUID() == unitTarget->GetGUID()) - { - (*iter)->InterruptSpell(CurrentSpellTypes(i), false); - } - } - } + unitTarget->getHostileRefManager().UpdateVisibility(); + unitTarget->m_lastSanctuaryTime = getMSTime(); - unitTarget->CombatStop(); - unitTarget->getHostileRefManager().deleteReferences(); // stop all fighting // Vanish allows to remove all threat and cast regular stealth so other spells can be used if (m_caster->GetTypeId() == TYPEID_PLAYER && m_spellInfo->SpellFamilyName == SPELLFAMILY_ROGUE |