93 lines
3.3 KiB
C#
93 lines
3.3 KiB
C#
|
using System.Collections;
|
||
|
using System.Collections.Generic;
|
||
|
using GameNetworkLayer.Shared;
|
||
|
using Svelto.Context;
|
||
|
using Svelto.ECS;
|
||
|
|
||
|
namespace CLre_server.API.Synergy
|
||
|
{
|
||
|
class ServerMessagingEngine: Engines.ServerEnginePreBuild, IWaitForFrameworkDestruction, IWaitForFrameworkInitialization
|
||
|
{
|
||
|
private struct MessageQueueItem
|
||
|
{
|
||
|
public SerializedCLreMessage msg;
|
||
|
public int playerId;
|
||
|
public NetworkDispatcherCode code;
|
||
|
}
|
||
|
|
||
|
private Utility.Reflection.INetMsgServerSender_SendMessage<SerializedCLreMessage> _sendMessage;
|
||
|
|
||
|
private Utility.Reflection.INetMsgServerListener_RegisterListener<SerializedCLreMessage> _registerListener;
|
||
|
|
||
|
private Queue<MessageQueueItem> _messageQueue = new Queue<MessageQueueItem>(10);
|
||
|
|
||
|
private bool _isRunning = false;
|
||
|
|
||
|
public override void Ready()
|
||
|
{
|
||
|
//Utility.Logging.MetaLog("Building send message delegate");
|
||
|
_sendMessage =
|
||
|
Utility.Reflection.MethodAsDelegate<Utility.Reflection.INetMsgServerSender_SendMessage<SerializedCLreMessage>>(
|
||
|
"GameNetworkLayer.Server.NetMessageServerSender:SendMessage",
|
||
|
generics: new [] {typeof(SerializedCLreMessage)},
|
||
|
instance: MainGameServer_SetupContainer_Patch.netMessageSender);
|
||
|
|
||
|
//Utility.Logging.MetaLog("Building register listener delegate");
|
||
|
_registerListener =
|
||
|
Utility.Reflection.MethodAsDelegate<Utility.Reflection.INetMsgServerListener_RegisterListener<SerializedCLreMessage>>(
|
||
|
"GameNetworkLayer.Server.NetMessageServerListener:RegisterListener",
|
||
|
generics: new [] {typeof(SerializedCLreMessage)},
|
||
|
instance: MainGameServer_SetupContainer_Patch.netMessageListener);
|
||
|
_registerListener(Message.CLre_MESSAGE_NETCODE, OnMessageReceived);
|
||
|
}
|
||
|
|
||
|
private void OnMessageReceived(int playerId, ref SerializedCLreMessage data)
|
||
|
{
|
||
|
Message.HandleMessageReceive(playerId, ref data);
|
||
|
}
|
||
|
|
||
|
internal void EnqueueMessage(int playerId, ref SerializedCLreMessage msg)
|
||
|
{
|
||
|
_messageQueue.Enqueue(new MessageQueueItem
|
||
|
{
|
||
|
msg = msg,
|
||
|
playerId = playerId,
|
||
|
code = Message.CLre_MESSAGE_NETCODE,
|
||
|
});
|
||
|
}
|
||
|
|
||
|
public ServerMessagingEngine(): base()
|
||
|
{
|
||
|
MainServer.Server.Instance.Connected += (_, __) => { MessageSender().Run(); };
|
||
|
}
|
||
|
|
||
|
public IEnumerator MessageSender()
|
||
|
{
|
||
|
while (!_isRunning)
|
||
|
{
|
||
|
yield return null;
|
||
|
}
|
||
|
while (_isRunning)
|
||
|
{
|
||
|
while (_messageQueue.Count != 0)
|
||
|
{
|
||
|
MessageQueueItem item = _messageQueue.Dequeue();
|
||
|
API.Utility.Logging.MetaLog($"Sending message with id {item.msg.Id}");
|
||
|
_sendMessage(item.code, ref item.msg, item.playerId);
|
||
|
}
|
||
|
|
||
|
yield return null;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public void OnFrameworkDestroyed()
|
||
|
{
|
||
|
_isRunning = false;
|
||
|
}
|
||
|
|
||
|
public void OnFrameworkInitialized()
|
||
|
{
|
||
|
_isRunning = true;
|
||
|
}
|
||
|
}
|
||
|
}
|