#pragma once #include #include #include #include #include #include "ItemSlot.h" #include "Area.h" class ItemFilter; class Inventory; class NetworkMessage; class Entity; 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::Array> observers; Framework::RCArray* pullSlotsOrder; Framework::RCArray* pushSlotsOrder; Framework::HashMap*>* itemCache; Framework::Critical cs; Framework::Array> afterPullStackCalls; Framework::Array> afterPushStackCalls; Framework::Array> observerAddedCalls; 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); void removeObserver(Entity* zSource, Framework::Text id); void addObserver(Entity* zSource, Framework::Text id); public: Inventory(const Framework::Vec3 location, bool hasInventory); virtual ~Inventory(); void notyObservers(NetworkMessage* msg); const ItemSlot* zSlot(int id) const; void addSlot(ItemSlot* slot); void localTransaction(Framework::Array< ItemSlot* >* zSourceSlots, Framework::Array* zTargetSlots, ItemFilter* zFilter, int count, Direction outDir, Direction inDir); ItemStack* takeItemsOut(ItemSlot* zSlot, int count, Direction dir); virtual void addItems(ItemStack* zItems, Direction dir); virtual void addItems(ItemSlot* zSlot, ItemStack* zItems, 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(); void inventoryApi(Framework::StreamReader* zRequest, NetworkMessage* zResponse, Entity* zSource); void registerAfterPullStackCall(std::function call); void registerAfterPushStackCall(std::function call); void registerObserverAddedCall(std::function call); friend InventoryInteraction; };