diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Spells/Spell.cpp | 11 | ||||
-rw-r--r-- | src/server/game/Spells/Spell.h | 4 | ||||
-rw-r--r-- | src/server/game/Spells/SpellEffects.cpp | 71 | ||||
-rw-r--r-- | src/server/game/Spells/SpellScript.cpp | 2 |
4 files changed, 65 insertions, 23 deletions
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index b6cafb07edf..785ad4008f9 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -573,7 +573,7 @@ m_spellValue(new SpellValue(m_spellInfo, caster)), _spellEvent(nullptr) unitTarget = nullptr; itemTarget = nullptr; gameObjTarget = nullptr; - corpseTarget = nullptr; + m_corpseTarget = nullptr; destTarget = nullptr; damage = 0; targetMissInfo = SPELL_MISS_NONE; @@ -591,7 +591,6 @@ m_spellValue(new SpellValue(m_spellInfo, caster)), _spellEvent(nullptr) memset(m_misc.Raw.Data, 0, sizeof(m_misc.Raw.Data)); m_SpellVisual.SpellXSpellVisualID = caster->GetCastSpellXSpellVisualId(m_spellInfo); m_triggeredByAuraSpell = nullptr; - unitCaster = nullptr; _spellAura = nullptr; _dynObjAura = nullptr; @@ -5267,10 +5266,9 @@ void Spell::HandleEffects(Unit* pUnitTarget, Item* pItemTarget, GameObject* pGoT unitTarget = pUnitTarget; itemTarget = pItemTarget; gameObjTarget = pGoTarget; - corpseTarget = pCorpseTarget; + m_corpseTarget = pCorpseTarget; destTarget = &m_destTargets[spellEffectInfo.EffectIndex]._position; effectInfo = &spellEffectInfo; - unitCaster = m_originalCaster ? m_originalCaster : m_caster->ToUnit(); damage = CalculateDamage(spellEffectInfo, unitTarget, &variance); @@ -7829,6 +7827,11 @@ bool Spell::IsNeedSendToClient() const (m_spellInfo->HasAttribute(SPELL_ATTR8_AURA_SEND_AMOUNT)) || m_spellInfo->HasHitDelay() || (!m_triggeredByAuraSpell && !IsTriggered()); } +Unit* Spell::GetUnitCasterForEffectHandlers() const +{ + return m_originalCaster ? m_originalCaster : m_caster->ToUnit(); +} + SpellEvent::SpellEvent(Spell* spell) : BasicEvent() { m_Spell = spell; diff --git a/src/server/game/Spells/Spell.h b/src/server/game/Spells/Spell.h index 0d008288186..13185fe342f 100644 --- a/src/server/game/Spells/Spell.h +++ b/src/server/game/Spells/Spell.h @@ -690,7 +690,7 @@ class TC_GAME_API Spell Unit* unitTarget; Item* itemTarget; GameObject* gameObjTarget; - Corpse* corpseTarget; + Corpse* m_corpseTarget; WorldLocation* destTarget; int32 damage; SpellMissInfo targetMissInfo; @@ -698,7 +698,7 @@ class TC_GAME_API Spell SpellEffectHandleMode effectHandleMode; SpellEffectInfo const* effectInfo; // used in effects handlers - Unit* unitCaster; + Unit* GetUnitCasterForEffectHandlers() const; UnitAura* _spellAura; DynObjAura* _dynObjAura; diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 813d926793c..a5317922595 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -387,13 +387,13 @@ void Spell::EffectResurrectNew() if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; - if (!corpseTarget && !unitTarget) + if (!m_corpseTarget && !unitTarget) return; Player* player = nullptr; - if (corpseTarget) - player = ObjectAccessor::FindPlayer(corpseTarget->GetOwnerGUID()); + if (m_corpseTarget) + player = ObjectAccessor::FindPlayer(m_corpseTarget->GetOwnerGUID()); else if (unitTarget) player = unitTarget->ToPlayer(); @@ -431,7 +431,7 @@ void Spell::EffectInstaKill() data.SpellID = m_spellInfo->Id; m_caster->SendMessageToSet(data.Write(), true); - Unit::Kill(unitCaster, unitTarget, false); + Unit::Kill(GetUnitCasterForEffectHandlers(), unitTarget, false); } void Spell::EffectEnvironmentalDMG() @@ -447,6 +447,7 @@ void Spell::EffectEnvironmentalDMG() unitTarget->ToPlayer()->EnvironmentalDamage(DAMAGE_FIRE, damage); else { + Unit* unitCaster = GetUnitCasterForEffectHandlers(); DamageInfo damageInfo(unitCaster, unitTarget, damage, m_spellInfo, m_spellInfo->GetSchoolMask(), SPELL_DIRECT_DAMAGE, BASE_ATTACK); Unit::CalcAbsorbResist(damageInfo); @@ -478,6 +479,7 @@ void Spell::EffectSchoolDMG() damage /= count; } + Unit* unitCaster = GetUnitCasterForEffectHandlers(); switch (m_spellInfo->SpellFamilyName) { case SPELLFAMILY_GENERIC: @@ -522,7 +524,7 @@ void Spell::EffectDummy() if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; - if (!unitTarget && !gameObjTarget && !itemTarget && !corpseTarget) + if (!unitTarget && !gameObjTarget && !itemTarget && !m_corpseTarget) return; // pet auras @@ -800,6 +802,7 @@ void Spell::EffectTriggerRitualOfSummoning() void Spell::CalculateJumpSpeeds(SpellEffectInfo const* effInfo, float dist, float& speedXY, float& speedZ) { + Unit* unitCaster = GetUnitCasterForEffectHandlers(); float runSpeed = unitCaster->IsControlledByPlayer() ? playerBaseMoveSpeed[MOVE_RUN] : baseMoveSpeed[MOVE_RUN]; if (Creature* creature = unitCaster->ToCreature()) runSpeed *= creature->GetCreatureTemplate()->speed_run; @@ -830,6 +833,7 @@ void Spell::EffectJump() if (effectHandleMode != SPELL_EFFECT_HANDLE_LAUNCH_TARGET) return; + Unit* unitCaster = GetUnitCasterForEffectHandlers(); if (!unitCaster) return; @@ -852,6 +856,7 @@ void Spell::EffectJumpDest() if (effectHandleMode != SPELL_EFFECT_HANDLE_LAUNCH) return; + Unit* unitCaster = GetUnitCasterForEffectHandlers(); if (!unitCaster) return; @@ -1009,6 +1014,7 @@ void Spell::EffectPowerDrain() if (!unitTarget || !unitTarget->IsAlive() || unitTarget->GetPowerType() != powerType || damage < 0) return; + Unit* unitCaster = GetUnitCasterForEffectHandlers(); // add spell damage bonus if (unitCaster) { @@ -1047,8 +1053,8 @@ void Spell::EffectSendEvent() target = unitTarget; else if (gameObjTarget) target = gameObjTarget; - else if (corpseTarget) - target = corpseTarget; + else if (m_corpseTarget) + target = m_corpseTarget; } else // if (effectHandleMode == SPELL_EFFECT_HANDLE_HIT) { @@ -1089,7 +1095,7 @@ void Spell::EffectPowerBurn() int32 newDamage = -(unitTarget->ModifyPower(powerType, -damage)); // NO - Not a typo - EffectPowerBurn uses effect value multiplier - not effect damage multiplier - float dmgMultiplier = effectInfo->CalcValueMultiplier(unitCaster, this); + float dmgMultiplier = effectInfo->CalcValueMultiplier(GetUnitCasterForEffectHandlers(), this); // add log data before multiplication (need power amount, not damage) ExecuteLogEffectTakeTargetPower(SpellEffectName(effectInfo->Effect), unitTarget, powerType, newDamage, 0.0f); @@ -1107,6 +1113,8 @@ void Spell::EffectHeal() if (!unitTarget || !unitTarget->IsAlive() || damage < 0) return; + Unit* unitCaster = GetUnitCasterForEffectHandlers(); + // Skip if m_originalCaster not available if (!unitCaster) return; @@ -1154,7 +1162,7 @@ void Spell::EffectHealPct() return; uint32 heal = unitTarget->CountPctFromMaxHealth(damage); - if (unitCaster) + if (Unit* unitCaster = GetUnitCasterForEffectHandlers()) { heal = unitCaster->SpellHealingBonusDone(unitTarget, m_spellInfo, heal, HEAL, *effectInfo); heal = unitTarget->SpellHealingBonusTaken(unitCaster, m_spellInfo, heal, HEAL); @@ -1171,6 +1179,7 @@ void Spell::EffectHealMechanical() if (!unitTarget || !unitTarget->IsAlive() || damage < 0) return; + Unit* unitCaster = GetUnitCasterForEffectHandlers(); uint32 heal = damage; if (unitCaster) heal = unitCaster->SpellHealingBonusDone(unitTarget, m_spellInfo, heal, HEAL, *effectInfo); @@ -1190,6 +1199,7 @@ void Spell::EffectHealthLeech() if (!unitTarget || !unitTarget->IsAlive() || damage < 0) return; + Unit* unitCaster = GetUnitCasterForEffectHandlers(); uint32 bonus = 0; if (unitCaster) bonus = unitCaster->SpellDamageBonusDone(unitTarget, m_spellInfo, uint32(damage), SPELL_DIRECT_DAMAGE, *effectInfo); @@ -1383,6 +1393,7 @@ void Spell::EffectPersistentAA() if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) return; + Unit* unitCaster = GetUnitCasterForEffectHandlers(); if (!unitCaster) return; @@ -1429,6 +1440,7 @@ void Spell::EffectEnergize() if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; + Unit* unitCaster = GetUnitCasterForEffectHandlers(); if (!unitCaster || !unitTarget) return; @@ -1472,6 +1484,7 @@ void Spell::EffectEnergizePct() if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; + Unit* unitCaster = GetUnitCasterForEffectHandlers(); if (!unitCaster || !unitTarget) return; @@ -1848,6 +1861,8 @@ void Spell::EffectSummonType() int32 duration = m_spellInfo->CalcDuration(caster); + Unit* unitCaster = GetUnitCasterForEffectHandlers(); + TempSummon* summon = nullptr; // determine how many units should be summoned @@ -2526,6 +2541,7 @@ void Spell::EffectTameCreature() if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; + Unit* unitCaster = GetUnitCasterForEffectHandlers(); if (!unitCaster || !unitCaster->GetPetGUID().IsEmpty()) return; @@ -2581,7 +2597,7 @@ void Spell::EffectSummonPet() return; Player* owner = nullptr; - if (unitCaster) + if (Unit* unitCaster = GetUnitCasterForEffectHandlers()) { owner = unitCaster->ToPlayer(); if (!owner && unitCaster->IsTotem()) @@ -2696,6 +2712,7 @@ void Spell::EffectTaunt() if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; + Unit* unitCaster = GetUnitCasterForEffectHandlers(); if (!unitCaster) return; @@ -2735,6 +2752,7 @@ void Spell::EffectWeaponDmg() if (effectHandleMode != SPELL_EFFECT_HANDLE_LAUNCH_TARGET) return; + Unit* unitCaster = GetUnitCasterForEffectHandlers(); if (!unitCaster) return; @@ -2856,6 +2874,7 @@ void Spell::EffectThreat() if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; + Unit* unitCaster = GetUnitCasterForEffectHandlers(); if (!unitCaster || !unitCaster->IsAlive()) return; @@ -2873,6 +2892,7 @@ void Spell::EffectHealMaxHealth() if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; + Unit* unitCaster = GetUnitCasterForEffectHandlers(); if (!unitCaster) return; @@ -2911,7 +2931,7 @@ void Spell::EffectInterruptCast() || (spell->getState() == SPELL_STATE_PREPARING && spell->GetCastTime() > 0.0f)) && curSpellInfo->CanBeInterrupted(m_caster, unitTarget)) { - if (unitCaster) + if (Unit* unitCaster = GetUnitCasterForEffectHandlers()) { int32 duration = m_spellInfo->GetDuration(); duration = unitTarget->ModSpellDuration(m_spellInfo, unitTarget, duration, false, 1 << effectInfo->EffectIndex); @@ -2989,6 +3009,8 @@ void Spell::EffectScriptEffect() if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; + Unit* unitCaster = GetUnitCasterForEffectHandlers(); + /// @todo we must implement hunter pet summon at login there (spell 6962) /// @todo: move this to scripts switch (m_spellInfo->SpellFamilyName) @@ -3291,6 +3313,7 @@ void Spell::EffectSummonPlayer() if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; + Unit* unitCaster = GetUnitCasterForEffectHandlers(); if (!unitCaster) return; @@ -3627,6 +3650,7 @@ void Spell::EffectSummonObject() if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) return; + Unit* unitCaster = GetUnitCasterForEffectHandlers(); if (!unitCaster) return; @@ -3684,13 +3708,13 @@ void Spell::EffectResurrect() if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; - if (!corpseTarget && !unitTarget) + if (!m_corpseTarget && !unitTarget) return; Player* player = nullptr; - if (corpseTarget) - player = ObjectAccessor::FindPlayer(corpseTarget->GetOwnerGUID()); + if (m_corpseTarget) + player = ObjectAccessor::FindPlayer(m_corpseTarget->GetOwnerGUID()); else if (unitTarget) player = unitTarget->ToPlayer(); @@ -3810,6 +3834,7 @@ void Spell::EffectForceDeselect() if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) return; + Unit* unitCaster = GetUnitCasterForEffectHandlers(); if (!unitCaster) return; @@ -3939,6 +3964,7 @@ void Spell::EffectCharge() if (!unitTarget) return; + Unit* unitCaster = GetUnitCasterForEffectHandlers(); if (!unitCaster) return; @@ -3997,6 +4023,7 @@ void Spell::EffectChargeDest() if (!destTarget) return; + Unit* unitCaster = GetUnitCasterForEffectHandlers(); if (!unitCaster) return; @@ -4325,6 +4352,7 @@ void Spell::EffectDestroyAllTotems() if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) return; + Unit* unitCaster = GetUnitCasterForEffectHandlers(); if (!unitCaster) return; @@ -4425,6 +4453,7 @@ void Spell::EffectModifyThreatPercent() if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; + Unit* unitCaster = GetUnitCasterForEffectHandlers(); if (!unitCaster || !unitTarget) return; @@ -4436,6 +4465,7 @@ void Spell::EffectTransmitted() if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) return; + Unit* unitCaster = GetUnitCasterForEffectHandlers(); if (!unitCaster) return; @@ -4657,8 +4687,8 @@ void Spell::EffectSkinPlayerCorpse() Player* target = nullptr; if (unitTarget) target = unitTarget->ToPlayer(); - else if (corpseTarget) - target = ObjectAccessor::FindPlayer(corpseTarget->GetOwnerGUID()); + else if (m_corpseTarget) + target = ObjectAccessor::FindPlayer(m_corpseTarget->GetOwnerGUID()); if (!player || !target || target->IsAlive()) return; @@ -4894,6 +4924,7 @@ void Spell::EffectRedirectThreat() if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; + Unit* unitCaster = GetUnitCasterForEffectHandlers(); if (!unitCaster) return; @@ -4940,6 +4971,7 @@ void Spell::EffectGameObjectSetDestructionState() void Spell::SummonGuardian(SpellEffectInfo const* effect, uint32 entry, SummonPropertiesEntry const* properties, uint32 numGuardians, ObjectGuid privateObjectOwner) { + Unit* unitCaster = GetUnitCasterForEffectHandlers(); if (!unitCaster) return; @@ -5335,6 +5367,7 @@ void Spell::EffectCreateAreaTrigger() if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) return; + Unit* unitCaster = GetUnitCasterForEffectHandlers(); if (!unitCaster || !m_targets.HasDst()) return; @@ -5401,6 +5434,7 @@ void Spell::EffectCreateConversation() if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) return; + Unit* unitCaster = GetUnitCasterForEffectHandlers(); if (!unitCaster || !m_targets.HasDst()) return; @@ -5705,6 +5739,7 @@ void Spell::EffectCreateSceneObject() if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) return; + Unit* unitCaster = GetUnitCasterForEffectHandlers(); if (!unitCaster || !m_targets.HasDst()) return; @@ -5725,6 +5760,7 @@ void Spell::EffectCreatePrivateSceneObject() if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) return; + Unit* unitCaster = GetUnitCasterForEffectHandlers(); if (!unitCaster || !m_targets.HasDst()) return; @@ -5773,6 +5809,7 @@ void Spell::EffectJumpCharge() if (effectHandleMode != SPELL_EFFECT_HANDLE_LAUNCH) return; + Unit* unitCaster = GetUnitCasterForEffectHandlers(); if (!unitCaster) return; @@ -5896,6 +5933,7 @@ void Spell::EffectCreatePrivateConversation() if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) return; + Unit* unitCaster = GetUnitCasterForEffectHandlers(); if (!unitCaster || !unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER) return; @@ -5907,6 +5945,7 @@ void Spell::EffectSendChatMessage() if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT) return; + Unit* unitCaster = GetUnitCasterForEffectHandlers(); if (!unitCaster) return; diff --git a/src/server/game/Spells/SpellScript.cpp b/src/server/game/Spells/SpellScript.cpp index e82d1111465..0029986471a 100644 --- a/src/server/game/Spells/SpellScript.cpp +++ b/src/server/game/Spells/SpellScript.cpp @@ -633,7 +633,7 @@ Corpse* SpellScript::GetHitCorpse() const TC_LOG_ERROR("scripts", "Script: `%s` Spell: `%u`: function SpellScript::GetHitCorpse was called, but function has no effect in current hook!", m_scriptName->c_str(), m_scriptSpellId); return nullptr; } - return m_spell->corpseTarget; + return m_spell->m_corpseTarget; } WorldLocation* SpellScript::GetHitDest() const |