Skip to content

Commit

Permalink
Support add/remove/update of chest
Browse files Browse the repository at this point in the history
  • Loading branch information
ethanmoffat committed Apr 9, 2022
1 parent de86fa5 commit 85a0de2
Show file tree
Hide file tree
Showing 12 changed files with 255 additions and 206 deletions.
8 changes: 8 additions & 0 deletions EOLib/Domain/Item/ItemDropValidator.cs
Expand Up @@ -20,6 +20,12 @@ public class ItemDropValidator : IItemDropValidator
_currentMapStateProvider = currentMapStateProvider;
}

public ItemDropResult ValidateItemDrop(ICharacter mainCharacter, IInventoryItem item)
{
var coord = new MapCoordinate(mainCharacter.RenderProperties.MapX, mainCharacter.RenderProperties.MapY);
return ValidateItemDrop(mainCharacter, item, coord);
}

public ItemDropResult ValidateItemDrop(ICharacter mainCharacter, IInventoryItem item, MapCoordinate dropPoint)
{
if (item.ItemID <= 0)
Expand All @@ -43,6 +49,8 @@ public ItemDropResult ValidateItemDrop(ICharacter mainCharacter, IInventoryItem

public interface IItemDropValidator
{
ItemDropResult ValidateItemDrop(ICharacter mainCharacter, IInventoryItem item);

ItemDropResult ValidateItemDrop(ICharacter mainCharacter, IInventoryItem item, MapCoordinate dropPoint);
}
}
26 changes: 26 additions & 0 deletions EOLib/Domain/Map/ChestItem.cs
@@ -0,0 +1,26 @@
using EOLib.Domain.Character;

namespace EOLib.Domain.Map
{
public class ChestItem : InventoryItem
{
public int Slot { get; }

public ChestItem(short itemID, int amount, int slot)
: base(itemID, amount)
{
Slot = slot;
}

public override bool Equals(object obj)
{
var chestItem = obj as ChestItem;
return base.Equals(chestItem) && Slot == chestItem.Slot;
}

public override int GetHashCode()
{
return base.GetHashCode() * -1521134295 + Slot.GetHashCode();
}
}
}
32 changes: 31 additions & 1 deletion EOLib/Domain/Map/MapActions.cs
Expand Up @@ -13,16 +13,19 @@ public class MapActions : IMapActions
private readonly IItemPickupValidator _itemPickupValidator;
private readonly ICharacterProvider _characterProvider;
private readonly ICurrentMapStateRepository _currentMapStateRepository;
private readonly IChestDataProvider _chestDataProvider;

public MapActions(IPacketSendService packetSendService,
IItemPickupValidator itemPickupValidator,
ICharacterProvider characterProvider,
ICurrentMapStateRepository currentMapStateRepository)
ICurrentMapStateRepository currentMapStateRepository,
IChestDataProvider chestDataProvider)
{
_packetSendService = packetSendService;
_itemPickupValidator = itemPickupValidator;
_characterProvider = characterProvider;
_currentMapStateRepository = currentMapStateRepository;
_chestDataProvider = chestDataProvider;
}

public void RequestRefresh()
Expand Down Expand Up @@ -66,6 +69,29 @@ public void OpenChest(byte x, byte y)

_packetSendService.SendPacket(packet);
}

public void AddItemToChest(IInventoryItem item)
{
var packet = new PacketBuilder(PacketFamily.Chest, PacketAction.Add)
.AddChar((byte)_chestDataProvider.Location.X)
.AddChar((byte)_chestDataProvider.Location.Y)
.AddShort(item.ItemID)
.AddThree(item.Amount)
.Build();

_packetSendService.SendPacket(packet);
}

public void TakeItemFromChest(short itemId)
{
var packet = new PacketBuilder(PacketFamily.Chest, PacketAction.Take)
.AddChar((byte)_chestDataProvider.Location.X)
.AddChar((byte)_chestDataProvider.Location.Y)
.AddShort(itemId)
.Build();

_packetSendService.SendPacket(packet);
}
}

public interface IMapActions
Expand All @@ -77,5 +103,9 @@ public interface IMapActions
void OpenDoor(IWarp warp);

void OpenChest(byte x, byte y);

void AddItemToChest(IInventoryItem item);

void TakeItemFromChest(short itemId);
}
}
120 changes: 0 additions & 120 deletions EOLib/Net/API/Chest.cs

This file was deleted.

1 change: 0 additions & 1 deletion EOLib/Net/API/PacketAPI.cs
Expand Up @@ -21,7 +21,6 @@ public PacketAPI(EOClient client)

//each of these sets up members of the partial PacketAPI class relevant to a particular packet family
_createBankMembers();
_createChestMembers();
_createInitMembers();
_createLockerMembers();
_createMusicMembers();
Expand Down
37 changes: 37 additions & 0 deletions EOLib/PacketHandlers/Chest/ChestAgreeHandler.cs
@@ -0,0 +1,37 @@
using AutomaticTypeMapper;
using EOLib.Domain.Character;
using EOLib.Domain.Login;
using EOLib.Domain.Map;
using EOLib.Net;
using EOLib.Net.Handlers;

namespace EOLib.PacketHandlers.Chest
{
[AutoMappedType]
public class ChestAgreeHandler : InGameOnlyPacketHandler
{
private readonly IChestDataRepository _chestDataRepository;

public override PacketFamily Family => PacketFamily.Chest;

public override PacketAction Action => PacketAction.Agree;

public ChestAgreeHandler(IPlayerInfoProvider playerInfoProvider,
IChestDataRepository chestDataRepository)
: base(playerInfoProvider)
{
_chestDataRepository = chestDataRepository;
}

public override bool HandlePacket(IPacket packet)
{
_chestDataRepository.Items.Clear();

int i = 0;
while (packet.ReadPosition < packet.Length)
_chestDataRepository.Items.Add(new ChestItem(packet.ReadShort(), packet.ReadThree(), i++));

return true;
}
}
}
82 changes: 82 additions & 0 deletions EOLib/PacketHandlers/Chest/ChestGetHandler.cs
@@ -0,0 +1,82 @@
using AutomaticTypeMapper;
using EOLib.Domain.Character;
using EOLib.Domain.Login;
using EOLib.Domain.Map;
using EOLib.Net;
using Optional.Collections;

namespace EOLib.PacketHandlers.Chest
{
/// <summary>
/// Handler for CHEST_GET packet, sent as confirmation to character that item is being taken
/// </summary>
[AutoMappedType]
public class ChestGetHandler : ChestAgreeHandler
{
private readonly ICharacterRepository _characterRepository;
private readonly ICharacterInventoryRepository _characterInventoryRepository;

public override PacketFamily Family => PacketFamily.Chest;

public override PacketAction Action => PacketAction.Get;

public ChestGetHandler(IPlayerInfoProvider playerInfoProvider,
IChestDataRepository chestDataRepository,
ICharacterRepository characterRepository,
ICharacterInventoryRepository characterInventoryRepository)
: base(playerInfoProvider, chestDataRepository)
{
_characterRepository = characterRepository;
_characterInventoryRepository = characterInventoryRepository;
}

public override bool HandlePacket(IPacket packet)
{
var itemId = packet.ReadShort();
var amount = Action == PacketAction.Get ? packet.ReadThree() : packet.ReadInt();
var weight = packet.ReadChar();
var maxWeight = packet.ReadChar();

_characterInventoryRepository.ItemInventory.SingleOrNone(x => x.ItemID == itemId)
.Match(
some: existing =>
{
_characterInventoryRepository.ItemInventory.Remove(existing);
if (amount > 0 || itemId == 1)
{
_characterInventoryRepository.ItemInventory.Add(existing.WithAmount(existing.Amount + (Action == PacketAction.Get ? amount : -amount)));
}
},
none: () =>
{
if (amount > 0)
_characterInventoryRepository.ItemInventory.Add(new InventoryItem(itemId, amount));
});

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

_characterRepository.MainCharacter = _characterRepository.MainCharacter.WithStats(stats);

return base.HandlePacket(packet);
}
}

/// <summary>
/// Handler for CHEST_REPLY packet, sent in response to main player adding an item to a chest
/// </summary>
[AutoMappedType]
public class ChestReplyHandler : ChestGetHandler
{
public override PacketAction Action => PacketAction.Reply;

public ChestReplyHandler(IPlayerInfoProvider playerInfoProvider,
IChestDataRepository chestDataRepository,
ICharacterRepository characterRepository,
ICharacterInventoryRepository characterInventoryRepository)
: base(playerInfoProvider, chestDataRepository, characterRepository, characterInventoryRepository)
{
}
}
}
4 changes: 3 additions & 1 deletion EOLib/PacketHandlers/Chest/ChestOpenHandler.cs
Expand Up @@ -30,8 +30,10 @@ public override bool HandlePacket(IPacket packet)

_chestDataRepository.ResetState();
_chestDataRepository.Location = new MapCoordinate(x, y);

int i = 0;
while (packet.ReadPosition < packet.Length)
_chestDataRepository.Items.Add(new InventoryItem(packet.ReadShort(), packet.ReadThree()));
_chestDataRepository.Items.Add(new ChestItem(packet.ReadShort(), packet.ReadThree(), i++));

return true;
}
Expand Down

0 comments on commit 85a0de2

Please sign in to comment.