*Fix blood frenzy remove (and possibly some other SPELL_AURA_ADD_TARGET_TRIGGER auras too).
*Fix some problems with Cut to the Chase. --HG-- branch : trunk
This commit is contained in:
+16
-3
@@ -1183,10 +1183,23 @@ void Spell::DoSpellHitOnUnit(Unit *unit, const uint32 effectMask)
|
||||
if(m_caster->GetTypeId() == TYPEID_UNIT && ((Creature*)m_caster)->IsAIEnabled)
|
||||
((Creature*)m_caster)->AI()->SpellHitTarget(unit, m_spellInfo);
|
||||
|
||||
for(ChanceTriggerSpells::const_iterator i = m_ChanceTriggerSpells.begin(); i != m_ChanceTriggerSpells.end(); ++i)
|
||||
if (m_ChanceTriggerSpells.size())
|
||||
{
|
||||
if(roll_chance_i(i->second))
|
||||
m_caster->CastSpell(unit, i->first, true);
|
||||
int _duration=0;
|
||||
for(ChanceTriggerSpells::const_iterator i = m_ChanceTriggerSpells.begin(); i != m_ChanceTriggerSpells.end(); ++i)
|
||||
{
|
||||
if(roll_chance_i(i->second))
|
||||
{
|
||||
m_caster->CastSpell(unit, i->first, true);
|
||||
// SPELL_AURA_ADD_TARGET_TRIGGER auras shouldn't trigger auras without duration
|
||||
// set duration equal to triggering spell
|
||||
if (GetSpellDuration(i->first)==-1)
|
||||
// get duration from aura-only once
|
||||
if (!_duration)
|
||||
_duration = unit->GetAuraByCasterSpell(m_spellInfo->Id, m_caster->GetGUID())->GetAuraDuration();
|
||||
unit->SetAurasDurationByCasterSpell(i->first->Id, m_caster->GetGUID(), _duration);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(m_customAttr & SPELL_ATTR_CU_LINK_HIT)
|
||||
|
||||
@@ -584,7 +584,7 @@ void Aura::Update(uint32 diff)
|
||||
else
|
||||
m_target->RemoveAurasByCasterSpell(GetId(),GetCasterGUID());
|
||||
}
|
||||
else if (caster->GetPower(powertype)>manaPerSecond)
|
||||
else if (caster->GetPower(powertype)>=manaPerSecond)
|
||||
caster->ModifyPower(powertype,-manaPerSecond);
|
||||
else
|
||||
m_target->RemoveAurasByCasterSpell(GetId(),GetCasterGUID());
|
||||
@@ -5424,14 +5424,6 @@ void Aura::HandleSpiritOfRedemption( bool apply, bool Real )
|
||||
|
||||
void Aura::CleanupTriggeredSpells()
|
||||
{
|
||||
if (m_spellProto->SpellFamilyName == SPELLFAMILY_WARRIOR && m_spellProto->SpellFamilyFlags[1] & 0x00000010 || m_spellProto->SpellFamilyFlags[0] & 0x00000020)
|
||||
{
|
||||
// Blood Frenzy remove
|
||||
m_target->RemoveAurasDueToSpell(30069);
|
||||
m_target->RemoveAurasDueToSpell(30070);
|
||||
return;
|
||||
}
|
||||
|
||||
uint32 tSpellId = m_spellProto->EffectTriggerSpell[GetEffIndex()];
|
||||
if(!tSpellId)
|
||||
return;
|
||||
|
||||
@@ -230,7 +230,14 @@ class TRINITY_DLL_SPEC Aura
|
||||
int32 GetAuraMaxDuration() const { return m_maxduration; }
|
||||
void SetAuraMaxDuration(int32 duration) { m_maxduration = duration; }
|
||||
int32 GetAuraDuration() const { return m_duration; }
|
||||
void SetAuraDuration(int32 duration) { m_duration = duration; }
|
||||
void SetAuraDuration(int32 duration)
|
||||
{
|
||||
m_duration = duration;
|
||||
if (duration<0)
|
||||
m_permanent=true;
|
||||
else
|
||||
m_permanent=false;
|
||||
}
|
||||
void SetAuraDurationAndUpdate(int32 duration)
|
||||
{
|
||||
m_duration = duration;
|
||||
|
||||
+32
-2
@@ -4151,6 +4151,37 @@ void Unit::RefreshAurasByCasterSpell(uint32 spellId, uint64 casterGUID)
|
||||
}
|
||||
}
|
||||
|
||||
void Unit::SetAurasDurationByCasterSpell(uint32 spellId, uint64 casterGUID, int32 duration)
|
||||
{
|
||||
for(uint8 i = 0; i < 3; ++i)
|
||||
{
|
||||
spellEffectPair spair = spellEffectPair(spellId, i);
|
||||
for(AuraMap::const_iterator itr = GetAuras().lower_bound(spair); itr != GetAuras().upper_bound(spair); ++itr)
|
||||
{
|
||||
if(itr->second->GetCasterGUID()==casterGUID)
|
||||
{
|
||||
itr->second->SetAuraDuration(duration);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Aura* Unit::GetAuraByCasterSpell(uint32 spellId, uint64 casterGUID)
|
||||
{
|
||||
// Returns first found aura from spell-use only in cases where effindex of spell doesn't matter!
|
||||
for(uint8 i = 0; i < 3; ++i)
|
||||
{
|
||||
spellEffectPair spair = spellEffectPair(spellId, i);
|
||||
for(AuraMap::const_iterator itr = GetAuras().lower_bound(spair); itr != GetAuras().upper_bound(spair); ++itr)
|
||||
{
|
||||
if(itr->second->GetCasterGUID()==casterGUID)
|
||||
return itr->second;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void Unit::RemoveAurasDueToSpellByDispel(uint32 spellId, uint64 casterGUID, Unit *dispeler)
|
||||
{
|
||||
for (AuraMap::iterator iter = m_Auras.begin(); iter != m_Auras.end(); )
|
||||
@@ -5996,8 +6027,7 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
|
||||
if( spellProto->SpellFamilyName == SPELLFAMILY_ROGUE &&
|
||||
spellProto->SpellFamilyFlags[0] & 0x40000)
|
||||
{
|
||||
(*itr)->SetAuraMaxDuration(GetSpellMaxDuration(spellProto));
|
||||
(*itr)->RefreshAura();
|
||||
RefreshAurasByCasterSpell(spellProto->Id, GetGUID());
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1247,6 +1247,9 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
|
||||
void RemoveAurasByCasterSpell(uint32 spellId, uint64 casterGUID, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT);
|
||||
void RemoveAurasByCasterSpell(uint32 spellId, uint8 effindex, uint64 casterGUID, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT);
|
||||
void RefreshAurasByCasterSpell(uint32 spellId, uint64 casterGUID);
|
||||
void SetAurasDurationByCasterSpell(uint32 spellId, uint64 casterGUID, int32 duration);
|
||||
Aura* GetAuraByCasterSpell(uint32 spellId, uint64 casterGUID);
|
||||
|
||||
void RemoveAurasDueToSpellByDispel(uint32 spellId, uint64 casterGUID, Unit *dispeler);
|
||||
void RemoveAurasDueToSpellBySteal(uint32 spellId, uint64 casterGUID, Unit *stealer);
|
||||
void RemoveAurasDueToSpellByCancel(uint32 spellId);
|
||||
|
||||
Reference in New Issue
Block a user