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

Port From (https://github.com/TrinityCore/TrinityCore/commit/27e23600bb9c47440cca12a4ddaa4627166b0327)
This commit is contained in:
Hondacrx
2024-08-25 14:44:28 -04:00
parent 2004acd5d1
commit ac1a621503
3 changed files with 19 additions and 4 deletions
@@ -417,7 +417,7 @@ namespace Game.BattleGrounds
WorldSafeLocsEntry pos = bg.GetTeamStartPosition(Battleground.GetTeamIndexByTeamId(team));
Log.outDebug(LogFilter.Battleground, $"BattlegroundMgr.SendToBattleground: Sending {player.GetName()} to map {mapid}, {pos.Loc} (bgType {bgTypeId})");
player.TeleportTo(pos.Loc);
player.TeleportTo(new Entities.TeleportLocation() { Location = pos.Loc, TransportGuid = pos.TransportSpawnId.HasValue ? ObjectGuid.Create(HighGuid.Transport, pos.TransportSpawnId.Value) : ObjectGuid.Empty });
}
else
Log.outError(LogFilter.Battleground, $"BattlegroundMgr.SendToBattleground: Instance {instanceId} (bgType {bgTypeId}) not found while trying to teleport player {player.GetName()}");
+1 -1
View File
@@ -4480,7 +4480,7 @@ namespace Game.Entities
// and don't show spirit healer location
if (closestGrave != null)
{
TeleportTo(closestGrave.Loc, shouldResurrect ? TeleportToOptions.ReviveAtTeleport : 0);
TeleportTo(new TeleportLocation() { Location = closestGrave.Loc, TransportGuid = closestGrave.TransportSpawnId.HasValue ? ObjectGuid.Create(HighGuid.Transport, closestGrave.TransportSpawnId.Value) : ObjectGuid.Empty }, shouldResurrect ? TeleportToOptions.ReviveAtTeleport : TeleportToOptions.None);
if (IsDead()) // not send if alive, because it used in TeleportTo()
{
DeathReleaseLoc packet = new();
+17 -2
View File
@@ -800,8 +800,8 @@ namespace Game
{
uint oldMSTime = Time.GetMSTime();
// 0 1 2 3 4 5
SQLResult result = DB.World.Query("SELECT ID, MapID, LocX, LocY, LocZ, Facing FROM world_safe_locs");
// 0 1 2 3 4 5 6
SQLResult result = DB.World.Query("SELECT ID, MapID, LocX, LocY, LocZ, Facing, TransportSpawnId FROM world_safe_locs");
if (result.IsEmpty())
{
Log.outInfo(LogFilter.ServerLoading, "Loaded 0 world locations. DB table `world_safe_locs` is empty.");
@@ -817,9 +817,23 @@ namespace Game
continue;
}
ulong? transportSpawnId = null;
if (!result.IsNull(6))
{
ulong spawnId = result.Read<ulong>(6);
if (Global.TransportMgr.GetTransportSpawn(spawnId) == null)
{
Log.outError(LogFilter.Sql, $"World location (ID: {id}) has a invalid transportSpawnID {spawnId}, skipped.");
continue;
}
transportSpawnId = spawnId;
}
WorldSafeLocsEntry worldSafeLocs = new();
worldSafeLocs.Id = id;
worldSafeLocs.Loc = loc;
worldSafeLocs.TransportSpawnId = transportSpawnId;
_worldSafeLocs[id] = worldSafeLocs;
} while (result.NextRow());
@@ -11491,6 +11505,7 @@ namespace Game
{
public uint Id;
public WorldLocation Loc;
public ulong? TransportSpawnId;
}
public class GraveyardData