From 01db065cebc656ff1936731a3a0aa4ceece6e8dd Mon Sep 17 00:00:00 2001 From: megamage Date: Wed, 17 Dec 2008 18:45:54 -0600 Subject: *Let feign death interrupt enemies' casting. --HG-- branch : trunk --- src/game/DynamicObject.cpp | 2 +- src/game/Object.h | 1 + src/game/SpellAuras.cpp | 25 +++++++++++++++++++++---- src/game/Unit.cpp | 20 +++----------------- 4 files changed, 26 insertions(+), 22 deletions(-) (limited to 'src') diff --git a/src/game/DynamicObject.cpp b/src/game/DynamicObject.cpp index dcac7f08a9b..d7badd57892 100644 --- a/src/game/DynamicObject.cpp +++ b/src/game/DynamicObject.cpp @@ -116,7 +116,7 @@ void DynamicObject::Update(uint32 p_time) if(m_updateTimer < p_time) { Trinity::DynamicObjectUpdater notifier(*this,caster); - GetMap()->VisitAll(GetPositionX(), GetPositionY(), GetRadius(), notifier); + VisitNearbyObject(GetRadius(), notifier); m_updateTimer = 500; // is this official-like? }else m_updateTimer -= p_time; diff --git a/src/game/Object.h b/src/game/Object.h index 4eab67185df..70bb50893da 100644 --- a/src/game/Object.h +++ b/src/game/Object.h @@ -479,6 +479,7 @@ class TRINITY_DLL_SPEC WorldObject : public Object Creature* SummonTrigger(float x, float y, float z, float ang, uint32 dur, CreatureAI* (*GetAI)(Creature*) = NULL); bool isActive() const { return m_isActive; } void setActive(bool isActive); + template void VisitNearbyObject(const float &radius, NOTIFIER ¬ifier) const { GetMap()->VisitAll(GetPositionX(), GetPositionY(), radius, notifier); } protected: explicit WorldObject(); std::string m_name; diff --git a/src/game/SpellAuras.cpp b/src/game/SpellAuras.cpp index 9d477b16406..a6e7be8d15d 100644 --- a/src/game/SpellAuras.cpp +++ b/src/game/SpellAuras.cpp @@ -2097,8 +2097,9 @@ void Aura::HandleAuraDummy(bool apply, bool Real) { if (GetAuraDuration() <= 0 || m_removeMode==AURA_REMOVE_BY_DISPEL) { - int32 bp0 = m_modifier.m_amount; //GetModifierValue(); - m_target->CastCustomSpell(m_target,33778,&bp0,NULL,NULL,true,NULL,this,GetCasterGUID()); + // final heal + if(m_target->IsInWorld()) + m_target->CastCustomSpell(m_target,33778,&m_modifier.m_amount,NULL,NULL,true,NULL,this,GetCasterGUID()); } } return; @@ -3061,8 +3062,24 @@ void Aura::HandleFeignDeath(bool apply, bool Real) m_target->SendMessageToSet(&data,true); */ - m_target->SetVisibility(VISIBILITY_OFF); - m_target->SetVisibility(VISIBILITY_ON); + std::list targets; + Trinity::AnyUnfriendlyUnitInObjectRangeCheck u_check(m_target, m_target, 100); + Trinity::UnitListSearcher searcher(targets, u_check); + m_target->VisitNearbyObject(100, searcher); + for(std::list::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)->m_currentSpells[i] + && (*iter)->m_currentSpells[i]->m_targets.getUnitTargetGUID() == m_target->GetGUID()) + { + (*iter)->InterruptSpell(i, false); + } + } + } // blizz like 2.0.x m_target->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_UNKNOWN6); // blizz like 2.0.x diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index 19ea4029cf8..f3a0b56c1fa 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -12089,24 +12089,10 @@ void Unit::UpdateReactives( uint32 p_time ) Unit* Unit::SelectNearbyTarget(float dist) const { - CellPair p(Trinity::ComputeCellPair(GetPositionX(), GetPositionY())); - Cell cell(p); - cell.data.Part.reserved = ALL_DISTRICT; - cell.SetNoCreate(); - std::list targets; - - { - Trinity::AnyUnfriendlyUnitInObjectRangeCheck u_check(this, this, dist); - Trinity::UnitListSearcher searcher(targets, u_check); - - TypeContainerVisitor, WorldTypeMapContainer > world_unit_searcher(searcher); - TypeContainerVisitor, GridTypeMapContainer > grid_unit_searcher(searcher); - - CellLock cell_lock(cell, p); - cell_lock->Visit(cell_lock, world_unit_searcher, *MapManager::Instance().GetMap(GetMapId(), this)); - cell_lock->Visit(cell_lock, grid_unit_searcher, *MapManager::Instance().GetMap(GetMapId(), this)); - } + Trinity::AnyUnfriendlyUnitInObjectRangeCheck u_check(this, this, dist); + Trinity::UnitListSearcher searcher(targets, u_check); + VisitNearbyObject(dist, searcher); // remove current target if(getVictim()) -- cgit v1.2.3