aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities/Player
diff options
context:
space:
mode:
authorTreeston <treeston.mmoc@gmail.com>2018-09-17 13:14:56 +0200
committerTreeston <treeston.mmoc@gmail.com>2018-09-17 13:14:56 +0200
commit28591fd1658e3e4842d64f330f27c233dc69aad2 (patch)
treed8947d256615f4bf86aebd8c0dbb8c746472654f /src/server/game/Entities/Player
parent003cc56d70c9b07f4484cb82484091ab4013895a (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.cpp9
-rw-r--r--src/server/game/Entities/Player/Player.h6
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; }