diff options
author | Shauren <shauren.trinity@gmail.com> | 2022-06-13 20:06:26 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2022-06-13 20:06:26 +0200 |
commit | cace41449771bbe692e1a45c4d38b15a12f6496e (patch) | |
tree | bb4dda1bd73f71f846916617a75e41a5075aaf4d /src/server/game/Handlers/MovementHandler.cpp | |
parent | 8f537b96868647d73aacd576bbe90bda138dd589 (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.cpp | 11 |
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!", |