diff options
author | Shauren <shauren.trinity@gmail.com> | 2015-05-01 15:44:43 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2015-05-01 15:44:43 +0200 |
commit | 68bd33b6549563ac3b719c27aa16cc4ebd33890a (patch) | |
tree | f3b12dbac650877fcc2f5cfa3ab714d1de44ddea /src/server/game/Handlers/MovementHandler.cpp | |
parent | 522ae49c6a17e51826ad7f62d2588e0866eb2639 (diff) |
Core/Player: Implemented seamless teleporting
Diffstat (limited to 'src/server/game/Handlers/MovementHandler.cpp')
-rw-r--r-- | src/server/game/Handlers/MovementHandler.cpp | 22 |
1 files changed, 16 insertions, 6 deletions
diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp index 3835a0642f9..0cedc1b239c 100644 --- a/src/server/game/Handlers/MovementHandler.cpp +++ b/src/server/game/Handlers/MovementHandler.cpp @@ -46,6 +46,7 @@ void WorldSession::HandleMoveWorldportAckOpcode() if (!GetPlayer()->IsBeingTeleportedFar()) return; + bool seamlessTeleport = GetPlayer()->IsBeingTeleportedSeamlessly(); GetPlayer()->SetSemaphoreTeleportFar(false); // get the teleport destination @@ -88,13 +89,16 @@ void WorldSession::HandleMoveWorldportAckOpcode() float z = loc.GetPositionZ(); if (GetPlayer()->HasUnitMovementFlag(MOVEMENTFLAG_HOVER)) z += GetPlayer()->GetFloatValue(UNIT_FIELD_HOVERHEIGHT); + GetPlayer()->Relocate(loc.GetPositionX(), loc.GetPositionY(), z, loc.GetOrientation()); GetPlayer()->ResetMap(); GetPlayer()->SetMap(newMap); - GetPlayer()->SendInitialPacketsBeforeAddToMap(); - if (!GetPlayer()->GetMap()->AddPlayerToMap(GetPlayer())) + if (!seamlessTeleport) + GetPlayer()->SendInitialPacketsBeforeAddToMap(); + + if (!GetPlayer()->GetMap()->AddPlayerToMap(GetPlayer(), !seamlessTeleport)) { TC_LOG_ERROR("network", "WORLD: failed to teleport player %s (%s) to map %d (%s) because of unknown reason!", GetPlayer()->GetName().c_str(), GetPlayer()->GetGUID().ToString().c_str(), loc.GetMapId(), newMap ? newMap->GetMapName() : "Unknown"); @@ -124,16 +128,22 @@ void WorldSession::HandleMoveWorldportAckOpcode() } } - GetPlayer()->SendInitialPacketsAfterAddToMap(); + if (!seamlessTeleport) + GetPlayer()->SendInitialPacketsAfterAddToMap(); + else + GetPlayer()->UpdateVisibilityForPlayer(); // flight fast teleport case if (GetPlayer()->GetMotionMaster()->GetCurrentMovementGeneratorType() == FLIGHT_MOTION_TYPE) { if (!_player->InBattleground()) { - // short preparations to continue flight - FlightPathMovementGenerator* flight = (FlightPathMovementGenerator*)(GetPlayer()->GetMotionMaster()->top()); - flight->Initialize(GetPlayer()); + if (!seamlessTeleport) + { + // short preparations to continue flight + FlightPathMovementGenerator* flight = (FlightPathMovementGenerator*)(GetPlayer()->GetMotionMaster()->top()); + flight->Initialize(GetPlayer()); + } return; } |