diff options
| author | Giacomo Pozzoni <giacomopoz@gmail.com> | 2020-06-29 21:03:03 +0000 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2022-01-20 00:13:02 +0100 |
| commit | 8f4db9aa6919e2b3b22ec21ffea4eacb605e9bc2 (patch) | |
| tree | 9863a03c733072d6c7f8ab4125e8e683f72c3d6b /src/server/game/Spells/SpellEffects.cpp | |
| parent | b9666481bbf943000c6c925c3287c1e1c9a94e7f (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.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 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; |
