aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Spells/SpellEffects.cpp
diff options
context:
space:
mode:
authorGiacomo Pozzoni <giacomopoz@gmail.com>2020-06-29 21:03:03 +0000
committerShauren <shauren.trinity@gmail.com>2022-01-20 00:13:02 +0100
commit8f4db9aa6919e2b3b22ec21ffea4eacb605e9bc2 (patch)
tree9863a03c733072d6c7f8ab4125e8e683f72c3d6b /src/server/game/Spells/SpellEffects.cpp
parentb9666481bbf943000c6c925c3287c1e1c9a94e7f (diff)
Core/Spells: implement corpse target type support and properly fix resurrections (#24921)
* Core/Spells: implement corpse target type support and properly fix resurrections (cherry picked from commit df193945d9aff8596985a20e2c654105354b0af7) * Core/Spells: implement TARGET_CORPSE_SRC_AREA_RAID and updated remaining resurrection effect handlers for updated corpse targeting (cherry picked from commit 98b075cb4b0da126d409ab42daa63a1f531a70ea) * Fix no-pch Co-authored-by: Ovahlord <dreadkiller@gmx.de> (cherry picked from commit cc71da35b5dc74abf71f8691161525a23d870bb5)
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 b216bb5f372..01ea58864e8 100644
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -52,6 +52,7 @@
#include "Map.h"
#include "MiscPackets.h"
#include "MotionMaster.h"
+#include "ObjectAccessor.h"
#include "ObjectMgr.h"
#include "Opcodes.h"
#include "OutdoorPvPMgr.h"
@@ -386,25 +387,27 @@ void Spell::EffectResurrectNew()
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 = effectInfo->MiscValue;
- ExecuteLogEffectResurrect(SpellEffectName(effectInfo->Effect), target);
- target->SetResurrectRequestData(m_caster, health, mana, 0);
- SendResurrectRequest(target);
+ ExecuteLogEffectResurrect(SpellEffectName(effectInfo->Effect), player);
+ player->SetResurrectRequestData(m_caster, health, mana, 0);
+ SendResurrectRequest(player);
}
void Spell::EffectInstaKill()
@@ -519,7 +522,7 @@ void Spell::EffectDummy()
if (effectHandleMode != SPELL_EFFECT_HANDLE_HIT_TARGET)
return;
- if (!unitTarget && !gameObjTarget && !itemTarget)
+ if (!unitTarget && !gameObjTarget && !itemTarget && !corpseTarget)
return;
// pet auras
@@ -1037,6 +1040,8 @@ void Spell::EffectSendEvent()
target = unitTarget;
else if (gameObjTarget)
target = gameObjTarget;
+ else if (corpseTarget)
+ target = corpseTarget;
}
else // if (effectHandleMode == SPELL_EFFECT_HANDLE_HIT)
{
@@ -3547,24 +3552,29 @@ void Spell::EffectResurrect()
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 (target->IsResurrectRequested()) // already have one active request
+ if (!player || player->IsAlive() || !player->IsInWorld())
return;
- uint32 health = target->CountPctFromMaxHealth(damage);
- uint32 mana = CalculatePct(target->GetMaxPower(POWER_MANA), damage);
+ if (player->IsResurrectRequested()) // already have one active request
+ return;
- ExecuteLogEffectResurrect(SpellEffectName(effectInfo->Effect), target);
+ uint32 health = player->CountPctFromMaxHealth(damage);
+ uint32 mana = CalculatePct(player->GetMaxPower(POWER_MANA), damage);
- target->SetResurrectRequestData(m_caster, health, mana, 0);
- SendResurrectRequest(target);
+ ExecuteLogEffectResurrect(SpellEffectName(effectInfo->Effect), player);
+
+ player->SetResurrectRequestData(m_caster, health, mana, 0);
+ SendResurrectRequest(player);
}
void Spell::EffectAddExtraAttacks()
@@ -4503,7 +4513,13 @@ void Spell::EffectSkinPlayerCorpse()
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;