diff options
-rw-r--r-- | src/game/Spell.cpp | 19 | ||||
-rw-r--r-- | src/game/SpellAuras.cpp | 10 | ||||
-rw-r--r-- | src/game/SpellAuras.h | 9 | ||||
-rw-r--r-- | src/game/Unit.cpp | 34 | ||||
-rw-r--r-- | src/game/Unit.h | 3 |
5 files changed, 60 insertions, 15 deletions
diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp index 4ae1e693a55..ea0aaeebd35 100644 --- a/src/game/Spell.cpp +++ b/src/game/Spell.cpp @@ -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) diff --git a/src/game/SpellAuras.cpp b/src/game/SpellAuras.cpp index 66d037ffe41..5f39e3f585c 100644 --- a/src/game/SpellAuras.cpp +++ b/src/game/SpellAuras.cpp @@ -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; diff --git a/src/game/SpellAuras.h b/src/game/SpellAuras.h index 3534fac5c96..086b944ea6d 100644 --- a/src/game/SpellAuras.h +++ b/src/game/SpellAuras.h @@ -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; diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp index 023bbf5df5b..ea9190335ad 100644 --- a/src/game/Unit.cpp +++ b/src/game/Unit.cpp @@ -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; } } diff --git a/src/game/Unit.h b/src/game/Unit.h index 98b30e75d31..74e4028eedd 100644 --- a/src/game/Unit.h +++ b/src/game/Unit.h @@ -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); |