aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/game/Spell.cpp24
-rw-r--r--src/game/SpellAuras.h9
-rw-r--r--src/game/Unit.cpp31
-rw-r--r--src/game/Unit.h2
4 files changed, 62 insertions, 4 deletions
diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp
index dbd0a74dc76..1e9a2a7d60e 100644
--- a/src/game/Spell.cpp
+++ b/src/game/Spell.cpp
@@ -1221,10 +1221,28 @@ 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)
+ {
+ Aura * aur = unit->GetAuraByCasterSpell(m_spellInfo->Id, m_caster->GetGUID());
+ _duration = aur ? aur->GetAuraDuration() : -1;
+ }
+ unit->SetAurasDurationByCasterSpell(i->first->Id, m_caster->GetGUID(), _duration);
+ }
+ }
+ }
}
if(m_customAttr & SPELL_ATTR_CU_LINK_HIT)
diff --git a/src/game/SpellAuras.h b/src/game/SpellAuras.h
index be95c5245b7..9d26d1b76dd 100644
--- a/src/game/SpellAuras.h
+++ b/src/game/SpellAuras.h
@@ -228,7 +228,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;
+ }
time_t GetAuraApplyTime() { return m_applyTime; }
void UpdateAuraDuration();
void SendAuraDurationForCaster(Player* caster);
diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp
index 2c2d38f8f19..159ce634a2d 100644
--- a/src/game/Unit.cpp
+++ b/src/game/Unit.cpp
@@ -4497,6 +4497,37 @@ void Unit::RemoveAurasByCasterSpell(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(); )
diff --git a/src/game/Unit.h b/src/game/Unit.h
index f980692ef7b..a5c7c290506 100644
--- a/src/game/Unit.h
+++ b/src/game/Unit.h
@@ -1128,6 +1128,8 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
void RemoveAurasDueToSpell(uint32 spellId, Aura* except = NULL);
void RemoveAurasDueToItemSpell(Item* castItem,uint32 spellId);
void RemoveAurasByCasterSpell(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);