diff options
| author | Shauren <shauren.trinity@gmail.com> | 2022-02-02 00:08:37 +0100 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2022-02-02 00:08:37 +0100 |
| commit | 950db60435e7e513633ff5b22ad7f0ed8b1147e4 (patch) | |
| tree | cb5b9e47570528dea0374f804f829512c89a5410 /src/server/game/Spells | |
| parent | d6a2461fc77f156dfe9e62c1c2387815c27e43de (diff) | |
Core/Pets: Updated pet summoning for latest client version (5 Call Pet spells and stable size 200)
Diffstat (limited to 'src/server/game/Spells')
| -rw-r--r-- | src/server/game/Spells/Spell.cpp | 49 | ||||
| -rw-r--r-- | src/server/game/Spells/SpellEffects.cpp | 42 |
2 files changed, 71 insertions, 20 deletions
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 95fd1f1a61d..03c1fc92a9e 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -5928,13 +5928,23 @@ SpellCastResult Spell::CheckCast(bool strict, int32* param1 /*= nullptr*/, int32 } case SPELL_EFFECT_RESURRECT_PET: { - Unit* unitCaster = m_caster->ToUnit(); - if (!unitCaster) + Player* playerCaster = m_caster->ToPlayer(); + if (!playerCaster || !playerCaster->GetPetStable()) return SPELL_FAILED_BAD_TARGETS; - Creature* pet = unitCaster->GetGuardianPet(); + Pet* pet = playerCaster->GetPet(); if (pet && pet->IsAlive()) return SPELL_FAILED_ALREADY_HAVE_SUMMON; + + PetStable const* petStable = playerCaster->GetPetStable(); + auto deadPetItr = std::find_if(petStable->ActivePets.begin(), petStable->ActivePets.end(), [](Optional<PetStable::PetInfo> const& petInfo) + { + return petInfo && !petInfo->Health; + }); + + if (deadPetItr == petStable->ActivePets.end()) + return SPELL_FAILED_BAD_TARGETS; + break; } // This is generic summon effect @@ -5998,17 +6008,27 @@ SpellCastResult Spell::CheckCast(bool strict, int32* param1 /*= nullptr*/, int32 Player* playerCaster = unitCaster->ToPlayer(); if (playerCaster && playerCaster->GetPetStable()) { - std::pair<PetStable::PetInfo const*, PetSaveMode> info = Pet::GetLoadPetInfo(*playerCaster->GetPetStable(), spellEffectInfo.MiscValue, 0, false); - if (info.first) + Optional<PetSaveMode> petSlot; + if (!spellEffectInfo.MiscValue) { - if (info.first->Type == HUNTER_PET) + petSlot = PetSaveMode(spellEffectInfo.CalcValue()); + + // No pet can be summoned if any pet is dead + for (Optional<PetStable::PetInfo> const& activePet : playerCaster->GetPetStable()->ActivePets) { - if (!info.first->Health) + if (activePet && !activePet->Health) { playerCaster->SendTameFailure(PetTameResult::Dead); return SPELL_FAILED_DONT_REPORT; } + } + } + std::pair<PetStable::PetInfo const*, PetSaveMode> info = Pet::GetLoadPetInfo(*playerCaster->GetPetStable(), spellEffectInfo.MiscValue, 0, petSlot); + if (info.first) + { + if (info.first->Type == HUNTER_PET) + { CreatureTemplate const* creatureInfo = sObjectMgr->GetCreatureTemplate(info.first->CreatureId); if (!creatureInfo || !creatureInfo->IsTameable(playerCaster->CanTameExoticPets())) { @@ -6031,6 +6051,21 @@ SpellCastResult Spell::CheckCast(bool strict, int32* param1 /*= nullptr*/, int32 break; } + case SPELL_EFFECT_DISMISS_PET: + { + Player* playerCaster = m_caster->ToPlayer(); + if (!playerCaster) + return SPELL_FAILED_BAD_TARGETS; + + Pet* pet = playerCaster->GetPet(); + if (!pet) + return SPELL_FAILED_NO_PET; + + if (!pet->IsAlive()) + return SPELL_FAILED_TARGETS_DEAD; + + break; + } case SPELL_EFFECT_SUMMON_PLAYER: { if (m_caster->GetTypeId() != TYPEID_PLAYER) diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp index 2cdf9006079..edd59647a76 100644 --- a/src/server/game/Spells/SpellEffects.cpp +++ b/src/server/game/Spells/SpellEffects.cpp @@ -2626,26 +2626,34 @@ void Spell::EffectSummonPet() return; } + Optional<PetSaveMode> petSlot; + if (!petentry) + petSlot = PetSaveMode(damage); + float x, y, z; owner->GetClosePoint(x, y, z, owner->GetCombatReach()); - Pet* pet = owner->SummonPet(petentry, x, y, z, owner->GetOrientation(), SUMMON_PET, 0); + bool isNew = false; + Pet* pet = owner->SummonPet(petentry, petSlot, x, y, z, owner->GetOrientation(), 0, &isNew); if (!pet) return; - if (m_caster->GetTypeId() == TYPEID_UNIT) + if (isNew) { - if (m_caster->ToCreature()->IsTotem()) - pet->SetReactState(REACT_AGGRESSIVE); - else - pet->SetReactState(REACT_DEFENSIVE); - } + if (m_caster->GetTypeId() == TYPEID_UNIT) + { + if (m_caster->ToCreature()->IsTotem()) + pet->SetReactState(REACT_AGGRESSIVE); + else + pet->SetReactState(REACT_DEFENSIVE); + } - pet->SetCreatedBySpell(m_spellInfo->Id); + pet->SetCreatedBySpell(m_spellInfo->Id); - // generate new name for summon pet - std::string new_name = sObjectMgr->GeneratePetName(petentry); - if (!new_name.empty()) - pet->SetName(new_name); + // generate new name for summon pet + std::string new_name = sObjectMgr->GeneratePetName(petentry); + if (!new_name.empty()) + pet->SetName(new_name); + } ExecuteLogEffectSummonObject(SpellEffectName(effectInfo->Effect), pet); } @@ -4252,9 +4260,17 @@ void Spell::EffectResurrectPet() if (!player->GetPet()) { + PetStable const* petStable = player->GetPetStable(); + auto deadPetItr = std::find_if(petStable->ActivePets.begin(), petStable->ActivePets.end(), [](Optional<PetStable::PetInfo> const& petInfo) + { + return petInfo && !petInfo->Health; + }); + + PetSaveMode slot = PetSaveMode(std::distance(petStable->ActivePets.begin(), deadPetItr)); + // Position passed to SummonPet is irrelevant with current implementation, // pet will be relocated without using these coords in Pet::LoadPetFromDB - player->SummonPet(0, 0.0f, 0.0f, 0.0f, 0.0f, SUMMON_PET, 0); + player->SummonPet(0, slot, 0.0f, 0.0f, 0.0f, 0.0f, 0); hadPet = false; } |
