From 35ebc910edac8d233d8875dda6c3e037b4519b16 Mon Sep 17 00:00:00 2001 From: xeon Date: Fri, 9 Feb 2024 12:44:42 +0300 Subject: [PATCH] Split network layer and session layer --- .../Handlers/AchievementMessageHandler.cs | 2 +- GameServer/Handlers/AuthMessageHandler.cs | 2 +- .../Handlers/DailyActivityMessageHandler.cs | 2 +- .../Handlers/ExchangeRewardMessageHandler.cs | 2 +- .../Handlers/FormationMessageHandler.cs | 2 +- GameServer/Handlers/FriendMessageHandler.cs | 2 +- GameServer/Handlers/GachaMessageHandler.cs | 2 +- .../InfluenceReputationMessageHandler.cs | 2 +- .../Handlers/InventoryMessageHandler.cs | 2 +- GameServer/Handlers/LordGymMessageHandler.cs | 2 +- GameServer/Handlers/MessageHandlerBase.cs | 4 +- .../Handlers/RoguelikeMessageHandler.cs | 2 +- GameServer/Handlers/RoleMessageHandler.cs | 2 +- GameServer/Handlers/ShopMessageHandler.cs | 2 +- GameServer/Handlers/TowerMessageHandler.cs | 2 +- GameServer/Handlers/TutorialMessageHandler.cs | 2 +- GameServer/Handlers/WorldMapMessageHandler.cs | 2 +- GameServer/Handlers/WorldMessageHandler.cs | 2 +- GameServer/Network/IConnection.cs | 9 ++ GameServer/Network/ISessionActionListener.cs | 7 ++ GameServer/Network/Kcp/KcpConnection.cs | 62 +++++++++++ GameServer/Network/{ => Kcp}/KcpGateway.cs | 2 +- GameServer/Network/KcpSession.cs | 104 ------------------ GameServer/Network/PlayerSession.cs | 53 +++++++++ GameServer/Network/Rpc/RpcSessionEndPoint.cs | 6 +- GameServer/Network/SessionManager.cs | 17 ++- GameServer/Program.cs | 3 +- GameServer/WWGameServer.cs | 2 +- 28 files changed, 170 insertions(+), 133 deletions(-) create mode 100644 GameServer/Network/IConnection.cs create mode 100644 GameServer/Network/ISessionActionListener.cs create mode 100644 GameServer/Network/Kcp/KcpConnection.cs rename GameServer/Network/{ => Kcp}/KcpGateway.cs (98%) delete mode 100644 GameServer/Network/KcpSession.cs create mode 100644 GameServer/Network/PlayerSession.cs diff --git a/GameServer/Handlers/AchievementMessageHandler.cs b/GameServer/Handlers/AchievementMessageHandler.cs index 7dfac49..3bbcb22 100644 --- a/GameServer/Handlers/AchievementMessageHandler.cs +++ b/GameServer/Handlers/AchievementMessageHandler.cs @@ -5,7 +5,7 @@ using Protocol; namespace GameServer.Handlers; internal class AchievementMessageHandler : MessageHandlerBase { - public AchievementMessageHandler(KcpSession session) : base(session) + public AchievementMessageHandler(PlayerSession session) : base(session) { // AchievementMessageHandler. } diff --git a/GameServer/Handlers/AuthMessageHandler.cs b/GameServer/Handlers/AuthMessageHandler.cs index 1ab6bf4..980c9fc 100644 --- a/GameServer/Handlers/AuthMessageHandler.cs +++ b/GameServer/Handlers/AuthMessageHandler.cs @@ -8,7 +8,7 @@ internal class AuthMessageHandler : MessageHandlerBase { private readonly ModelManager _modelManager; - public AuthMessageHandler(KcpSession session, ModelManager modelManager) : base(session) + public AuthMessageHandler(PlayerSession session, ModelManager modelManager) : base(session) { _modelManager = modelManager; } diff --git a/GameServer/Handlers/DailyActivityMessageHandler.cs b/GameServer/Handlers/DailyActivityMessageHandler.cs index 52202da..71bc86b 100644 --- a/GameServer/Handlers/DailyActivityMessageHandler.cs +++ b/GameServer/Handlers/DailyActivityMessageHandler.cs @@ -5,7 +5,7 @@ using Protocol; namespace GameServer.Handlers; internal class DailyActivityMessageHandler : MessageHandlerBase { - public DailyActivityMessageHandler(KcpSession session) : base(session) + public DailyActivityMessageHandler(PlayerSession session) : base(session) { // DailyActivityMessageHandler. } diff --git a/GameServer/Handlers/ExchangeRewardMessageHandler.cs b/GameServer/Handlers/ExchangeRewardMessageHandler.cs index d559fe5..9ac8700 100644 --- a/GameServer/Handlers/ExchangeRewardMessageHandler.cs +++ b/GameServer/Handlers/ExchangeRewardMessageHandler.cs @@ -5,7 +5,7 @@ using Protocol; namespace GameServer.Handlers; internal class ExchangeRewardMessageHandler : MessageHandlerBase { - public ExchangeRewardMessageHandler(KcpSession session) : base(session) + public ExchangeRewardMessageHandler(PlayerSession session) : base(session) { // ExchangeRewardMessageHandler. } diff --git a/GameServer/Handlers/FormationMessageHandler.cs b/GameServer/Handlers/FormationMessageHandler.cs index ec0ee26..b5f0829 100644 --- a/GameServer/Handlers/FormationMessageHandler.cs +++ b/GameServer/Handlers/FormationMessageHandler.cs @@ -8,7 +8,7 @@ internal class FormationMessageHandler : MessageHandlerBase { private readonly ModelManager _modelManager; - public FormationMessageHandler(KcpSession session, ModelManager modelManager) : base(session) + public FormationMessageHandler(PlayerSession session, ModelManager modelManager) : base(session) { _modelManager = modelManager; } diff --git a/GameServer/Handlers/FriendMessageHandler.cs b/GameServer/Handlers/FriendMessageHandler.cs index 9cce4ad..82b1402 100644 --- a/GameServer/Handlers/FriendMessageHandler.cs +++ b/GameServer/Handlers/FriendMessageHandler.cs @@ -5,7 +5,7 @@ using Protocol; namespace GameServer.Handlers; internal class FriendMessageHandler : MessageHandlerBase { - public FriendMessageHandler(KcpSession session) : base(session) + public FriendMessageHandler(PlayerSession session) : base(session) { // FriendMessageHandler. } diff --git a/GameServer/Handlers/GachaMessageHandler.cs b/GameServer/Handlers/GachaMessageHandler.cs index df52b03..7d3a58a 100644 --- a/GameServer/Handlers/GachaMessageHandler.cs +++ b/GameServer/Handlers/GachaMessageHandler.cs @@ -5,7 +5,7 @@ using Protocol; namespace GameServer.Handlers; internal class GachaMessageHandler : MessageHandlerBase { - public GachaMessageHandler(KcpSession session) : base(session) + public GachaMessageHandler(PlayerSession session) : base(session) { // GachaMessageHandler. } diff --git a/GameServer/Handlers/InfluenceReputationMessageHandler.cs b/GameServer/Handlers/InfluenceReputationMessageHandler.cs index f2f22d3..4aeaf92 100644 --- a/GameServer/Handlers/InfluenceReputationMessageHandler.cs +++ b/GameServer/Handlers/InfluenceReputationMessageHandler.cs @@ -5,7 +5,7 @@ using Protocol; namespace GameServer.Handlers; internal class InfluenceReputationMessageHandler : MessageHandlerBase { - public InfluenceReputationMessageHandler(KcpSession session) : base(session) + public InfluenceReputationMessageHandler(PlayerSession session) : base(session) { // InfluenceReputationMessageHandler. } diff --git a/GameServer/Handlers/InventoryMessageHandler.cs b/GameServer/Handlers/InventoryMessageHandler.cs index 459a6f4..e0a495c 100644 --- a/GameServer/Handlers/InventoryMessageHandler.cs +++ b/GameServer/Handlers/InventoryMessageHandler.cs @@ -5,7 +5,7 @@ using Protocol; namespace GameServer.Handlers; internal class InventoryMessageHandler : MessageHandlerBase { - public InventoryMessageHandler(KcpSession session) : base(session) + public InventoryMessageHandler(PlayerSession session) : base(session) { // InventoryMessageHandler. } diff --git a/GameServer/Handlers/LordGymMessageHandler.cs b/GameServer/Handlers/LordGymMessageHandler.cs index 3e365e5..b02896d 100644 --- a/GameServer/Handlers/LordGymMessageHandler.cs +++ b/GameServer/Handlers/LordGymMessageHandler.cs @@ -5,7 +5,7 @@ using Protocol; namespace GameServer.Handlers; internal class LordGymMessageHandler : MessageHandlerBase { - public LordGymMessageHandler(KcpSession session) : base(session) + public LordGymMessageHandler(PlayerSession session) : base(session) { // LordGymMessageHandler. } diff --git a/GameServer/Handlers/MessageHandlerBase.cs b/GameServer/Handlers/MessageHandlerBase.cs index 84259d1..56bec7d 100644 --- a/GameServer/Handlers/MessageHandlerBase.cs +++ b/GameServer/Handlers/MessageHandlerBase.cs @@ -3,9 +3,9 @@ namespace GameServer.Handlers; internal abstract class MessageHandlerBase { - protected KcpSession Session { get; } + protected PlayerSession Session { get; } - public MessageHandlerBase(KcpSession session) + public MessageHandlerBase(PlayerSession session) { Session = session; } diff --git a/GameServer/Handlers/RoguelikeMessageHandler.cs b/GameServer/Handlers/RoguelikeMessageHandler.cs index cc72fde..736ea12 100644 --- a/GameServer/Handlers/RoguelikeMessageHandler.cs +++ b/GameServer/Handlers/RoguelikeMessageHandler.cs @@ -5,7 +5,7 @@ using Protocol; namespace GameServer.Handlers; internal class RoguelikeMessageHandler : MessageHandlerBase { - public RoguelikeMessageHandler(KcpSession session) : base(session) + public RoguelikeMessageHandler(PlayerSession session) : base(session) { // RoguelikeMessageHandler. } diff --git a/GameServer/Handlers/RoleMessageHandler.cs b/GameServer/Handlers/RoleMessageHandler.cs index 087acfa..7259224 100644 --- a/GameServer/Handlers/RoleMessageHandler.cs +++ b/GameServer/Handlers/RoleMessageHandler.cs @@ -5,7 +5,7 @@ using Protocol; namespace GameServer.Handlers; internal class RoleMessageHandler : MessageHandlerBase { - public RoleMessageHandler(KcpSession session) : base(session) + public RoleMessageHandler(PlayerSession session) : base(session) { // RoleMessageHandler. } diff --git a/GameServer/Handlers/ShopMessageHandler.cs b/GameServer/Handlers/ShopMessageHandler.cs index afa8753..cefde20 100644 --- a/GameServer/Handlers/ShopMessageHandler.cs +++ b/GameServer/Handlers/ShopMessageHandler.cs @@ -5,7 +5,7 @@ using Protocol; namespace GameServer.Handlers; internal class ShopMessageHandler : MessageHandlerBase { - public ShopMessageHandler(KcpSession session) : base(session) + public ShopMessageHandler(PlayerSession session) : base(session) { // ShopMessageHandler. } diff --git a/GameServer/Handlers/TowerMessageHandler.cs b/GameServer/Handlers/TowerMessageHandler.cs index 4e15e07..49674c1 100644 --- a/GameServer/Handlers/TowerMessageHandler.cs +++ b/GameServer/Handlers/TowerMessageHandler.cs @@ -5,7 +5,7 @@ using Protocol; namespace GameServer.Handlers; internal class TowerMessageHandler : MessageHandlerBase { - public TowerMessageHandler(KcpSession session) : base(session) + public TowerMessageHandler(PlayerSession session) : base(session) { // TowerMessageHandler. } diff --git a/GameServer/Handlers/TutorialMessageHandler.cs b/GameServer/Handlers/TutorialMessageHandler.cs index bc73e81..6d1e39c 100644 --- a/GameServer/Handlers/TutorialMessageHandler.cs +++ b/GameServer/Handlers/TutorialMessageHandler.cs @@ -5,7 +5,7 @@ using Protocol; namespace GameServer.Handlers; internal class TutorialMessageHandler : MessageHandlerBase { - public TutorialMessageHandler(KcpSession session) : base(session) + public TutorialMessageHandler(PlayerSession session) : base(session) { // TutorialMessageHandler. } diff --git a/GameServer/Handlers/WorldMapMessageHandler.cs b/GameServer/Handlers/WorldMapMessageHandler.cs index 9529791..7bfdcc2 100644 --- a/GameServer/Handlers/WorldMapMessageHandler.cs +++ b/GameServer/Handlers/WorldMapMessageHandler.cs @@ -5,7 +5,7 @@ using Protocol; namespace GameServer.Handlers; internal class WorldMapMessageHandler : MessageHandlerBase { - public WorldMapMessageHandler(KcpSession session) : base(session) + public WorldMapMessageHandler(PlayerSession session) : base(session) { // WorldMapMessageHandler. } diff --git a/GameServer/Handlers/WorldMessageHandler.cs b/GameServer/Handlers/WorldMessageHandler.cs index 7967503..d0db7d0 100644 --- a/GameServer/Handlers/WorldMessageHandler.cs +++ b/GameServer/Handlers/WorldMessageHandler.cs @@ -5,7 +5,7 @@ using Protocol; namespace GameServer.Handlers; internal class WorldMessageHandler : MessageHandlerBase { - public WorldMessageHandler(KcpSession session) : base(session) + public WorldMessageHandler(PlayerSession session) : base(session) { // WorldMessageHandler. } diff --git a/GameServer/Network/IConnection.cs b/GameServer/Network/IConnection.cs new file mode 100644 index 0000000..15e8ac0 --- /dev/null +++ b/GameServer/Network/IConnection.cs @@ -0,0 +1,9 @@ +using GameServer.Network.Packets; + +namespace GameServer.Network; +internal interface IConnection : ISessionActionListener +{ + bool Active { get; } + ValueTask ReceiveMessageAsync(); + +} diff --git a/GameServer/Network/ISessionActionListener.cs b/GameServer/Network/ISessionActionListener.cs new file mode 100644 index 0000000..082d32c --- /dev/null +++ b/GameServer/Network/ISessionActionListener.cs @@ -0,0 +1,7 @@ +using GameServer.Network.Packets; + +namespace GameServer.Network; +internal interface ISessionActionListener +{ + public Task OnServerMessageAvailable(BaseMessage message); +} diff --git a/GameServer/Network/Kcp/KcpConnection.cs b/GameServer/Network/Kcp/KcpConnection.cs new file mode 100644 index 0000000..f579cc0 --- /dev/null +++ b/GameServer/Network/Kcp/KcpConnection.cs @@ -0,0 +1,62 @@ +using GameServer.Extensions; +using GameServer.Handlers; +using GameServer.Network.Packets; +using System.Buffers; +using KcpSharp; + +namespace GameServer.Network.Kcp; +internal class KcpConnection : IConnection +{ + private readonly byte[] _recvBuffer; + private readonly KcpConversation _conv; + private uint _upStreamSeqNo; + private uint _downStreamSeqNo; + + public KcpConnection(KcpConversation conv) + { + _conv = conv; + _recvBuffer = GC.AllocateUninitializedArray(8192); + } + + public bool Active => !_conv.TransportClosed; + + public async ValueTask ReceiveMessageAsync() + { + KcpConversationReceiveResult result = await _conv.ReceiveAsync(_recvBuffer.AsMemory(), CancellationToken.None); + if (result.TransportClosed) return null; + + ReadOnlyMemory buffer = _recvBuffer.AsMemory(0, result.BytesReceived); + BaseMessage message = MessageManager.DecodeMessage(buffer.Slice(BaseMessage.LengthFieldSize, buffer.Span.ReadInt24LittleEndian())); + + if (message.SeqNo < _downStreamSeqNo) return null; + + _downStreamSeqNo = message.SeqNo; + return message; + } + + public Task OnServerMessageAvailable(BaseMessage message) + { + message.SeqNo = NextUpStreamSeqNo(); + return SendAsyncImpl(message); + } + + private async Task SendAsyncImpl(BaseMessage message) + { + int networkSize = message.NetworkSize; + + using IMemoryOwner memoryOwner = MemoryPool.Shared.Rent(networkSize); + Memory memory = memoryOwner.Memory; + + memory.Span.WriteInt24LittleEndian(networkSize - BaseMessage.LengthFieldSize); + + MessageManager.EncodeMessage(memory[BaseMessage.LengthFieldSize..], message); + + if (_conv == null) throw new InvalidOperationException("Trying to send message when conv is null"); + await _conv.SendAsync(memoryOwner.Memory[..networkSize]); + } + + private uint NextUpStreamSeqNo() + { + return Interlocked.Increment(ref _upStreamSeqNo); + } +} diff --git a/GameServer/Network/KcpGateway.cs b/GameServer/Network/Kcp/KcpGateway.cs similarity index 98% rename from GameServer/Network/KcpGateway.cs rename to GameServer/Network/Kcp/KcpGateway.cs index abb032e..443c18a 100644 --- a/GameServer/Network/KcpGateway.cs +++ b/GameServer/Network/Kcp/KcpGateway.cs @@ -5,7 +5,7 @@ using System.Net.Sockets; using KcpSharp; using Microsoft.Extensions.Logging; -namespace GameServer.Network; +namespace GameServer.Network.Kcp; internal class KcpGateway { private const int KcpSynPacketSize = 1; diff --git a/GameServer/Network/KcpSession.cs b/GameServer/Network/KcpSession.cs deleted file mode 100644 index f756de6..0000000 --- a/GameServer/Network/KcpSession.cs +++ /dev/null @@ -1,104 +0,0 @@ -using System.Buffers; -using GameServer.Extensions; -using GameServer.Handlers; -using GameServer.Network.Messages; -using GameServer.Network.Packets; -using GameServer.Network.Rpc; -using Google.Protobuf; -using KcpSharp; -using Microsoft.Extensions.Logging; -using Protocol; - -namespace GameServer.Network; -internal class KcpSession -{ - private readonly ILogger _logger; - private readonly MessageManager _messageManager; - private readonly byte[] _recvBuffer; - - private KcpConversation? _conv; - private uint _upStreamSeqNo; - private uint _downStreamSeqNo; - - public RpcManager Rpc { get; } - - public KcpSession(ILogger logger, MessageManager messageManager, RpcManager rpcManager) - { - _logger = logger; - _messageManager = messageManager; - Rpc = rpcManager; - _recvBuffer = GC.AllocateUninitializedArray(8192); - } - - public async Task RunAsync() - { - while (_conv != null) - { - KcpConversationReceiveResult result = await _conv.ReceiveAsync(_recvBuffer.AsMemory(), CancellationToken.None); - if (result.TransportClosed) return; - - ReadOnlyMemory buffer = _recvBuffer.AsMemory(0, result.BytesReceived); - await HandleMessageAsync(MessageManager.DecodeMessage(buffer.Slice(BaseMessage.LengthFieldSize, buffer.Span.ReadInt24LittleEndian()))); - } - } - - private async Task HandleMessageAsync(BaseMessage message) - { - if (_downStreamSeqNo >= message.SeqNo) return; - _downStreamSeqNo = message.SeqNo; - - switch (message) - { - case RequestMessage request: - await Rpc.HandleRpcRequest(request); - break; - case PushMessage push: - if (!await _messageManager.ProcessMessage(push.MessageId, push.Payload)) - _logger.LogWarning("Push message ({id}) was not handled", push.MessageId); - - break; - } - } - - public Task PushMessage(MessageId id, TProtoBuf data) where TProtoBuf : IMessage - { - return Send(new PushMessage - { - MessageId = id, - Payload = data.ToByteArray() - }); - } - - public Task Send(BaseMessage message) - { - message.SeqNo = NextUpStreamSeqNo(); - return SendAsyncImpl(message); - } - - public void SetConv(KcpConversation conv) - { - if (_conv != null) throw new InvalidOperationException("Conv was already set"); - - _conv = conv; - } - - private uint NextUpStreamSeqNo() - { - return Interlocked.Increment(ref _upStreamSeqNo); - } - - private async Task SendAsyncImpl(BaseMessage message) - { - int networkSize = message.NetworkSize; - - using IMemoryOwner memoryOwner = MemoryPool.Shared.Rent(networkSize); - Memory memory = memoryOwner.Memory; - - memory.Span.WriteInt24LittleEndian(networkSize - BaseMessage.LengthFieldSize); - - MessageManager.EncodeMessage(memory[BaseMessage.LengthFieldSize..], message); - - if (_conv == null) throw new InvalidOperationException("Trying to send message when conv is null"); - await _conv.SendAsync(memoryOwner.Memory[..networkSize]); - } -} diff --git a/GameServer/Network/PlayerSession.cs b/GameServer/Network/PlayerSession.cs new file mode 100644 index 0000000..04ddda7 --- /dev/null +++ b/GameServer/Network/PlayerSession.cs @@ -0,0 +1,53 @@ +using GameServer.Handlers; +using GameServer.Network.Messages; +using GameServer.Network.Packets; +using GameServer.Network.Rpc; +using Google.Protobuf; +using Microsoft.Extensions.Logging; +using Protocol; + +namespace GameServer.Network; +internal class PlayerSession +{ + private readonly ILogger _logger; + private readonly MessageManager _messageManager; + + public RpcManager Rpc { get; } + public ISessionActionListener? Listener { private get; set; } + + public PlayerSession(ILogger logger, MessageManager messageManager, RpcManager rpcManager) + { + _logger = logger; + _messageManager = messageManager; + Rpc = rpcManager; + } + + public async Task HandleMessageAsync(BaseMessage message) + { + switch (message) + { + case RequestMessage request: + await Rpc.HandleRpcRequest(request); + break; + case PushMessage push: + if (!await _messageManager.ProcessMessage(push.MessageId, push.Payload)) + _logger.LogWarning("Push message ({id}) was not handled", push.MessageId); + + break; + } + } + + public Task PushMessage(MessageId id, TProtoBuf data) where TProtoBuf : IMessage + { + return Listener?.OnServerMessageAvailable(new PushMessage + { + MessageId = id, + Payload = data.ToByteArray() + }) ?? Task.CompletedTask; + } + + public Task SendRpcRsp(ResponseMessage message) + { + return Listener?.OnServerMessageAvailable(message) ?? Task.CompletedTask; + } +} diff --git a/GameServer/Network/Rpc/RpcSessionEndPoint.cs b/GameServer/Network/Rpc/RpcSessionEndPoint.cs index 2d8b954..ecf7bfb 100644 --- a/GameServer/Network/Rpc/RpcSessionEndPoint.cs +++ b/GameServer/Network/Rpc/RpcSessionEndPoint.cs @@ -5,14 +5,14 @@ namespace GameServer.Network.Rpc; internal class RpcSessionEndPoint : IRpcEndPoint { private readonly IServiceProvider _serviceProvider; - private KcpSession? _session; + private PlayerSession? _session; - private KcpSession Session => _session ??= _serviceProvider.GetRequiredService(); + private PlayerSession Session => _session ??= _serviceProvider.GetRequiredService(); public RpcSessionEndPoint(IServiceProvider serviceProvider) { _serviceProvider = serviceProvider; } - public Task SendRpcResult(ResponseMessage message) => Session.Send(message); + public Task SendRpcResult(ResponseMessage message) => Session.SendRpcRsp(message); } diff --git a/GameServer/Network/SessionManager.cs b/GameServer/Network/SessionManager.cs index 7a8d0ea..945db70 100644 --- a/GameServer/Network/SessionManager.cs +++ b/GameServer/Network/SessionManager.cs @@ -1,4 +1,6 @@ -using KcpSharp; +using GameServer.Network.Kcp; +using GameServer.Network.Packets; +using KcpSharp; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; @@ -17,12 +19,19 @@ internal class SessionManager public async Task RunSessionAsync(KcpConversation kcpConv) { using IServiceScope scope = _scopeFactory.CreateScope(); - KcpSession session = scope.ServiceProvider.GetRequiredService(); + PlayerSession session = scope.ServiceProvider.GetRequiredService(); + KcpConnection connection = new(kcpConv); + session.Listener = connection; try { - session.SetConv(kcpConv); - await session.RunAsync(); + while (connection.Active) + { + BaseMessage? message = await connection.ReceiveMessageAsync(); + if (message == null) break; + + await session.HandleMessageAsync(message); + } } catch (Exception exception) { diff --git a/GameServer/Program.cs b/GameServer/Program.cs index 4a886b6..e86211a 100644 --- a/GameServer/Program.cs +++ b/GameServer/Program.cs @@ -3,6 +3,7 @@ using GameServer.Handlers; using GameServer.Handlers.Factory; using GameServer.Models; using GameServer.Network; +using GameServer.Network.Kcp; using GameServer.Network.Rpc; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; @@ -18,7 +19,7 @@ internal static class Program builder.Logging.AddConsole(); builder.Services.AddHandlers() - .AddSingleton().AddScoped() + .AddSingleton().AddScoped() .AddScoped().AddSingleton() .AddScoped().AddScoped() .AddSingleton() diff --git a/GameServer/WWGameServer.cs b/GameServer/WWGameServer.cs index 7e70c32..d6f1ed8 100644 --- a/GameServer/WWGameServer.cs +++ b/GameServer/WWGameServer.cs @@ -1,5 +1,5 @@ using GameServer.Handlers.Factory; -using GameServer.Network; +using GameServer.Network.Kcp; using Microsoft.Extensions.Hosting; namespace GameServer;