From 853d190e6f5d5e0d56f302def499949b44da4eb3 Mon Sep 17 00:00:00 2001 From: Ethan Moffat Date: Fri, 19 May 2023 13:38:21 -0700 Subject: [PATCH] Fix packet handling for jukebox packets. Add missing Jukebox_Agree handler. --- .../Jukebox/JukeboxAgreeHandler.cs | 39 +++++++++++++++++++ .../Jukebox/JukeboxOpenHandler.cs | 4 ++ .../Jukebox/JukeboxUseHandler.cs | 9 +++++ 3 files changed, 52 insertions(+) create mode 100644 EOLib/PacketHandlers/Jukebox/JukeboxAgreeHandler.cs diff --git a/EOLib/PacketHandlers/Jukebox/JukeboxAgreeHandler.cs b/EOLib/PacketHandlers/Jukebox/JukeboxAgreeHandler.cs new file mode 100644 index 00000000..f458329c --- /dev/null +++ b/EOLib/PacketHandlers/Jukebox/JukeboxAgreeHandler.cs @@ -0,0 +1,39 @@ +using AutomaticTypeMapper; +using EOLib.Domain.Character; +using EOLib.Domain.Login; +using EOLib.Net; +using EOLib.Net.Handlers; +using Optional.Collections; + +namespace EOLib.PacketHandlers.Jukebox +{ + /// + /// Sent to update character's remaining gold after requesting a song + /// + [AutoMappedType] + public class JukeboxAgreeHandler : InGameOnlyPacketHandler + { + private readonly ICharacterInventoryRepository _characterInventoryRepository; + + public override PacketFamily Family => PacketFamily.JukeBox; + + public override PacketAction Action => PacketAction.Agree; + + public JukeboxAgreeHandler(IPlayerInfoProvider playerInfoProvider, + ICharacterInventoryRepository characterInventoryRepository) + : base(playerInfoProvider) + { + _characterInventoryRepository = characterInventoryRepository; + } + + public override bool HandlePacket(IPacket packet) + { + var goldRemaining = packet.ReadInt(); + + _characterInventoryRepository.ItemInventory.SingleOrNone(x => x.ItemID == 1).MatchSome(x => _characterInventoryRepository.ItemInventory.Remove(x)); + _characterInventoryRepository.ItemInventory.Add(new InventoryItem(1, goldRemaining)); + + return true; + } + } +} diff --git a/EOLib/PacketHandlers/Jukebox/JukeboxOpenHandler.cs b/EOLib/PacketHandlers/Jukebox/JukeboxOpenHandler.cs index 47c618b8..84cd6da0 100644 --- a/EOLib/PacketHandlers/Jukebox/JukeboxOpenHandler.cs +++ b/EOLib/PacketHandlers/Jukebox/JukeboxOpenHandler.cs @@ -37,6 +37,10 @@ public override bool HandlePacket(IPacket packet) { _jukeboxRepository.PlayingRequestName = Option.Some(packet.ReadEndString()); } + else + { + _jukeboxRepository.PlayingRequestName = Option.None(); + } foreach (var notifier in _userInterfaceNotifiers) notifier.NotifyPacketDialog(PacketFamily.JukeBox); diff --git a/EOLib/PacketHandlers/Jukebox/JukeboxUseHandler.cs b/EOLib/PacketHandlers/Jukebox/JukeboxUseHandler.cs index b3fc0236..590d1276 100644 --- a/EOLib/PacketHandlers/Jukebox/JukeboxUseHandler.cs +++ b/EOLib/PacketHandlers/Jukebox/JukeboxUseHandler.cs @@ -1,8 +1,10 @@ using AutomaticTypeMapper; +using EOLib.Domain.Interact.Jukebox; using EOLib.Domain.Login; using EOLib.Domain.Notifiers; using EOLib.Net; using EOLib.Net.Handlers; +using Optional; using System.Collections.Generic; namespace EOLib.PacketHandlers.Jukebox @@ -13,6 +15,7 @@ namespace EOLib.PacketHandlers.Jukebox [AutoMappedType] public class JukeboxUseHandler : InGameOnlyPacketHandler { + private readonly IJukeboxRepository _jukeboxRepository; private readonly IEnumerable _soundNotifiers; public override PacketFamily Family => PacketFamily.JukeBox; @@ -20,17 +23,23 @@ public class JukeboxUseHandler : InGameOnlyPacketHandler public override PacketAction Action => PacketAction.Use; public JukeboxUseHandler(IPlayerInfoProvider playerInfoProvider, + IJukeboxRepository jukeboxRepository, IEnumerable soundNotifiers) : base(playerInfoProvider) { + _jukeboxRepository = jukeboxRepository; _soundNotifiers = soundNotifiers; } public override bool HandlePacket(IPacket packet) { var id = packet.ReadShort(); + + _jukeboxRepository.PlayingRequestName = Option.Some(string.Empty); + foreach (var notifier in _soundNotifiers) notifier.NotifyMusic(id, isJukebox: true); + return true; } }