aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/game/Spell.cpp2
-rw-r--r--src/game/SpellAuras.cpp16
-rw-r--r--src/game/SpellEffects.cpp16
-rw-r--r--src/game/SpellMgr.cpp2
-rw-r--r--src/game/Unit.cpp56
-rw-r--r--src/game/Unit.h2
6 files changed, 61 insertions, 33 deletions
diff --git a/src/game/Spell.cpp b/src/game/Spell.cpp
index e4d57801161..b753b957fda 100644
--- a/src/game/Spell.cpp
+++ b/src/game/Spell.cpp
@@ -2289,7 +2289,7 @@ void Spell::handle_immediate()
if (duration)
{
//apply haste mods
- m_caster->ModSpellCastTime(m_spellInfo, duration);
+ m_caster->ModSpellCastTime(m_spellInfo, duration, this);
// Apply duration mod
if(Player* modOwner = m_caster->GetSpellModOwner())
modOwner->ApplySpellMod(m_spellInfo->Id, SPELLMOD_DURATION, duration);
diff --git a/src/game/SpellAuras.cpp b/src/game/SpellAuras.cpp
index 219fa7dcb47..3dcf984086e 100644
--- a/src/game/SpellAuras.cpp
+++ b/src/game/SpellAuras.cpp
@@ -5698,14 +5698,14 @@ void Aura::PeriodicTick()
int32 drain_amount = m_target->GetPower(power) > pdamage ? pdamage : m_target->GetPower(power);
//Viper sting and Drain Life take mana % amount from target, but not bigger than amount*2 of caster mana
- if ((m_spellProto->SpellFamilyName==SPELLFAMILY_WARLOCK && m_spellProto->SpellFamilyFlags[0]&0x10)
- || (m_spellProto->SpellFamilyName==SPELLFAMILY_HUNTER && m_spellProto->SpellFamilyFlags[1]&0x80))
- {
- uint32 drain = m_target->GetMaxPower(power) * drain_amount /100;
- if(drain > pCaster->GetMaxPower(power) * drain_amount / 50)
- drain_amount = pCaster->GetMaxPower(power) * drain_amount / 50;
- else
- drain_amount = drain;
+ if ((m_spellProto->SpellFamilyName==SPELLFAMILY_WARLOCK && m_spellProto->SpellFamilyFlags[0]&0x10)
+ || (m_spellProto->SpellFamilyName==SPELLFAMILY_HUNTER && m_spellProto->SpellFamilyFlags[1]&0x80))
+ {
+ uint32 drain = m_target->GetMaxPower(power) * drain_amount /100;
+ if(drain > pCaster->GetMaxPower(power) * drain_amount / 50)
+ drain_amount = pCaster->GetMaxPower(power) * drain_amount / 50;
+ else
+ drain_amount = drain;
}
// resilience reduce mana draining effect at spell crit damage reduction (added in 2.4)
diff --git a/src/game/SpellEffects.cpp b/src/game/SpellEffects.cpp
index 967b3407326..4792848f48f 100644
--- a/src/game/SpellEffects.cpp
+++ b/src/game/SpellEffects.cpp
@@ -2264,7 +2264,7 @@ void Spell::EffectApplyAura(uint32 i)
//mod duration of channeled aura by spell haste
if (IsChanneledSpell(m_spellInfo))
- caster->ModSpellCastTime(m_spellInfo, duration);
+ caster->ModSpellCastTime(m_spellInfo, duration, this);
// if Aura removed and deleted, do not continue.
if(duration== 0 && !(Aur->IsPermanent()))
@@ -4766,13 +4766,13 @@ void Spell::EffectScriptEffect(uint32 effIndex)
unitTarget->HandleEmoteCommand(EMOTE_STATE_DANCE);
break;
}
- // Escape artist
- case 20589:
- {
- if(!unitTarget)
- return;
- // It is said that removing effects by script should include dispel resist mods
- unitTarget->RemoveSpellsCausingAuraWithDispel(SPELL_AURA_MOD_ROOT, this);
+ // Escape artist
+ case 20589:
+ {
+ if(!unitTarget)
+ return;
+ // It is said that removing effects by script should include dispel resist mods
+ unitTarget->RemoveSpellsCausingAuraWithDispel(SPELL_AURA_MOD_ROOT, this);
unitTarget->RemoveSpellsCausingAuraWithDispel(SPELL_AURA_MOD_DECREASE_SPEED, this);
}
// Mirren's Drinking Hat
diff --git a/src/game/SpellMgr.cpp b/src/game/SpellMgr.cpp
index 8a0eb06ab11..dd4edcb7087 100644
--- a/src/game/SpellMgr.cpp
+++ b/src/game/SpellMgr.cpp
@@ -245,7 +245,7 @@ uint32 GetSpellCastTime(SpellEntry const* spellInfo, Spell const* spell)
int32 castTime = spellCastTimeEntry->CastTime;
if (spell && spell->GetCaster())
- spell->GetCaster()->ModSpellCastTime(spellInfo, castTime);
+ spell->GetCaster()->ModSpellCastTime(spellInfo, castTime, spell);
if (spellInfo->Attributes & SPELL_ATTR_RANGED && (!spell || !(spell->IsAutoRepeat())))
castTime += 500;
diff --git a/src/game/Unit.cpp b/src/game/Unit.cpp
index d0bd170b931..8875c3301a7 100644
--- a/src/game/Unit.cpp
+++ b/src/game/Unit.cpp
@@ -487,7 +487,7 @@ void Unit::RemoveSpellsCausingAuraWithDispel(AuraType auraType, Spell * spell)
if (*iter)
{
- if (!(*iter)->GetDispelChance(spell))
+ if (!(*iter)->GetDispelChance( spell))
continue;
RemoveAurasDueToSpell((*iter)->GetId());
if (!m_modAuras[auraType].empty())
@@ -4197,7 +4197,7 @@ void Unit::RemoveAura(AuraMap::iterator &i, AuraRemoveMode mode)
&& AurSpellInfo->EffectApplyAuraName[Aur->GetEffIndex()]!= SPELL_AURA_DUMMY)
//don't stop channeling of scripted spells (this is actually a hack)
{
- caster->InterruptSpell(CURRENT_CHANNELED_SPELL);
+ caster->m_currentSpells[CURRENT_CHANNELED_SPELL]->cancel();
}
}
}
@@ -5485,14 +5485,14 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
triggered_spell_id = 56160;
break;
}
- // Glyph of Dispel Magic
- case 55677:
- {
- if(!target->IsFriendlyTo(this))
- return false;
-
- basepoints0 = int32(target->GetMaxHealth() * triggerAmount / 100);
- triggered_spell_id = 56131;
+ // Glyph of Dispel Magic
+ case 55677:
+ {
+ if(!target->IsFriendlyTo(this))
+ return false;
+
+ basepoints0 = int32(target->GetMaxHealth() * triggerAmount / 100);
+ triggered_spell_id = 56131;
break;
}
// Oracle Healing Bonus ("Garments of the Oracle" set)
@@ -6330,6 +6330,35 @@ bool Unit::HandleDummyAuraProc(Unit *pVictim, uint32 damage, Aura* triggeredByAu
}
break;
}
+ case SPELLFAMILY_POTION:
+ {
+ sLog.outError("It Procs!");
+ if (dummySpell->Id == 17619)
+ {
+ if (procSpell->Category==4) //potion category
+ {
+ for (uint8 i=0;i<3;i++)
+ {
+ if (procSpell->Effect[i]==SPELL_EFFECT_HEAL)
+ {
+ basepoints0 = damage * 0.4f;
+ triggered_spell_id = 21399;
+ }
+ else if (procSpell->Effect[i]==SPELL_EFFECT_ENERGIZE)
+ {
+ basepoints0 = CalculateSpellDamage(procSpell,i,procSpell->EffectBasePoints[i],this) * 0.4f;
+ triggered_spell_id = 21400;
+ }
+ else continue;
+
+ CastCustomSpell(this,triggered_spell_id,&basepoints0,NULL,NULL,true,castItem,triggeredByAura);
+ }
+ if (triggered_spell_id)
+ return true;
+ return false;
+ }
+ }
+ }
default:
break;
}
@@ -10272,13 +10301,13 @@ int32 Unit::ModSpellDuration(SpellEntry const* spellProto, uint8 effect_index, U
return duration>0 ? duration : 0;
}
-void Unit::ModSpellCastTime(SpellEntry const* spellProto, int32 & castTime)
+void Unit::ModSpellCastTime(SpellEntry const* spellProto, int32 & castTime, Spell const * spell)
{
if (!spellProto || castTime<0)
return;
//called from caster
if(Player* modOwner = GetSpellModOwner())
- modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_CASTING_TIME, castTime);
+ modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_CASTING_TIME, castTime, spell);
if( !(spellProto->Attributes & (SPELL_ATTR_UNK4|SPELL_ATTR_UNK5)) )
castTime = int32( float(castTime) * GetFloatValue(UNIT_MOD_CAST_SPEED));
@@ -11244,12 +11273,11 @@ void Unit::ProcDamageAndSpellFor( bool isVictim, Unit * pTarget, uint32 procFlag
continue;
procTriggered.push_back( ProcTriggeredData(spellProcEvent, itr->second) );
- }
+ }
// Nothing found
if (procTriggered.empty())
return;
-
// Handle effects proceed this time
for(ProcTriggeredList::iterator i = procTriggered.begin(); i != procTriggered.end(); ++i)
{
diff --git a/src/game/Unit.h b/src/game/Unit.h
index 449df62109e..8d08f793eac 100644
--- a/src/game/Unit.h
+++ b/src/game/Unit.h
@@ -1477,7 +1477,7 @@ class TRINITY_DLL_SPEC Unit : public WorldObject
int32 CalculateSpellDamage(SpellEntry const* spellProto, uint8 effect_index, int32 basePoints, Unit const* target);
int32 CalcSpellDuration(SpellEntry const* spellProto);
int32 ModSpellDuration(SpellEntry const* spellProto, uint8 effect_index, Unit const* target, int32 duration);
- void ModSpellCastTime(SpellEntry const* spellProto, int32 & castTime);
+ void ModSpellCastTime(SpellEntry const* spellProto, int32 & castTime, Spell const * spell=NULL);
float CalculateLevelPenalty(SpellEntry const* spellProto) const;
void addFollower(FollowerReference* pRef) { m_FollowingRefManager.insertFirst(pRef); }