using System.Collections.Generic; using System.Linq; using NitroxModel.DataStructures; using NitroxModel.DataStructures.GameLogic; using NitroxModel.Packets; using NitroxServer.GameLogic; using NitroxServer.GameLogic.Entities; namespace NitroxServer.Communication.Packets.Processors.Abstract; public abstract class TransmitIfCanSeePacketProcessor : AuthenticatedPacketProcessor where T : Packet { private readonly PlayerManager playerManager; private readonly EntityRegistry entityRegistry; public TransmitIfCanSeePacketProcessor(PlayerManager playerManager, EntityRegistry entityRegistry) { this.playerManager = playerManager; this.entityRegistry = entityRegistry; } /// /// Transmits the provided to all other players (excluding ) /// who can see () entities corresponding to the provided only if all those entities are registered. /// public void TransmitIfCanSeeEntities(Packet packet, Player senderPlayer, List entityIds) { List entities = []; foreach (NitroxId entityId in entityIds) { if (entityRegistry.TryGetEntityById(entityId, out Entity entity)) { entities.Add(entity); } else { return; } } foreach (Player player in playerManager.GetConnectedPlayersExcept(senderPlayer)) { if (entities.All(player.CanSee)) { player.SendPacket(packet); } } } }