aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Handlers/MovementHandler.cpp
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2022-06-13 20:06:26 +0200
committerShauren <shauren.trinity@gmail.com>2022-06-13 20:06:26 +0200
commitcace41449771bbe692e1a45c4d38b15a12f6496e (patch)
treebb4dda1bd73f71f846916617a75e41a5075aaf4d /src/server/game/Handlers/MovementHandler.cpp
parent8f537b96868647d73aacd576bbe90bda138dd589 (diff)
Core/Transports: Localized transport objects within each map
Transports no longer move between maps, each map gets a separate copy of the transport object and players are moved between them when transferring to another map This means they can no longer be globally looked up in HashMapHolder
Diffstat (limited to 'src/server/game/Handlers/MovementHandler.cpp')
-rw-r--r--src/server/game/Handlers/MovementHandler.cpp11
1 files changed, 11 insertions, 0 deletions
diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp
index a8cd953abb7..ce38b918519 100644
--- a/src/server/game/Handlers/MovementHandler.cpp
+++ b/src/server/game/Handlers/MovementHandler.cpp
@@ -79,6 +79,10 @@ void WorldSession::HandleMoveWorldportAck()
sMapMgr->FindMap(loc.GetMapId(), *GetPlayer()->GetTeleportDestInstanceId()) :
sMapMgr->CreateMap(loc.GetMapId(), GetPlayer());
+ MovementInfo::TransportInfo transportInfo = player->m_movementInfo.transport;
+ if (TransportBase* transport = player->GetTransport())
+ transport->RemovePassenger(player);
+
if (player->IsInWorld())
{
TC_LOG_ERROR("network", "%s %s is still in world when teleported from map %s (%u) to new map %s (%u)", player->GetGUID().ToString().c_str(), player->GetName().c_str(), oldMap->GetMapName(), oldMap->GetId(), newMap ? newMap->GetMapName() : "Unknown", loc.GetMapId());
@@ -110,6 +114,13 @@ void WorldSession::HandleMoveWorldportAck()
if (!seamlessTeleport)
player->SendInitialPacketsBeforeAddToMap();
+ // move player between transport copies on each map
+ if (Transport* newTransport = newMap->GetTransport(transportInfo.guid))
+ {
+ player->m_movementInfo.transport = transportInfo;
+ newTransport->AddPassenger(player);
+ }
+
if (!player->GetMap()->AddPlayerToMap(player, !seamlessTeleport))
{
TC_LOG_ERROR("network", "WORLD: failed to teleport player %s %s to map %d (%s) because of unknown reason!",