aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities/Player
diff options
context:
space:
mode:
authorGiacomo Pozzoni <giacomopoz@gmail.com>2019-08-02 16:09:02 +0200
committerGitHub <noreply@github.com>2019-08-02 16:09:02 +0200
commita0f8ce14e9a7aeceea035a733625cc695909a5bd (patch)
tree6071a22534e0738425d177479a5ec1860b2425ef /src/server/game/Entities/Player
parent543fe77d2e9d8fb94d706513d15981f8a4527e32 (diff)
3.3.5 Don't allow to summon dead hunter pets (#23271)
* Core/Player: Add support to SMSG_PET_TAME_FAILURE * Core/Pet: Don't summon dead pets when using "Call pet"
Diffstat (limited to 'src/server/game/Entities/Player')
-rw-r--r--src/server/game/Entities/Player/Player.cpp16
-rw-r--r--src/server/game/Entities/Player/Player.h3
2 files changed, 17 insertions, 2 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 0ffc9ba31b4..89fd02dbdce 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -2955,6 +2955,13 @@ void Player::SendUnlearnSpells()
SendDirectMessage(&data);
}
+void Player::SendTameFailure(uint8 result)
+{
+ WorldPacket data(SMSG_PET_TAME_FAILURE, 1);
+ data << uint8(result);
+ SendDirectMessage(&data);
+}
+
void Player::RemoveMail(uint32 id)
{
for (PlayerMails::iterator itr = m_mail.begin(); itr != m_mail.end(); ++itr)
@@ -26550,12 +26557,19 @@ Guild* Player::GetGuild()
return guildId ? sGuildMgr->GetGuildById(guildId) : nullptr;
}
-Pet* Player::SummonPet(uint32 entry, float x, float y, float z, float ang, PetType petType, uint32 duration)
+Pet* Player::SummonPet(uint32 entry, float x, float y, float z, float ang, PetType petType, uint32 duration, bool aliveOnly)
{
Pet* pet = new Pet(this, petType);
if (petType == SUMMON_PET && pet->LoadPetFromDB(this, entry))
{
+ if (aliveOnly && !pet->IsAlive())
+ {
+ pet->DespawnOrUnsummon();
+ SendTameFailure(PETTAME_DEAD);
+ return nullptr;
+ }
+
// Remove Demonic Sacrifice auras (known pet)
Unit::AuraEffectList const& auraClassScripts = GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
for (Unit::AuraEffectList::const_iterator itr = auraClassScripts.begin(); itr != auraClassScripts.end();)
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index a61285a57ff..454ab16bf11 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -1013,7 +1013,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
uint32 GetInnTriggerId() const { return inn_triggerId; }
Pet* GetPet() const;
- Pet* SummonPet(uint32 entry, float x, float y, float z, float ang, PetType petType, uint32 despwtime);
+ Pet* SummonPet(uint32 entry, float x, float y, float z, float ang, PetType petType, uint32 despwtime, bool aliveOnly = false);
void RemovePet(Pet* pet, PetSaveMode mode, bool returnreagent = false);
uint32 GetPhaseMaskForSpawn() const; // used for proper set phase for DB at GM-mode creature/GO spawn
@@ -1445,6 +1445,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
void SendTalentsInfoData(bool pet);
void LearnTalent(uint32 talentId, uint32 talentRank);
void LearnPetTalent(ObjectGuid petGuid, uint32 talentId, uint32 talentRank);
+ void SendTameFailure(uint8 result);
bool AddTalent(uint32 spellId, uint8 spec, bool learning);
bool HasTalent(uint32 spell_id, uint8 spec) const;