diff --git a/EOLib/Domain/Interact/Bank/BankActions.cs b/EOLib/Domain/Interact/Bank/BankActions.cs new file mode 100644 index 000000000..fb3a6ea2f --- /dev/null +++ b/EOLib/Domain/Interact/Bank/BankActions.cs @@ -0,0 +1,52 @@ +using AutomaticTypeMapper; +using EOLib.Net; +using EOLib.Net.Communication; + +namespace EOLib.Domain.Interact.Bank +{ + [AutoMappedType] + public class BankActions : IBankActions + { + private readonly IPacketSendService _packetSendService; + + public BankActions(IPacketSendService packetSendService) + { + _packetSendService = packetSendService; + } + + public void Deposit(int amount) + { + var packet = new PacketBuilder(PacketFamily.Bank, PacketAction.Add) + .AddInt(amount) + .Build(); + + _packetSendService.SendPacket(packet); + } + + public void Withdraw(int amount) + { + var packet = new PacketBuilder(PacketFamily.Bank, PacketAction.Take) + .AddInt(amount) + .Build(); + + _packetSendService.SendPacket(packet); + } + + public void BuyStorageUpgrade() + { + var packet = new PacketBuilder(PacketFamily.Locker, PacketAction.Buy) + .Build(); + + _packetSendService.SendPacket(packet); + } + } + + public interface IBankActions + { + void Deposit(int amount); + + void Withdraw(int amount); + + void BuyStorageUpgrade(); + } +} diff --git a/EOLib/Domain/Interact/Bank/BankDataRepository.cs b/EOLib/Domain/Interact/Bank/BankDataRepository.cs new file mode 100644 index 000000000..2a6bd49c4 --- /dev/null +++ b/EOLib/Domain/Interact/Bank/BankDataRepository.cs @@ -0,0 +1,45 @@ +using AutomaticTypeMapper; +using Optional; + +namespace EOLib.Domain.Interact.Bank +{ + public interface IBankDataRepository : IResettable + { + int AccountValue { get; set; } + + int SessionID { get; set; } + + Option LockerUpgrades { get; set; } + } + + public interface IBankDataProvider : IResettable + { + int AccountValue { get; } + + int SessionID { get; } + + Option LockerUpgrades { get; } + } + + [AutoMappedType(IsSingleton = true)] + public class BankDataRepository : IBankDataRepository, IBankDataProvider + { + public int AccountValue { get; set; } + + public int SessionID { get; set; } + + public Option LockerUpgrades { get; set; } + + public BankDataRepository() + { + ResetState(); + } + + public void ResetState() + { + AccountValue = 0; + SessionID = 0; + LockerUpgrades = Option.None(); + } + } +} diff --git a/EOLib/Domain/Interact/MapNPCActions.cs b/EOLib/Domain/Interact/MapNPCActions.cs index ad7f3a441..c56efe22c 100644 --- a/EOLib/Domain/Interact/MapNPCActions.cs +++ b/EOLib/Domain/Interact/MapNPCActions.cs @@ -45,6 +45,15 @@ public void RequestQuest(INPC npc) _packetSendService.SendPacket(packet); } + + public void RequestBank(INPC npc) + { + var packet = new PacketBuilder(PacketFamily.Bank, PacketAction.Open) + .AddShort(npc.Index) + .Build(); + + _packetSendService.SendPacket(packet); + } } public interface IMapNPCActions @@ -52,5 +61,7 @@ public interface IMapNPCActions void RequestShop(INPC npc); void RequestQuest(INPC npc); + + void RequestBank(INPC npc); } } diff --git a/EOLib/Net/API/Bank.cs b/EOLib/Net/API/Bank.cs deleted file mode 100644 index a5dd6128c..000000000 --- a/EOLib/Net/API/Bank.cs +++ /dev/null @@ -1,71 +0,0 @@ -using EOLib.Net.Handlers; - -namespace EOLib.Net.API -{ - partial class PacketAPI - { - public delegate void BankOpenEvent(int bankGold, int lockerUpgrades); - public delegate void BankChangeEvent(int characterGold, int bankGold); - - public event BankOpenEvent OnBankOpen; - public event BankChangeEvent OnBankChange; - - private void _createBankMembers() - { - m_client.AddPacketHandler(new FamilyActionPair(PacketFamily.Bank, PacketAction.Open), _handleBankOpen, true); - m_client.AddPacketHandler(new FamilyActionPair(PacketFamily.Bank, PacketAction.Reply), _handleBankReply, true); - } - - public bool BankOpen(short npcIndex) - { - if (!m_client.ConnectedAndInitialized || !Initialized || npcIndex < 0) - return false; - - OldPacket pkt = new OldPacket(PacketFamily.Bank, PacketAction.Open); - pkt.AddShort(npcIndex); - - return m_client.SendPacket(pkt); - } - - private void _handleBankOpen(OldPacket pkt) - { - int bankGold = pkt.GetInt(); - pkt.Skip(3); /*Session token - eoserv always sets 0*/ - int lockerUpgrades = pkt.GetChar(); //number of locker upgrades that have been done - - if (OnBankOpen != null) - OnBankOpen(bankGold, lockerUpgrades); - } - - public bool BankDeposit(int amount) - { - if (!m_client.ConnectedAndInitialized || !Initialized || amount < 0) - return false; - - OldPacket pkt = new OldPacket(PacketFamily.Bank, PacketAction.Add); - pkt.AddInt(amount); - - return m_client.SendPacket(pkt); - } - - public bool BankWithdraw(int amount) - { - if (!m_client.ConnectedAndInitialized || !Initialized || amount < 0) - return false; - - OldPacket pkt = new OldPacket(PacketFamily.Bank, PacketAction.Take); - pkt.AddInt(amount); - - return m_client.SendPacket(pkt); - } - - private void _handleBankReply(OldPacket pkt) - { - int characterGold = pkt.GetInt(); - int bankAmount = pkt.GetInt(); - - if(OnBankChange != null) - OnBankChange(characterGold, bankAmount); - } - } -} diff --git a/EOLib/Net/API/Locker.cs b/EOLib/Net/API/Locker.cs deleted file mode 100644 index e992f55af..000000000 --- a/EOLib/Net/API/Locker.cs +++ /dev/null @@ -1,26 +0,0 @@ -using EOLib.Net.Handlers; - -namespace EOLib.Net.API -{ - partial class PacketAPI - { - public delegate void LockerUpgradeEvent(int goldRemaining, byte lockerUpgrades); - - public event LockerUpgradeEvent OnLockerUpgrade; - - private void _createLockerMembers() - { - m_client.AddPacketHandler(new FamilyActionPair(PacketFamily.Locker, PacketAction.Buy), _handleLockerBuy, true); - } - - /// - /// Handles LOCKER_BUY from server when buying a locker unit upgrade - /// - /// - private void _handleLockerBuy(OldPacket pkt) - { - if (OnLockerUpgrade != null) - OnLockerUpgrade(pkt.GetInt(), pkt.GetChar()); //gold remaining, num upgrades - } - } -} diff --git a/EOLib/Net/API/PacketAPI.cs b/EOLib/Net/API/PacketAPI.cs index 19ef11d21..d87fdad80 100644 --- a/EOLib/Net/API/PacketAPI.cs +++ b/EOLib/Net/API/PacketAPI.cs @@ -20,9 +20,7 @@ public PacketAPI(EOClient client) m_client = client; //each of these sets up members of the partial PacketAPI class relevant to a particular packet family - _createBankMembers(); _createInitMembers(); - _createLockerMembers(); _createMusicMembers(); _createPartyMembers(); _createNPCMembers(); diff --git a/EOLib/PacketHandlers/Bank/BankOpenHandler.cs b/EOLib/PacketHandlers/Bank/BankOpenHandler.cs new file mode 100644 index 000000000..012f08065 --- /dev/null +++ b/EOLib/PacketHandlers/Bank/BankOpenHandler.cs @@ -0,0 +1,35 @@ +using AutomaticTypeMapper; +using EOLib.Domain.Interact.Bank; +using EOLib.Domain.Login; +using EOLib.Net; +using EOLib.Net.Handlers; +using Optional; + +namespace EOLib.PacketHandlers.Bank +{ + [AutoMappedType] + public class BankOpenHandler : InGameOnlyPacketHandler + { + private readonly IBankDataRepository _bankDataRepository; + + public override PacketFamily Family => PacketFamily.Bank; + + public override PacketAction Action => PacketAction.Open; + + public BankOpenHandler(IPlayerInfoProvider playerInfoProvider, + IBankDataRepository bankDataRepository) + : base(playerInfoProvider) + { + _bankDataRepository = bankDataRepository; + } + + public override bool HandlePacket(IPacket packet) + { + _bankDataRepository.AccountValue = packet.ReadInt(); + _bankDataRepository.SessionID = packet.ReadThree(); + _bankDataRepository.LockerUpgrades = Option.Some(packet.ReadChar()); + + return true; + } + } +} diff --git a/EOLib/PacketHandlers/Bank/BankReplyHandler.cs b/EOLib/PacketHandlers/Bank/BankReplyHandler.cs new file mode 100644 index 000000000..22abb821c --- /dev/null +++ b/EOLib/PacketHandlers/Bank/BankReplyHandler.cs @@ -0,0 +1,40 @@ +using AutomaticTypeMapper; +using EOLib.Domain.Character; +using EOLib.Domain.Interact.Bank; +using EOLib.Domain.Login; +using EOLib.Net; +using EOLib.Net.Handlers; + +namespace EOLib.PacketHandlers.Bank +{ + [AutoMappedType] + public class BankReplyHandler : InGameOnlyPacketHandler + { + private readonly IBankDataRepository _bankDataRepository; + private readonly ICharacterInventoryRepository _characterInventoryRepository; + + public override PacketFamily Family => PacketFamily.Bank; + + public override PacketAction Action => PacketAction.Reply; + + public BankReplyHandler(IPlayerInfoProvider playerInfoProvider, + IBankDataRepository bankDataRepository, + ICharacterInventoryRepository characterInventoryRepository) + : base(playerInfoProvider) + { + _bankDataRepository = bankDataRepository; + _characterInventoryRepository = characterInventoryRepository; + } + + public override bool HandlePacket(IPacket packet) + { + var characterGold = packet.ReadInt(); + _characterInventoryRepository.ItemInventory.RemoveWhere(x => x.ItemID == 1); + _characterInventoryRepository.ItemInventory.Add(new InventoryItem(1, characterGold)); + + _bankDataRepository.AccountValue = packet.ReadInt(); + + return true; + } + } +} diff --git a/EOLib/PacketHandlers/Locker/LockerBuyHandler.cs b/EOLib/PacketHandlers/Locker/LockerBuyHandler.cs new file mode 100644 index 000000000..45502e1a1 --- /dev/null +++ b/EOLib/PacketHandlers/Locker/LockerBuyHandler.cs @@ -0,0 +1,41 @@ +using AutomaticTypeMapper; +using EOLib.Domain.Character; +using EOLib.Domain.Interact.Bank; +using EOLib.Domain.Login; +using EOLib.Net; +using EOLib.Net.Handlers; +using Optional; + +namespace EOLib.PacketHandlers.Locker +{ + [AutoMappedType] + public class LockerBuyHandler : InGameOnlyPacketHandler + { + private readonly IBankDataRepository _bankDataRepository; + private readonly ICharacterInventoryRepository _characterInventoryRepository; + + public override PacketFamily Family => PacketFamily.Locker; + + public override PacketAction Action => PacketAction.Buy; + + public LockerBuyHandler(IPlayerInfoProvider playerInfoProvider, + IBankDataRepository bankDataRepository, + ICharacterInventoryRepository characterInventoryRepository) + : base(playerInfoProvider) + { + _bankDataRepository = bankDataRepository; + _characterInventoryRepository = characterInventoryRepository; + } + + public override bool HandlePacket(IPacket packet) + { + var inventoryGold = packet.ReadInt(); + _characterInventoryRepository.ItemInventory.RemoveWhere(x => x.ItemID == 1); + _characterInventoryRepository.ItemInventory.Add(new InventoryItem(1, inventoryGold)); + + _bankDataRepository.LockerUpgrades = Option.Some(packet.ReadChar()); + + return true; + } + } +} diff --git a/EndlessClient/Dialogs/Old/BankAccountDialog.cs b/EndlessClient/Dialogs/Old/BankAccountDialog.cs index 52af6d17d..82cc1e9bd 100644 --- a/EndlessClient/Dialogs/Old/BankAccountDialog.cs +++ b/EndlessClient/Dialogs/Old/BankAccountDialog.cs @@ -22,12 +22,12 @@ public static void Show(PacketAPI api, short npcID) Instance = new BankAccountDialog(api); - if (!api.BankOpen(npcID)) - { - Instance.Close(); - Instance = null; - EOGame.Instance.DoShowLostConnectionDialogAndReturnToMainMenu(); - } + //if (!api.BankOpen(npcID)) + //{ + // Instance.Close(); + // Instance = null; + // EOGame.Instance.DoShowLostConnectionDialogAndReturnToMainMenu(); + //} } private readonly XNALabel m_accountBalance; @@ -111,11 +111,11 @@ private void _deposit() } if (item.Amount == 1) { - if (!m_api.BankDeposit(1)) - { - Close(null, XNADialogResult.NO_BUTTON_PRESSED); - EOGame.Instance.DoShowLostConnectionDialogAndReturnToMainMenu(); - } + //if (!m_api.BankDeposit(1)) + //{ + // Close(null, XNADialogResult.NO_BUTTON_PRESSED); + // EOGame.Instance.DoShowLostConnectionDialogAndReturnToMainMenu(); + //} return; } @@ -126,11 +126,11 @@ private void _deposit() if (e.Result == XNADialogResult.Cancel) return; - if (!m_api.BankDeposit(dlg.SelectedAmount)) - { - Close(null, XNADialogResult.NO_BUTTON_PRESSED); - EOGame.Instance.DoShowLostConnectionDialogAndReturnToMainMenu(); - } + //if (!m_api.BankDeposit(dlg.SelectedAmount)) + //{ + // Close(null, XNADialogResult.NO_BUTTON_PRESSED); + // EOGame.Instance.DoShowLostConnectionDialogAndReturnToMainMenu(); + //} }; } @@ -144,11 +144,11 @@ private void _withdraw() } if (balance == 1) { - if (!m_api.BankWithdraw(1)) - { - Close(null, XNADialogResult.NO_BUTTON_PRESSED); - EOGame.Instance.DoShowLostConnectionDialogAndReturnToMainMenu(); - } + //if (!m_api.BankWithdraw(1)) + //{ + // Close(null, XNADialogResult.NO_BUTTON_PRESSED); + // EOGame.Instance.DoShowLostConnectionDialogAndReturnToMainMenu(); + //} return; } @@ -159,11 +159,11 @@ private void _withdraw() if (e.Result == XNADialogResult.Cancel) return; - if (!m_api.BankWithdraw(dlg.SelectedAmount)) - { - Close(null, XNADialogResult.NO_BUTTON_PRESSED); - EOGame.Instance.DoShowLostConnectionDialogAndReturnToMainMenu(); - } + //if (!m_api.BankWithdraw(dlg.SelectedAmount)) + //{ + // Close(null, XNADialogResult.NO_BUTTON_PRESSED); + // EOGame.Instance.DoShowLostConnectionDialogAndReturnToMainMenu(); + //} }; } diff --git a/EndlessClient/Old/PacketAPICallbackManager.cs b/EndlessClient/Old/PacketAPICallbackManager.cs index 8f6dab2a7..fbfc0cc73 100644 --- a/EndlessClient/Old/PacketAPICallbackManager.cs +++ b/EndlessClient/Old/PacketAPICallbackManager.cs @@ -29,13 +29,6 @@ public void AssignCallbacks() //npc related m_packetAPI.OnRemoveChildNPCs += _removeChildNPCs; - //bank related - m_packetAPI.OnBankOpen += _bankOpen; - m_packetAPI.OnBankChange += _bankChange; - - //locker - m_packetAPI.OnLockerUpgrade += _lockerUpgrade; - //party m_packetAPI.OnPartyClose += _partyClose; m_packetAPI.OnPartyDataRefresh += _partyDataRefresh; @@ -85,29 +78,6 @@ private void _removeChildNPCs(short childNPCID) OldWorld.Instance.ActiveMapRenderer.RemoveNPCsWhere(x => x.NPC.Data.ID == childNPCID); } - private void _bankOpen(int gold, int upgrades) - { - if (BankAccountDialog.Instance == null) return; - BankAccountDialog.Instance.AccountBalance = $"{gold}"; - BankAccountDialog.Instance.LockerUpgrades = upgrades; - } - - private void _bankChange(int gold, int bankGold) - { - if (BankAccountDialog.Instance == null) return; - - //OldWorld.Instance.MainPlayer.ActiveCharacter.UpdateInventoryItem(1, gold); - BankAccountDialog.Instance.AccountBalance = $"{bankGold}"; - } - - private void _lockerUpgrade(int remaining, byte upgrades) - { - if (BankAccountDialog.Instance == null) return; - //OldWorld.Instance.MainPlayer.ActiveCharacter.UpdateInventoryItem(1, remaining); - BankAccountDialog.Instance.LockerUpgrades = upgrades; - m_game.Hud.SetStatusLabel(EOResourceID.STATUS_LABEL_TYPE_INFORMATION, EOResourceID.STATUS_LABEL_LOCKER_SPACE_INCREASED); - } - private void _partyClose() { m_game.Hud.CloseParty();