using System; using System.Collections.Generic; using System.Diagnostics; using LiteNetLib; using LiteNetLib.Utils; using Syntriax.Engine.Core; using Syntriax.Engine.Network.Abstract; namespace Syntriax.Engine.Network; public abstract class NetworkBase : BehaviourOverride, INetworkCommunicator { private readonly NetPacketProcessor netPacketProcessor = new(); private readonly Dictionary networkEntities = []; private BehaviourCollector networkEntityCollector = null!; public EventBasedNetListener Listener { get; private set; } = null!; public NetManager Manager { get; private set; } = null!; public NetworkBase() { Priority = 10; Listener = new EventBasedNetListener(); Manager = new NetManager(Listener); Listener.NetworkReceiveEvent += NetworkReceiveEvent; netPacketProcessor.SubscribeReusable, NetPeer>(OnPacketArrived); } private void OnPacketArrived(NetworkPacket packet, NetPeer peer) { Debug.WriteLine($"Packet Arrived for {packet.NetworkId}: {packet.Data}"); } int i = 0; public void SendData() { NetDataWriter netDataWriter = new(); NetworkPacket packet = new() { NetworkId = (uint)i++, Data = i++ }; netPacketProcessor.Write(netDataWriter, packet); Debug.WriteLine($"Packet Sending {packet.NetworkId}: {packet.Data}"); foreach (var item in Manager.ConnectedPeerList) item.Send(netDataWriter, DeliveryMethod.ReliableUnordered); } protected override void OnInitialize() { base.OnInitialize(); networkEntityCollector = new(GameObject.GameManager); networkEntityCollector.OnCollected += OnNetworkEntityCollected; networkEntityCollector.OnRemoved += OnNetworkEntityRemoved; } protected override void OnFinalize() { networkEntityCollector.OnCollected -= OnNetworkEntityCollected; networkEntityCollector.OnRemoved -= OnNetworkEntityRemoved; Stop(); } private void OnNetworkEntityCollected(BehaviourCollector sender, INetworkEntity behaviourCollected) => networkEntities.Add(behaviourCollected.NetworkId, behaviourCollected); private void OnNetworkEntityRemoved(BehaviourCollector sender, INetworkEntity behaviourRemoved) => networkEntities.Remove(behaviourRemoved.NetworkId); private void NetworkReceiveEvent(NetPeer peer, NetPacketReader reader, byte channel, DeliveryMethod deliveryMethod) { netPacketProcessor.ReadAllPackets(reader, peer); } public void PollEvents() => Manager.PollEvents(); public void Stop() => Manager.Stop(); protected override void OnUpdate() => PollEvents(); }