diff options
Diffstat (limited to 'src/server/game/Spells/SpellEffects.cpp')
-rw-r--r-- | src/server/game/Spells/SpellEffects.cpp | 60 |
1 files changed, 38 insertions, 22 deletions
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 874294f5809..e8defc90144 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -36,6 +36,7 @@ #include "LootMgr.h" #include "MiscPackets.h" #include "MotionMaster.h" +#include "ObjectAccessor.h" #include "ObjectMgr.h" #include "Opcodes.h" #include "OutdoorPvPMgr.h" @@ -244,25 +245,27 @@ void Spell::EffectResurrectNew(SpellEffIndex effIndex) if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; - if (!unitTarget || unitTarget->IsAlive()) + if (!corpseTarget && !unitTarget) return; - if (unitTarget->GetTypeId() != TYPEID_PLAYER) - return; + Player* player = nullptr; - if (!unitTarget->IsInWorld()) - return; + if (corpseTarget) + player = ObjectAccessor::FindPlayer(corpseTarget->GetOwnerGUID()); + else if (unitTarget) + player = unitTarget->ToPlayer(); - Player* target = unitTarget->ToPlayer(); + if (!player || player->IsAlive() || !player->IsInWorld()) + return; - if (target->IsResurrectRequested()) // already have one active request + if (player->IsResurrectRequested()) // already have one active request return; uint32 health = damage; uint32 mana = m_spellInfo->Effects[effIndex].MiscValue; - ExecuteLogEffectResurrect(effIndex, target); - target->SetResurrectRequestData(m_caster, health, mana, 0); - SendResurrectRequest(target); + ExecuteLogEffectResurrect(effIndex, player); + player->SetResurrectRequestData(m_caster, health, mana, 0); + SendResurrectRequest(player); } void Spell::EffectInstaKill(SpellEffIndex /*effIndex*/) @@ -694,7 +697,7 @@ void Spell::EffectDummy(SpellEffIndex effIndex) if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; - if (!unitTarget && !gameObjTarget && !itemTarget) + if (!unitTarget && !gameObjTarget && !itemTarget && !corpseTarget) return; // pet auras @@ -1150,6 +1153,8 @@ void Spell::EffectSendEvent(SpellEffIndex effIndex) target = unitTarget; else if (gameObjTarget) target = gameObjTarget; + else if (corpseTarget) + target = corpseTarget; } else // if (effectHandleMode == SPELL_EFFECT_HANDLE_HIT) { @@ -4000,24 +4005,29 @@ void Spell::EffectResurrect(SpellEffIndex effIndex) if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET) return; - if (!unitTarget || unitTarget->GetTypeId() != TYPEID_PLAYER) + if (!corpseTarget && !unitTarget) return; - if (unitTarget->IsAlive() || !unitTarget->IsInWorld()) - return; + Player* player = nullptr; - Player* target = unitTarget->ToPlayer(); + if (corpseTarget) + player = ObjectAccessor::FindPlayer(corpseTarget->GetOwnerGUID()); + else if (unitTarget) + player = unitTarget->ToPlayer(); + + if (!player || player->IsAlive() || !player->IsInWorld()) + return; - if (target->IsResurrectRequested()) // already have one active request + if (player->IsResurrectRequested()) // already have one active request return; - uint32 health = target->CountPctFromMaxHealth(damage); - uint32 mana = CalculatePct(target->GetMaxPower(POWER_MANA), damage); + uint32 health = player->CountPctFromMaxHealth(damage); + uint32 mana = CalculatePct(player->GetMaxPower(POWER_MANA), damage); - ExecuteLogEffectResurrect(effIndex, target); + ExecuteLogEffectResurrect(effIndex, player); - target->SetResurrectRequestData(m_caster, health, mana, 0); - SendResurrectRequest(target); + player->SetResurrectRequestData(m_caster, health, mana, 0); + SendResurrectRequest(player); } void Spell::EffectAddExtraAttacks(SpellEffIndex effIndex) @@ -4848,7 +4858,13 @@ void Spell::EffectSkinPlayerCorpse(SpellEffIndex /*effIndex*/) TC_LOG_DEBUG("spells", "Effect: SkinPlayerCorpse"); Player* player = m_caster->ToPlayer(); - Player* target = unitTarget->ToPlayer(); + + Player* target = nullptr; + if (unitTarget) + target = unitTarget->ToPlayer(); + else if (corpseTarget) + target = ObjectAccessor::FindPlayer(corpseTarget->GetOwnerGUID()); + if (!player || !target || target->IsAlive()) return; |