diff options
Diffstat (limited to 'src/server/game/Spells/SpellEffects.cpp')
-rwxr-xr-x | src/server/game/Spells/SpellEffects.cpp | 982 |
1 files changed, 656 insertions, 326 deletions
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index c8e3c195e32..0637c25e3ab 100755 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -206,14 +206,14 @@ pEffect SpellEffects[TOTAL_SPELL_EFFECTS]= &Spell::EffectLeapBack, //138 SPELL_EFFECT_LEAP_BACK Leap back &Spell::EffectQuestClear, //139 SPELL_EFFECT_CLEAR_QUEST Reset quest status (miscValue - quest ID) &Spell::EffectForceCast, //140 SPELL_EFFECT_FORCE_CAST - &Spell::EffectForceCastWithValue, //141 SPELL_EFFECT_FORCE_CAST_WITH_VALUE - &Spell::EffectTriggerSpellWithValue, //142 SPELL_EFFECT_TRIGGER_SPELL_WITH_VALUE + &Spell::EffectForceCast, //141 SPELL_EFFECT_FORCE_CAST_WITH_VALUE + &Spell::EffectTriggerSpell, //142 SPELL_EFFECT_TRIGGER_SPELL_WITH_VALUE &Spell::EffectApplyAreaAura, //143 SPELL_EFFECT_APPLY_AREA_AURA_OWNER &Spell::EffectKnockBack, //144 SPELL_EFFECT_KNOCK_BACK_DEST &Spell::EffectPullTowards, //145 SPELL_EFFECT_PULL_TOWARDS_DEST Black Hole Effect &Spell::EffectActivateRune, //146 SPELL_EFFECT_ACTIVATE_RUNE &Spell::EffectQuestFail, //147 SPELL_EFFECT_QUEST_FAIL quest fail - &Spell::EffectUnused, //148 SPELL_EFFECT_148 1 spell - 43509 + &Spell::EffectTriggerMissileSpell, //148 SPELL_EFFECT_TRIGGER_MISSILE_SPELL_WITH_VALUE &Spell::EffectChargeDest, //149 SPELL_EFFECT_CHARGE_DEST &Spell::EffectQuestStart, //150 SPELL_EFFECT_QUEST_START &Spell::EffectTriggerRitualOfSummoning, //151 SPELL_EFFECT_TRIGGER_SPELL_2 @@ -244,6 +244,9 @@ void Spell::EffectUnused(SpellEffIndex /*effIndex*/) void Spell::EffectResurrectNew(SpellEffIndex effIndex) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (!unitTarget || unitTarget->isAlive()) return; @@ -267,6 +270,9 @@ void Spell::EffectResurrectNew(SpellEffIndex effIndex) void Spell::EffectInstaKill(SpellEffIndex /*effIndex*/) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (!unitTarget || !unitTarget->isAlive()) return; @@ -284,6 +290,9 @@ void Spell::EffectInstaKill(SpellEffIndex /*effIndex*/) void Spell::EffectEnvironmentalDMG(SpellEffIndex /*effIndex*/) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (!unitTarget || !unitTarget->isAlive()) return; @@ -297,12 +306,11 @@ void Spell::EffectEnvironmentalDMG(SpellEffIndex /*effIndex*/) unitTarget->ToPlayer()->EnvironmentalDamage(DAMAGE_FIRE, damage); } -void Spell::EffectSchoolDMG(SpellEffIndex /*effIndex*/) +void Spell::EffectSchoolDMG(SpellEffIndex effIndex) { -} + if (effectHandleMode == SPELL_EFFECT_HANDLE_LAUNCH_TARGET) + return; -void Spell::SpellDamageSchoolDmg(SpellEffIndex effIndex) -{ bool apply_direct_bonus = true; if (unitTarget && unitTarget->isAlive()) @@ -744,6 +752,9 @@ void Spell::SpellDamageSchoolDmg(SpellEffIndex effIndex) void Spell::EffectDummy(SpellEffIndex effIndex) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (!unitTarget && !gameObjTarget && !itemTarget) return; @@ -1540,44 +1551,230 @@ void Spell::EffectDummy(SpellEffIndex effIndex) sScriptMgr->OnDummyEffect(m_caster, m_spellInfo->Id, effIndex, itemTarget); } -void Spell::EffectTriggerSpellWithValue(SpellEffIndex effIndex) +void Spell::EffectTriggerSpell(SpellEffIndex effIndex) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_LAUNCH_TARGET + && effectHandleMode != SPELL_EFFECT_HANDLE_LAUNCH) + return; + uint32 triggered_spell_id = m_spellInfo->Effects[effIndex].TriggerSpell; + // todo: move those to spell scripts + if (m_spellInfo->Effects[effIndex].Effect == SPELL_EFFECT_TRIGGER_SPELL + && effectHandleMode == SPELL_EFFECT_HANDLE_LAUNCH_TARGET) + { + // special cases + switch(triggered_spell_id) + { + // Mirror Image + case 58832: + { + // Glyph of Mirror Image + if (m_caster->HasAura(63093)) + m_caster->CastSpell(m_caster, 65047, true); // Mirror Image + + break; + } + // Vanish (not exist) + case 18461: + { + unitTarget->RemoveMovementImpairingAuras(); + unitTarget->RemoveAurasByType(SPELL_AURA_MOD_STALKED); + + // If this spell is given to an NPC, it must handle the rest using its own AI + if (unitTarget->GetTypeId() != TYPEID_PLAYER) + return; + + // See if we already are stealthed. If so, we're done. + if (unitTarget->HasAura(1784)) + return; + + // Reset cooldown on stealth if needed + if (unitTarget->ToPlayer()->HasSpellCooldown(1784)) + unitTarget->ToPlayer()->RemoveSpellCooldown(1784); + + triggered_spell_id = 1784; + break; + } + // Demonic Empowerment -- succubus + case 54437: + { + unitTarget->RemoveMovementImpairingAuras(); + unitTarget->RemoveAurasByType(SPELL_AURA_MOD_STALKED); + unitTarget->RemoveAurasByType(SPELL_AURA_MOD_STUN); + + // Cast Lesser Invisibility + triggered_spell_id = 7870; + break; + } + // just skip + case 23770: // Sayge's Dark Fortune of * + // not exist, common cooldown can be implemented in scripts if need. + return; + // Brittle Armor - (need add max stack of 24575 Brittle Armor) + case 29284: + { + // Brittle Armor + SpellInfo const* spell = sSpellMgr->GetSpellInfo(24575); + if (!spell) + return; + + for (uint32 j = 0; j < spell->StackAmount; ++j) + m_caster->CastSpell(unitTarget, spell->Id, true); + return; + } + // Mercurial Shield - (need add max stack of 26464 Mercurial Shield) + case 29286: + { + // Mercurial Shield + SpellInfo const* spell = sSpellMgr->GetSpellInfo(26464); + if (!spell) + return; + + for (uint32 j = 0; j < spell->StackAmount; ++j) + m_caster->CastSpell(unitTarget, spell->Id, true); + return; + } + // Righteous Defense + case 31980: + { + m_caster->CastSpell(unitTarget, 31790, true); + return; + } + // Cloak of Shadows + case 35729: + { + uint32 dispelMask = SpellInfo::GetDispelMask(DISPEL_ALL); + Unit::AuraApplicationMap& Auras = unitTarget->GetAppliedAuras(); + for (Unit::AuraApplicationMap::iterator iter = Auras.begin(); iter != Auras.end();) + { + // remove all harmful spells on you... + SpellInfo const* spell = iter->second->GetBase()->GetSpellInfo(); + if ((spell->DmgClass == SPELL_DAMAGE_CLASS_MAGIC // only affect magic spells + || ((spell->GetDispelMask()) & dispelMask)) + // ignore positive and passive auras + && !iter->second->IsPositive() && !iter->second->GetBase()->IsPassive()) + { + m_caster->RemoveAura(iter); + } + else + ++iter; + } + return; + } + // Priest Shadowfiend (34433) need apply mana gain trigger aura on pet + case 41967: + { + if (Unit* pet = unitTarget->GetGuardianPet()) + pet->CastSpell(pet, 28305, true); + return; + } + } + } + // normal case SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(triggered_spell_id); - if (!spellInfo) { - sLog->outError("EffectTriggerSpellWithValue of spell %u: triggering unknown spell id %i", m_spellInfo->Id, triggered_spell_id); + sLog->outDebug(LOG_FILTER_SPELLS_AURAS, "Spell::EffectTriggerSpell spell %u tried to trigger unknown spell %u", m_spellInfo->Id, triggered_spell_id); return; } - int32 bp = damage; + SpellCastTargets targets; + if (effectHandleMode == SPELL_EFFECT_HANDLE_LAUNCH_TARGET) + { + if (!spellInfo->NeedsToBeTriggeredByCaster()) + return; + targets.SetUnitTarget(unitTarget); + } + else //if (effectHandleMode == SPELL_EFFECT_HANDLE_LAUNCH) + { + if (spellInfo->NeedsToBeTriggeredByCaster() && !(m_spellInfo->Effects[effIndex].GetProvidedTargetMask() & TARGET_FLAG_UNIT_MASK)) + return; + + if (spellInfo->GetExplicitTargetMask() & TARGET_FLAG_DEST_LOCATION) + targets.SetDst(m_targets); - Unit* caster = spellInfo->NeedsToBeTriggeredByCaster() ? m_caster : unitTarget; + targets.SetUnitTarget(m_caster); + } + + CustomSpellValues values; + // set basepoints for trigger with value effect + if (m_spellInfo->Effects[effIndex].Effect == SPELL_EFFECT_TRIGGER_SPELL_WITH_VALUE) + { + // maybe need to set value only when basepoints == 0? + values.AddSpellMod(SPELLVALUE_BASE_POINT0, damage); + values.AddSpellMod(SPELLVALUE_BASE_POINT1, damage); + values.AddSpellMod(SPELLVALUE_BASE_POINT2, damage); + } - caster->CastCustomSpell(unitTarget, triggered_spell_id, &bp, &bp, &bp, true); + // Remove spell cooldown (not category) if spell triggering spell with cooldown and same category + if (m_caster->GetTypeId() == TYPEID_PLAYER && m_spellInfo->CategoryRecoveryTime && spellInfo->CategoryRecoveryTime + && m_spellInfo->Category == spellInfo->Category) + m_caster->ToPlayer()->RemoveSpellCooldown(spellInfo->Id); + + // original caster guid only for GO cast + m_caster->CastSpell(targets, spellInfo, &values, TRIGGERED_FULL_MASK, NULL, NULL, m_originalCasterGUID); } -void Spell::EffectTriggerRitualOfSummoning(SpellEffIndex effIndex) +void Spell::EffectTriggerMissileSpell(SpellEffIndex effIndex) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET + && effectHandleMode != SPELL_EFFECT_HANDLE_HIT) + return; + uint32 triggered_spell_id = m_spellInfo->Effects[effIndex].TriggerSpell; - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(triggered_spell_id); + // normal case + SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(triggered_spell_id); if (!spellInfo) { - sLog->outError("EffectTriggerRitualOfSummoning of spell %u: triggering unknown spell id %i", m_spellInfo->Id, triggered_spell_id); + sLog->outDebug(LOG_FILTER_SPELLS_AURAS, "Spell::EffectTriggerSpell spell %u tried to trigger unknown spell %u", m_spellInfo->Id, triggered_spell_id); return; } - finish(); + SpellCastTargets targets; + if (effectHandleMode == SPELL_EFFECT_HANDLE_HIT_TARGET) + { + if (!spellInfo->NeedsToBeTriggeredByCaster()) + return; + targets.SetUnitTarget(unitTarget); + } + else //if (effectHandleMode == SPELL_EFFECT_HANDLE_HIT) + { + if (spellInfo->NeedsToBeTriggeredByCaster() && !(m_spellInfo->Effects[effIndex].GetProvidedTargetMask() & TARGET_FLAG_UNIT_MASK)) + return; + + if (spellInfo->GetExplicitTargetMask() & TARGET_FLAG_DEST_LOCATION) + targets.SetDst(m_targets); + + targets.SetUnitTarget(m_caster); + } - m_caster->CastSpell(unitTarget, spellInfo, false); + CustomSpellValues values; + // set basepoints for trigger with value effect + if (m_spellInfo->Effects[effIndex].Effect == SPELL_EFFECT_TRIGGER_MISSILE_SPELL_WITH_VALUE) + { + // maybe need to set value only when basepoints == 0? + values.AddSpellMod(SPELLVALUE_BASE_POINT0, damage); + values.AddSpellMod(SPELLVALUE_BASE_POINT1, damage); + values.AddSpellMod(SPELLVALUE_BASE_POINT2, damage); + } + + // Remove spell cooldown (not category) if spell triggering spell with cooldown and same category + if (m_caster->GetTypeId() == TYPEID_PLAYER && m_spellInfo->CategoryRecoveryTime && spellInfo->CategoryRecoveryTime + && m_spellInfo->Category == spellInfo->Category) + m_caster->ToPlayer()->RemoveSpellCooldown(spellInfo->Id); + + // original caster guid only for GO cast + m_caster->CastSpell(targets, spellInfo, &values, TRIGGERED_FULL_MASK, NULL, NULL, m_originalCasterGUID); } void Spell::EffectForceCast(SpellEffIndex effIndex) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (!unitTarget) return; @@ -1588,11 +1785,11 @@ void Spell::EffectForceCast(SpellEffIndex effIndex) if (!spellInfo) { - sLog->outError("EffectForceCast of spell %u: triggering unknown spell id %i", m_spellInfo->Id, triggered_spell_id); + sLog->outError("Spell::EffectForceCast of spell %u: triggering unknown spell id %i", m_spellInfo->Id, triggered_spell_id); return; } - if (damage) + if (m_spellInfo->Effects[effIndex].Effect == SPELL_EFFECT_FORCE_CAST && damage) { switch (m_spellInfo->Id) { @@ -1610,224 +1807,55 @@ void Spell::EffectForceCast(SpellEffIndex effIndex) break; } } - unitTarget->CastSpell(m_caster, spellInfo, true); -} - -void Spell::EffectForceCastWithValue(SpellEffIndex effIndex) -{ - if (!unitTarget) - return; - - uint32 triggered_spell_id = m_spellInfo->Effects[effIndex].TriggerSpell; - - // normal case - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(triggered_spell_id); - if (!spellInfo) + CustomSpellValues values; + // set basepoints for trigger with value effect + if (m_spellInfo->Effects[effIndex].Effect == SPELL_EFFECT_FORCE_CAST_WITH_VALUE) { - sLog->outError("EffectForceCastWithValue of spell %u: triggering unknown spell id %i", m_spellInfo->Id, triggered_spell_id); - return; + // maybe need to set value only when basepoints == 0? + values.AddSpellMod(SPELLVALUE_BASE_POINT0, damage); + values.AddSpellMod(SPELLVALUE_BASE_POINT1, damage); + values.AddSpellMod(SPELLVALUE_BASE_POINT2, damage); } - int32 bp = damage; - unitTarget->CastCustomSpell(m_caster, spellInfo->Id, &bp, &bp, &bp, true); + SpellCastTargets targets; + targets.SetUnitTarget(m_caster); + + unitTarget->CastSpell(targets, spellInfo, &values, TRIGGERED_FULL_MASK); } -void Spell::EffectTriggerSpell(SpellEffIndex effIndex) +void Spell::EffectTriggerRitualOfSummoning(SpellEffIndex effIndex) { - // only unit case known - if (!unitTarget) - { - if (gameObjTarget || itemTarget) - sLog->outError("Spell::EffectTriggerSpell (Spell: %u): Unsupported non-unit case!", m_spellInfo->Id); + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) return; - } uint32 triggered_spell_id = m_spellInfo->Effects[effIndex].TriggerSpell; - Unit* originalCaster = NULL; - - // special cases - switch(triggered_spell_id) - { - // Mirror Image - case 58832: - { - // Glyph of Mirror Image - if (m_caster->HasAura(63093)) - m_caster->CastSpell(m_caster, 65047, true); // Mirror Image - - break; - } - // Vanish (not exist) - case 18461: - { - unitTarget->RemoveMovementImpairingAuras(); - unitTarget->RemoveAurasByType(SPELL_AURA_MOD_STALKED); - - // If this spell is given to an NPC, it must handle the rest using its own AI - if (unitTarget->GetTypeId() != TYPEID_PLAYER) - return; - - // See if we already are stealthed. If so, we're done. - if (unitTarget->HasAura(1784)) - return; - - // Reset cooldown on stealth if needed - if (unitTarget->ToPlayer()->HasSpellCooldown(1784)) - unitTarget->ToPlayer()->RemoveSpellCooldown(1784); - - triggered_spell_id = 1784; - break; - } - // Demonic Empowerment -- succubus - case 54437: - { - unitTarget->RemoveMovementImpairingAuras(); - unitTarget->RemoveAurasByType(SPELL_AURA_MOD_STALKED); - unitTarget->RemoveAurasByType(SPELL_AURA_MOD_STUN); - - // Cast Lesser Invisibility - triggered_spell_id = 7870; - break; - } - // just skip - case 23770: // Sayge's Dark Fortune of * - // not exist, common cooldown can be implemented in scripts if need. - return; - // Brittle Armor - (need add max stack of 24575 Brittle Armor) - case 29284: - { - // Brittle Armor - SpellInfo const* spell = sSpellMgr->GetSpellInfo(24575); - if (!spell) - return; - - for (uint32 j = 0; j < spell->StackAmount; ++j) - m_caster->CastSpell(unitTarget, spell->Id, true); - return; - } - // Mercurial Shield - (need add max stack of 26464 Mercurial Shield) - case 29286: - { - // Mercurial Shield - SpellInfo const* spell = sSpellMgr->GetSpellInfo(26464); - if (!spell) - return; - - for (uint32 j = 0; j < spell->StackAmount; ++j) - m_caster->CastSpell(unitTarget, spell->Id, true); - return; - } - // Righteous Defense - case 31980: - { - m_caster->CastSpell(unitTarget, 31790, true); - return; - } - // Cloak of Shadows - case 35729: - { - uint32 dispelMask = SpellInfo::GetDispelMask(DISPEL_ALL); - Unit::AuraApplicationMap& Auras = unitTarget->GetAppliedAuras(); - for (Unit::AuraApplicationMap::iterator iter = Auras.begin(); iter != Auras.end();) - { - // remove all harmful spells on you... - SpellInfo const* spell = iter->second->GetBase()->GetSpellInfo(); - if ((spell->DmgClass == SPELL_DAMAGE_CLASS_MAGIC // only affect magic spells - || ((spell->GetDispelMask()) & dispelMask)) - // ignore positive and passive auras - && !iter->second->IsPositive() && !iter->second->GetBase()->IsPassive()) - { - m_caster->RemoveAura(iter); - } - else - ++iter; - } - return; - } - // Priest Shadowfiend (34433) need apply mana gain trigger aura on pet - case 41967: - { - if (Unit* pet = unitTarget->GetGuardianPet()) - pet->CastSpell(pet, 28305, true); - return; - } - // Empower Rune Weapon - case 53258: - return; // skip, hack-added in spell effect - // Snake Trap - case 57879: - originalCaster = m_originalCaster; - break; - // Coldflame - case 33801: - return; // just make the core stfu - } - - // normal case - SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(triggered_spell_id); - if (!spellInfo) - { - sLog->outError("EffectTriggerSpell of spell %u: triggering unknown spell id %i", m_spellInfo->Id, triggered_spell_id); - return; - } - - // Remove spell cooldown (not category) if spell triggering spell with cooldown and same category - // Needed by freezing arrow and few other spells - if (m_caster->GetTypeId() == TYPEID_PLAYER && m_spellInfo->CategoryRecoveryTime && spellInfo->CategoryRecoveryTime - && m_spellInfo->Category == spellInfo->Category) - m_caster->ToPlayer()->RemoveSpellCooldown(spellInfo->Id); - - // Note: not exist spells with weapon req. and IsSpellHaveCasterSourceTargets == true - // so this just for speedup places in else - Unit* caster = spellInfo->NeedsToBeTriggeredByCaster() ? m_caster : unitTarget; - - caster->CastSpell(unitTarget, spellInfo, true, 0, 0, (originalCaster ? originalCaster->GetGUID() : 0)); -} - -void Spell::EffectTriggerMissileSpell(SpellEffIndex effIndex) -{ - uint32 triggered_spell_id = m_spellInfo->Effects[effIndex].TriggerSpell; - - // normal case SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(triggered_spell_id); if (!spellInfo) { - sLog->outError("EffectTriggerMissileSpell of spell %u (eff: %u): triggering unknown spell id %u", - m_spellInfo->Id, effIndex, triggered_spell_id); + sLog->outError("EffectTriggerRitualOfSummoning of spell %u: triggering unknown spell id %i", m_spellInfo->Id, triggered_spell_id); return; } - if (m_CastItem) - sLog->outStaticDebug("WORLD: cast Item spellId - %i", spellInfo->Id); - - // Remove spell cooldown (not category) if spell triggering spell with cooldown and same category - // Needed by freezing arrow and few other spells - if (m_caster->GetTypeId() == TYPEID_PLAYER && m_spellInfo->CategoryRecoveryTime && spellInfo->CategoryRecoveryTime - && m_spellInfo->Category == spellInfo->Category) - m_caster->ToPlayer()->RemoveSpellCooldown(spellInfo->Id); + finish(); - float x, y, z; - m_targets.GetDst()->GetPosition(x, y, z); - m_caster->CastSpell(x, y, z, spellInfo->Id, true, m_CastItem, 0, m_originalCasterGUID); + m_caster->CastSpell((Unit*)NULL, spellInfo, false); } void Spell::EffectJump(SpellEffIndex effIndex) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_LAUNCH_TARGET) + return; + if (m_caster->isInFlight()) return; - float x, y, z; - if (m_targets.GetUnitTarget()) - m_targets.GetUnitTarget()->GetContactPoint(m_caster, x, y, z, CONTACT_DISTANCE); - else if (m_targets.GetGOTarget()) - m_targets.GetGOTarget()->GetContactPoint(m_caster, x, y, z, CONTACT_DISTANCE); - else - { - sLog->outError("Spell::EffectJump - unsupported target mode for spell ID %u", m_spellInfo->Id); + if (!unitTarget) return; - } + + float x, y, z; + unitTarget->GetContactPoint(m_caster, x, y, z, CONTACT_DISTANCE); float speedXY, speedZ; CalculateJumpSpeeds(effIndex, m_caster->GetExactDist2d(x, y), speedXY, speedZ); @@ -1836,34 +1864,18 @@ void Spell::EffectJump(SpellEffIndex effIndex) void Spell::EffectJumpDest(SpellEffIndex effIndex) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_LAUNCH) + return; + if (m_caster->isInFlight()) return; + if (!m_targets.HasDst()) + return; + // Init dest coordinates float x, y, z; - if (m_targets.HasDst()) - { - m_targets.GetDst()->GetPosition(x, y, z); - - if (m_spellInfo->Effects[effIndex].TargetA.GetTarget() == TARGET_DEST_TARGET_BACK) - { - // explicit cast data from client or server-side cast - // some spell at client send caster - Unit* pTarget = NULL; - if (m_targets.GetUnitTarget() && m_targets.GetUnitTarget() != m_caster) - pTarget = m_targets.GetUnitTarget(); - else if (m_caster->getVictim()) - pTarget = m_caster->getVictim(); - else if (m_caster->GetTypeId() == TYPEID_PLAYER) - pTarget = ObjectAccessor::GetUnit(*m_caster, m_caster->ToPlayer()->GetSelection()); - - } - } - else - { - sLog->outError("Spell::EffectJumpDest - unsupported target mode for spell ID %u", m_spellInfo->Id); - return; - } + m_targets.GetDst()->GetPosition(x, y, z); float speedXY, speedZ; CalculateJumpSpeeds(effIndex, m_caster->GetExactDist2d(x, y), speedXY, speedZ); @@ -1883,6 +1895,9 @@ void Spell::CalculateJumpSpeeds(uint8 i, float dist, float & speedXY, float & sp void Spell::EffectTeleportUnits(SpellEffIndex /*effIndex*/) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (!unitTarget || unitTarget->isInFlight()) return; @@ -2046,6 +2061,9 @@ void Spell::EffectTeleportUnits(SpellEffIndex /*effIndex*/) void Spell::EffectApplyAura(SpellEffIndex effIndex) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (!m_spellAura || !unitTarget) return; ASSERT(unitTarget == m_spellAura->GetOwner()); @@ -2054,6 +2072,9 @@ void Spell::EffectApplyAura(SpellEffIndex effIndex) void Spell::EffectApplyAreaAura(SpellEffIndex effIndex) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (!m_spellAura || !unitTarget) return; ASSERT (unitTarget == m_spellAura->GetOwner()); @@ -2062,6 +2083,9 @@ void Spell::EffectApplyAreaAura(SpellEffIndex effIndex) void Spell::EffectUnlearnSpecialization(SpellEffIndex effIndex) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER) return; @@ -2075,6 +2099,9 @@ void Spell::EffectUnlearnSpecialization(SpellEffIndex effIndex) void Spell::EffectPowerDrain(SpellEffIndex effIndex) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (m_spellInfo->Effects[effIndex].MiscValue < 0 || m_spellInfo->Effects[effIndex].MiscValue >= int8(MAX_POWERS)) return; @@ -2109,18 +2136,30 @@ void Spell::EffectPowerDrain(SpellEffIndex effIndex) void Spell::EffectSendEvent(SpellEffIndex effIndex) { - /* - we do not handle a flag dropping or clicking on flag in battleground by sendevent system - */ - sLog->outDebug(LOG_FILTER_SPELLS_AURAS, "Spell ScriptStart %u for spellid %u in EffectSendEvent ", m_spellInfo->Effects[effIndex].MiscValue, m_spellInfo->Id); + // we do not handle a flag dropping or clicking on flag in battleground by sendevent system + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET + && effectHandleMode != SPELL_EFFECT_HANDLE_HIT) + return; Object* target = NULL; - if (focusObject) - target = focusObject; - else if (unitTarget) - target = unitTarget; - else if (gameObjTarget) - target = gameObjTarget; + + // call events for target if present + if (effectHandleMode == SPELL_EFFECT_HANDLE_HIT_TARGET) + { + if (unitTarget) + target = unitTarget; + else if (gameObjTarget) + target = gameObjTarget; + } + // call event with no target or focus target when no targets could be found due to no dbc entry + else if (!m_spellInfo->Effects[effIndex].GetProvidedTargetMask()) + { + if (focusObject) + target = focusObject; + // TODO: there should be a possibility to pass dest target to event script + } + + sLog->outDebug(LOG_FILTER_SPELLS_AURAS, "Spell ScriptStart %u for spellid %u in EffectSendEvent ", m_spellInfo->Effects[effIndex].MiscValue, m_spellInfo->Id); if (ZoneScript* zoneScript = m_caster->GetZoneScript()) zoneScript->ProcessEvent(unitTarget, m_spellInfo->Effects[effIndex].MiscValue); @@ -2130,6 +2169,9 @@ void Spell::EffectSendEvent(SpellEffIndex effIndex) void Spell::EffectPowerBurn(SpellEffIndex effIndex) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (m_spellInfo->Effects[effIndex].MiscValue < 0 || m_spellInfo->Effects[effIndex].MiscValue >= int8(MAX_POWERS)) return; @@ -2166,10 +2208,9 @@ void Spell::EffectPowerBurn(SpellEffIndex effIndex) void Spell::EffectHeal(SpellEffIndex /*effIndex*/) { -} + if (effectHandleMode != SPELL_EFFECT_HANDLE_LAUNCH_TARGET) + return; -void Spell::SpellDamageHeal(SpellEffIndex /*effIndex*/) -{ if (unitTarget && unitTarget->isAlive() && damage >= 0) { // Try to get original caster @@ -2284,6 +2325,9 @@ void Spell::SpellDamageHeal(SpellEffIndex /*effIndex*/) void Spell::EffectHealPct(SpellEffIndex /*effIndex*/) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (!unitTarget || !unitTarget->isAlive() || damage < 0) return; @@ -2300,6 +2344,9 @@ void Spell::EffectHealPct(SpellEffIndex /*effIndex*/) void Spell::EffectHealMechanical(SpellEffIndex /*effIndex*/) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (!unitTarget || !unitTarget->isAlive() || damage < 0) return; @@ -2312,6 +2359,9 @@ void Spell::EffectHealMechanical(SpellEffIndex /*effIndex*/) void Spell::EffectHealthLeech(SpellEffIndex effIndex) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (!unitTarget || !unitTarget->isAlive() || damage < 0) return; @@ -2337,7 +2387,7 @@ void Spell::DoCreateItem(uint32 /*i*/, uint32 itemtype) if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER) return; - Player* player = (Player*)unitTarget; + Player* player = unitTarget->ToPlayer(); uint32 newitemid = itemtype; ItemTemplate const* pProto = sObjectMgr->GetItemTemplate(newitemid); @@ -2445,15 +2495,22 @@ void Spell::DoCreateItem(uint32 /*i*/, uint32 itemtype) void Spell::EffectCreateItem(SpellEffIndex effIndex) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + DoCreateItem(effIndex, m_spellInfo->Effects[effIndex].ItemType); ExecuteLogEffectCreateItem(effIndex, m_spellInfo->Effects[effIndex].ItemType); } void Spell::EffectCreateItem2(SpellEffIndex effIndex) { - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; - Player* player = (Player*)m_caster; + + if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER) + return; + + Player* player = unitTarget->ToPlayer(); uint32 item_id = m_spellInfo->Effects[effIndex].ItemType; @@ -2483,9 +2540,12 @@ void Spell::EffectCreateItem2(SpellEffIndex effIndex) void Spell::EffectCreateRandomItem(SpellEffIndex /*effIndex*/) { - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; - Player* player = (Player*)m_caster; + + if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER) + return; + Player* player = unitTarget->ToPlayer(); // create some random items player->AutoStoreLoot(m_spellInfo->Id, LootTemplates_Spell); @@ -2494,6 +2554,9 @@ void Spell::EffectCreateRandomItem(SpellEffIndex /*effIndex*/) void Spell::EffectPersistentAA(SpellEffIndex effIndex) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) + return; + if (!m_spellAura) { Unit* caster = m_caster->GetEntry() == WORLD_TRIGGER ? m_originalCaster : m_caster; @@ -2526,6 +2589,9 @@ void Spell::EffectPersistentAA(SpellEffIndex effIndex) void Spell::EffectEnergize(SpellEffIndex effIndex) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (!unitTarget) return; if (!unitTarget->isAlive()) @@ -2628,6 +2694,9 @@ void Spell::EffectEnergize(SpellEffIndex effIndex) void Spell::EffectEnergizePct(SpellEffIndex effIndex) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (!unitTarget) return; if (!unitTarget->isAlive()) @@ -2717,13 +2786,16 @@ void Spell::SendLoot(uint64 guid, LootType loottype) void Spell::EffectOpenLock(SpellEffIndex effIndex) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (m_caster->GetTypeId() != TYPEID_PLAYER) { sLog->outDebug(LOG_FILTER_SPELLS_AURAS, "WORLD: Open Lock - No Player Caster!"); return; } - Player* player = (Player*)m_caster; + Player* player = m_caster->ToPlayer(); uint32 lockId = 0; uint64 guid = 0; @@ -2819,10 +2891,13 @@ void Spell::EffectOpenLock(SpellEffIndex effIndex) void Spell::EffectSummonChangeItem(SpellEffIndex effIndex) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) + return; + if (m_caster->GetTypeId() != TYPEID_PLAYER) return; - Player* player = (Player*)m_caster; + Player* player = m_caster->ToPlayer(); // applied only to using item if (!m_CastItem) @@ -2918,9 +2993,12 @@ void Spell::EffectSummonChangeItem(SpellEffIndex effIndex) void Spell::EffectProficiency(SpellEffIndex /*effIndex*/) { - if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER) + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) + return; + + if (m_caster->GetTypeId() != TYPEID_PLAYER) return; - Player* p_target = unitTarget->ToPlayer(); + Player* p_target = m_caster->ToPlayer(); uint32 subClassMask = m_spellInfo->EquippedItemSubClassMask; if (m_spellInfo->EquippedItemClass == ITEM_CLASS_WEAPON && !(p_target->GetWeaponProficiency() & subClassMask)) @@ -2937,6 +3015,9 @@ void Spell::EffectProficiency(SpellEffIndex /*effIndex*/) void Spell::EffectSummonType(SpellEffIndex effIndex) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) + return; + uint32 entry = m_spellInfo->Effects[effIndex].MiscValue; if (!entry) return; @@ -3086,6 +3167,9 @@ void Spell::EffectSummonType(SpellEffIndex effIndex) void Spell::EffectLearnSpell(SpellEffIndex effIndex) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (!unitTarget) return; @@ -3108,6 +3192,9 @@ typedef std::list< std::pair<uint32, uint64> > DispelList; typedef std::list< std::pair<Aura* , uint8> > DispelChargesList; void Spell::EffectDispel(SpellEffIndex effIndex) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (!unitTarget) return; @@ -3246,6 +3333,9 @@ void Spell::EffectDispel(SpellEffIndex effIndex) void Spell::EffectDualWield(SpellEffIndex /*effIndex*/) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + unitTarget->SetCanDualWield(true); if (unitTarget->GetTypeId() == TYPEID_UNIT) unitTarget->ToCreature()->UpdateDamagePhysical(OFF_ATTACK); @@ -3259,6 +3349,9 @@ void Spell::EffectPull(SpellEffIndex effIndex) void Spell::EffectDistract(SpellEffIndex /*effIndex*/) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + // Check for possible target if (!unitTarget || unitTarget->isInCombat()) return; @@ -3287,6 +3380,9 @@ void Spell::EffectDistract(SpellEffIndex /*effIndex*/) void Spell::EffectPickPocket(SpellEffIndex /*effIndex*/) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (m_caster->GetTypeId() != TYPEID_PLAYER) return; @@ -3301,6 +3397,9 @@ void Spell::EffectPickPocket(SpellEffIndex /*effIndex*/) void Spell::EffectAddFarsight(SpellEffIndex effIndex) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) + return; + if (m_caster->GetTypeId() != TYPEID_PLAYER) return; @@ -3326,6 +3425,9 @@ void Spell::EffectAddFarsight(SpellEffIndex effIndex) void Spell::EffectUntrainTalents(SpellEffIndex /*effIndex*/) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (!unitTarget || m_caster->GetTypeId() == TYPEID_PLAYER) return; @@ -3335,6 +3437,9 @@ void Spell::EffectUntrainTalents(SpellEffIndex /*effIndex*/) void Spell::EffectTeleUnitsFaceCaster(SpellEffIndex effIndex) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (!unitTarget) return; @@ -3351,6 +3456,9 @@ void Spell::EffectTeleUnitsFaceCaster(SpellEffIndex effIndex) void Spell::EffectLearnSkill(SpellEffIndex effIndex) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (unitTarget->GetTypeId() != TYPEID_PLAYER) return; @@ -3364,6 +3472,9 @@ void Spell::EffectLearnSkill(SpellEffIndex effIndex) void Spell::EffectAddHonor(SpellEffIndex /*effIndex*/) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (unitTarget->GetTypeId() != TYPEID_PLAYER) return; @@ -3392,15 +3503,21 @@ void Spell::EffectAddHonor(SpellEffIndex /*effIndex*/) void Spell::EffectTradeSkill(SpellEffIndex /*effIndex*/) { - if (unitTarget->GetTypeId() != TYPEID_PLAYER) + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) + return; + + if (m_caster->GetTypeId() != TYPEID_PLAYER) return; // uint32 skillid = m_spellInfo->Effects[i].MiscValue; // uint16 skillmax = unitTarget->ToPlayer()->(skillid); - // unitTarget->ToPlayer()->SetSkill(skillid, skillval?skillval:1, skillmax+75); + // m_caster->ToPlayer()->SetSkill(skillid, skillval?skillval:1, skillmax+75); } void Spell::EffectEnchantItemPerm(SpellEffIndex effIndex) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (m_caster->GetTypeId() != TYPEID_PLAYER) return; if (!itemTarget) @@ -3461,6 +3578,9 @@ void Spell::EffectEnchantItemPerm(SpellEffIndex effIndex) void Spell::EffectEnchantItemPrismatic(SpellEffIndex effIndex) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (m_caster->GetTypeId() != TYPEID_PLAYER) return; if (!itemTarget) @@ -3521,6 +3641,9 @@ void Spell::EffectEnchantItemPrismatic(SpellEffIndex effIndex) void Spell::EffectEnchantItemTmp(SpellEffIndex effIndex) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (m_caster->GetTypeId() != TYPEID_PLAYER) return; @@ -3528,7 +3651,7 @@ void Spell::EffectEnchantItemTmp(SpellEffIndex effIndex) // Rockbiter Weapon apply to both weapon if (!itemTarget) - return; + return; if (m_spellInfo->SpellFamilyName == SPELLFAMILY_SHAMAN && m_spellInfo->SpellFamilyFlags[0] & 0x400000) { uint32 spell_id = 0; @@ -3649,6 +3772,9 @@ void Spell::EffectEnchantItemTmp(SpellEffIndex effIndex) void Spell::EffectTameCreature(SpellEffIndex /*effIndex*/) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (m_caster->GetPetGUID()) return; @@ -3702,6 +3828,9 @@ void Spell::EffectTameCreature(SpellEffIndex /*effIndex*/) void Spell::EffectSummonPet(SpellEffIndex effIndex) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) + return; + Player* owner = NULL; if (m_originalCaster) { @@ -3781,6 +3910,9 @@ void Spell::EffectSummonPet(SpellEffIndex effIndex) void Spell::EffectLearnPetSpell(SpellEffIndex effIndex) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (!unitTarget) return; @@ -3804,6 +3936,9 @@ void Spell::EffectLearnPetSpell(SpellEffIndex effIndex) void Spell::EffectTaunt(SpellEffIndex /*effIndex*/) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (!unitTarget) return; @@ -3837,12 +3972,11 @@ void Spell::EffectTaunt(SpellEffIndex /*effIndex*/) unitTarget->ToCreature()->AI()->AttackStart(m_caster); } -void Spell::EffectWeaponDmg(SpellEffIndex /*effIndex*/) +void Spell::EffectWeaponDmg(SpellEffIndex effIndex) { -} + if (effectHandleMode != SPELL_EFFECT_HANDLE_LAUNCH_TARGET) + return; -void Spell::SpellDamageWeaponDmg(SpellEffIndex effIndex) -{ if (!unitTarget || !unitTarget->isAlive()) return; @@ -4132,6 +4266,9 @@ void Spell::SpellDamageWeaponDmg(SpellEffIndex effIndex) void Spell::EffectThreat(SpellEffIndex /*effIndex*/) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (!unitTarget || !unitTarget->isAlive() || !m_caster->isAlive()) return; @@ -4143,6 +4280,9 @@ void Spell::EffectThreat(SpellEffIndex /*effIndex*/) void Spell::EffectHealMaxHealth(SpellEffIndex /*effIndex*/) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (!unitTarget || !unitTarget->isAlive()) return; @@ -4169,6 +4309,9 @@ void Spell::EffectHealMaxHealth(SpellEffIndex /*effIndex*/) void Spell::EffectInterruptCast(SpellEffIndex effIndex) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (!unitTarget || !unitTarget->isAlive()) return; @@ -4198,6 +4341,9 @@ void Spell::EffectInterruptCast(SpellEffIndex effIndex) void Spell::EffectSummonObjectWild(SpellEffIndex effIndex) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) + return; + uint32 gameobject_id = m_spellInfo->Effects[effIndex].MiscValue; GameObject* pGameObj = new GameObject; @@ -4287,6 +4433,9 @@ void Spell::EffectSummonObjectWild(SpellEffIndex effIndex) void Spell::EffectScriptEffect(SpellEffIndex effIndex) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + // TODO: we must implement hunter pet summon at login there (spell 6962) switch(m_spellInfo->SpellFamilyName) @@ -5327,6 +5476,9 @@ void Spell::EffectScriptEffect(SpellEffIndex effIndex) void Spell::EffectSanctuary(SpellEffIndex /*effIndex*/) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (!unitTarget) return; @@ -5357,6 +5509,9 @@ void Spell::EffectSanctuary(SpellEffIndex /*effIndex*/) void Spell::EffectAddComboPoints(SpellEffIndex /*effIndex*/) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (!unitTarget) return; @@ -5371,6 +5526,9 @@ void Spell::EffectAddComboPoints(SpellEffIndex /*effIndex*/) void Spell::EffectDuel(SpellEffIndex effIndex) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (!unitTarget || m_caster->GetTypeId() != TYPEID_PLAYER || unitTarget->GetTypeId() != TYPEID_PLAYER) return; @@ -5455,13 +5613,16 @@ void Spell::EffectDuel(SpellEffIndex effIndex) void Spell::EffectStuck(SpellEffIndex /*effIndex*/) { - if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER) + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) + return; + + if (!m_caster || m_caster->GetTypeId() != TYPEID_PLAYER) return; if (!sWorld->getBoolConfig(CONFIG_CAST_UNSTUCK)) return; - Player* pTarget = (Player*)unitTarget; + Player* pTarget = (Player*)m_caster; sLog->outDebug(LOG_FILTER_SPELLS_AURAS, "Spell Effect: Stuck"); sLog->outDetail("Player %s (guid %u) used auto-unstuck future at map %u (%f, %f, %f)", pTarget->GetName(), pTarget->GetGUIDLow(), m_caster->GetMapId(), m_caster->GetPositionX(), pTarget->GetPositionY(), pTarget->GetPositionZ()); @@ -5469,9 +5630,9 @@ void Spell::EffectStuck(SpellEffIndex /*effIndex*/) if (pTarget->isInFlight()) return; - pTarget->TeleportTo(pTarget->GetStartPosition(), unitTarget == m_caster ? TELE_TO_SPELL : 0); + pTarget->TeleportTo(pTarget->GetStartPosition(), m_caster == m_caster ? TELE_TO_SPELL : 0); // homebind location is loaded always - // pTarget->TeleportTo(pTarget->m_homebindMapId, pTarget->m_homebindX, pTarget->m_homebindY, pTarget->m_homebindZ, pTarget->GetOrientation(), (unitTarget == m_caster ? TELE_TO_SPELL : 0)); + // pTarget->TeleportTo(pTarget->m_homebindMapId, pTarget->m_homebindX, pTarget->m_homebindY, pTarget->m_homebindZ, pTarget->GetOrientation(), (m_caster == m_caster ? TELE_TO_SPELL : 0)); // Stuck spell trigger Hearthstone cooldown SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(8690); @@ -5483,6 +5644,10 @@ void Spell::EffectStuck(SpellEffIndex /*effIndex*/) void Spell::EffectSummonPlayer(SpellEffIndex /*effIndex*/) { + // workaround - this effect should not use target map + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER) return; @@ -5504,6 +5669,9 @@ void Spell::EffectSummonPlayer(SpellEffIndex /*effIndex*/) void Spell::EffectActivateObject(SpellEffIndex /*effIndex*/) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (!gameObjTarget) return; @@ -5517,6 +5685,9 @@ void Spell::EffectActivateObject(SpellEffIndex /*effIndex*/) void Spell::EffectApplyGlyph(SpellEffIndex effIndex) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) + return; + if (m_caster->GetTypeId() != TYPEID_PLAYER || m_glyphIndex >= MAX_GLYPH_SLOT_INDEX) return; @@ -5572,6 +5743,9 @@ void Spell::EffectApplyGlyph(SpellEffIndex effIndex) void Spell::EffectEnchantHeldItem(SpellEffIndex effIndex) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + // this is only item spell effect applied to main-hand weapon of target player (players in area) if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER) return; @@ -5614,6 +5788,9 @@ void Spell::EffectEnchantHeldItem(SpellEffIndex effIndex) void Spell::EffectDisEnchant(SpellEffIndex /*effIndex*/) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (m_caster->GetTypeId() != TYPEID_PLAYER) return; @@ -5630,6 +5807,9 @@ void Spell::EffectDisEnchant(SpellEffIndex /*effIndex*/) void Spell::EffectInebriate(SpellEffIndex /*effIndex*/) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER) return; @@ -5645,12 +5825,15 @@ void Spell::EffectInebriate(SpellEffIndex /*effIndex*/) void Spell::EffectFeedPet(SpellEffIndex effIndex) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (m_caster->GetTypeId() != TYPEID_PLAYER) return; Player* _player = m_caster->ToPlayer(); - Item* foodItem = m_targets.GetItemTarget(); + Item* foodItem = itemTarget; if (!foodItem) return; @@ -5676,21 +5859,23 @@ void Spell::EffectFeedPet(SpellEffIndex effIndex) void Spell::EffectDismissPet(SpellEffIndex effIndex) { - if (m_caster->GetTypeId() != TYPEID_PLAYER) + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; - Pet* pet = m_caster->ToPlayer()->GetPet(); - - // not let dismiss dead pet - if (!pet||!pet->isAlive()) + if (!unitTarget || !unitTarget->isPet()) return; + Pet* pet = unitTarget->ToPet(); + ExecuteLogEffectUnsummonObject(effIndex, pet); - m_caster->ToPlayer()->RemovePet(pet, PET_SAVE_NOT_IN_SLOT); + pet->GetOwner()->RemovePet(pet, PET_SAVE_NOT_IN_SLOT); } void Spell::EffectSummonObject(SpellEffIndex effIndex) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) + return; + uint32 go_id = m_spellInfo->Effects[effIndex].MiscValue; uint8 slot = 0; @@ -5753,6 +5938,9 @@ void Spell::EffectSummonObject(SpellEffIndex effIndex) void Spell::EffectResurrect(SpellEffIndex effIndex) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (!unitTarget) return; if (unitTarget->GetTypeId() != TYPEID_PLAYER) @@ -5808,6 +5996,9 @@ void Spell::EffectResurrect(SpellEffIndex effIndex) void Spell::EffectAddExtraAttacks(SpellEffIndex effIndex) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (!unitTarget || !unitTarget->isAlive() || !unitTarget->getVictim()) return; @@ -5821,19 +6012,28 @@ void Spell::EffectAddExtraAttacks(SpellEffIndex effIndex) void Spell::EffectParry(SpellEffIndex /*effIndex*/) { - if (unitTarget && unitTarget->GetTypeId() == TYPEID_PLAYER) - unitTarget->ToPlayer()->SetCanParry(true); + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) + return; + + if (m_caster->GetTypeId() == TYPEID_PLAYER) + m_caster->ToPlayer()->SetCanParry(true); } void Spell::EffectBlock(SpellEffIndex /*effIndex*/) { - if (unitTarget && unitTarget->GetTypeId() == TYPEID_PLAYER) - unitTarget->ToPlayer()->SetCanBlock(true); + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) + return; + + if (m_caster->GetTypeId() == TYPEID_PLAYER) + m_caster->ToPlayer()->SetCanBlock(true); } void Spell::EffectLeap(SpellEffIndex /*effIndex*/) { - if (unitTarget->isInFlight()) + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + + if (!unitTarget || unitTarget->isInFlight()) return; if (!m_targets.HasDst()) @@ -5844,12 +6044,15 @@ void Spell::EffectLeap(SpellEffIndex /*effIndex*/) void Spell::EffectReputation(SpellEffIndex effIndex) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER) return; Player* _player = unitTarget->ToPlayer(); - int32 rep_change = damage;//+1; // field store reputation change -1 + int32 rep_change = damage; uint32 faction_id = m_spellInfo->Effects[effIndex].MiscValue; @@ -5872,14 +6075,13 @@ void Spell::EffectReputation(SpellEffIndex effIndex) void Spell::EffectQuestComplete(SpellEffIndex effIndex) { - Player* player = NULL; - if (unitTarget && unitTarget->GetTypeId() == TYPEID_PLAYER) - player = (Player*)unitTarget; - else if (m_caster->GetTypeId() == TYPEID_PLAYER) - player = (Player*)m_caster; - else + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; + if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER) + return; + Player* player = unitTarget->ToPlayer(); + uint32 questId = m_spellInfo->Effects[effIndex].MiscValue; if (questId) { @@ -5897,6 +6099,9 @@ void Spell::EffectQuestComplete(SpellEffIndex effIndex) void Spell::EffectForceDeselect(SpellEffIndex /*effIndex*/) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) + return; + WorldPacket data(SMSG_CLEAR_TARGET, 8); data << uint64(m_caster->GetGUID()); m_caster->SendMessageToSet(&data, true); @@ -5904,11 +6109,14 @@ void Spell::EffectForceDeselect(SpellEffIndex /*effIndex*/) void Spell::EffectSelfResurrect(SpellEffIndex effIndex) { - if (!unitTarget || unitTarget->isAlive()) + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) return; - if (unitTarget->GetTypeId() != TYPEID_PLAYER) + + if (!m_caster || m_caster->isAlive()) return; - if (!unitTarget->IsInWorld()) + if (m_caster->GetTypeId() != TYPEID_PLAYER) + return; + if (!m_caster->IsInWorld()) return; uint32 health = 0; @@ -5923,12 +6131,12 @@ void Spell::EffectSelfResurrect(SpellEffIndex effIndex) // percent case else { - health = unitTarget->CountPctFromMaxHealth(damage); - if (unitTarget->GetMaxPower(POWER_MANA) > 0) - mana = CalculatePctN(unitTarget->GetMaxPower(POWER_MANA), damage); + health = m_caster->CountPctFromMaxHealth(damage); + if (m_caster->GetMaxPower(POWER_MANA) > 0) + mana = CalculatePctN(m_caster->GetMaxPower(POWER_MANA), damage); } - Player* plr = unitTarget->ToPlayer(); + Player* plr = m_caster->ToPlayer(); plr->ResurrectPlayer(0.0f); plr->SetHealth(health); @@ -5941,6 +6149,9 @@ void Spell::EffectSelfResurrect(SpellEffIndex effIndex) void Spell::EffectSkinning(SpellEffIndex /*effIndex*/) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (unitTarget->GetTypeId() != TYPEID_UNIT) return; if (m_caster->GetTypeId() != TYPEID_PLAYER) @@ -5964,21 +6175,32 @@ void Spell::EffectSkinning(SpellEffIndex /*effIndex*/) void Spell::EffectCharge(SpellEffIndex /*effIndex*/) { - Unit* target = m_targets.GetUnitTarget(); - if (!target) - return; + if (effectHandleMode == SPELL_EFFECT_HANDLE_LAUNCH_TARGET) + { + if (!unitTarget) + return; - float x, y, z; - target->GetContactPoint(m_caster, x, y, z); - m_caster->GetMotionMaster()->MoveCharge(x, y, z); + float x, y, z; + unitTarget->GetContactPoint(m_caster, x, y, z); + m_caster->GetMotionMaster()->MoveCharge(x, y, z); + } - // not all charge effects used in negative spells - if (!m_spellInfo->IsPositive() && m_caster->GetTypeId() == TYPEID_PLAYER) - m_caster->Attack(target, true); + if (effectHandleMode == SPELL_EFFECT_HANDLE_HIT_TARGET) + { + if (!unitTarget) + return; + + // not all charge effects used in negative spells + if (!m_spellInfo->IsPositive() && m_caster->GetTypeId() == TYPEID_PLAYER) + m_caster->Attack(unitTarget, true); + } } void Spell::EffectChargeDest(SpellEffIndex /*effIndex*/) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_LAUNCH) + return; + if (m_targets.HasDst()) { float x, y, z; @@ -5989,6 +6211,9 @@ void Spell::EffectChargeDest(SpellEffIndex /*effIndex*/) void Spell::EffectKnockBack(SpellEffIndex effIndex) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (!unitTarget) return; @@ -6044,30 +6269,26 @@ void Spell::EffectKnockBack(SpellEffIndex effIndex) void Spell::EffectLeapBack(SpellEffIndex effIndex) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_LAUNCH_TARGET) + return; + + if (!unitTarget) + return; + float speedxy = float(m_spellInfo->Effects[effIndex].MiscValue)/10; float speedz = float(damage/10); - if (!speedxy) - { - if (m_targets.GetUnitTarget()) - m_caster->JumpTo(m_targets.GetUnitTarget(), speedz); - } - else - { - //1891: Disengage - m_caster->JumpTo(speedxy, speedz, m_spellInfo->SpellIconID != 1891); - } + //1891: Disengage + m_caster->JumpTo(speedxy, speedz, m_spellInfo->SpellIconID != 1891); } void Spell::EffectQuestClear(SpellEffIndex effIndex) { - Player* pPlayer = NULL; - if (m_caster->GetTypeId() == TYPEID_PLAYER) - pPlayer = m_caster->ToPlayer(); - else if (unitTarget && unitTarget->GetTypeId() == TYPEID_PLAYER) - pPlayer = unitTarget->ToPlayer(); + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; - if (!pPlayer) + if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER) return; + Player* pPlayer = unitTarget->ToPlayer(); uint32 quest_id = m_spellInfo->Effects[effIndex].MiscValue; @@ -6099,6 +6320,9 @@ void Spell::EffectQuestClear(SpellEffIndex effIndex) void Spell::EffectSendTaxi(SpellEffIndex effIndex) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER) return; @@ -6107,6 +6331,9 @@ void Spell::EffectSendTaxi(SpellEffIndex effIndex) void Spell::EffectPullTowards(SpellEffIndex effIndex) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (!unitTarget) return; @@ -6130,6 +6357,9 @@ void Spell::EffectPullTowards(SpellEffIndex effIndex) void Spell::EffectDispelMechanic(SpellEffIndex effIndex) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (!unitTarget) return; @@ -6156,6 +6386,9 @@ void Spell::EffectDispelMechanic(SpellEffIndex effIndex) void Spell::EffectSummonDeadPet(SpellEffIndex /*effIndex*/) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) + return; + if (m_caster->GetTypeId() != TYPEID_PLAYER) return; Player* _player = m_caster->ToPlayer(); @@ -6184,6 +6417,9 @@ void Spell::EffectSummonDeadPet(SpellEffIndex /*effIndex*/) void Spell::EffectDestroyAllTotems(SpellEffIndex /*effIndex*/) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) + return; + int32 mana = 0; for (uint8 slot = SUMMON_SLOT_TOTEM; slot < MAX_TOTEM_SLOT; ++slot) { @@ -6210,6 +6446,9 @@ void Spell::EffectDestroyAllTotems(SpellEffIndex /*effIndex*/) void Spell::EffectDurabilityDamage(SpellEffIndex effIndex) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER) return; @@ -6235,6 +6474,9 @@ void Spell::EffectDurabilityDamage(SpellEffIndex effIndex) void Spell::EffectDurabilityDamagePCT(SpellEffIndex effIndex) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER) return; @@ -6261,6 +6503,9 @@ void Spell::EffectDurabilityDamagePCT(SpellEffIndex effIndex) void Spell::EffectModifyThreatPercent(SpellEffIndex /*effIndex*/) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (!unitTarget) return; @@ -6269,6 +6514,9 @@ void Spell::EffectModifyThreatPercent(SpellEffIndex /*effIndex*/) void Spell::EffectTransmitted(SpellEffIndex effIndex) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) + return; + uint32 name_id = m_spellInfo->Effects[effIndex].MiscValue; GameObjectTemplate const* goinfo = sObjectMgr->GetGameObjectTemplate(name_id); @@ -6411,6 +6659,9 @@ void Spell::EffectTransmitted(SpellEffIndex effIndex) void Spell::EffectProspecting(SpellEffIndex /*effIndex*/) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (m_caster->GetTypeId() != TYPEID_PLAYER) return; @@ -6433,6 +6684,9 @@ void Spell::EffectProspecting(SpellEffIndex /*effIndex*/) void Spell::EffectMilling(SpellEffIndex /*effIndex*/) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (m_caster->GetTypeId() != TYPEID_PLAYER) return; @@ -6455,6 +6709,9 @@ void Spell::EffectMilling(SpellEffIndex /*effIndex*/) void Spell::EffectSkill(SpellEffIndex /*effIndex*/) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) + return; + sLog->outDebug(LOG_FILTER_SPELLS_AURAS, "WORLD: SkillEFFECT"); } @@ -6464,9 +6721,10 @@ void Spell::EffectSkill(SpellEffIndex /*effIndex*/) This is why we use a half sec delay between the visual effect and the resurrection itself */ void Spell::EffectSpiritHeal(SpellEffIndex /*effIndex*/) { - /* - if (!unitTarget || unitTarget->isAlive()) + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; + + /* if (unitTarget->GetTypeId() != TYPEID_PLAYER) return; if (!unitTarget->IsInWorld()) @@ -6482,6 +6740,9 @@ void Spell::EffectSpiritHeal(SpellEffIndex /*effIndex*/) // remove insignia spell effect void Spell::EffectSkinPlayerCorpse(SpellEffIndex /*effIndex*/) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + sLog->outDebug(LOG_FILTER_SPELLS_AURAS, "Effect: SkinPlayerCorpse"); if ((m_caster->GetTypeId() != TYPEID_PLAYER) || (unitTarget->GetTypeId() != TYPEID_PLAYER) || (unitTarget->isAlive())) return; @@ -6491,6 +6752,9 @@ void Spell::EffectSkinPlayerCorpse(SpellEffIndex /*effIndex*/) void Spell::EffectStealBeneficialBuff(SpellEffIndex effIndex) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + sLog->outDebug(LOG_FILTER_SPELLS_AURAS, "Effect: StealBeneficialBuff"); if (!unitTarget || unitTarget == m_caster) // can't steal from self @@ -6593,6 +6857,9 @@ void Spell::EffectStealBeneficialBuff(SpellEffIndex effIndex) void Spell::EffectKillCreditPersonal(SpellEffIndex effIndex) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER) return; @@ -6601,6 +6868,9 @@ void Spell::EffectKillCreditPersonal(SpellEffIndex effIndex) void Spell::EffectKillCredit(SpellEffIndex effIndex) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER) return; @@ -6617,6 +6887,9 @@ void Spell::EffectKillCredit(SpellEffIndex effIndex) void Spell::EffectQuestFail(SpellEffIndex effIndex) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER) return; @@ -6625,6 +6898,9 @@ void Spell::EffectQuestFail(SpellEffIndex effIndex) void Spell::EffectQuestStart(SpellEffIndex effIndex) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER) return; @@ -6640,6 +6916,9 @@ void Spell::EffectQuestStart(SpellEffIndex effIndex) void Spell::EffectActivateRune(SpellEffIndex effIndex) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_LAUNCH) + return; + if (m_caster->GetTypeId() != TYPEID_PLAYER) return; @@ -6678,6 +6957,9 @@ void Spell::EffectActivateRune(SpellEffIndex effIndex) void Spell::EffectCreateTamedPet(SpellEffIndex effIndex) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER || unitTarget->GetPetGUID() || unitTarget->getClass() != CLASS_HUNTER) return; @@ -6703,6 +6985,9 @@ void Spell::EffectCreateTamedPet(SpellEffIndex effIndex) void Spell::EffectDiscoverTaxi(SpellEffIndex effIndex) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER) return; uint32 nodeid = m_spellInfo->Effects[effIndex].MiscValue; @@ -6712,18 +6997,27 @@ void Spell::EffectDiscoverTaxi(SpellEffIndex effIndex) void Spell::EffectTitanGrip(SpellEffIndex /*effIndex*/) { - if (unitTarget && unitTarget->GetTypeId() == TYPEID_PLAYER) - unitTarget->ToPlayer()->SetCanTitanGrip(true); + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) + return; + + if (m_caster->GetTypeId() == TYPEID_PLAYER) + m_caster->ToPlayer()->SetCanTitanGrip(true); } void Spell::EffectRedirectThreat(SpellEffIndex /*effIndex*/) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (unitTarget) m_caster->SetReducedThreatPercent((uint32)damage, unitTarget->GetGUID()); } void Spell::EffectGameObjectDamage(SpellEffIndex /*effIndex*/) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (!gameObjTarget) return; @@ -6740,6 +7034,9 @@ void Spell::EffectGameObjectDamage(SpellEffIndex /*effIndex*/) void Spell::EffectGameObjectRepair(SpellEffIndex /*effIndex*/) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (!gameObjTarget) return; @@ -6748,6 +7045,9 @@ void Spell::EffectGameObjectRepair(SpellEffIndex /*effIndex*/) void Spell::EffectGameObjectSetDestructionState(SpellEffIndex effIndex) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (!gameObjTarget || !m_originalCaster) return; @@ -6868,6 +7168,9 @@ void Spell::GetSummonPosition(uint32 i, Position &pos, float radius, uint32 coun void Spell::EffectRenamePet(SpellEffIndex /*effIndex*/) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (!unitTarget || unitTarget->GetTypeId() != TYPEID_UNIT || !unitTarget->ToCreature()->isPet() || ((Pet*)unitTarget)->getPetType() != HUNTER_PET) return; @@ -6877,6 +7180,9 @@ void Spell::EffectRenamePet(SpellEffIndex /*effIndex*/) void Spell::EffectPlayMusic(SpellEffIndex effIndex) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER) return; @@ -6895,6 +7201,9 @@ void Spell::EffectPlayMusic(SpellEffIndex effIndex) void Spell::EffectSpecCount(SpellEffIndex /*effIndex*/) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER) return; @@ -6903,6 +7212,9 @@ void Spell::EffectSpecCount(SpellEffIndex /*effIndex*/) void Spell::EffectActivateSpec(SpellEffIndex /*effIndex*/) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER) return; @@ -6911,6 +7223,9 @@ void Spell::EffectActivateSpec(SpellEffIndex /*effIndex*/) void Spell::EffectPlayerNotification(SpellEffIndex effIndex) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER) return; @@ -6937,6 +7252,9 @@ void Spell::EffectPlayerNotification(SpellEffIndex effIndex) void Spell::EffectRemoveAura(SpellEffIndex effIndex) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (!unitTarget) return; // there may be need of specifying casterguid of removed auras @@ -6945,7 +7263,10 @@ void Spell::EffectRemoveAura(SpellEffIndex effIndex) void Spell::EffectCastButtons(SpellEffIndex effIndex) { - if (!unitTarget || m_caster->GetTypeId() != TYPEID_PLAYER) + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) + return; + + if (m_caster->GetTypeId() != TYPEID_PLAYER) return; Player* p_caster = m_caster->ToPlayer(); @@ -6979,12 +7300,15 @@ void Spell::EffectCastButtons(SpellEffIndex effIndex) continue; TriggerCastFlags triggerFlags = TriggerCastFlags(TRIGGERED_IGNORE_GCD | TRIGGERED_IGNORE_CAST_IN_PROGRESS | TRIGGERED_CAST_DIRECTLY); - m_caster->CastSpell(unitTarget, spell_id, triggerFlags); + m_caster->CastSpell(m_caster, spell_id, triggerFlags); } } void Spell::EffectRechargeManaGem(SpellEffIndex /*effIndex*/) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER) return; @@ -7012,6 +7336,9 @@ void Spell::EffectRechargeManaGem(SpellEffIndex /*effIndex*/) void Spell::EffectBind(SpellEffIndex effIndex) { + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; + if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER) return; @@ -7065,7 +7392,10 @@ void Spell::EffectBind(SpellEffIndex effIndex) player->SendDirectMessage(&data); } -void Spell::EffectSummonRaFFriend(SpellEffIndex effIndex) { +void Spell::EffectSummonRaFFriend(SpellEffIndex effIndex) +{ + if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) + return; if (m_caster->GetTypeId() != TYPEID_PLAYER || !unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER) return; |