Core/Transports: Localized transport objects within each map

Port From (https://github.com/TrinityCore/TrinityCore/commit/cace41449771bbe692e1a45c4d38b15a12f6496e)
This commit is contained in:
hondacrx
2022-06-16 14:08:22 -04:00
parent 30525b4567
commit 37d62e3a32
9 changed files with 208 additions and 208 deletions
+33 -36
View File
@@ -83,6 +83,8 @@ namespace Game.Maps
_poolData = Global.PoolMgr.InitPoolsForMap(this);
Global.TransportMgr.CreateTransportsForMap(this);
Global.MMapMgr.LoadMapInstance(Global.WorldMgr.GetDataPath(), GetId(), i_InstanceId);
Global.ScriptMgr.OnCreateMap(this);
@@ -408,12 +410,6 @@ namespace Game.Maps
player.Dispose();
}
void DeleteFromWorld(Transport transport)
{
Global.ObjAccessor.RemoveObject(transport);
transport.Dispose();
}
void DeleteFromWorld(WorldObject obj)
{
obj.Dispose();
@@ -642,20 +638,24 @@ namespace Game.Maps
return false; //Should delete object
}
obj.AddToWorld();
_transports.Add(obj);
// Broadcast creation to players
foreach (Player player in GetPlayers())
if (obj.GetExpectedMapId() == GetId())
{
if (player.GetTransport() != obj)
obj.AddToWorld();
// Broadcast creation to players
foreach (var player in GetPlayers())
{
var data = new UpdateData(GetId());
obj.BuildCreateUpdateBlockForPlayer(data, player);
player.m_visibleTransports.Add(obj.GetGUID());
UpdateObject packet;
data.BuildPacket(out packet);
player.SendPacket(packet);
if (player.GetTransport() != obj && player.IsInPhase(obj))
{
var data = new UpdateData(GetId());
obj.BuildCreateUpdateBlockForPlayer(data, player);
player.m_visibleTransports.Add(obj.GetGUID());
UpdateObject packet;
data.BuildPacket(out packet);
player.SendPacket(packet);
}
}
}
@@ -830,7 +830,7 @@ namespace Game.Maps
for (var i = 0; i < _transports.Count; ++i)
{
Transport transport = _transports[i];
if (!transport || !transport.IsInWorld)
if (!transport)
continue;
transport.Update(diff);
@@ -1011,19 +1011,22 @@ namespace Game.Maps
public void RemoveFromMap(Transport obj, bool remove)
{
obj.RemoveFromWorld();
var players = GetPlayers();
if (!players.Empty())
if (obj.IsInWorld)
{
obj.RemoveFromWorld();
UpdateData data = new(GetId());
obj.BuildOutOfRangeUpdateBlock(data);
if (obj.IsDestroyedObject())
obj.BuildDestroyUpdateBlock(data);
else
obj.BuildOutOfRangeUpdateBlock(data);
UpdateObject packet;
data.BuildPacket(out packet);
foreach (var player in players)
foreach (var player in GetPlayers())
{
if (player.GetTransport() != obj)
if (player.GetTransport() != obj && player.m_visibleTransports.Contains(obj.GetGUID()))
{
player.SendPacket(packet);
player.m_visibleTransports.Remove(obj.GetGUID());
@@ -2270,11 +2273,11 @@ namespace Game.Maps
void SendInitTransports(Player player)
{
var transData = new UpdateData(player.GetMapId());
var transData = new UpdateData(GetId());
foreach (Transport transport in _transports)
{
if (transport != player.GetTransport() && player.IsInPhase(transport))
if (transport.IsInWorld && transport != player.GetTransport() && player.IsInPhase(transport))
{
transport.BuildCreateUpdateBlockForPlayer(transData, player);
player.m_visibleTransports.Add(transport.GetGUID());
@@ -2291,7 +2294,7 @@ namespace Game.Maps
var transData = new UpdateData(player.GetMapId());
foreach (Transport transport in _transports)
{
if (transport != player.GetTransport())
if (player.m_visibleTransports.Contains(transport.GetGUID()) && transport != player.GetTransport())
{
transport.BuildOutOfRangeUpdateBlock(transData);
player.m_visibleTransports.Remove(transport.GetGUID());
@@ -2309,6 +2312,9 @@ namespace Game.Maps
UpdateData transData = new(player.GetMapId());
foreach (var transport in _transports)
{
if (!transport.IsInWorld)
continue;
var hasTransport = player.m_visibleTransports.Contains(transport.GetGUID());
if (player.IsInPhase(transport))
{
@@ -2914,15 +2920,6 @@ namespace Game.Maps
while (_farSpellCallbacks.TryDequeue(out FarSpellCallback callback))
callback(this);
for (var i = 0; i < _transports.Count; ++i)
{
Transport transport = _transports[i];
if (!transport.IsInWorld)
continue;
transport.DelayedUpdate(diff);
}
RemoveAllObjectsInRemoveList();
// Don't unload grids if it's Battleground, since we may have manually added GOs, creatures, those doesn't load from DB at grid re-load !