diff options
| author | Treeston <treeston.mmoc@gmail.com> | 2018-09-17 13:14:56 +0200 |
|---|---|---|
| committer | Treeston <treeston.mmoc@gmail.com> | 2018-09-17 13:14:56 +0200 |
| commit | 28591fd1658e3e4842d64f330f27c233dc69aad2 (patch) | |
| tree | d8947d256615f4bf86aebd8c0dbb8c746472654f /src/server/game/Entities/Player | |
| parent | 003cc56d70c9b07f4484cb82484091ab4013895a (diff) | |
Core/Player: Delay resurrection on release for unreachable maps until teleport has completed. Closes #21481.
Diffstat (limited to 'src/server/game/Entities/Player')
| -rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 9 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/Player.h | 6 |
2 files changed, 11 insertions, 4 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 48b17451f6d..7f37550b0f9 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -1708,6 +1708,9 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati UnsummonPetTemporaryIfAny(); } + if (!IsAlive() && options & TELE_REVIVE_AT_TELEPORT) + ResurrectPlayer(0.5f); + if (!(options & TELE_TO_NOT_LEAVE_COMBAT)) CombatStop(); @@ -1814,6 +1817,7 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati oldmap->RemovePlayerFromMap(this, false); m_teleport_dest = WorldLocation(mapid, x, y, z, orientation); + m_teleport_options = options; SetFallInformation(0, GetPositionZ()); // if the player is saved before worldportack (at logout for example) // this will be used instead of the current location in SaveToDB @@ -4952,10 +4956,11 @@ void Player::RepopAtGraveyard() AreaTableEntry const* zone = sAreaTableStore.LookupEntry(GetAreaId()); + bool shouldResurrect = false; // Such zones are considered unreachable as a ghost and the player must be automatically revived if ((!IsAlive() && zone && zone->flags & AREA_FLAG_NEED_FLY) || GetTransport() || GetPositionZ() < GetMap()->GetMinHeight(GetPositionX(), GetPositionY())) { - ResurrectPlayer(0.5f); + shouldResurrect = true; SpawnCorpseBones(); } @@ -4979,7 +4984,7 @@ void Player::RepopAtGraveyard() // and don't show spirit healer location if (ClosestGrave) { - TeleportTo(ClosestGrave->map_id, ClosestGrave->x, ClosestGrave->y, ClosestGrave->z, GetOrientation()); + TeleportTo(ClosestGrave->map_id, ClosestGrave->x, ClosestGrave->y, ClosestGrave->z, GetOrientation(), shouldResurrect ? TELE_REVIVE_AT_TELEPORT : 0); if (isDead()) // not send if alive, because it used in TeleportTo() { WorldPacket data(SMSG_DEATH_RELEASE_LOC, 4*4); // show spirit healer position on minimap diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h index 14f252b2cce..98f952bc0e3 100644 --- a/src/server/game/Entities/Player/Player.h +++ b/src/server/game/Entities/Player/Player.h @@ -672,7 +672,8 @@ enum TeleportToOptions TELE_TO_NOT_LEAVE_COMBAT = 0x04, TELE_TO_NOT_UNSUMMON_PET = 0x08, TELE_TO_SPELL = 0x10, - TELE_TO_TRANSPORT_TELEPORT = 0x20 + TELE_TO_TRANSPORT_TELEPORT = 0x20, + TELE_REVIVE_AT_TELEPORT = 0x40 }; /// Type of environmental damages @@ -1721,7 +1722,8 @@ class TC_GAME_API Player : public Unit, public GridObject<Player> void LearnSkillRewardedSpells(uint32 skillId, uint32 skillValue); WorldLocation& GetTeleportDest() { return m_teleport_dest; } - bool IsBeingTeleported() const { return mSemaphoreTeleport_Near || mSemaphoreTeleport_Far; } + uint32 GetTeleportOptions() const { return m_teleport_options; } + bool IsBeingTeleported() const { return IsBeingTeleportedNear() || IsBeingTeleportedFar(); } bool IsBeingTeleportedNear() const { return mSemaphoreTeleport_Near; } bool IsBeingTeleportedFar() const { return mSemaphoreTeleport_Far; } void SetSemaphoreTeleportNear(bool semphsetting) { mSemaphoreTeleport_Near = semphsetting; } |
