diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/game/Spell.cpp | 2 | ||||
-rw-r--r-- | src/game/SpellAuras.cpp | 16 | ||||
-rw-r--r-- | src/game/SpellEffects.cpp | 16 | ||||
-rw-r--r-- | src/game/SpellMgr.cpp | 2 | ||||
-rw-r--r-- | src/game/Unit.cpp | 56 | ||||
-rw-r--r-- | src/game/Unit.h | 2 |
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); } |