Core/Players: Extend Player::SendInitialVisiblePackets to work with all WorldObject types
Port From (https://github.com/TrinityCore/TrinityCore/commit/1439535c6ac2ca8db13990e4fee29d4c1312f87a)
This commit is contained in:
@@ -6049,7 +6049,7 @@ namespace Game.Entities
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
UpdateData udata = new(GetMapId());
|
UpdateData udata = new(GetMapId());
|
||||||
List<Unit> newVisibleUnits = new();
|
List<WorldObject> newVisibleObjects = new();
|
||||||
|
|
||||||
foreach (WorldObject target in targets)
|
foreach (WorldObject target in targets)
|
||||||
{
|
{
|
||||||
@@ -6059,28 +6059,28 @@ namespace Game.Entities
|
|||||||
switch (target.GetTypeId())
|
switch (target.GetTypeId())
|
||||||
{
|
{
|
||||||
case TypeId.Unit:
|
case TypeId.Unit:
|
||||||
UpdateVisibilityOf(target.ToCreature(), udata, newVisibleUnits);
|
UpdateVisibilityOf(target.ToCreature(), udata, newVisibleObjects);
|
||||||
break;
|
break;
|
||||||
case TypeId.Player:
|
case TypeId.Player:
|
||||||
UpdateVisibilityOf(target.ToPlayer(), udata, newVisibleUnits);
|
UpdateVisibilityOf(target.ToPlayer(), udata, newVisibleObjects);
|
||||||
break;
|
break;
|
||||||
case TypeId.GameObject:
|
case TypeId.GameObject:
|
||||||
UpdateVisibilityOf(target.ToGameObject(), udata, newVisibleUnits);
|
UpdateVisibilityOf(target.ToGameObject(), udata, newVisibleObjects);
|
||||||
break;
|
break;
|
||||||
case TypeId.DynamicObject:
|
case TypeId.DynamicObject:
|
||||||
UpdateVisibilityOf(target.ToDynamicObject(), udata, newVisibleUnits);
|
UpdateVisibilityOf(target.ToDynamicObject(), udata, newVisibleObjects);
|
||||||
break;
|
break;
|
||||||
case TypeId.Corpse:
|
case TypeId.Corpse:
|
||||||
UpdateVisibilityOf(target.ToCorpse(), udata, newVisibleUnits);
|
UpdateVisibilityOf(target.ToCorpse(), udata, newVisibleObjects);
|
||||||
break;
|
break;
|
||||||
case TypeId.AreaTrigger:
|
case TypeId.AreaTrigger:
|
||||||
UpdateVisibilityOf(target.ToAreaTrigger(), udata, newVisibleUnits);
|
UpdateVisibilityOf(target.ToAreaTrigger(), udata, newVisibleObjects);
|
||||||
break;
|
break;
|
||||||
case TypeId.SceneObject:
|
case TypeId.SceneObject:
|
||||||
UpdateVisibilityOf(target.ToSceneObject(), udata, newVisibleUnits);
|
UpdateVisibilityOf(target.ToSceneObject(), udata, newVisibleObjects);
|
||||||
break;
|
break;
|
||||||
case TypeId.Conversation:
|
case TypeId.Conversation:
|
||||||
UpdateVisibilityOf(target.ToConversation(), udata, newVisibleUnits);
|
UpdateVisibilityOf(target.ToConversation(), udata, newVisibleObjects);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@@ -6093,7 +6093,7 @@ namespace Game.Entities
|
|||||||
udata.BuildPacket(out UpdateObject packet);
|
udata.BuildPacket(out UpdateObject packet);
|
||||||
SendPacket(packet);
|
SendPacket(packet);
|
||||||
|
|
||||||
foreach (var visibleUnit in newVisibleUnits)
|
foreach (var visibleUnit in newVisibleObjects)
|
||||||
SendInitialVisiblePackets(visibleUnit);
|
SendInitialVisiblePackets(visibleUnit);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -6129,7 +6129,7 @@ namespace Game.Entities
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void UpdateVisibilityOf<T>(T target, UpdateData data, List<Unit> visibleNow) where T : WorldObject
|
public void UpdateVisibilityOf<T>(T target, UpdateData data, List<WorldObject> visibleNow) where T : WorldObject
|
||||||
{
|
{
|
||||||
if (HaveAtClient(target))
|
if (HaveAtClient(target))
|
||||||
{
|
{
|
||||||
@@ -6150,33 +6150,23 @@ namespace Game.Entities
|
|||||||
if (CanSeeOrDetect(target, false, true))
|
if (CanSeeOrDetect(target, false, true))
|
||||||
{
|
{
|
||||||
target.BuildCreateUpdateBlockForPlayer(data, this);
|
target.BuildCreateUpdateBlockForPlayer(data, this);
|
||||||
UpdateVisibilityOf_helper(m_clientGUIDs, target, visibleNow);
|
m_clientGUIDs.Add(target.GetGUID());
|
||||||
|
visibleNow.Add(target);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void UpdateVisibilityOf_helper<T>(List<ObjectGuid> s64, T target, List<Unit> v) where T : WorldObject
|
public void SendInitialVisiblePackets(WorldObject target)
|
||||||
{
|
{
|
||||||
s64.Add(target.GetGUID());
|
Unit targetUnit = target.ToUnit();
|
||||||
|
if (targetUnit != null)
|
||||||
switch (target.GetTypeId())
|
|
||||||
{
|
{
|
||||||
case TypeId.Unit:
|
SendAurasForTarget(targetUnit);
|
||||||
v.Add(target.ToCreature());
|
if (targetUnit.IsAlive())
|
||||||
break;
|
{
|
||||||
case TypeId.Player:
|
if (targetUnit.HasUnitState(UnitState.MeleeAttacking) && targetUnit.GetVictim() != null)
|
||||||
v.Add(target.ToPlayer());
|
targetUnit.SendMeleeAttackStart(targetUnit.GetVictim());
|
||||||
break;
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void SendInitialVisiblePackets(Unit target)
|
|
||||||
{
|
|
||||||
SendAurasForTarget(target);
|
|
||||||
if (target.IsAlive())
|
|
||||||
{
|
|
||||||
if (target.HasUnitState(UnitState.MeleeAttacking) && target.GetVictim() != null)
|
|
||||||
target.SendMeleeAttackStart(target.GetVictim());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ namespace Game.Maps
|
|||||||
i_player = pl;
|
i_player = pl;
|
||||||
i_data = new UpdateData(pl.GetMapId());
|
i_data = new UpdateData(pl.GetMapId());
|
||||||
vis_guids = new List<ObjectGuid>(pl.m_clientGUIDs);
|
vis_guids = new List<ObjectGuid>(pl.m_clientGUIDs);
|
||||||
i_visibleNow = new List<Unit>();
|
i_visibleNow = new List<WorldObject>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public override void Visit(IList<WorldObject> objs)
|
public override void Visit(IList<WorldObject> objs)
|
||||||
@@ -93,30 +93,28 @@ namespace Game.Maps
|
|||||||
Transport transport = i_player.GetTransport<Transport>();
|
Transport transport = i_player.GetTransport<Transport>();
|
||||||
if (transport != null)
|
if (transport != null)
|
||||||
{
|
{
|
||||||
foreach (var obj in transport.GetPassengers())
|
foreach (var passenger in transport.GetPassengers())
|
||||||
{
|
{
|
||||||
if (vis_guids.Contains(obj.GetGUID()))
|
if (vis_guids.Remove(passenger.GetGUID()))
|
||||||
{
|
{
|
||||||
vis_guids.Remove(obj.GetGUID());
|
switch (passenger.GetTypeId())
|
||||||
|
|
||||||
switch (obj.GetTypeId())
|
|
||||||
{
|
{
|
||||||
case TypeId.GameObject:
|
case TypeId.GameObject:
|
||||||
i_player.UpdateVisibilityOf(obj.ToGameObject(), i_data, i_visibleNow);
|
i_player.UpdateVisibilityOf(passenger.ToGameObject(), i_data, i_visibleNow);
|
||||||
break;
|
break;
|
||||||
case TypeId.Player:
|
case TypeId.Player:
|
||||||
i_player.UpdateVisibilityOf(obj.ToPlayer(), i_data, i_visibleNow);
|
i_player.UpdateVisibilityOf(passenger.ToPlayer(), i_data, i_visibleNow);
|
||||||
if (!obj.IsNeedNotify(NotifyFlags.VisibilityChanged))
|
if (!passenger.IsNeedNotify(NotifyFlags.VisibilityChanged))
|
||||||
obj.ToPlayer().UpdateVisibilityOf(i_player);
|
passenger.ToPlayer().UpdateVisibilityOf(i_player);
|
||||||
break;
|
break;
|
||||||
case TypeId.Unit:
|
case TypeId.Unit:
|
||||||
i_player.UpdateVisibilityOf(obj.ToCreature(), i_data, i_visibleNow);
|
i_player.UpdateVisibilityOf(passenger.ToCreature(), i_data, i_visibleNow);
|
||||||
break;
|
break;
|
||||||
case TypeId.DynamicObject:
|
case TypeId.DynamicObject:
|
||||||
i_player.UpdateVisibilityOf(obj.ToDynamicObject(), i_data, i_visibleNow);
|
i_player.UpdateVisibilityOf(passenger.ToDynamicObject(), i_data, i_visibleNow);
|
||||||
break;
|
break;
|
||||||
case TypeId.AreaTrigger:
|
case TypeId.AreaTrigger:
|
||||||
i_player.UpdateVisibilityOf(obj.ToAreaTrigger(), i_data, i_visibleNow);
|
i_player.UpdateVisibilityOf(passenger.ToAreaTrigger(), i_data, i_visibleNow);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@@ -125,16 +123,16 @@ namespace Game.Maps
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
foreach (var guid in vis_guids)
|
foreach (var outOfRangeGuid in vis_guids)
|
||||||
{
|
{
|
||||||
i_player.m_clientGUIDs.Remove(guid);
|
i_player.m_clientGUIDs.Remove(outOfRangeGuid);
|
||||||
i_data.AddOutOfRangeGUID(guid);
|
i_data.AddOutOfRangeGUID(outOfRangeGuid);
|
||||||
|
|
||||||
if (guid.IsPlayer())
|
if (outOfRangeGuid.IsPlayer())
|
||||||
{
|
{
|
||||||
Player pl = Global.ObjAccessor.FindPlayer(guid);
|
Player player = Global.ObjAccessor.FindPlayer(outOfRangeGuid);
|
||||||
if (pl != null && pl.IsInWorld && !pl.IsNeedNotify(NotifyFlags.VisibilityChanged))
|
if (player != null && !player.IsNeedNotify(NotifyFlags.VisibilityChanged))
|
||||||
pl.UpdateVisibilityOf(i_player);
|
player.UpdateVisibilityOf(i_player);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -145,14 +143,14 @@ namespace Game.Maps
|
|||||||
i_data.BuildPacket(out packet);
|
i_data.BuildPacket(out packet);
|
||||||
i_player.SendPacket(packet);
|
i_player.SendPacket(packet);
|
||||||
|
|
||||||
foreach (var obj in i_visibleNow)
|
foreach (var visibleObject in i_visibleNow)
|
||||||
i_player.SendInitialVisiblePackets(obj);
|
i_player.SendInitialVisiblePackets(visibleObject);
|
||||||
}
|
}
|
||||||
|
|
||||||
internal Player i_player;
|
internal Player i_player;
|
||||||
internal UpdateData i_data;
|
internal UpdateData i_data;
|
||||||
internal List<ObjectGuid> vis_guids;
|
internal List<ObjectGuid> vis_guids;
|
||||||
internal List<Unit> i_visibleNow;
|
internal List<WorldObject> i_visibleNow;
|
||||||
}
|
}
|
||||||
|
|
||||||
public class VisibleChangesNotifier : Notifier
|
public class VisibleChangesNotifier : Notifier
|
||||||
|
|||||||
Reference in New Issue
Block a user