Engine-Pong/Shared/Network/NetworkManager.cs

60 lines
2.2 KiB
C#

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<string, INetworkEntity> _networkEntities = [];
public IReadOnlyDictionary<string, INetworkEntity> NetworkEntities => _networkEntities;
private readonly BehaviourCollector<INetworkEntity> _networkEntityCollector = new();
public IBehaviourCollector<INetworkEntity> 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<INetworkEntity> sender, INetworkEntity behaviourCollected)
{
if (!_networkEntities.TryAdd(behaviourCollected.Id, behaviourCollected))
throw new($"Unable to add {behaviourCollected.Id} to {nameof(NetworkManager)}");
}
private void OnRemoved(IBehaviourCollector<INetworkEntity> sender, INetworkEntity behaviourRemoved)
{
_networkEntities.Remove(behaviourRemoved.Id);
}
protected override void OnEnteringUniverse(IUniverse universe) => _networkEntityCollector.Assign(universe);
protected override void OnExitingUniverse(IUniverse universe) => _networkEntityCollector.Unassign();
}