diff options
| author | Shauren <shauren.trinity@gmail.com> | 2024-03-02 15:06:33 +0100 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2024-03-02 15:06:33 +0100 |
| commit | f2ce5072d62e2835c4426220ebf8ade5fa67a79b (patch) | |
| tree | 3634fe43193476be3862112ea16f4696f93277bf /src/server/game/Entities/Player | |
| parent | bd8cc0e5724a1b5c07f25e1547d2f3125b1fff8b (diff) | |
Core/Creatures: Implemented unsummoning and resummoning critter pets on flying mounts and teleports (and related static flags)
Diffstat (limited to 'src/server/game/Entities/Player')
| -rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 32 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/Player.h | 5 |
2 files changed, 35 insertions, 2 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 03a0f270781..7498890db63 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -1568,6 +1568,7 @@ void Player::RemoveFromWorld() StopCastingCharm(); StopCastingBindSight(); UnsummonPetTemporaryIfAny(); + UnsummonBattlePetTemporaryIfAny(); SetPower(POWER_COMBO_POINTS, 0); m_session->DoLootReleaseAll(); m_lootRolls.clear(); @@ -21663,7 +21664,7 @@ void Player::RemovePetAura(PetAura const* petSpell) pet->RemoveAurasDueToSpell(petSpell->GetAura(pet->GetEntry())); } -Creature* Player::GetSummonedBattlePet() +Creature* Player::GetSummonedBattlePet() const { if (Creature* summonedBattlePet = ObjectAccessor::GetCreatureOrPetOrVehicle(*this, GetCritterGUID())) if (!GetSummonedBattlePetGUID().IsEmpty() && GetSummonedBattlePetGUID() == summonedBattlePet->GetBattlePetCompanionGUID()) @@ -27120,6 +27121,35 @@ void Player::ResummonPetTemporaryUnSummonedIfAny() m_temporaryUnsummonedPetNumber = 0; } +void Player::UnsummonBattlePetTemporaryIfAny(bool onFlyingMount /*= false*/) +{ + Creature* battlepet = GetSummonedBattlePet(); + if (!battlepet || !battlepet->IsSummon()) + return; + + if (onFlyingMount && !battlepet->ToTempSummon()->IsDismissedOnFlyingMount()) + return; + + if (battlepet->ToTempSummon()->IsAutoResummoned()) + m_temporaryUnsummonedBattlePet = battlepet->GetBattlePetCompanionGUID(); + + GetSession()->GetBattlePetMgr()->DismissPet(); +} + +void Player::ResummonBattlePetTemporaryUnSummonedIfAny() +{ + if (m_temporaryUnsummonedBattlePet.IsEmpty()) + return; + + // not resummon in not appropriate state + if (IsPetNeedBeTemporaryUnsummoned()) + return; + + GetSession()->GetBattlePetMgr()->SummonPet(m_temporaryUnsummonedBattlePet); + + m_temporaryUnsummonedBattlePet.Clear(); +} + bool Player::IsPetNeedBeTemporaryUnsummoned() const { return !IsInWorld() || !IsAlive() || HasUnitMovementFlag(MOVEMENTFLAG_FLYING) || HasExtraUnitMovementFlag2(MOVEMENTFLAG3_ADV_FLYING); diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 5d8c7a6d03f..80eed2d2ccd 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -1238,7 +1238,7 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player> void AddPetAura(PetAura const* petSpell); void RemovePetAura(PetAura const* petSpell); - Creature* GetSummonedBattlePet(); + Creature* GetSummonedBattlePet() const; void SetBattlePetData(BattlePets::BattlePet const* pet = nullptr); /// Handles said message in regular chat based on declared language and in config pre-defined Range. @@ -2548,6 +2548,8 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player> void EnablePetControlsOnDismount(); void UnsummonPetTemporaryIfAny(); void ResummonPetTemporaryUnSummonedIfAny(); + void UnsummonBattlePetTemporaryIfAny(bool onFlyingMount = false); + void ResummonBattlePetTemporaryUnSummonedIfAny(); bool IsPetNeedBeTemporaryUnsummoned() const; void SendCinematicStart(uint32 CinematicSequenceId) const; @@ -3188,6 +3190,7 @@ class TC_GAME_API Player final : public Unit, public GridObject<Player> uint32 m_temporaryUnsummonedPetNumber; Optional<ReactStates> m_temporaryPetReactState; uint32 m_oldpetspell; + ObjectGuid m_temporaryUnsummonedBattlePet; std::unique_ptr<PlayerAchievementMgr> m_achievementMgr; std::unique_ptr<ReputationMgr> m_reputationMgr; |
