#ifndef STAR_CONTAINER_OBJECT_HPP #define STAR_CONTAINER_OBJECT_HPP #include "StarItemBag.hpp" #include "StarObject.hpp" #include "StarWeightedPool.hpp" #include "StarContainerEntity.hpp" #include "StarItemRecipe.hpp" namespace Star { STAR_CLASS(ContainerObject); class ContainerObject : public Object, public virtual ContainerEntity { public: ContainerObject(ObjectConfigConstPtr config, Json const& parameters); void init(World* world, EntityId entityId, EntityMode mode) override; void update(float dt, uint64_t currentStep) override; void render(RenderCallback* renderCallback) override; void destroy(RenderCallback* renderCallback) override; InteractAction interact(InteractRequest const& request) override; Maybe receiveMessage(ConnectionId sendingConnection, String const& message, JsonArray const& args) override; Json containerGuiConfig() const override; String containerDescription() const override; String containerSubTitle() const override; ItemDescriptor iconItem() const override; ItemBagConstPtr itemBag() const override; void containerOpen() override; void containerClose() override; void startCrafting() override; void stopCrafting() override; bool isCrafting() const override; float craftingProgress() const override; void burnContainerContents() override; RpcPromise addItems(ItemPtr const& items) override; RpcPromise putItems(size_t slot, ItemPtr const& items) override; RpcPromise takeItems(size_t slot, size_t count = NPos) override; RpcPromise swapItems(size_t slot, ItemPtr const& items, bool tryCombine = true) override; RpcPromise applyAugment(size_t slot, ItemPtr const& augment) override; RpcPromise consumeItems(ItemDescriptor const& descriptor) override; RpcPromise consumeItems(size_t slot, size_t count) override; RpcPromise> clearContainer() override; protected: void getNetStates(bool initial) override; void setNetStates() override; void readStoredData(Json const& diskStore) override; Json writeStoredData() const override; private: typedef std::function ContainerCallback; ItemRecipe recipeForMaterials(List const& inputItems); void tickCrafting(float dt); ItemPtr doAddItems(ItemPtr const& items); ItemPtr doStackItems(ItemPtr const& items); ItemPtr doPutItems(size_t slot, ItemPtr const& items); ItemPtr doTakeItems(size_t slot, size_t count = NPos); ItemPtr doSwapItems(size_t slot, ItemPtr const& items, bool tryCombine = true); ItemPtr doApplyAugment(size_t slot, ItemPtr const& augment); bool doConsumeItems(ItemDescriptor const& descriptor); bool doConsumeItems(size_t slot, size_t count); List doClearContainer(); template RpcPromise addSlavePromise(String const& message, JsonArray const& args, function converter); void itemsUpdated(); NetElementInt m_opened; NetElementBool m_crafting; NetElementFloat m_craftingProgress; ItemBagPtr m_items; NetElementBytes m_itemsNetState; // master only bool m_initialized; int m_count; int m_currentState; int64_t m_animationFrameCooldown; int64_t m_autoCloseCooldown; ItemRecipe m_goalRecipe; bool m_itemsUpdated; bool m_runUpdatedCallback; ContainerCallback m_containerCallback; EpochTimer m_ageItemsTimer; List m_lostItems; }; } #endif