#pragma once #include #include #include #include #include "ItemSlot.h" #include "Area.h" class ItemFilter; class Inventory; class InventoryInteraction { private: Inventory* current; Inventory* other; Direction dir; void lock(); void unlock(); void transaction(Inventory* zSource, Inventory* zTarget, ItemFilter* zFilter, Direction sourceView, Direction targetView, int count); public: InventoryInteraction(Inventory* zCurrent, Inventory* zOther, Direction dir); InventoryInteraction(const InventoryInteraction& interaction); ~InventoryInteraction(); InventoryInteraction& operator=(const InventoryInteraction& data); void endInteraction(); void pullItems(int count, ItemFilter* zFilter); void pushItems(int count, ItemFilter* zFilter); }; class Inventory : public virtual Framework::ReferenceCounter { private: Framework::RCArray* pullSlotsOrder; Framework::RCArray* pushSlotsOrder; Framework::HashMap*>* itemCache; Framework::Critical cs; int nextSlotId; void updateCache(ItemSlot* zSlot, int beforeKey); protected: Framework::Vec3 location; virtual bool allowPullStack(ItemSlot* zSlot, Direction dir) const; virtual bool allowPushStack(ItemSlot* zSlot, Direction dir, const Item* zItem, int& count) const; virtual void afterPullStack(ItemSlot* zSlot, Direction dir, const Item* zItem, int count); virtual void afterPushStack(ItemSlot* zSlot, Direction dir, const Item* zItem, int count); virtual void loadInventory(Framework::StreamReader* zReader); virtual void saveInventory(Framework::StreamWriter* zWriter); ItemSlot* zSlot(int id); public: Inventory(const Framework::Vec3 location, bool hasInventory); virtual ~Inventory(); void addSlot(ItemSlot* slot); void localTransaction(Framework::Array< ItemSlot* >* zSourceSlots, Framework::Array< ItemSlot* >* zTargetSlots, ItemFilter* zFilter, int count, Direction outDir, Direction inDir); ItemStack* takeItemsOut(ItemSlot* zSlot, int count, Direction dir); virtual void addItems(ItemStack* items, Direction dir); InventoryInteraction interactWith(Inventory* zInventory, Direction dir); void unsaveAddItem(ItemStack* zStack, Direction dir); int numberOfAddableItems(const ItemStack* zStack, Direction dir) const; Framework::Iterator begin(); Framework::Iterator end(); friend InventoryInteraction; };