diff options
author | QAston <none@none> | 2009-04-07 20:40:00 +0200 |
---|---|---|
committer | QAston <none@none> | 2009-04-07 20:40:00 +0200 |
commit | 741b51cc471d8a3f897b7ded51e1d3122e3d8300 (patch) | |
tree | 3c579933847679c780be6b672e00d636a32690dd /src/game/Unit.cpp | |
parent | 26b856a5135f51372cb1b15de21a0e995cdb6435 (diff) | |
parent | c6b6a72956efdc10da8fac982db734b054984d08 (diff) |
*Merge
--HG--
branch : trunk
Diffstat (limited to 'src/game/Unit.cpp')
-rw-r--r-- | src/game/Unit.cpp | 74 |
1 files changed, 29 insertions, 45 deletions
diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index ad25d138a19..21a6ec75e7e 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -3216,47 +3216,35 @@ void Unit::_UpdateSpells( uint32 time ) // TODO: Find a better way to prevent crash when multiple auras are removed. for (AuraMap::iterator i = m_Auras.begin(); i != m_Auras.end(); ++i) - if ((*i).second) - (*i).second->SetUpdated(false); - for (AuraMap::iterator i = m_Auras.begin(), next; i != m_Auras.end(); i = next) + i->second->SetUpdated(false); + + for(AuraMap::iterator i = m_Auras.begin(); i != m_Auras.end();) { - next = i; - ++next; - if ((*i).second) + Aura *aur = i->second; + + // prevent double update + if (aur->IsUpdated()) + continue; + aur->SetUpdated(true); + + uint32 removedAuras = m_removedAuras.size(); + aur->Update( time ); + + // several auras can be deleted due to update + if(removedAuras < m_removedAuras.size()) { - // prevent double update - if ((*i).second->IsUpdated()) - continue; - uint32 removedAuras = m_removedAuras.size(); - (*i).second->SetUpdated(true); - (*i).second->Update( time ); - // several auras can be deleted due to update - if (removedAuras < m_removedAuras.size()) - { - if (m_Auras.empty()) break; - next = m_Auras.begin(); - removedAuras = m_removedAuras.size(); - } + i = m_Auras.begin(); } + else + ++i; } - for (AuraMap::iterator i = m_Auras.begin(); i != m_Auras.end();) + for(AuraMap::iterator i = m_Auras.begin(); i != m_Auras.end();) { - if ((*i).second) - { - if ( !(*i).second->GetAuraDuration() && !((*i).second->IsPermanent() || ((*i).second->IsPassive())) ) - { - RemoveAura(i, AURA_REMOVE_BY_EXPIRE); - } - else - { - ++i; - } - } + if(!i->second->GetAuraDuration() && !(i->second->IsPermanent() || (i->second->IsPassive()))) + RemoveAura(i, AURA_REMOVE_BY_EXPIRE); else - { ++i; - } } for (AuraList::iterator i = m_removedAuras.begin(); i != m_removedAuras.end();i = m_removedAuras.begin()) @@ -4165,10 +4153,7 @@ void Unit::RemoveAura(AuraMap::iterator &i, AuraRemoveMode mode) statue->UnSummon(); // only way correctly remove all auras from list - if( m_Auras.empty() ) - i = m_Auras.end(); - else - i = m_Auras.begin(); + i = m_Auras.begin(); } void Unit::RemoveAllAuras() @@ -9555,7 +9540,14 @@ void Unit::CombatStart(Unit* target) if(!target->isInCombat() && target->GetTypeId() != TYPEID_PLAYER && !((Creature*)target)->HasReactState(REACT_PASSIVE) && ((Creature*)target)->IsAIEnabled) + { ((Creature*)target)->AI()->AttackStart(this); + if(((Creature*)target)->GetFormation()) + { + ((Creature*)target)->GetFormation()->MemberAttackStart((Creature*)target, this); + sLog.outDebug("Unit::CombatStart() calls CreatureGroups::MemberHasAttacked(this);"); + } + } SetInCombatWith(target); target->SetInCombatWith(this); @@ -9572,14 +9564,6 @@ void Unit::CombatStart(Unit* target) me->UpdatePvP(true); me->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT); } - - //Call creature group update - if(GetTypeId()==TYPEID_UNIT && ((Creature*)this)->GetFormationID()) - { - CreatureGroupHolderType::iterator itr = CreatureGroupHolder.find(((Creature*)this)->GetFormationID()); - if(itr != CreatureGroupHolder.end()) - itr->second->MemberHasAttacked(((Creature*)this)); - } } void Unit::SetInCombatState(bool PvP) |