aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/game/Spell.cpp19
-rw-r--r--src/game/SpellAuras.cpp10
-rw-r--r--src/game/SpellAuras.h9
-rw-r--r--src/game/Unit.cpp34
-rw-r--r--src/game/Unit.h3
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);