Skip to content

Commit 2fac9cb

Browse files
committed
Update command bus to use source generation and switch pipeline to ValueTask to reduce allocations
1 parent e6c3344 commit 2fac9cb

File tree

107 files changed

+271
-297
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

107 files changed

+271
-297
lines changed

.run/Fragment.NetSlum.Server.run.xml

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<component name="ProjectRunConfigurationManager">
2+
<configuration default="false" name="Fragment.NetSlum.Server" type="DotNetProject" factoryName=".NET Project">
3+
<option name="EXE_PATH" value="$PROJECT_DIR$/src/Fragment.NetSlum.Server/bin/Debug/net8.0/Fragment.NetSlum.Server.exe" />
4+
<option name="PROGRAM_PARAMETERS" value="" />
5+
<option name="WORKING_DIRECTORY" value="$PROJECT_DIR$/src/Fragment.NetSlum.Server/bin/Debug/net8.0" />
6+
<option name="PASS_PARENT_ENVS" value="1" />
7+
<option name="USE_EXTERNAL_CONSOLE" value="0" />
8+
<option name="USE_MONO" value="0" />
9+
<option name="RUNTIME_ARGUMENTS" value="" />
10+
<option name="PROJECT_PATH" value="$PROJECT_DIR$/src/Fragment.NetSlum.Server/Fragment.NetSlum.Server.csproj" />
11+
<option name="PROJECT_EXE_PATH_TRACKING" value="1" />
12+
<option name="PROJECT_ARGUMENTS_TRACKING" value="1" />
13+
<option name="PROJECT_WORKING_DIRECTORY_TRACKING" value="1" />
14+
<option name="PROJECT_KIND" value="DotNetCore" />
15+
<option name="PROJECT_TFM" value="net8.0" />
16+
<method v="2">
17+
<option name="Build" />
18+
</method>
19+
</configuration>
20+
</component>

src/Fragment.NetSlum.Core/CommandBus/Contracts/Commands/CommandHandler.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
using System.Threading;
22
using System.Threading.Tasks;
3-
using MediatR;
3+
using Mediator;
44

55
namespace Fragment.NetSlum.Core.CommandBus.Contracts.Commands;
66

@@ -13,5 +13,5 @@ namespace Fragment.NetSlum.Core.CommandBus.Contracts.Commands;
1313
public abstract class CommandHandler<TCommand, TResult> : ICommandHandler<TCommand, TResult>, IRequestHandler<TCommand, TResult>
1414
where TCommand : ICommand<TResult>
1515
{
16-
public abstract Task<TResult> Handle(TCommand command, CancellationToken cancellationToken);
16+
public abstract ValueTask<TResult> Handle(TCommand command, CancellationToken cancellationToken);
1717
}

src/Fragment.NetSlum.Core/CommandBus/Contracts/Commands/ICommand.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using MediatR;
1+
using Mediator;
22

33
namespace Fragment.NetSlum.Core.CommandBus.Contracts.Commands;
44

Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
using System.Threading;
22
using System.Threading.Tasks;
3-
using MediatR;
3+
using Mediator;
44

55
namespace Fragment.NetSlum.Core.CommandBus.Contracts.Commands;
66

77
public interface ICommandHandler<in TCommand, TResult> where TCommand : ICommand<TResult>
88
{
9-
public Task<TResult> Handle(TCommand command, CancellationToken cancellationToken);
9+
public ValueTask<TResult> Handle(TCommand command, CancellationToken cancellationToken);
1010
}
1111

1212
public interface ICommandHandler<in TCommand> : ICommandHandler<TCommand, Unit> where TCommand : ICommand {}

src/Fragment.NetSlum.Core/CommandBus/Contracts/Events/EventHandler.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
using System.Threading;
22
using System.Threading.Tasks;
3-
using MediatR;
3+
using Mediator;
44

55
namespace Fragment.NetSlum.Core.CommandBus.Contracts.Events;
66

@@ -12,5 +12,5 @@ namespace Fragment.NetSlum.Core.CommandBus.Contracts.Events;
1212
public abstract class EventHandler<TEvent> : IEventHandler<TEvent>, INotificationHandler<TEvent>
1313
where TEvent : IEvent
1414
{
15-
public abstract Task Handle(TEvent eventInfo, CancellationToken cancellationToken);
15+
public abstract ValueTask Handle(TEvent eventInfo, CancellationToken cancellationToken);
1616
}

src/Fragment.NetSlum.Core/CommandBus/Contracts/Events/IEvent.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using MediatR;
1+
using Mediator;
22

33
namespace Fragment.NetSlum.Core.CommandBus.Contracts.Events;
44

src/Fragment.NetSlum.Core/CommandBus/Contracts/Events/IEventHandler.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,5 @@ namespace Fragment.NetSlum.Core.CommandBus.Contracts.Events;
55

66
internal interface IEventHandler<in TEvent> where TEvent : IEvent
77
{
8-
public Task Handle(TEvent eventInfo, CancellationToken cancellationToken);
8+
public ValueTask Handle(TEvent eventInfo, CancellationToken cancellationToken);
99
}

src/Fragment.NetSlum.Core/CommandBus/Contracts/Queries/IQuery.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
using MediatR;
1+
using Mediator;
22

33
namespace Fragment.NetSlum.Core.CommandBus.Contracts.Queries;
44

src/Fragment.NetSlum.Core/CommandBus/Contracts/Queries/IQueryHandler.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,5 @@ namespace Fragment.NetSlum.Core.CommandBus.Contracts.Queries;
55

66
public interface IQueryHandler<in TQuery, TResult> where TQuery : IQuery<TResult>
77
{
8-
public Task<TResult> Handle(TQuery command, CancellationToken cancellationToken);
8+
public ValueTask<TResult> Handle(TQuery command, CancellationToken cancellationToken);
99
}

src/Fragment.NetSlum.Core/CommandBus/Contracts/Queries/QueryHandler.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
using System.Threading;
22
using System.Threading.Tasks;
3-
using MediatR;
3+
using Mediator;
44

55
namespace Fragment.NetSlum.Core.CommandBus.Contracts.Queries;
66

@@ -13,5 +13,5 @@ namespace Fragment.NetSlum.Core.CommandBus.Contracts.Queries;
1313
public abstract class QueryHandler<TCommand, TResult> : IQueryHandler<TCommand, TResult>, IRequestHandler<TCommand, TResult>
1414
where TCommand : IQuery<TResult>
1515
{
16-
public abstract Task<TResult> Handle(TCommand command, CancellationToken cancellationToken);
16+
public abstract ValueTask<TResult> Handle(TCommand command, CancellationToken cancellationToken);
1717
}

src/Fragment.NetSlum.Core/CommandBus/MediatorCommandBus.cs

+3-5
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
using System.Threading;
22
using System.Threading.Tasks;
3-
using Fragment.NetSlum.Core.CommandBus.Contracts.Commands;
43
using Fragment.NetSlum.Core.CommandBus.Contracts.Events;
5-
using Fragment.NetSlum.Core.CommandBus.Contracts.Queries;
6-
using MediatR;
4+
using Mediator;
75

86
namespace Fragment.NetSlum.Core.CommandBus;
97

@@ -24,12 +22,12 @@ public async Task Notify<TEvent>(TEvent eventInfo, CancellationToken cancellatio
2422
await _mediator.Publish(eventInfo, cancellationToken);
2523
}
2624

27-
public async Task<TResult> GetResult<TResult>(IQuery<TResult> query, CancellationToken cancellationToken = default)
25+
public async Task<TResult> GetResult<TResult>(Contracts.Queries.IQuery<TResult> query, CancellationToken cancellationToken = default)
2826
{
2927
return await _mediator.Send(query, cancellationToken);
3028
}
3129

32-
public async Task<TResult> Execute<TResult>(ICommand<TResult> command, CancellationToken cancellationToken = default)
30+
public async Task<TResult> Execute<TResult>(Contracts.Commands.ICommand<TResult> command, CancellationToken cancellationToken = default)
3331
{
3432
return await _mediator.Send(command, cancellationToken);
3533
}

src/Fragment.NetSlum.Core/Extensions/IpAddressExtensions.cs

+4-4
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@ public static class IpAddressExtensions
88
/// Private IP CIDR ranges defined by
99
/// <a href="http://www.faqs.org/rfcs/rfc1918.html">RFC1918</a>
1010
/// </summary>
11-
private static readonly string[] _privateIpCidrs = new string[]
12-
{
11+
private static readonly string[] _privateIpCidrs =
12+
[
1313
"10.0.0.0/8",
1414
"172.16.0.0/12",
15-
"192.168.0.0/16",
16-
};
15+
"192.168.0.0/16"
16+
];
1717

1818
/// <summary>
1919
/// Determines if the given <see cref="IPAddress"/> is a private (LAN) IP
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using Mediator;
12
using System;
23
using System.Linq;
34
using Fragment.NetSlum.Core.CommandBus;
@@ -16,18 +17,6 @@ public static class ServiceCollectionExtensions
1617
/// <returns></returns>
1718
public static IServiceCollection AddCommandBus(this IServiceCollection services, params Type[] types)
1819
{
19-
services.AddMediatR(cfg =>
20-
{
21-
cfg.RegisterServicesFromAssemblies(types.Select(t => t.Assembly).ToArray());
22-
cfg.TypeEvaluator = t =>
23-
{
24-
Log.Information(t.Name);
25-
return true;
26-
};
27-
});
28-
29-
services.AddScoped<ICommandBus, MediatorCommandBus>();
30-
3120
return services;
3221
}
3322
}

src/Fragment.NetSlum.Core/Fragment.NetSlum.Core.csproj

+3-3
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,12 @@
1212
<PackageReference Include="IPNetwork2" Version="3.0.667">
1313
<Aliases>IPNetwork2</Aliases>
1414
</PackageReference>
15-
<PackageReference Include="MediatR" Version="12.2.0" />
16-
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="8.0.5" />
15+
<PackageReference Include="Mediator.Abstractions" Version="2.1.7" />
16+
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="8.0.6" />
1717
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0" />
1818
<PackageReference Include="Microsoft.Extensions.Logging" Version="8.0.0" />
1919
<PackageReference Include="Pomelo.EntityFrameworkCore.MySql" Version="8.0.2" />
20-
<PackageReference Include="Serilog" Version="3.1.1" />
20+
<PackageReference Include="Serilog" Version="4.0.0" />
2121
<PackageReference Include="System.Text.Encoding.CodePages" Version="8.0.0" />
2222
</ItemGroup>
2323

src/Fragment.NetSlum.Networking/Commands/News/MarkNewsArticleReadCommand.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
namespace Fragment.NetSlum.Networking.Commands.News;
44

5-
public class MarkNewsArticleReadCommand : ICommand, ICommand<bool>
5+
public class MarkNewsArticleReadCommand : ICommand<bool>
66
{
77
public int PlayerId { get; }
88
public ushort ArticleId { get; }

src/Fragment.NetSlum.Networking/Crypto/BlowfishProvider.cs

+9-9
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public class BlowfishProvider
1515
private uint SecretKeyLength => (uint)(_secretKey?.Length ?? 0);
1616

1717
private uint[]? _pArray;
18-
private List<uint[]> _sBoxes = new();
18+
private List<uint[]> _sBoxes = [];
1919

2020
public bool Initialized => _pArray != null && _sBoxes.Count > 0;
2121

@@ -81,7 +81,7 @@ public void Initialize()
8181
_pArray[i] = DefaultParray[i];
8282
}
8383

84-
_sBoxes = new List<uint[]>();
84+
_sBoxes = [];
8585
for (int i = 0; i < 4; i++)
8686
{
8787
uint[] sBox = new uint[256];
@@ -108,7 +108,7 @@ public void Initialize()
108108
}
109109

110110
// Encrypt P-Array
111-
uint[] tempChunks = { 0, 0 };
111+
uint[] tempChunks = [0, 0];
112112
for (int i = 0; i < 9; i++)
113113
{
114114
// Encrypt 1st Half
@@ -206,7 +206,7 @@ public byte[] Decrypt(byte[] payload)
206206
chunkBuffer[0] = BitConverter.ToUInt32(result, i * 8);
207207
chunkBuffer[1] = BitConverter.ToUInt32(result, i * 8 + 4);
208208
// Processing Variables
209-
uint[] tempChunks = { 0, 0 };
209+
uint[] tempChunks = [0, 0];
210210

211211
// Decrypt Chunk
212212
var runningChunk = chunkBuffer[0] ^ _pArray![17];
@@ -297,7 +297,7 @@ public byte[] Encrypt(byte[] payload)
297297
chunkBuffer[0] = BitConverter.ToUInt32(result, i * 8);
298298
chunkBuffer[1] = BitConverter.ToUInt32(result, i * 8 + 4);
299299
// Processing Variables
300-
uint[] tempChunks = { 0, 0 };
300+
uint[] tempChunks = [0, 0];
301301

302302
// Encrypt Chunk
303303
var runningChunk = chunkBuffer[0] ^ _pArray![0];
@@ -393,16 +393,16 @@ public static ushort Checksum(byte[] data)
393393
#region defaults
394394

395395
private static readonly uint[] DefaultParray =
396-
{
396+
[
397397
0x25406B89, 0x86A409D4, 0x141A8B2F, 0x04717445,
398398
0xA50A3923, 0x2AA032D1, 0x092FFB99, 0xED4F6D8A,
399399
0x462922E7, 0x39D11478, 0xBF5567D0, 0x35EA0D6D,
400400
0xC1AD2AB8, 0xCA7D51DE, 0x4085D6B6, 0xB6480A18,
401401
0x9317D6DA, 0x8A7AFC1C
402-
};
402+
];
403403

404404
private static readonly uint[] DefaultSboxes =
405-
{
405+
[
406406
0xD2320CA7, 0x99E0B6AD, 0x30FE73DC, 0xD11BE0B8,
407407
0xB9E2B0EE, 0x6B277F97, 0xBB7D9146, 0xF22D809A,
408408
0x25A29A48, 0xB4926DF8, 0x0902F3E3, 0x868FFD17,
@@ -659,7 +659,7 @@ public static ushort Checksum(byte[] data)
659659
0x1A49C35D, 0x03FC8B8D, 0x02C46BE5, 0xD7ECE2FA,
660660
0x91D5F96A, 0xA75DDFA1, 0x400A262E, 0xC309E7A0,
661661
0xB84F6233, 0xCF78E35C, 0x5890E0E4, 0x3BC473E7
662-
};
662+
];
663663

664664
#endregion
665665
}

src/Fragment.NetSlum.Networking/Extensions/PacketExtensions.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public static Memory<byte> Replace(this Memory<byte> sourceData, Memory<byte> re
4949
/// <typeparam name="TSession"></typeparam>
5050
/// <returns></returns>
5151
/// <exception cref="ArgumentException"></exception>
52-
public static async Task<ICollection<FragmentMessage>> CreateResponse<TSession>(this BaseRequest ro, TSession session, FragmentMessage request)
52+
public static async ValueTask<ICollection<FragmentMessage>> CreateResponse<TSession>(this BaseRequest ro, TSession session, FragmentMessage request)
5353
{
5454
return session switch
5555
{

src/Fragment.NetSlum.Networking/Messaging/FragmentPacketHandler.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public FragmentPacketHandler(ILogger<FragmentPacketHandler> logger, PacketCache
2020
_packetCache = packetCache;
2121
}
2222

23-
public async Task<ICollection<FragmentMessage>> CreateResponse<TSession>(TSession session, FragmentMessage o) where TSession : IScopeable
23+
public async ValueTask<ICollection<FragmentMessage>> CreateResponse<TSession>(TSession session, FragmentMessage o) where TSession : IScopeable
2424
{
2525
BaseRequest? availableResponseObject = GetRequest(session.ServiceScope.ServiceProvider, o);
2626

src/Fragment.NetSlum.Networking/Messaging/IPacketHandler.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,5 @@ namespace Fragment.NetSlum.Networking.Messaging;
66

77
public interface IPacketHandler<TRequest>
88
{
9-
public Task<ICollection<TRequest>> CreateResponse<TSession>(TSession session, TRequest o) where TSession : IScopeable;
9+
public ValueTask<ICollection<TRequest>> CreateResponse<TSession>(TSession session, TRequest o) where TSession : IScopeable;
1010
}

src/Fragment.NetSlum.Networking/Models/ChatLobbyModel.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ public void NotifyAllExcept(ChatLobbyPlayer? sender, List<FragmentMessage> messa
190190
public void NotifyAllExcept(ChatLobbyPlayer? sender, FragmentMessage message)
191191
{
192192
Log.ForContext<ChatLobbyModel>().Debug("Notifying lobby {LobbyName} ({LobbyId}) with data:\n{HexDump}", LobbyName, LobbyId, message.Data.ToHexDump());
193-
NotifyAllExcept(sender, new List<FragmentMessage> { message });
193+
NotifyAllExcept(sender, [message]);
194194
}
195195

196196
/// <summary>
@@ -220,7 +220,7 @@ public void SendTo(ushort idx, List<FragmentMessage> messages)
220220
/// <param name="message"></param>
221221
public void SendTo(ushort idx, FragmentMessage message)
222222
{
223-
SendTo(idx, new List<FragmentMessage> {message});
223+
SendTo(idx, [message]);
224224
}
225225

226226
private ushort GetAvailablePlayerIndex()

src/Fragment.NetSlum.Networking/Packets/Request/AreaServer/AreaServerIPAddressPortRequest.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public AreaServerIPAddressPortRequest(ILogger<AreaServerIPAddressPortRequest> lo
2525
_logger = logger;
2626
}
2727

28-
public override Task<ICollection<FragmentMessage>> GetResponse(FragmentTcpSession session, FragmentMessage request)
28+
public override ValueTask<ICollection<FragmentMessage>> GetResponse(FragmentTcpSession session, FragmentMessage request)
2929
{
3030
var ipAddressBytes = new Span<byte>(new byte[4]);
3131
request.Data.Span[..4].CopyTo(ipAddressBytes);

src/Fragment.NetSlum.Networking/Packets/Request/AreaServer/AreaServerPublishDetailsRequest.cs

+13-5
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public AreaServerPublishDetailsRequest(FragmentContext database, ILogger<AreaSer
2929
_logger = logger;
3030
}
3131

32-
public override Task<ICollection<FragmentMessage>> GetResponse(FragmentTcpSession session, FragmentMessage request)
32+
public override ValueTask<ICollection<FragmentMessage>> GetResponse(FragmentTcpSession session, FragmentMessage request)
3333
{
3434
BaseResponse response;
3535

@@ -50,17 +50,25 @@ public override Task<ICollection<FragmentMessage>> GetResponse(FragmentTcpSessio
5050
pos += 3;
5151
session.AreaServerInfo.Detail = request.Data[pos..];
5252

53-
response = new AreaServerPublishDetailsResponse { PacketType = OpCodes.Data_AreaServerPublishDetails1Success, Data = new byte[] { 0x00, 0x01 } };
53+
response = new AreaServerPublishDetailsResponse { PacketType = OpCodes.Data_AreaServerPublishDetails1Success, Data = [0x00, 0x01
54+
]
55+
};
5456
break;
5557
case OpCodes.Data_AreaServerPublishDetails2Request:
56-
response = new AreaServerPublishDetailsResponse { PacketType = OpCodes.Data_AreaServerPublishDetails2Success, Data = new byte[] { 0xDE, 0xAD } };
58+
response = new AreaServerPublishDetailsResponse { PacketType = OpCodes.Data_AreaServerPublishDetails2Success, Data = [0xDE, 0xAD
59+
]
60+
};
5761
break;
5862

5963
case OpCodes.Data_AreaServerPublishDetails3Request:
60-
response = new AreaServerPublishDetailsResponse { PacketType = OpCodes.Data_AreaServerPublishDetails3Success, Data = new byte[] { 0x00, 0x01 } };
64+
response = new AreaServerPublishDetailsResponse { PacketType = OpCodes.Data_AreaServerPublishDetails3Success, Data = [0x00, 0x01
65+
]
66+
};
6167
break;
6268
case OpCodes.Data_AreaServerPublishDetails4Request:
63-
response = new AreaServerPublishDetailsResponse { PacketType = OpCodes.Data_AreaServerPublishDetails4Success, Data = new byte[] { 0x00, 0x01 } };
69+
response = new AreaServerPublishDetailsResponse { PacketType = OpCodes.Data_AreaServerPublishDetails4Success, Data = [0x00, 0x01
70+
]
71+
};
6472
break;
6573
case OpCodes.Data_AreaServerPublishDetails6Request:
6674
//response = new AreaServerPublishDetailsResponse() { PacketType = OpCodes.Data_AreaServerPublishDetails6Success, Data = new byte[] { 0x00, 0x09 } };

src/Fragment.NetSlum.Networking/Packets/Request/AreaServer/AreaServerPublshRequest.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public AreaServerPublshRequest(ILogger<AreaServerPublshRequest> logger)
2020
_logger = logger;
2121
}
2222

23-
public override Task<ICollection<FragmentMessage>> GetResponse(FragmentTcpSession session, FragmentMessage request)
23+
public override ValueTask<ICollection<FragmentMessage>> GetResponse(FragmentTcpSession session, FragmentMessage request)
2424
{
2525
BaseResponse response = new AreaServerPublishResponse();
2626
return SingleMessage(response.Build());

src/Fragment.NetSlum.Networking/Packets/Request/AreaServer/AreaServerUpdateStatusRequest.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ public AreaServerUpdateStatusRequest(ILogger<AreaServerUpdateStatusRequest> logg
2020
_logger = logger;
2121
}
2222

23-
public override Task<ICollection<FragmentMessage>> GetResponse(FragmentTcpSession session, FragmentMessage request)
23+
public override ValueTask<ICollection<FragmentMessage>> GetResponse(FragmentTcpSession session, FragmentMessage request)
2424
{
2525
//byte[] diskId = request.Data[0..64].ToArray();
2626
var pos = 0x43;

src/Fragment.NetSlum.Networking/Packets/Request/AreaServer/AreaServerUpdateUserCountRequest.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ public AreaServerUpdateUserCountRequest(ILogger<AreaServerUpdateUserCountRequest
1919
_logger = logger;
2020
}
2121

22-
public override Task<ICollection<FragmentMessage>> GetResponse(FragmentTcpSession session, FragmentMessage request)
22+
public override ValueTask<ICollection<FragmentMessage>> GetResponse(FragmentTcpSession session, FragmentMessage request)
2323
{
2424
session.AreaServerInfo!.CurrentPlayerCount = BinaryPrimitives.ReadUInt16BigEndian(request.Data[2..4].ToArray());
2525
return NoResponse();

0 commit comments

Comments
 (0)