From 8b70222ae29247de431e5b3e422b11c38111ea41 Mon Sep 17 00:00:00 2001 From: UltraNix <80540499+UltraNix@users.noreply.github.com> Date: Fri, 15 Oct 2021 00:54:18 +0200 Subject: [PATCH] fix(Core/Spells): Revive pet cannot be used on alive pets. (#8434) Fixes #8315 --- src/server/game/Entities/Pet/Pet.cpp | 15 +++++++++++---- src/server/game/Entities/Pet/Pet.h | 2 +- src/server/game/Spells/Spell.cpp | 19 +++++++++++++++---- 3 files changed, 27 insertions(+), 9 deletions(-) diff --git a/src/server/game/Entities/Pet/Pet.cpp b/src/server/game/Entities/Pet/Pet.cpp index 2afc056ec..dda0fc7a5 100644 --- a/src/server/game/Entities/Pet/Pet.cpp +++ b/src/server/game/Entities/Pet/Pet.cpp @@ -115,7 +115,7 @@ void Pet::RemoveFromWorld() } } -SpellCastResult Pet::TryLoadFromDB(Player* owner, bool current /*= false*/, PetType mandatoryPetType /*= MAX_PET_TYPE*/) +SpellCastResult Pet::TryLoadFromDB(Player* owner, bool current /*= false*/, PetType mandatoryPetType /*= MAX_PET_TYPE*/, bool checkDead /*= false*/) { CharacterDatabasePreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_SEL_CHAR_PET_BY_ENTRY_AND_SLOT_SYNS); stmt->setUInt32(0, owner->GetGUID().GetCounter()); @@ -151,10 +151,17 @@ SpellCastResult Pet::TryLoadFromDB(Player* owner, bool current /*= false*/, PetT if (current && isTemporarySummoned) return SPELL_FAILED_NO_PET; - if (!savedHealth) + if (!checkDead) { - owner->ToPlayer()->SendTameFailure(PET_TAME_DEAD); - return SPELL_FAILED_TARGETS_DEAD; + if (!savedHealth) + { + owner->ToPlayer()->SendTameFailure(PET_TAME_DEAD); + return SPELL_FAILED_TARGETS_DEAD; + } + } + else if (savedHealth) + { + return SPELL_FAILED_TARGET_NOT_DEAD; } if (mandatoryPetType != MAX_PET_TYPE && petType != mandatoryPetType) diff --git a/src/server/game/Entities/Pet/Pet.h b/src/server/game/Entities/Pet/Pet.h index 398d5106e..be8a4327d 100644 --- a/src/server/game/Entities/Pet/Pet.h +++ b/src/server/game/Entities/Pet/Pet.h @@ -73,7 +73,7 @@ public: bool CreateBaseAtCreature(Creature* creature); bool CreateBaseAtCreatureInfo(CreatureTemplate const* cinfo, Unit* owner); bool CreateBaseAtTamed(CreatureTemplate const* cinfo, Map* map, uint32 phaseMask); - static SpellCastResult TryLoadFromDB(Player* owner, bool current = false, PetType mandatoryPetType = MAX_PET_TYPE); + static SpellCastResult TryLoadFromDB(Player* owner, bool current = false, PetType mandatoryPetType = MAX_PET_TYPE, bool checkDead = false); static bool LoadPetFromDB(Player* owner, uint8 asynchLoadType, uint32 petentry = 0, uint32 petnumber = 0, bool current = false, AsynchPetSummon* info = nullptr); bool isBeingLoaded() const override { return m_loading;} void SavePetToDB(PetSaveMode mode, bool logout); diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index ec38f1192..67780c75f 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -5898,10 +5898,21 @@ SpellCastResult Spell::CheckCast(bool strict) } case SPELL_EFFECT_RESURRECT_PET: { - Creature* pet = m_caster->GetGuardianPet(); - - if (pet && pet->IsAlive()) - return SPELL_FAILED_ALREADY_HAVE_SUMMON; + if (Creature* pet = m_caster->GetGuardianPet()) + { + if (pet->IsAlive()) + { + return SPELL_FAILED_ALREADY_HAVE_SUMMON; + } + } + else if (Player* player = m_caster->ToPlayer()) + { + SpellCastResult loadResult = Pet::TryLoadFromDB(player, false, MAX_PET_TYPE, true); + if (loadResult != SPELL_CAST_OK) + { + return loadResult; + } + } break; }