aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rwxr-xr-xsrc/server/game/Combat/HostileRefManager.cpp15
-rwxr-xr-xsrc/server/game/Combat/HostileRefManager.h2
-rwxr-xr-xsrc/server/game/Entities/Unit/Unit.cpp2
-rwxr-xr-xsrc/server/game/Entities/Unit/Unit.h1
-rwxr-xr-xsrc/server/game/Spells/Spell.cpp6
-rwxr-xr-xsrc/server/game/Spells/SpellEffects.cpp22
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