aboutsummaryrefslogtreecommitdiff
path: root/src
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
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')
-rw-r--r--src/server/game/Entities/Player/Player.cpp16
-rw-r--r--src/server/game/Entities/Player/Player.h3
-rw-r--r--src/server/game/Spells/SpellEffects.cpp2
-rw-r--r--src/server/shared/SharedDefines.h17
4 files changed, 35 insertions, 3 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;
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index fddad903438..8d22a687690 100644
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -2914,7 +2914,7 @@ void Spell::EffectSummonPet(SpellEffIndex effIndex)
float x, y, z;
owner->GetClosePoint(x, y, z, owner->GetCombatReach());
- Pet* pet = owner->SummonPet(petentry, x, y, z, owner->GetOrientation(), SUMMON_PET, 0);
+ Pet* pet = owner->SummonPet(petentry, x, y, z, owner->GetOrientation(), SUMMON_PET, 0, true);
if (!pet)
return;
diff --git a/src/server/shared/SharedDefines.h b/src/server/shared/SharedDefines.h
index d49d28b3681..b829a984925 100644
--- a/src/server/shared/SharedDefines.h
+++ b/src/server/shared/SharedDefines.h
@@ -3539,6 +3539,23 @@ enum MailResponseResult
MAIL_ERR_ITEM_HAS_EXPIRED = 21
};
+enum PetTameFailure
+{
+ PETTAME_INVALIDCREATURE = 1,
+ PETTAME_TOOMANY = 2,
+ PETTAME_CREATUREALREADYOWNED = 3,
+ PETTAME_NOTTAMEABLE = 4,
+ PETTAME_ANOTHERSUMMONACTIVE = 5,
+ PETTAME_UNITSCANTTAME = 6,
+ PETTAME_NOPETAVAILABLE = 7,
+ PETTAME_INTERNALERROR = 8,
+ PETTAME_TOOHIGHLEVEL = 9,
+ PETTAME_DEAD = 10,
+ PETTAME_NOTDEAD = 11,
+ PETTAME_CANTCONTROLEXOTIC = 12,
+ PETTAME_UNKNOWNERROR = 13
+};
+
// EnumUtils: DESCRIBE THIS
enum SpellFamilyNames
{