60 lines
2.2 KiB
C#
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();
|
|
}
|