82 lines
2.3 KiB
C#
82 lines
2.3 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
|
|
using LiteNetLib;
|
|
using LiteNetLib.Utils;
|
|
|
|
using Syntriax.Engine.Core;
|
|
using Syntriax.Engine.Core.Abstract;
|
|
using Syntriax.Engine.Network.Abstract;
|
|
|
|
namespace Syntriax.Engine.Network;
|
|
|
|
public abstract class NetworkBase : BehaviourOverride, INetworkCommunicator
|
|
{
|
|
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;
|
|
}
|
|
|
|
public void PollEvents() => Manager.PollEvents();
|
|
public void Stop() => Manager.Stop();
|
|
|
|
protected override void OnUpdate() => PollEvents();
|
|
protected override void OnFinalize() => Stop();
|
|
|
|
private readonly Dictionary<string, Action<NetPacketReader, NetPeer>> callbacks = new(32);
|
|
|
|
private void NetworkReceiveEvent(NetPeer peer, NetPacketReader reader, byte channel, DeliveryMethod deliveryMethod)
|
|
{
|
|
if (callbacks.TryGetValue(reader.GetString(), out var action))
|
|
action?.Invoke(reader, peer);
|
|
|
|
reader.Recycle();
|
|
}
|
|
|
|
public void RegisterEntityListener(IEntity entity, Action<NetPacketReader, NetPeer> onDataReceived)
|
|
{
|
|
if (callbacks.ContainsKey(entity.Id))
|
|
return;
|
|
|
|
callbacks.Add(entity.Id, onDataReceived);
|
|
entity.OnIdChanged += OnEntityIdChanged;
|
|
}
|
|
|
|
public void UnregisterEntityListener(IEntity entity)
|
|
{
|
|
if (!callbacks.Remove(entity.Id))
|
|
return;
|
|
|
|
entity.OnIdChanged -= OnEntityIdChanged;
|
|
}
|
|
|
|
public NetDataWriter GetMessageWriter(IEntity entity)
|
|
{
|
|
NetDataWriter netDataWriter = GetEntityWriter(entity);
|
|
netDataWriter.Put((int)MessageType.Message);
|
|
return netDataWriter;
|
|
}
|
|
|
|
public NetDataWriter GetEntityWriter(IEntity entity)
|
|
{
|
|
NetDataWriter netDataWriter = new();
|
|
netDataWriter.Put(entity.Id);
|
|
return netDataWriter;
|
|
}
|
|
|
|
private void OnEntityIdChanged(IEntity entity, string previousId)
|
|
{
|
|
var action = callbacks[previousId];
|
|
callbacks.Remove(previousId);
|
|
callbacks.Add(entity.Id, action);
|
|
}
|
|
}
|