Core/Players: Allow teleporting to a specific instance id

Port From (https://github.com/TrinityCore/TrinityCore/commit/25c0aaa83fede6cd5214da00bb08a21c0b28c4be)
This commit is contained in:
hondacrx
2022-06-12 00:22:32 -04:00
parent bbaf66df51
commit f66c3aec14
5 changed files with 27 additions and 11 deletions
+1 -1
View File
@@ -427,7 +427,7 @@ namespace Game.Chat
// before GM
float x, y, z;
gmPlayer.GetClosePoint(out x, out y, out z, player.GetCombatReach());
player.TeleportTo(gmPlayer.GetMapId(), x, y, z, player.GetOrientation());
player.TeleportTo(gmPlayer.GetMapId(), x, y, z, player.GetOrientation(), 0, gmPlayer.GetInstanceId());
}
return true;
+2 -2
View File
@@ -140,7 +140,7 @@ namespace Game.Chat
float x, y, z;
target.GetClosePoint(out x, out y, out z, _player.GetCombatReach(), 1.0f);
_player.TeleportTo(target.GetMapId(), x, y, z, _player.GetAbsoluteAngle(target), TeleportToOptions.GMMode);
_player.TeleportTo(target.GetMapId(), x, y, z, _player.GetAbsoluteAngle(target), TeleportToOptions.GMMode, target.GetInstanceId());
PhasingHandler.InheritPhaseShift(_player, target);
_player.UpdateObjectVisibility();
}
@@ -1856,7 +1856,7 @@ namespace Game.Chat
// before GM
float x, y, z;
_player.GetClosePoint(out x, out y, out z, target.GetCombatReach());
target.TeleportTo(_player.GetMapId(), x, y, z, target.GetOrientation());
target.TeleportTo(_player.GetMapId(), x, y, z, target.GetOrientation(), 0, map.GetInstanceId());
PhasingHandler.InheritPhaseShift(target, _player);
target.UpdateObjectVisibility();
}
@@ -95,6 +95,7 @@ namespace Game.Entities
uint m_lastFallTime;
float m_lastFallZ;
WorldLocation teleportDest;
uint? m_teleport_instanceId;
TeleportToOptions m_teleport_options;
bool mSemaphoreTeleport_Near;
bool mSemaphoreTeleport_Far;
@@ -138,6 +139,7 @@ namespace Game.Entities
// Player summoning
long m_summon_expire;
WorldLocation m_summon_location;
uint m_summon_instanceId;
RestMgr _restMgr;
@@ -225,6 +227,7 @@ namespace Game.Entities
// Recall position
WorldLocation m_recall_location;
uint m_recall_instanceId;
WorldLocation homebind = new();
uint homebindAreaId;
uint m_HomebindTimer;
+20 -7
View File
@@ -1651,11 +1651,11 @@ namespace Game.Entities
void SetCanDelayTeleport(bool setting) { m_bCanDelayTeleport = setting; }
bool IsHasDelayedTeleport() { return m_bHasDelayedTeleport; }
void SetDelayedTeleportFlag(bool setting) { m_bHasDelayedTeleport = setting; }
public bool TeleportTo(WorldLocation loc, TeleportToOptions options = 0)
public bool TeleportTo(WorldLocation loc, TeleportToOptions options = 0, uint? instanceId = null)
{
return TeleportTo(loc.GetMapId(), loc.posX, loc.posY, loc.posZ, loc.Orientation, options);
return TeleportTo(loc.GetMapId(), loc.posX, loc.posY, loc.posZ, loc.Orientation, options, instanceId);
}
public bool TeleportTo(uint mapid, float x, float y, float z, float orientation, TeleportToOptions options = 0)
public bool TeleportTo(uint mapid, float x, float y, float z, float orientation, TeleportToOptions options = 0, uint? instanceId = null)
{
if (!GridDefines.IsValidMapCoord(mapid, x, y, z, orientation))
{
@@ -1721,7 +1721,7 @@ namespace Game.Entities
if (duel != null && GetMapId() != mapid && GetMap().GetGameObject(m_playerData.DuelArbiter))
DuelComplete(DuelCompleteType.Fled);
if (GetMapId() == mapid)
if (GetMapId() == mapid && (!instanceId.HasValue || GetInstanceId() == instanceId))
{
//lets reset far teleport flag if it wasn't reset during chained teleports
SetSemaphoreTeleportFar(false);
@@ -1734,6 +1734,7 @@ namespace Game.Entities
SetSemaphoreTeleportNear(true);
//lets save teleport destination for player
teleportDest = new WorldLocation(mapid, x, y, z, orientation);
m_teleport_instanceId = null;
m_teleport_options = options;
return true;
}
@@ -1753,6 +1754,7 @@ namespace Game.Entities
// this will be used instead of the current location in SaveToDB
teleportDest = new WorldLocation(mapid, x, y, z, orientation);
m_teleport_instanceId = null;
m_teleport_options = options;
SetFallInformation(0, GetPositionZ());
@@ -1793,6 +1795,7 @@ namespace Game.Entities
SetSemaphoreTeleportFar(true);
//lets save teleport destination for player
teleportDest = new WorldLocation(mapid, x, y, z, orientation);
m_teleport_instanceId = instanceId;
m_teleport_options = options;
return true;
}
@@ -1866,6 +1869,7 @@ namespace Game.Entities
oldmap.RemovePlayerFromMap(this, false);
teleportDest = new WorldLocation(mapid, x, y, z, orientation);
m_teleport_instanceId = instanceId;
m_teleport_options = options;
SetFallInformation(0, GetPositionZ());
// if the player is saved before worldportack (at logout for example)
@@ -2079,6 +2083,7 @@ namespace Game.Entities
m_summon_expire = GameTime.GetGameTime() + PlayerConst.MaxPlayerSummonDelay;
m_summon_location = new WorldLocation(summoner);
m_summon_instanceId = summoner.GetInstanceId();
SummonRequest summonRequest = new();
summonRequest.SummonerGUID = summoner.GetGUID();
@@ -2166,8 +2171,7 @@ namespace Game.Entities
UpdateCriteria(CriteriaType.AcceptSummon, 1);
RemoveAurasWithInterruptFlags(SpellAuraInterruptFlags.Summon);
m_summon_location.SetOrientation(GetOrientation());
TeleportTo(m_summon_location);
TeleportTo(m_summon_location, 0, m_summon_instanceId);
broadcastSummonResponse(true);
}
@@ -5872,8 +5876,10 @@ namespace Game.Entities
public void SaveRecallPosition()
{
m_recall_location = new WorldLocation(this);
m_recall_instanceId = GetInstanceId();
}
public void Recall() { TeleportTo(m_recall_location); }
public void Recall() { TeleportTo(m_recall_location, 0, m_recall_instanceId); }
public uint GetSaveTimer() { return m_nextSave; }
void SetSaveTimer(uint timer) { m_nextSave = timer; }
@@ -7615,10 +7621,17 @@ namespace Game.Entities
{
return teleportDest;
}
public uint? GetTeleportDestInstanceId()
{
return m_teleport_instanceId;
}
public WorldLocation GetHomebind()
{
return homebind;
}
public WorldLocation GetRecall()
{
return m_recall_location;
+1 -1
View File
@@ -254,7 +254,7 @@ namespace Game
player.m_InstanceValid = true;
Map oldMap = player.GetMap();
Map newMap = Global.MapMgr.CreateMap(loc.GetMapId(), player);
Map newMap = GetPlayer().GetTeleportDestInstanceId().HasValue ? Global.MapMgr.FindMap(loc.GetMapId(), GetPlayer().GetTeleportDestInstanceId().Value) : Global.MapMgr.CreateMap(loc.GetMapId(), GetPlayer());
if (player.IsInWorld)
{