mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-19 00:48:56 +01:00
*Let feign death interrupt enemies' casting.
--HG-- branch : trunk
This commit is contained in:
@@ -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;
|
||||
|
||||
|
||||
@@ -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<class NOTIFIER> void VisitNearbyObject(const float &radius, NOTIFIER ¬ifier) const { GetMap()->VisitAll(GetPositionX(), GetPositionY(), radius, notifier); }
|
||||
protected:
|
||||
explicit WorldObject();
|
||||
std::string m_name;
|
||||
|
||||
@@ -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<Unit*> targets;
|
||||
Trinity::AnyUnfriendlyUnitInObjectRangeCheck u_check(m_target, m_target, 100);
|
||||
Trinity::UnitListSearcher<Trinity::AnyUnfriendlyUnitInObjectRangeCheck> searcher(targets, u_check);
|
||||
m_target->VisitNearbyObject(100, 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)->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
|
||||
|
||||
@@ -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<Unit *> targets;
|
||||
|
||||
{
|
||||
Trinity::AnyUnfriendlyUnitInObjectRangeCheck u_check(this, this, dist);
|
||||
Trinity::UnitListSearcher<Trinity::AnyUnfriendlyUnitInObjectRangeCheck> searcher(targets, u_check);
|
||||
|
||||
TypeContainerVisitor<Trinity::UnitListSearcher<Trinity::AnyUnfriendlyUnitInObjectRangeCheck>, WorldTypeMapContainer > world_unit_searcher(searcher);
|
||||
TypeContainerVisitor<Trinity::UnitListSearcher<Trinity::AnyUnfriendlyUnitInObjectRangeCheck>, GridTypeMapContainer > grid_unit_searcher(searcher);
|
||||
|
||||
CellLock<GridReadGuard> 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<Trinity::AnyUnfriendlyUnitInObjectRangeCheck> searcher(targets, u_check);
|
||||
VisitNearbyObject(dist, searcher);
|
||||
|
||||
// remove current target
|
||||
if(getVictim())
|
||||
|
||||
Reference in New Issue
Block a user