aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Spells
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2022-02-02 00:08:37 +0100
committerShauren <shauren.trinity@gmail.com>2022-02-02 00:08:37 +0100
commit950db60435e7e513633ff5b22ad7f0ed8b1147e4 (patch)
treecb5b9e47570528dea0374f804f829512c89a5410 /src/server/game/Spells
parentd6a2461fc77f156dfe9e62c1c2387815c27e43de (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.cpp49
-rw-r--r--src/server/game/Spells/SpellEffects.cpp42
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;
}