aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Spells/SpellEffects.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Spells/SpellEffects.cpp')
-rw-r--r--src/server/game/Spells/SpellEffects.cpp60
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;