From 2aa0003d4278b92bb21916dd96830b8fb1a0f426 Mon Sep 17 00:00:00 2001 From: Olion Date: Sun, 14 Feb 2016 23:12:21 +0200 Subject: [PATCH] Player::TeleportTo() signature change to request undelayed teleport --- src/game/Object/Player.cpp | 56 ++++++++++---------------- src/game/Object/Player.h | 2 +- src/game/WorldHandlers/MiscHandler.cpp | 12 +++++- 3 files changed, 33 insertions(+), 37 deletions(-) diff --git a/src/game/Object/Player.cpp b/src/game/Object/Player.cpp index 87f9b586..e3da2bde 100644 --- a/src/game/Object/Player.cpp +++ b/src/game/Object/Player.cpp @@ -1525,7 +1525,7 @@ ChatTagFlags Player::GetChatTag() const return CHAT_TAG_NONE; } -bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientation, uint32 options /*=0*/, AreaTrigger const* at /*=NULL*/) +bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientation, uint32 options /*=0*/, bool allowNoDelay /*=false*/) { if (!MapManager::IsValidMapCoord(mapid, x, y, z, orientation)) { @@ -1550,29 +1550,11 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati if (!InBattleGround() && mEntry->IsBattleGround()) { return false; } - // Get MapEntrance trigger if teleport to other -nonBG- map - bool assignedAreaTrigger = false; - if (GetMapId() != mapid && !mEntry->IsBattleGround() && !at) - { - at = sObjectMgr.GetMapEntranceTrigger(mapid); - assignedAreaTrigger = true; - } - // Check requirements for teleport - if (at) + if (!IsAlive() && mEntry->IsDungeon()) // rare case of teleporting the player into an instance with no areatrigger participation { - uint32 miscRequirement = 0; - AreaLockStatus lockStatus = GetAreaTriggerLockStatus(at, miscRequirement); - if (lockStatus != AREA_LOCKSTATUS_OK) - { - SendTransferAbortedByLockStatus(mEntry, lockStatus, miscRequirement); - return false; - } - if (IsDead() && mEntry->IsDungeon()) // rare case of teleporting the player into an instance with no areatrigger participation - { - ResurrectPlayer(0.5f); - SpawnCorpseBones(); - } + ResurrectPlayer(0.5f); + SpawnCorpseBones(); } // if we were on a transport, leave @@ -1601,13 +1583,16 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati // setup delayed teleport flag // if teleport spell is casted in Unit::Update() func // then we need to delay it until update process will be finished - if (SetDelayedTeleportFlagIfCan()) + if (!allowNoDelay) { - SetSemaphoreTeleportNear(true); - // lets save teleport destination for player - m_teleport_dest = WorldLocation(mapid, x, y, z, orientation); - m_teleport_options = options; - return true; + if (SetDelayedTeleportFlagIfCan()) + { + SetSemaphoreTeleportNear(true); + // lets save teleport destination for player + m_teleport_dest = WorldLocation(mapid, x, y, z, orientation); + m_teleport_options = options; + return true; + } } if (!(options & TELE_TO_NOT_UNSUMMON_PET)) @@ -1652,13 +1637,16 @@ bool Player::TeleportTo(uint32 mapid, float x, float y, float z, float orientati // setup delayed teleport flag // if teleport spell is casted in Unit::Update() func // then we need to delay it until update process will be finished - if (SetDelayedTeleportFlagIfCan()) + if (!allowNoDelay) { - SetSemaphoreTeleportFar(true); - // lets save teleport destination for player - m_teleport_dest = WorldLocation(mapid, x, y, z, orientation); - m_teleport_options = options; - return true; + if (SetDelayedTeleportFlagIfCan()) + { + SetSemaphoreTeleportFar(true); + // lets save teleport destination for player + m_teleport_dest = WorldLocation(mapid, x, y, z, orientation); + m_teleport_options = options; + return true; + } } SetSelectionGuid(ObjectGuid()); diff --git a/src/game/Object/Player.h b/src/game/Object/Player.h index 8a1a971f..841e9ada 100644 --- a/src/game/Object/Player.h +++ b/src/game/Object/Player.h @@ -908,7 +908,7 @@ class Player : public Unit void AddToWorld() override; void RemoveFromWorld() override; - bool TeleportTo(uint32 mapid, float x, float y, float z, float orientation, uint32 options = 0, AreaTrigger const* at = NULL); + bool TeleportTo(uint32 mapid, float x, float y, float z, float orientation, uint32 options = 0, bool allowNoDelay = false); bool TeleportTo(WorldLocation const& loc, uint32 options = 0) { diff --git a/src/game/WorldHandlers/MiscHandler.cpp b/src/game/WorldHandlers/MiscHandler.cpp index 8958ee40..260f9a23 100644 --- a/src/game/WorldHandlers/MiscHandler.cpp +++ b/src/game/WorldHandlers/MiscHandler.cpp @@ -811,8 +811,16 @@ void WorldSession::HandleAreaTriggerOpcode(WorldPacket& recv_data) player->SpawnCorpseBones(); } - // teleport player (trigger requirement will be checked on TeleportTo) - player->TeleportTo(at->target_mapId, at->target_X, at->target_Y, at->target_Z, at->target_Orientation, TELE_TO_NOT_LEAVE_TRANSPORT, at); + uint32 miscRequirement = 0; + AreaLockStatus lockStatus = player->GetAreaTriggerLockStatus(at, miscRequirement); + if (lockStatus != AREA_LOCKSTATUS_OK) + { + player->SendTransferAbortedByLockStatus(targetMapEntry, lockStatus, miscRequirement); + return; + } + + // teleport player + player->TeleportTo(at->target_mapId, at->target_X, at->target_Y, at->target_Z, at->target_Orientation, TELE_TO_NOT_LEAVE_TRANSPORT, true); } void WorldSession::HandleUpdateAccountData(WorldPacket& recv_data)