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/Entities/Player | |
| 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/Entities/Player')
| -rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 40 |
1 files changed, 23 insertions, 17 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 481f18c4b82..b72333f397a 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -443,7 +443,7 @@ bool Player::Create(ObjectGuid::LowType guidlow, WorldPackets::Character::Charac if (position.TransportGuid) { - if (Transport* transport = HashMapHolder<Transport>::Find(ObjectGuid::Create<HighGuid::Transport>(*position.TransportGuid))) + if (Transport* transport = ObjectAccessor::GetTransport(*this, ObjectGuid::Create<HighGuid::Transport>(*position.TransportGuid))) { transport->AddPassenger(this); m_movementInfo.transport.pos.Relocate(position.Loc); @@ -18224,8 +18224,22 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder const& hol ObjectGuid transGUID = ObjectGuid::Create<HighGuid::Transport>(fields.transguid); Transport* transport = nullptr; - if (Transport* go = HashMapHolder<Transport>::Find(transGUID)) - transport = go; + if (Map* transportMap = sMapMgr->CreateMap(mapId, this, instanceId)) + { + if (Transport* transportOnMap = transportMap->GetTransport(transGUID)) + { + if (transportOnMap->GetExpectedMapId() != mapId) + { + mapId = transportOnMap->GetExpectedMapId(); + instanceId = 0; + transportMap = sMapMgr->CreateMap(mapId, this, instanceId); + if (transportMap) + transport = transportMap->GetTransport(transGUID); + } + else + transport = transportOnMap; + } + } if (transport) { @@ -20373,22 +20387,14 @@ bool Player::_LoadHomeBind(PreparedQueryResult result) if (!ok && HasAtLoginFlag(AT_LOGIN_FIRST)) { PlayerInfo::CreatePosition const& createPosition = m_createMode == PlayerCreateMode::NPE && info->createPositionNPE ? *info->createPositionNPE : info->createPosition; - - m_homebind.WorldRelocate(createPosition.Loc); - if (createPosition.TransportGuid) + if (!createPosition.TransportGuid) { - if (Transport* transport = HashMapHolder<Transport>::Find(ObjectGuid::Create<HighGuid::Transport>(*createPosition.TransportGuid))) - { - float orientation = m_homebind.GetOrientation(); - transport->CalculatePassengerPosition(m_homebind.m_positionX, m_homebind.m_positionY, m_homebind.m_positionZ, &orientation); - m_homebind.SetOrientation(orientation); - } - } + m_homebind.WorldRelocate(createPosition.Loc); + m_homebindAreaId = sMapMgr->GetAreaId(PhasingHandler::GetEmptyPhaseShift(), m_homebind); - m_homebindAreaId = sMapMgr->GetAreaId(PhasingHandler::GetEmptyPhaseShift(), m_homebind); - - saveHomebindToDb(); - ok = true; + saveHomebindToDb(); + ok = true; + } } if (!ok) |
