From 8f4db9aa6919e2b3b22ec21ffea4eacb605e9bc2 Mon Sep 17 00:00:00 2001 From: Giacomo Pozzoni Date: Mon, 29 Jun 2020 21:03:03 +0000 Subject: 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 (cherry picked from commit cc71da35b5dc74abf71f8691161525a23d870bb5) --- src/server/game/Spells/SpellEffects.cpp | 60 +++++++++++++++++++++------------ 1 file changed, 38 insertions(+), 22 deletions(-) (limited to 'src/server/game/Spells/SpellEffects.cpp') 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; -- cgit v1.2.3