aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGolrag <golrag.jeremy@gmail.com>2024-05-25 21:05:14 +0200
committerOvahlord <dreadkiller@gmx.de>2024-06-20 01:02:30 +0200
commit3619b6e6ff0a23d818af76627416e237a6c0c001 (patch)
tree9d984b511fe673d73afc1307d97f2542e9f171bc /src
parentc7374b620ba1c8d89203242614e9c0aba67b6461 (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
(cherry picked from commit 27e23600bb9c47440cca12a4ddaa4627166b0327) # Conflicts: # sql/old/4.4.x/world/24021_2024_06_02/2024_05_25_08_world.sql
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Battlegrounds/BattlegroundMgr.cpp2
-rw-r--r--src/server/game/Entities/Player/Player.cpp2
-rw-r--r--src/server/game/Globals/ObjectMgr.cpp17
-rw-r--r--src/server/game/Globals/ObjectMgr.h1
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 631441d8ba5..79be45a11c8 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -4771,7 +4771,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 2ba5a758db3..d7cb4e739bd 100644
--- a/src/server/game/Globals/ObjectMgr.cpp
+++ b/src/server/game/Globals/ObjectMgr.cpp
@@ -7015,8 +7015,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
{
@@ -7029,9 +7029,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