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:
hondacrx
2024-03-13 09:15:57 -04:00
parent 6ae8362013
commit 2c008b2b70
2 changed files with 43 additions and 55 deletions
+22 -32
View File
@@ -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());
} }
} }
+21 -23
View File
@@ -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