diff options
author | Golrag <golrag.jeremy@gmail.com> | 2024-05-25 21:05:14 +0200 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2024-05-25 22:05:53 +0200 |
commit | 27e23600bb9c47440cca12a4ddaa4627166b0327 (patch) | |
tree | b191fc2ae9179a4cefe769610db0cbac7b027078 /src | |
parent | 5b130cfb4253a94c08ff807e7f28e988651d2476 (diff) |
Core/Players: Extended world_safe_locs with transport guid - this allows teleporting to a different map directly to a transport and having graveyards on transports
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Battlegrounds/BattlegroundMgr.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Globals/ObjectMgr.cpp | 17 | ||||
-rw-r--r-- | src/server/game/Globals/ObjectMgr.h | 1 |
4 files changed, 18 insertions, 4 deletions
diff --git a/src/server/game/Battlegrounds/BattlegroundMgr.cpp b/src/server/game/Battlegrounds/BattlegroundMgr.cpp index edef0191304..b2856d6ef7b 100644 --- a/src/server/game/Battlegrounds/BattlegroundMgr.cpp +++ b/src/server/game/Battlegrounds/BattlegroundMgr.cpp @@ -469,7 +469,7 @@ void BattlegroundMgr::SendToBattleground(Player* player, uint32 instanceId, Batt WorldSafeLocsEntry const* pos = bg->GetTeamStartPosition(Battleground::GetTeamIndexByTeamId(team)); TC_LOG_DEBUG("bg.battleground", "BattlegroundMgr::SendToBattleground: Sending {} to map {}, {} (bgType {})", player->GetName(), mapid, pos->Loc.ToString(), bgTypeId); - player->TeleportTo(pos->Loc); + player->TeleportTo({ .Location = pos->Loc, .TransportGuid = pos->TransportSpawnId ? ObjectGuid::Create<HighGuid::Transport>(*pos->TransportSpawnId) : ObjectGuid::Empty }); } else TC_LOG_ERROR("bg.battleground", "BattlegroundMgr::SendToBattleground: Instance {} (bgType {}) not found while trying to teleport player {}", instanceId, bgTypeId, player->GetName()); diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 547655b5a0e..7a89cd5f48c 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -4834,7 +4834,7 @@ void Player::RepopAtGraveyard() // and don't show spirit healer location if (closestGrave) { - TeleportTo(closestGrave->Loc, shouldResurrect ? TELE_REVIVE_AT_TELEPORT : TELE_TO_NONE); + TeleportTo({ .Location = closestGrave->Loc, .TransportGuid = closestGrave->TransportSpawnId ? ObjectGuid::Create<HighGuid::Transport>(*closestGrave->TransportSpawnId) : ObjectGuid::Empty }, shouldResurrect ? TELE_REVIVE_AT_TELEPORT : TELE_TO_NONE); if (isDead()) // not send if alive, because it used in TeleportTo() { WorldPackets::Misc::DeathReleaseLoc packet; diff --git a/src/server/game/Globals/ObjectMgr.cpp b/src/server/game/Globals/ObjectMgr.cpp index 9f8ffeb4d8e..838f5f575c1 100644 --- a/src/server/game/Globals/ObjectMgr.cpp +++ b/src/server/game/Globals/ObjectMgr.cpp @@ -7011,8 +7011,8 @@ void ObjectMgr::LoadWorldSafeLocs() { uint32 oldMSTime = getMSTime(); - // 0 1 2 3 4 5 - if (QueryResult result = WorldDatabase.Query("SELECT ID, MapID, LocX, LocY, LocZ, Facing FROM world_safe_locs")) + // 0 1 2 3 4 5 6 + if (QueryResult result = WorldDatabase.Query("SELECT ID, MapID, LocX, LocY, LocZ, Facing, TransportSpawnId FROM world_safe_locs")) { do { @@ -7025,9 +7025,22 @@ void ObjectMgr::LoadWorldSafeLocs() continue; } + Optional<ObjectGuid::LowType> transportSpawnId = {}; + if (!fields[6].IsNull()) + { + if (!sTransportMgr->GetTransportSpawn(fields[6].GetUInt64())) + { + TC_LOG_ERROR("sql.sql", "World location (ID: {}) has a invalid transportSpawnID {}, skipped.", id, fields[6].GetUInt64()); + continue; + } + + transportSpawnId = fields[6].GetUInt64(); + } + WorldSafeLocsEntry& worldSafeLocs = _worldSafeLocs[id]; worldSafeLocs.ID = id; worldSafeLocs.Loc.WorldRelocate(loc); + worldSafeLocs.TransportSpawnId = transportSpawnId; } while (result->NextRow()); diff --git a/src/server/game/Globals/ObjectMgr.h b/src/server/game/Globals/ObjectMgr.h index d373047127c..5e599b242d6 100644 --- a/src/server/game/Globals/ObjectMgr.h +++ b/src/server/game/Globals/ObjectMgr.h @@ -835,6 +835,7 @@ struct WorldSafeLocsEntry { uint32 ID = 0; WorldLocation Loc; + Optional<ObjectGuid::LowType> TransportSpawnId = {}; }; struct GraveyardData |