using System.Collections.Generic; using Syntriax.Engine.Core; namespace Syntriax.Engine.Network; public class NetworkManager : UniverseObject, INetworkManager { private INetworkCommunicator networkCommunicator = null!; public INetworkCommunicator NetworkCommunicator { get => networkCommunicator; set { if (networkCommunicator == value) return; var previousCommunicator = networkCommunicator; networkCommunicator = value; if (previousCommunicator is not null) previousCommunicator.OnPacketReceived -= OnPacketReceived; if (networkCommunicator is not null) networkCommunicator.OnPacketReceived += OnPacketReceived; } } private readonly Dictionary _networkEntities = []; public IReadOnlyDictionary NetworkEntities => _networkEntities; private readonly BehaviourCollector _networkEntityCollector = new(); public IBehaviourCollector NetworkEntityCollector => _networkEntityCollector; public NetworkManager() { _networkEntityCollector.OnCollected += OnCollected; _networkEntityCollector.OnRemoved += OnRemoved; } private void OnPacketReceived(INetworkCommunicator sender, object packet, string from) { if (packet is not EntityDataPacket entityDataPacket) return; _networkEntities[entityDataPacket.Entity].ReceiveData(entityDataPacket.Data); } private void OnCollected(IBehaviourCollector sender, INetworkEntity behaviourCollected) { if (!_networkEntities.TryAdd(behaviourCollected.Id, behaviourCollected)) throw new($"Unable to add {behaviourCollected.Id} to {nameof(NetworkManager)}"); } private void OnRemoved(IBehaviourCollector sender, INetworkEntity behaviourRemoved) { _networkEntities.Remove(behaviourRemoved.Id); } protected override void OnEnteringUniverse(IUniverse universe) => _networkEntityCollector.Assign(universe); protected override void OnExitingUniverse(IUniverse universe) => _networkEntityCollector.Unassign(); }