Skip to content

Commit

Permalink
Migrate shop packet family to new handlers/actions
Browse files Browse the repository at this point in the history
  • Loading branch information
ethanmoffat committed Apr 3, 2022
1 parent 8820813 commit 6aa0ff2
Show file tree
Hide file tree
Showing 7 changed files with 451 additions and 398 deletions.
53 changes: 53 additions & 0 deletions EOLib/Domain/Interact/Shop/ShopActions.cs
@@ -0,0 +1,53 @@
using EOLib.Net;
using EOLib.Net.Communication;

namespace EOLib.Domain.Interact.Shop
{
public class ShopActions : IShopActions
{
private readonly IPacketSendService _packetSendService;

public ShopActions(IPacketSendService packetSendService)
{
_packetSendService = packetSendService;
}

public void BuyItem(short itemId, int amount)
{
var packet = new PacketBuilder(PacketFamily.Shop, PacketAction.Buy)
.AddShort(itemId)
.AddInt(amount)
.Build();

_packetSendService.SendPacket(packet);
}

public void SellItem(short itemId, int amount)
{
var packet = new PacketBuilder(PacketFamily.Shop, PacketAction.Sell)
.AddShort(itemId)
.AddInt(amount)
.Build();

_packetSendService.SendPacket(packet);
}

public void CraftItem(short itemId)
{
var packet = new PacketBuilder(PacketFamily.Shop, PacketAction.Create)
.AddShort(itemId)
.Build();

_packetSendService.SendPacket(packet);
}
}

public interface IShopActions
{
void BuyItem(short itemId, int amount);

void SellItem(short itemId, int amount);

void CraftItem(short itemId);
}
}
1 change: 0 additions & 1 deletion EOLib/Net/API/PacketAPI.cs
Expand Up @@ -29,7 +29,6 @@ public PacketAPI(EOClient client)
_createPartyMembers();
_createNPCMembers();
_createQuestMembers();
_createShopMembers();
_createSpellMembers();
_createStatSkillMembers();
_createTradeMembers();
Expand Down
156 changes: 0 additions & 156 deletions EOLib/Net/API/Shop.cs

This file was deleted.

75 changes: 75 additions & 0 deletions EOLib/PacketHandlers/Interact/Shop/ShopCraftHandler.cs
@@ -0,0 +1,75 @@
using AutomaticTypeMapper;
using EOLib.Domain.Character;
using EOLib.Domain.Login;
using EOLib.Net;
using EOLib.Net.Handlers;
using Optional.Collections;
using System.Collections.Generic;

namespace EOLib.PacketHandlers.Interact.Shop
{
[AutoMappedType]
public class ShopCraftHandler : InGameOnlyPacketHandler
{
private readonly ICharacterRepository _characterRepository;
private readonly ICharacterInventoryRepository _characterInventoryRepository;

public override PacketFamily Family => PacketFamily.Shop;

public override PacketAction Action => PacketAction.Create;

protected ShopCraftHandler(IPlayerInfoProvider playerInfoProvider,
ICharacterRepository characterRepository,
ICharacterInventoryRepository characterInventoryRepository)
: base(playerInfoProvider)
{
_characterRepository = characterRepository;
_characterInventoryRepository = characterInventoryRepository;
}

public override bool HandlePacket(IPacket packet)
{
var itemId = packet.ReadShort();
var weight = packet.ReadChar();
var maxWeight = packet.ReadChar();

while (packet.ReadPosition < packet.Length)
{
if (packet.PeekShort() == 0) break;

var nextItemId = packet.ReadShort();
var nextItemAmount = packet.ReadInt();

_characterInventoryRepository.ItemInventory.SingleOrNone(x => x.ItemID == nextItemId)
.Match(
some: existing =>
{
_characterInventoryRepository.ItemInventory.Remove(existing);
if (nextItemAmount > 0)
_characterInventoryRepository.ItemInventory.Add(existing.WithAmount(nextItemAmount));
},
none: () =>
{
if (nextItemAmount > 0)
_characterInventoryRepository.ItemInventory.Add(new InventoryItem(nextItemId, nextItemAmount));
});
}

_characterInventoryRepository.ItemInventory.SingleOrNone(x => x.ItemID == itemId)
.Match(
some: existing =>
{
_characterInventoryRepository.ItemInventory.Remove(existing);
_characterInventoryRepository.ItemInventory.Add(existing.WithAmount(existing.Amount + 1));
},
none: () => _characterInventoryRepository.ItemInventory.Add(new InventoryItem(itemId, 1)));

var stats = _characterRepository.MainCharacter.Stats;
stats = stats.WithNewStat(CharacterStat.Weight, weight)
.WithNewStat(CharacterStat.MaxWeight, maxWeight);
_characterRepository.MainCharacter = _characterRepository.MainCharacter.WithStats(stats);

return true;
}
}
}
100 changes: 100 additions & 0 deletions EOLib/PacketHandlers/Interact/Shop/ShopTradeHandler.cs
@@ -0,0 +1,100 @@
using AutomaticTypeMapper;
using EOLib.Domain.Character;
using EOLib.Domain.Login;
using EOLib.Net;
using EOLib.Net.Handlers;
using Optional.Collections;

namespace EOLib.PacketHandlers.Interact.Shop
{
public abstract class ShopTradeHandler : InGameOnlyPacketHandler
{
private readonly ICharacterRepository _characterRepository;
private readonly ICharacterInventoryRepository _characterInventoryRepository;

public override PacketFamily Family => PacketFamily.Shop;

protected ShopTradeHandler(IPlayerInfoProvider playerInfoProvider,
ICharacterRepository characterRepository,
ICharacterInventoryRepository characterInventoryRepository)
: base(playerInfoProvider)
{
_characterRepository = characterRepository;
_characterInventoryRepository = characterInventoryRepository;
}

public override bool HandlePacket(IPacket packet)
{
var remaining = packet.ReadInt(); // character gold remaining on buy; item amount remaining on sell
var itemId = packet.ReadShort();
var acquired = packet.ReadInt(); // amount acquired on buy; gold acquired on sell
var weight = packet.ReadChar();
var maxWeight = packet.ReadChar();

if (Action == PacketAction.Buy)
{
var gold = new InventoryItem(1, remaining);
_characterInventoryRepository.ItemInventory.RemoveWhere(x => x.ItemID == 1);
_characterInventoryRepository.ItemInventory.Add(gold);

var shopBuy = new InventoryItem(itemId, acquired);
_characterInventoryRepository.ItemInventory.SingleOrNone(x => x.ItemID == itemId)
.Match(
some: existing =>
{
_characterInventoryRepository.ItemInventory.RemoveWhere(x => x.ItemID == itemId);
_characterInventoryRepository.ItemInventory.Add(shopBuy);
},
none: () => _characterInventoryRepository.ItemInventory.Add(shopBuy));
}
else if (Action == PacketAction.Sell)
{
var gold = new InventoryItem(1, acquired);
_characterInventoryRepository.ItemInventory.RemoveWhere(x => x.ItemID == 1);
_characterInventoryRepository.ItemInventory.Add(gold);

var itemSold = new InventoryItem(itemId, remaining);
_characterInventoryRepository.ItemInventory.RemoveWhere(x => x.ItemID == itemId);
if (itemSold.Amount > 0)
_characterInventoryRepository.ItemInventory.Add(itemSold);
}
else
{
return false;
}

var stats = _characterRepository.MainCharacter.Stats;
stats = stats.WithNewStat(CharacterStat.Weight, weight)
.WithNewStat(CharacterStat.MaxWeight, maxWeight);
_characterRepository.MainCharacter = _characterRepository.MainCharacter.WithStats(stats);

return true;
}
}

[AutoMappedType]
public class ShopBuyHandler : ShopTradeHandler
{
public override PacketAction Action => PacketAction.Buy;

public ShopBuyHandler(IPlayerInfoProvider playerInfoProvider,
ICharacterRepository characterRepository,
ICharacterInventoryRepository characterInventoryRepository)
: base(playerInfoProvider, characterRepository, characterInventoryRepository)
{
}
}

[AutoMappedType]
public class ShopSellHandler : ShopTradeHandler
{
public override PacketAction Action => PacketAction.Sell;

public ShopSellHandler(IPlayerInfoProvider playerInfoProvider,
ICharacterRepository characterRepository,
ICharacterInventoryRepository characterInventoryRepository)
: base(playerInfoProvider, characterRepository, characterInventoryRepository)
{
}
}
}

0 comments on commit 6aa0ff2

Please sign in to comment.