M Core/NosSmooth.Game/Data/Act4/Act4Status.cs => Core/NosSmooth.Game/Data/Act4/Act4Status.cs +1 -1
@@ 22,5 22,5 @@ public record Act4FactionStatus
Act4Mode Mode,
long? CurrentTime,
long? TotalTime,
- Act4Raid Raid
+ Act4Raid? Raid
);=
\ No newline at end of file
A Core/NosSmooth.Game/Events/Act4/Act4StatusReceivedEvent.cs => Core/NosSmooth.Game/Events/Act4/Act4StatusReceivedEvent.cs +25 -0
@@ 0,0 1,25 @@
+//
+// Act4StatusReceivedEvent.cs
+//
+// Copyright (c) František Boháček. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using NosSmooth.Game.Data.Act4;
+using NosSmooth.Packets.Enums.Entities;
+
+namespace NosSmooth.Game.Events.Act4;
+
+/// <summary>
+/// A new act4 status was received.
+/// </summary>
+/// <param name="Faction">The faction the player belongs to.</param>
+/// <param name="MinutesUntilReset">Minutes until the faction with raid will be reset.</param>
+/// <param name="AngelStatus">The angel status.</param>
+/// <param name="DemonStatus">The demon status.</param>
+public record Act4StatusReceivedEvent
+(
+ FactionType Faction,
+ long MinutesUntilReset,
+ Act4FactionStatus AngelStatus,
+ Act4FactionStatus DemonStatus
+) : IGameEvent;<
\ No newline at end of file
M Core/NosSmooth.Game/Extensions/ServiceCollectionExtensions.cs => Core/NosSmooth.Game/Extensions/ServiceCollectionExtensions.cs +2 -0
@@ 10,6 10,7 @@ using NosSmooth.Core.Extensions;
using NosSmooth.Game.Apis;
using NosSmooth.Game.Events.Core;
using NosSmooth.Game.Events.Inventory;
+using NosSmooth.Game.PacketHandlers.Act4;
using NosSmooth.Game.PacketHandlers.Characters;
using NosSmooth.Game.PacketHandlers.Entities;
using NosSmooth.Game.PacketHandlers.Inventory;
@@ 39,6 40,7 @@ public static class ServiceCollectionExtensions
serviceCollection.TryAddSingleton<Game>();
serviceCollection
+ .AddPacketResponder<FcResponder>()
.AddPacketResponder<CharacterInitResponder>()
.AddPacketResponder<PlayerSkillResponder>()
.AddPacketResponder<MatesSkillResponder>()
A Core/NosSmooth.Game/PacketHandlers/Act4/FcResponder.cs => Core/NosSmooth.Game/PacketHandlers/Act4/FcResponder.cs +82 -0
@@ 0,0 1,82 @@
+//
+// FcResponder.cs
+//
+// Copyright (c) František Boháček. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+
+using NosSmooth.Core.Packets;
+using NosSmooth.Game.Data.Act4;
+using NosSmooth.Game.Events.Act4;
+using NosSmooth.Game.Events.Core;
+using NosSmooth.Packets.Server.Act4;
+using Remora.Results;
+
+namespace NosSmooth.Game.PacketHandlers.Act4;
+
+/// <summary>
+/// Responds to <see cref="FcPacket"/>.
+/// </summary>
+public class FcResponder : IPacketResponder<FcPacket>
+{
+ private readonly EventDispatcher _eventDispatcher;
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="FcResponder"/> class.
+ /// </summary>
+ /// <param name="eventDispatcher">The event dispatcher.</param>
+ public FcResponder(EventDispatcher eventDispatcher)
+ {
+ _eventDispatcher = eventDispatcher;
+ }
+
+ /// <inheritdoc />
+ public async Task<Result> Respond(PacketEventArgs<FcPacket> packetArgs, CancellationToken ct = default)
+ {
+ var packet = packetArgs.Packet;
+ return await _eventDispatcher.DispatchEvent
+ (
+ new Act4StatusReceivedEvent
+ (
+ packet.Faction,
+ packet.MinutesUntilReset,
+ GetStatus(packet.AngelState),
+ GetStatus(packet.DemonState)
+ ),
+ ct
+ );
+ }
+
+ private Act4FactionStatus GetStatus(FcSubPacket packet)
+ {
+ return new Act4FactionStatus
+ (
+ packet.Percentage,
+ packet.Mode,
+ packet.CurrentTime,
+ packet.TotalTime,
+ GetRaid(packet)
+ );
+ }
+
+ private Act4Raid? GetRaid(FcSubPacket packet)
+ {
+ if (packet.IsBerios)
+ {
+ return Act4Raid.Berios;
+ }
+ if (packet.IsCalvina)
+ {
+ return Act4Raid.Calvina;
+ }
+ if (packet.IsHatus)
+ {
+ return Act4Raid.Hatus;
+ }
+ if (packet.IsMorcos)
+ {
+ return Act4Raid.Morcos;
+ }
+
+ return null;
+ }
+}<
\ No newline at end of file