mirror of
https://github.com/mangosfour/server.git
synced 2025-12-14 16:37:01 +00:00
Merge branch 'master' into 303
This commit is contained in:
commit
52b0ab1f89
20 changed files with 294 additions and 128 deletions
|
|
@ -4105,12 +4105,17 @@ void Unit::RemoveNotOwnSingleTargetAuras()
|
|||
|
||||
void Unit::RemoveAura(AuraMap::iterator &i, AuraRemoveMode mode)
|
||||
{
|
||||
if (IsSingleTargetSpell((*i).second->GetSpellProto()))
|
||||
Aura* Aur = i->second;
|
||||
SpellEntry const* AurSpellInfo = Aur->GetSpellProto();
|
||||
|
||||
Unit* caster = NULL;
|
||||
if (IsSingleTargetSpell(AurSpellInfo))
|
||||
{
|
||||
if(Unit* caster = (*i).second->GetCaster())
|
||||
caster = Aur->GetCaster();
|
||||
if(!caster)
|
||||
{
|
||||
AuraList& scAuras = caster->GetSingleCastAuras();
|
||||
scAuras.remove((*i).second);
|
||||
scAuras.remove(Aur);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -4119,13 +4124,12 @@ void Unit::RemoveAura(AuraMap::iterator &i, AuraRemoveMode mode)
|
|||
}
|
||||
}
|
||||
|
||||
if ((*i).second->GetModifier()->m_auraname < TOTAL_AURAS)
|
||||
// remove from list before mods removing (prevent cyclic calls, mods added before including to aura list - use reverse order)
|
||||
if (Aur->GetModifier()->m_auraname < TOTAL_AURAS)
|
||||
{
|
||||
m_modAuras[(*i).second->GetModifier()->m_auraname].remove((*i).second);
|
||||
m_modAuras[Aur->GetModifier()->m_auraname].remove(Aur);
|
||||
}
|
||||
|
||||
// remove from list before mods removing (prevent cyclic calls, mods added before including to aura list - use reverse order)
|
||||
Aura* Aur = i->second;
|
||||
// Set remove mode
|
||||
Aur->SetRemoveMode(mode);
|
||||
// some ShapeshiftBoosts at remove trigger removing other auras including parent Shapeshift aura
|
||||
|
|
@ -4135,16 +4139,29 @@ void Unit::RemoveAura(AuraMap::iterator &i, AuraRemoveMode mode)
|
|||
|
||||
// Statue unsummoned at aura remove
|
||||
Totem* statue = NULL;
|
||||
if(IsChanneledSpell(Aur->GetSpellProto()))
|
||||
if(Unit* caster = Aur->GetCaster())
|
||||
bool caster_channeled = false;
|
||||
if(IsChanneledSpell(AurSpellInfo))
|
||||
{
|
||||
if(!caster) // can be already located for IsSingleTargetSpell case
|
||||
caster = Aur->GetCaster();
|
||||
|
||||
if(caster)
|
||||
{
|
||||
if(caster->GetTypeId()==TYPEID_UNIT && ((Creature*)caster)->isTotem() && ((Totem*)caster)->GetTotemType()==TOTEM_STATUE)
|
||||
statue = ((Totem*)caster);
|
||||
else
|
||||
caster_channeled = caster==this;
|
||||
}
|
||||
}
|
||||
|
||||
sLog.outDebug("Aura %u now is remove mode %d",Aur->GetModifier()->m_auraname, mode);
|
||||
Aur->ApplyModifier(false,true);
|
||||
Aur->_RemoveAura();
|
||||
delete Aur;
|
||||
|
||||
if(caster_channeled)
|
||||
RemoveAurasAtChanneledTarget (AurSpellInfo);
|
||||
|
||||
if(statue)
|
||||
statue->UnSummon();
|
||||
|
||||
|
|
@ -10918,4 +10935,24 @@ bool Unit::HandleMeandingAuraProc( Aura* triggeredByAura )
|
|||
// heal
|
||||
CastCustomSpell(this,33110,&heal,NULL,NULL,true,NULL,NULL,caster_guid);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
void Unit::RemoveAurasAtChanneledTarget(SpellEntry const* spellInfo)
|
||||
{
|
||||
uint64 target_guid = GetUInt64Value(UNIT_FIELD_CHANNEL_OBJECT);
|
||||
|
||||
if(!IS_UNIT_GUID(target_guid))
|
||||
return;
|
||||
|
||||
Unit* target = ObjectAccessor::GetUnit(*this, target_guid);
|
||||
if(!target)
|
||||
return;
|
||||
|
||||
for (AuraMap::iterator iter = target->GetAuras().begin(); iter != target->GetAuras().end(); )
|
||||
{
|
||||
if (iter->second->GetId() == spellInfo->Id && iter->second->GetCasterGUID()==GetGUID())
|
||||
target->RemoveAura(iter);
|
||||
else
|
||||
++iter;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue