diff options
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 16 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.h | 3 | ||||
-rw-r--r-- | src/server/game/Spells/SpellEffects.cpp | 2 | ||||
-rw-r--r-- | src/server/shared/SharedDefines.h | 17 |
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 { |